production_chain 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/README +6 -1
- data/lib/core_ext/numeric.rb +6 -0
- data/lib/production_chain.rb +16 -0
- data/lib/rails/action_controller/abstract_request.rb +6 -0
- data/lib/rails/action_view/text_helper.rb +43 -0
- data/lib/recipes/dump_and_restore.rb +28 -0
- data/lib/recipes/sphinx.rb +51 -0
- data/lib/tasks.rb +9 -0
- data/lib/tasks/backup.rake +56 -0
- data/lib/tasks/db.rake +133 -0
- data/lib/tasks/diagrams.rake +13 -0
- data/lib/tasks/env.rake +22 -0
- data/lib/tasks/mongo.rake +17 -0
- data/lib/tasks/revision.rake +13 -0
- data/production_chain.gemspec +22 -0
- data/rails/init.rb +2 -0
- metadata +31 -32
data/.gitignore
ADDED
data/README
CHANGED
@@ -1 +1,6 @@
|
|
1
|
-
A rails
|
1
|
+
A rails gem that incorporate various libs, recipes and tasks
|
2
|
+
|
3
|
+
To add the recipes to capistrano, you have to add these two lines to `config/deploy.rb` :
|
4
|
+
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'production_chain'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
if defined?(Rails)
|
2
|
+
# Core Ext
|
3
|
+
require "core_ext/numeric"
|
4
|
+
|
5
|
+
# Rails
|
6
|
+
require "rails/action_controller/abstract_request"
|
7
|
+
require "rails/action_view/text_helper"
|
8
|
+
|
9
|
+
# Rake Tasks
|
10
|
+
require "tasks"
|
11
|
+
end
|
12
|
+
|
13
|
+
if defined?(Capistrano)
|
14
|
+
# Recipes
|
15
|
+
Dir[File.join(File.dirname(__FILE__), 'recipes/**/*.rb')].each { |file| load file }
|
16
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module ActionView::Helpers::TextHelper
|
2
|
+
def truncate(text, *args)
|
3
|
+
options = args.extract_options!
|
4
|
+
|
5
|
+
# support either old or Rails 2.2 calling convention:
|
6
|
+
unless args.empty?
|
7
|
+
options[:length] = args[0] || 30
|
8
|
+
options[:omission] = args[1] || "..."
|
9
|
+
end
|
10
|
+
options.reverse_merge!(:length => 30, :omission => "...")
|
11
|
+
|
12
|
+
# support any of:
|
13
|
+
# * ruby 1.9 sane utf8 support
|
14
|
+
# * rails 2.1 workaround for crappy ruby 1.8 utf8 support
|
15
|
+
# * rails 2.2 workaround for crappy ruby 1.8 utf8 support
|
16
|
+
# hooray!
|
17
|
+
if text
|
18
|
+
chars = if text.respond_to?(:mb_chars)
|
19
|
+
text.mb_chars
|
20
|
+
elsif RUBY_VERSION < '1.9'
|
21
|
+
text.chars
|
22
|
+
else
|
23
|
+
text
|
24
|
+
end
|
25
|
+
|
26
|
+
omission = if options[:omission].respond_to?(:mb_chars)
|
27
|
+
options[:omission].mb_chars
|
28
|
+
elsif RUBY_VERSION < '1.9'
|
29
|
+
options[:omission].chars
|
30
|
+
else
|
31
|
+
options[:omission]
|
32
|
+
end
|
33
|
+
|
34
|
+
l = options[:length] - omission.length
|
35
|
+
if chars.length > options[:length]
|
36
|
+
result = (chars[/\A.{#{l}}\w*\;?/m][/.*[\w\;]/m]).to_s
|
37
|
+
((options[:avoid_orphans] && result =~ /\A(.*?)\n+\W*\w*\W*\Z/m) ? $1 : result) + options[:omission]
|
38
|
+
else
|
39
|
+
text
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :db do
|
3
|
+
# this recipe needs the "mysql tasks" plugin
|
4
|
+
desc "Make a dump on the remote production box and restore on the local dev box"
|
5
|
+
task :dump_and_restore, :roles => :db, :only => {:primary => true} do
|
6
|
+
rake = fetch(:rake, "rake")
|
7
|
+
rails_env = fetch(:rails_env, "production")
|
8
|
+
file_env = ENV['FILE'] || "database"
|
9
|
+
run "cd #{current_release} && RAILS_ENV=#{rails_env} FILE=#{file_env} #{rake} db:backup"
|
10
|
+
get "#{current_release}/db/dump.tar.gz", "db/dump.tar.gz"
|
11
|
+
cmd = "RAILS_ENV=#{ ENV['RAILS_ENV'] || "development" } FILE=#{file_env} #{rake} db:restore"
|
12
|
+
puts cmd
|
13
|
+
system cmd
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :assets do
|
18
|
+
desc "Make a dump on the remote production box and restore on the local dev box"
|
19
|
+
task :dump_and_restore, :roles => :db, :only => {:primary => true} do
|
20
|
+
assets_backup_path = "#{current_path}/system.tar.gz"
|
21
|
+
run "cd #{current_path}/ && tar czfh #{assets_backup_path} public/system/"
|
22
|
+
get "#{assets_backup_path}", "system.tar.gz"
|
23
|
+
run "cd #{current_path}/ && rm #{assets_backup_path}"
|
24
|
+
`rm -rf public/system/*`
|
25
|
+
`tar xvzf system.tar.gz`
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :thinking_sphinx do
|
3
|
+
desc "Generate the Sphinx configuration file"
|
4
|
+
task :configure do
|
5
|
+
rake "thinking_sphinx:configure"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Index data"
|
9
|
+
task :index do
|
10
|
+
rake "thinking_sphinx:index"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Start the Sphinx daemon"
|
14
|
+
task :start do
|
15
|
+
configure
|
16
|
+
rake "thinking_sphinx:start"
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Stop the Sphinx daemon"
|
20
|
+
task :stop do
|
21
|
+
configure
|
22
|
+
rake "thinking_sphinx:stop"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Stop and then start the Sphinx daemon"
|
26
|
+
task :restart do
|
27
|
+
stop
|
28
|
+
start
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Stop, re-index and then start the Sphinx daemon"
|
32
|
+
task :rebuild do
|
33
|
+
stop
|
34
|
+
index
|
35
|
+
start
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Add the shared folder for sphinx files for the production environment"
|
39
|
+
task :shared_sphinx_folder, :roles => :web do
|
40
|
+
run "mkdir -p #{shared_path}/db/sphinx/production"
|
41
|
+
end
|
42
|
+
|
43
|
+
def rake(*tasks)
|
44
|
+
rails_env = fetch(:rails_env, "production")
|
45
|
+
rake = fetch(:rake, "rake")
|
46
|
+
tasks.each do |t|
|
47
|
+
run "if [ -d #{release_path} ]; then cd #{release_path}; else cd #{current_path}; fi; #{rake} RAILS_ENV=#{rails_env} #{t}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/tasks.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 's3'
|
2
|
+
|
3
|
+
namespace :s3 do
|
4
|
+
|
5
|
+
desc "Backup code, database, and scm to S3"
|
6
|
+
task :backup => ["s3:backup:db", "s3:backup:shared"]
|
7
|
+
|
8
|
+
namespace :backup do
|
9
|
+
desc "Backup the database to S3"
|
10
|
+
task :db do
|
11
|
+
db_tmp_path = "#{Rails.root}/db/dump.tar.gz"
|
12
|
+
Rake::Task['db:backup'].invoke
|
13
|
+
send_to_s3(db_tmp_path)
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Backup the shared folder to S3"
|
17
|
+
task :shared do
|
18
|
+
cmd = " cd .. && tar czfh /tmp/shared.tar.gz shared/ --exclude=shared/log/* --exclude=shared/sphinx/*"
|
19
|
+
system(cmd)
|
20
|
+
shared_tmp_path = "/tmp/shared.tar.gz"
|
21
|
+
send_to_s3(shared_tmp_path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def conn
|
29
|
+
@s3_config ||= YAML.load_file("#{Rails.root}/config/backup_s3.yml")[Rails.env]
|
30
|
+
@conn ||= S3::Service.new(:access_key_id => @s3_config['access_key_id'],
|
31
|
+
:secret_access_key => @s3_config['secret_access_key'],
|
32
|
+
:use_ssl => true)
|
33
|
+
end
|
34
|
+
|
35
|
+
def bucket_name
|
36
|
+
@s3_config['bucket_name']
|
37
|
+
end
|
38
|
+
|
39
|
+
def backup_bucket
|
40
|
+
begin
|
41
|
+
bucket ||= conn.buckets.find(bucket_name)
|
42
|
+
rescue S3::Error::ResponseError
|
43
|
+
bucket = conn.buckets.build(bucket_name)
|
44
|
+
bucket.save
|
45
|
+
end
|
46
|
+
bucket
|
47
|
+
end
|
48
|
+
|
49
|
+
def send_to_s3 local_file_path
|
50
|
+
bucket = backup_bucket
|
51
|
+
s3_file_path = Time.now.strftime("%Y%m%d") + '/' + local_file_path.split('/').last
|
52
|
+
|
53
|
+
upload = bucket.objects.build(s3_file_path)
|
54
|
+
upload.content = File.open(local_file_path)
|
55
|
+
upload.save
|
56
|
+
end
|
data/lib/tasks/db.rake
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
namespace :db do
|
2
|
+
desc "Dump schema and data to a bzip file"
|
3
|
+
task :backup => :environment do
|
4
|
+
type, database, user, password, host = retrieve_db_info ENV['FILE']
|
5
|
+
type = "mysql" if type == "mysql2"
|
6
|
+
send("backup_#{type}_database", database, user, password, host)
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Load schema and data from a bzip file"
|
10
|
+
task :restore => :environment do
|
11
|
+
type, database, user, password, host = retrieve_db_info ENV['FILE']
|
12
|
+
type = "mysql" if type == "mysql2"
|
13
|
+
if type == "mongodb"
|
14
|
+
send("restore_#{type}_database", database, user, password, host)
|
15
|
+
else
|
16
|
+
send("drop_#{type}_database", database, user, password, host)
|
17
|
+
send("create_#{type}_database", database, user, password, host)
|
18
|
+
send("restore_#{type}_database", database, user, password, host)
|
19
|
+
|
20
|
+
#Rake::Task['db:migrate'].invoke
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def retrieve_db_info(filename)
|
28
|
+
filename ||= "database"
|
29
|
+
result = File.read "#{Rails.root}/config/#{filename}.yml"
|
30
|
+
# result.strip!
|
31
|
+
config_file = YAML::load(ERB.new(result).result)
|
32
|
+
type = filename == "mongoid" ? "mongodb" : config_file[Rails.env]['adapter']
|
33
|
+
return [
|
34
|
+
type,
|
35
|
+
config_file[Rails.env]['database'],
|
36
|
+
config_file[Rails.env]['username'],
|
37
|
+
config_file[Rails.env]['password'],
|
38
|
+
config_file[Rails.env]['host'] || "127.0.0.1"
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
def archive_name
|
43
|
+
archive = "#{Rails.root}/db/dump.tar.gz"
|
44
|
+
end
|
45
|
+
|
46
|
+
def backup_mysql_database database, user, password, host
|
47
|
+
cmd = "/usr/bin/env mysqldump --opt --skip-add-locks -h #{host} -u #{user} "
|
48
|
+
puts cmd + "... [password filtered]"
|
49
|
+
cmd << " -p'#{password}' " unless password.nil?
|
50
|
+
cmd << " #{database} > dump.sql && tar czfh #{archive_name} dump.sql"
|
51
|
+
|
52
|
+
system(cmd)
|
53
|
+
end
|
54
|
+
|
55
|
+
def restore_mysql_database database, user, password, host
|
56
|
+
cmd = "tar xvzf #{archive_name} && "
|
57
|
+
cmd << "/usr/bin/env mysql -h #{host} -u #{user} #{database}"
|
58
|
+
puts cmd + "... [password filtered]"
|
59
|
+
cmd << " -p'#{password}'" unless password.nil?
|
60
|
+
cmd << " < dump.sql"
|
61
|
+
|
62
|
+
system(cmd)
|
63
|
+
end
|
64
|
+
|
65
|
+
# pg_dump does not allow to pass the password in the command line for security reasons.
|
66
|
+
# You need to define the password for your user in ~/.pgpass
|
67
|
+
# See : http://www.postgresql.org/docs/8.1/interactive/libpq-pgpass.html
|
68
|
+
#
|
69
|
+
# pg_dump -Fc option outputs a custom dump file which is compressed by default.
|
70
|
+
# See man pg_dump for more information.
|
71
|
+
#
|
72
|
+
def backup_postgresql_database database, user, password, host
|
73
|
+
cmd = "/usr/bin/env pg_dump -Fc -h #{host} -U #{user} #{database} -f db.dump"
|
74
|
+
cmd << " && tar czfh #{archive_name} db.dump"
|
75
|
+
puts cmd
|
76
|
+
|
77
|
+
system(cmd)
|
78
|
+
end
|
79
|
+
|
80
|
+
def restore_postgresql_database database, user, password, host
|
81
|
+
cmd = "tar xvzf #{archive_name}"
|
82
|
+
cmd << " && /usr/bin/env pg_restore -h #{host} -U #{user} -O -d #{database} db.dump"
|
83
|
+
puts cmd
|
84
|
+
|
85
|
+
system(cmd)
|
86
|
+
end
|
87
|
+
|
88
|
+
def backup_mongodb_database database, user, password, host
|
89
|
+
cmd = "rm -rf dump/ 2>/dev/null && /usr/bin/env mongodump -h #{host} -d #{database}"
|
90
|
+
cmd << " && tar czfh #{archive_name} dump/"
|
91
|
+
|
92
|
+
system(cmd)
|
93
|
+
end
|
94
|
+
|
95
|
+
def restore_mongodb_database database, user, password, host
|
96
|
+
cmd = "rm -rf dump/ 2>/dev/null && tar xvzf #{archive_name}"
|
97
|
+
cmd += " && /usr/bin/env mongorestore --drop -h #{host} -d #{database} --dir dump/*_*"
|
98
|
+
puts cmd
|
99
|
+
|
100
|
+
system(cmd)
|
101
|
+
end
|
102
|
+
|
103
|
+
def drop_mysql_database database, user, password, host
|
104
|
+
cmd = "/usr/bin/env mysql -h #{host} -u #{user}"
|
105
|
+
cmd << " -e \"DROP DATABASE #{database}\""
|
106
|
+
puts cmd + "... [password filtered]"
|
107
|
+
cmd << " -p'#{password}'" unless password.nil?
|
108
|
+
|
109
|
+
system(cmd)
|
110
|
+
end
|
111
|
+
|
112
|
+
# We cannot use dropdb command as the rake task seems to lock the database...
|
113
|
+
#
|
114
|
+
def drop_postgresql_database database, user, password, host
|
115
|
+
Rake::Task['db:drop'].invoke
|
116
|
+
end
|
117
|
+
|
118
|
+
def create_postgresql_database database, user, password, host
|
119
|
+
cmd = "/usr/bin/env createdb -h #{host} -U #{user} #{database}"
|
120
|
+
puts cmd
|
121
|
+
|
122
|
+
system(cmd)
|
123
|
+
end
|
124
|
+
|
125
|
+
def create_mysql_database database, user, password, host
|
126
|
+
cmd = "/usr/bin/env mysql -h #{host} -u #{user}"
|
127
|
+
cmd << " -e \"CREATE DATABASE #{database}\""
|
128
|
+
puts cmd + "... [password filtered]"
|
129
|
+
cmd << " -p'#{password}'" unless password.nil?
|
130
|
+
|
131
|
+
system(cmd)
|
132
|
+
end
|
133
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :doc do
|
2
|
+
namespace :diagram do
|
3
|
+
task :models do
|
4
|
+
sh "railroad -i -l -a -m -M | dot -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' > doc/models.svg"
|
5
|
+
end
|
6
|
+
|
7
|
+
task :controllers do
|
8
|
+
sh "railroad -i -l -C | neato -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' > doc/controllers.svg"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
task :diagrams => %w(diagram:models diagram:controllers)
|
13
|
+
end
|
data/lib/tasks/env.rake
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
namespace :env do
|
2
|
+
desc "reset your dev environment with default reference datas"
|
3
|
+
task :reset => :environment do
|
4
|
+
Rake::Task['db:drop'].invoke
|
5
|
+
Rake::Task['db:create'].invoke
|
6
|
+
Rake::Task['db:migrate'].invoke
|
7
|
+
Rake::Task['spec:db:fixtures:load'].invoke
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Rebuild with production data"
|
11
|
+
task :rebuild_with_production_data => :environment do
|
12
|
+
env = Rails.env
|
13
|
+
# Recreate database
|
14
|
+
`RAILS_ENV=#{env} rake db:drop db:create`
|
15
|
+
# Fetch database data
|
16
|
+
`RAILS_ENV=#{env} cap production db:dump_and_restore`
|
17
|
+
# Play migrations
|
18
|
+
`RAILS_ENV=#{env} rake db:migrate`
|
19
|
+
# Fetch assets
|
20
|
+
`RAILS_ENV=#{env} cap production assets:dump_and_restore`
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace :mongo do
|
2
|
+
desc "Drops the database for the current RAILS_ENV"
|
3
|
+
task :drop => :environment do
|
4
|
+
MongoMapper.connection.drop_database(MongoMapper.database.name)
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Create the database defined in config/database.yml for the current RAILS_ENV"
|
8
|
+
task :seed => :environment do
|
9
|
+
Rake::Task["db:seed"].invoke
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Drops and recreates the database"
|
13
|
+
task :reset => :environment do
|
14
|
+
Rake::Task["mongo:drop"].invoke
|
15
|
+
Rake::Task["mongo:seed"].invoke
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :revision do
|
2
|
+
desc "print revision number in admin template"
|
3
|
+
task :print do
|
4
|
+
svn_revision = ENV['SVN_REVISION'] || IO.popen("svn info").readlines[4].split(" ").last
|
5
|
+
release_number = ENV['RELEASE_NUMBER'] || Dir.pwd.split("/").last
|
6
|
+
revision = RAILS_ENV
|
7
|
+
revision += "-r#{svn_revision}"
|
8
|
+
revision += "-#{release_number}" if release_number.to_i != 0
|
9
|
+
|
10
|
+
path = "app/views/shared/_revision.html.haml"
|
11
|
+
`echo "#{revision}" > #{path}`
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "production_chain"
|
3
|
+
s.version = "0.0.2"
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.authors = ["Novelys"]
|
6
|
+
s.email = ["contact@novelys.com"]
|
7
|
+
s.homepage = "http://github.com/novelys/production_chain"
|
8
|
+
s.summary = "Production Chain"
|
9
|
+
s.description = "A rails plugin that incorporate various libs, recipes and tasks"
|
10
|
+
s.rubyforge_project = s.name
|
11
|
+
|
12
|
+
s.required_rubygems_version = ">= 1.3.6"
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
# s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
16
|
+
# s.extensions = `git ls-files ext/extconf.rb`.split("\n")
|
17
|
+
|
18
|
+
s.require_path = 'lib'
|
19
|
+
|
20
|
+
# For C extensions
|
21
|
+
# s.extensions = "ext/extconf.rb"
|
22
|
+
end
|
data/rails/init.rb
ADDED
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: production_chain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 29
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Novelys
|
@@ -15,27 +14,13 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date:
|
17
|
+
date: 2012-05-31 00:00:00 +02:00
|
19
18
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 25
|
30
|
-
segments:
|
31
|
-
- 2
|
32
|
-
- 3
|
33
|
-
- 13
|
34
|
-
version: 2.3.13
|
35
|
-
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
description: A rails plugin to setup a basic production chain (it also includes various libs, recipes and tasks)
|
38
|
-
email: contact@novelys.com
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: A rails plugin that incorporate various libs, recipes and tasks
|
22
|
+
email:
|
23
|
+
- contact@novelys.com
|
39
24
|
executables: []
|
40
25
|
|
41
26
|
extensions: []
|
@@ -43,7 +28,23 @@ extensions: []
|
|
43
28
|
extra_rdoc_files: []
|
44
29
|
|
45
30
|
files:
|
31
|
+
- .gitignore
|
46
32
|
- README
|
33
|
+
- lib/core_ext/numeric.rb
|
34
|
+
- lib/production_chain.rb
|
35
|
+
- lib/rails/action_controller/abstract_request.rb
|
36
|
+
- lib/rails/action_view/text_helper.rb
|
37
|
+
- lib/recipes/dump_and_restore.rb
|
38
|
+
- lib/recipes/sphinx.rb
|
39
|
+
- lib/tasks.rb
|
40
|
+
- lib/tasks/backup.rake
|
41
|
+
- lib/tasks/db.rake
|
42
|
+
- lib/tasks/diagrams.rake
|
43
|
+
- lib/tasks/env.rake
|
44
|
+
- lib/tasks/mongo.rake
|
45
|
+
- lib/tasks/revision.rake
|
46
|
+
- production_chain.gemspec
|
47
|
+
- rails/init.rb
|
47
48
|
has_rdoc: true
|
48
49
|
homepage: http://github.com/novelys/production_chain
|
49
50
|
licenses: []
|
@@ -54,29 +55,27 @@ rdoc_options: []
|
|
54
55
|
require_paths:
|
55
56
|
- lib
|
56
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 3
|
62
61
|
segments:
|
63
62
|
- 0
|
64
63
|
version: "0"
|
65
64
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
65
|
requirements:
|
68
66
|
- - ">="
|
69
67
|
- !ruby/object:Gem::Version
|
70
|
-
hash: 3
|
71
68
|
segments:
|
72
|
-
-
|
73
|
-
|
69
|
+
- 1
|
70
|
+
- 3
|
71
|
+
- 6
|
72
|
+
version: 1.3.6
|
74
73
|
requirements: []
|
75
74
|
|
76
|
-
rubyforge_project:
|
77
|
-
rubygems_version: 1.3.
|
75
|
+
rubyforge_project: production_chain
|
76
|
+
rubygems_version: 1.3.6
|
78
77
|
signing_key:
|
79
78
|
specification_version: 3
|
80
|
-
summary:
|
79
|
+
summary: Production Chain
|
81
80
|
test_files: []
|
82
81
|
|