simple-rails-deploy 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.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/LICENSE.txt ADDED
@@ -0,0 +1,18 @@
1
+ Permission is hereby granted, free of charge, to any person obtaining
2
+ a copy of this software and associated documentation files (the
3
+ "Software"), to deal in the Software without restriction, including
4
+ without limitation the rights to use, copy, modify, merge, publish,
5
+ distribute, sublicense, and/or sell copies of the Software, and to
6
+ permit persons to whom the Software is furnished to do so, subject to
7
+ the following conditions:
8
+
9
+ The above copyright notice and this permission notice shall be
10
+ included in all copies or substantial portions of the Software.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,135 @@
1
+ Simple rails deploy
2
+ ===================
3
+
4
+ This gem is made to get everything I need for deploy in one place. Such as:
5
+ * capistrano configuration
6
+ * unicorn configuration
7
+ * unicorn startup rake task
8
+ * nginx configuration
9
+ * all stuff and magic to use this all together
10
+
11
+ Assumptions
12
+ ========
13
+ * Project uses ruby 1.9.3 for deployment.
14
+ * Project uses asset pipeline for asset packing.
15
+ * Project uses bundler to handle dependencies.
16
+ * Project uses git.
17
+ * Each project has its own user(all path assumptions are based on this).
18
+ * Nobody likes setting up ruby web servers.
19
+
20
+ What does it provide
21
+ =======
22
+ Configless unicorn control and configuration: tasks unicorn:start, unicorn:restart, unicorn:stop.
23
+ Small common capistrano recipes.
24
+
25
+ Limitations
26
+ ========
27
+ - Unicorn can be less flexibly configured
28
+
29
+ Step by step instruction
30
+ ======
31
+
32
+ Server-side:
33
+ (as root)
34
+ ```bash
35
+ # Server initial setup
36
+ apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion
37
+ #Use other package if using other DB
38
+ apt-get install postgresql libpq-dev
39
+
40
+ # Creating new ssh user
41
+ adduser <project-name>
42
+ cd ~<project-name>
43
+ mkdir .ssh
44
+ nano .ssh/authorized_keys
45
+ #(paste your public ssh key in editor)
46
+ chmod -R 700 .ssh
47
+ chown -R <project-name>:<project-name> .ssh
48
+
49
+ # Workaround to add
50
+
51
+ # Database credentials
52
+ su postgres
53
+ createuser <project-name>
54
+ # Allow only database creation, not superuser
55
+ ```
56
+
57
+ And you should add nginx config:
58
+ ```nginx
59
+ server {
60
+ server_name <domain to use>;
61
+
62
+ root /home/<projectname>/app/current/public;
63
+ try_files $uri/index.html $uri.html $uri @app;
64
+
65
+ location @app {
66
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
67
+ proxy_set_header Host $http_host;
68
+ proxy_redirect off;
69
+
70
+ # If you don't find the filename in the static files
71
+ # Then request it from the unicorn server
72
+ proxy_pass http://unix:/home/<projectname>/app/shared/tmp/sockets/unicorn.sock:;
73
+ }
74
+ }
75
+ ```
76
+
77
+ That's all for root. Everything else will be done without superuser privileges.
78
+
79
+ In application code folder:
80
+ Run 'capify .' command. Replace config/deploy.rb:
81
+ ```ruby
82
+ require 'simple-rails-deploy/common'
83
+
84
+ #Use rvm with ruby 1.9.3 for deployment
85
+ load 'deploy/rvm'
86
+ #Use unicorn as web server
87
+ load 'deploy/unicorn'
88
+ #Uncomment if you want to add 'deny all' robots.txt
89
+ #load 'deploy/robots-deny-all'
90
+
91
+ #multistaging
92
+ require "capistrano/ext/multistage"
93
+ set :stages, %w(demo)
94
+ set :default_stage, "demo"
95
+ set :keep_releases, 5
96
+
97
+ set :application, "<application name>"
98
+ set :repository, "<repo name>"
99
+
100
+ ```
101
+
102
+ create file config/deploy/[stage-name].rb with contents:
103
+ ```ruby
104
+ # Path to deploy folder is calculated based on appication name:
105
+ # "/home/#{application}/app/"
106
+
107
+ #set rails environment here
108
+ set :rails_env, "production"
109
+
110
+ #set git branch here
111
+ set :branch, "master"
112
+
113
+ #set server address here
114
+ set :domain, "<username>@<server-hostname>" # Required for ssh deploy
115
+
116
+ #Server roles
117
+ role :web, domain
118
+ role :app, domain
119
+ role :db, domain, :primary => true
120
+ ```
121
+
122
+ And run:
123
+ ```bash
124
+ cap <stagename> deploy:setup
125
+ cap <stagename> deploy:create_database #optional
126
+ cap <stagename> deploy:cold
127
+ cap <stagename> deploy:migrate
128
+ cap <stagename> deploy
129
+ ```
130
+
131
+ License
132
+ ======
133
+ Copyright 2012, Alexander Rozumiy. Distributed under the MIT license.
134
+
135
+ Thanks to @Slotos for help with initial configuration files.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+
3
+ begin
4
+ require 'bundler'
5
+ Bundler::GemHelper.install_tasks
6
+ rescue LoadError => e
7
+ warn "[WARNING]: It is recommended that you use bundler during development: gem install bundler"
8
+ end
@@ -0,0 +1,43 @@
1
+ rails_root = ENV['RAILS_PATH'] || raise("Rails path unknown")
2
+ pid_file = "#{rails_root}/tmp/pids/unicorn.pid"
3
+ socket_file= "#{rails_root}/tmp/unicorn.sock"
4
+ log_file = "#{rails_root}/log/unicorn.log"
5
+ err_log = "#{rails_root}/log/unicorn_error.log"
6
+ old_pid = pid_file + '.oldbin'
7
+
8
+ timeout 30
9
+ worker_processes ENV['WORKERS_COUNT'].to_i || raise("Workers count not specified") # Based on load and other stuff
10
+ listen socket_file, :backlog => 1024
11
+ pid pid_file
12
+ stderr_path err_log
13
+ stdout_path log_file
14
+
15
+ #preload_app true # Master loads app before forking
16
+ preload_app false
17
+
18
+ GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=) # ree garbage collection tuning
19
+
20
+ before_exec do |server|
21
+ ENV["BUNDLE_GEMFILE"] = "#{rails_root}/Gemfile"
22
+ end
23
+
24
+ before_fork do |server, worker|
25
+ # Disconnect from DB before forking
26
+ defined?(ActiveRecord::Base) and
27
+ ActiveRecord::Base.connection.disconnect!
28
+
29
+ #0 downtime deploy magic
30
+ if File.exists?(old_pid) && server.pid != old_pid
31
+ begin
32
+ Process.kill("QUIT", File.read(old_pid).to_i)
33
+ rescue Errno::ENOENT, Errno::ESRCH
34
+ # someone else did our job for us
35
+ end
36
+ end
37
+ end
38
+
39
+ after_fork do |server, worker|
40
+ # Reconnect to db after forking
41
+ defined?(ActiveRecord::Base) and
42
+ ActiveRecord::Base.establish_connection
43
+ end
@@ -0,0 +1,30 @@
1
+ namespace :deploy do
2
+ task :add_to_startup do
3
+ startup_sh = '#!/bin/bash
4
+ #Comment this if not using rvm
5
+ [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
6
+ rvm use 1.9.3-falcon
7
+
8
+ export rvm_project_rvmrc=0
9
+
10
+ #Change this path to rails root
11
+ cd ~/app/current
12
+
13
+ #rvm use 1.9.3-falcon
14
+ RAILS_ENV=production RAILS_PATH=`pwd` bundle exec rake unicorn:start'
15
+
16
+ put startup_sh, "/home/#{application}/startup.sh", :mode => '755'
17
+
18
+ begin
19
+ run "crontab -l > ~/#{application}-cron"
20
+ rescue
21
+ #no crontab present
22
+ end
23
+
24
+ run "echo '#Begin reload on reboot task' >> ~/#{application}-cron"
25
+ run "echo '@reboot /bin/bash /home/#{application}/startup.sh' >> ~/#{application}-cron"
26
+ run "echo '#End reload on reboot task' >> ~/#{application}-cron"
27
+ run "crontab ~/#{application}-cron"
28
+ run "rm ~/#{application}-cron"
29
+ end
30
+ end
@@ -0,0 +1,8 @@
1
+ # This task adds robots.txt with 'deny all' to web root
2
+ after "deploy:finalize_update", "deploy:robots"
3
+
4
+ namespace :deploy do
5
+ task :robots do
6
+ run "echo 'User-Agent: *' > #{release_path}/public/robots.txt&&echo 'Disallow: /' >> #{release_path}/public/robots.txt"
7
+ end
8
+ end
data/lib/deploy/rvm.rb ADDED
@@ -0,0 +1,19 @@
1
+ set :rvm_ruby_string, '1.9.3-falcon'
2
+ set :default_environment, {
3
+ 'RUBY_HEAP_MIN_SLOTS' => 600000,
4
+ 'RUBY_GC_MALLOC_LIMIT' => 59000000,
5
+ 'RUBY_HEAP_FREE_MIN' => 100000
6
+ }
7
+
8
+ require "rvm/capistrano"
9
+
10
+ namespace :rvm do
11
+ task :trust_rvmrc do
12
+ run "rvm rvmrc trust #{release_path}"
13
+ end
14
+ end
15
+
16
+ before 'deploy:setup', 'rvm:install_rvm'
17
+ before 'deploy:setup', 'rvm:install_ruby'
18
+ after "deploy", "rvm:trust_rvmrc"
19
+
@@ -0,0 +1,54 @@
1
+ #Links files from this list to 'current' folder
2
+ set :normal_symlinks, %w(
3
+ config/database.yml
4
+ tmp
5
+ )
6
+
7
+ namespace :deploy do
8
+ desc "Use configs"
9
+ task :app_symlinks do
10
+ normal_symlinks.map do |path|
11
+ run "rm -rf #{release_path}/#{path} && ln -nfs #{shared_path}/#{path} #{release_path}/#{path}"
12
+ end
13
+ end
14
+ end
15
+
16
+ after "deploy:finalize_update", "deploy:app_symlinks"
17
+
18
+ namespace :deploy do
19
+ task :create_database_yml do
20
+ db_config = ERB.new <<-EOF
21
+ base: &base
22
+ adapter: postgresql
23
+ encoding: unicode
24
+ database: #{application}
25
+ pool: 5
26
+ min_messages: WARNING
27
+
28
+ #{rails_env}:
29
+ <<: *base
30
+
31
+ development:
32
+ <<: *base
33
+ EOF
34
+
35
+ run "mkdir -p #{shared_path}/config"
36
+ put db_config.result, "#{shared_path}/config/database.yml"
37
+ end
38
+
39
+ task :create_database do
40
+ run "psql -c'create database #{application};' postgres"
41
+ end
42
+
43
+ task :create_shared_tmp_folder do
44
+ run "mkdir -p #{shared_path}/tmp"
45
+ end
46
+
47
+ task :fix_ssh_git do
48
+ run "echo 'StrictHostKeyChecking no' > ~/.ssh/config"
49
+ end
50
+ end
51
+
52
+ before 'deploy:setup', 'deploy:create_database_yml'
53
+ before 'deploy:setup', 'deploy:create_shared_tmp_folder'
54
+ before 'deploy:setup', 'deploy:fix_ssh_git'
@@ -0,0 +1,18 @@
1
+ namespace :deploy do
2
+ desc "Start unicorn"
3
+ task :start do
4
+ run "cd #{current_path} && RAILS_ENV=#{rails_env} RAILS_PATH=#{current_path} bundle exec rake unicorn:start"
5
+ end
6
+
7
+ desc "Restart unicorn"
8
+ task :restart do
9
+ run "cd #{current_path} && RAILS_ENV=#{rails_env} RAILS_PATH=#{current_path} bundle exec rake unicorn:restart"
10
+ end
11
+
12
+ desc "Stop unicorn and start again"
13
+ task :reload do
14
+ run "cd #{current_path} && RAILS_ENV=#{rails_env} RAILS_PATH=#{current_path} bundle exec rake unicorn:stop"
15
+ run "cd #{current_path} && RAILS_ENV=#{rails_env} RAILS_PATH=#{current_path} bundle exec rake unicorn:start"
16
+ end
17
+ end
18
+
@@ -0,0 +1,29 @@
1
+ # Bundler integration - installs same gems as in development
2
+ require 'bundler/capistrano'
3
+ # Colored capistrano output
4
+ require 'capistrano_colors'
5
+
6
+ Capistrano::Configuration.instance(true).load do
7
+ @load_paths += [Gem::Specification.find_by_name("simple-rails-deploy").gem_dir+'/lib']
8
+
9
+ load 'deploy/assets'
10
+ load 'deploy/sharing-files'
11
+ load 'deploy/add-to-autostart'
12
+
13
+ # VCS settings
14
+ set :scm, :git
15
+ set :deploy_via, :remote_cache
16
+ set :ssh_options, { :forward_agent => true }
17
+
18
+ # Server settings
19
+ set :use_sudo, false
20
+
21
+ # Hack to make forward_agent work
22
+ on :start do
23
+ `ssh-add`
24
+ end
25
+
26
+ # Deployment path
27
+ set(:deploy_to) { "/home/#{application}/app/" }
28
+ end
29
+
@@ -0,0 +1,9 @@
1
+ require 'rails'
2
+
3
+ module SimpleRailsDeploy
4
+ class Railtie < Rails::Railtie
5
+ rake_tasks do
6
+ load 'tasks/unicorn.rake'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ if Object.const_defined?(:Rails)
2
+ require 'simple-rails-deploy/railtie'
3
+ end
@@ -0,0 +1,99 @@
1
+ # cpu count code is from https://gist.github.com/1009994
2
+ module System
3
+ extend self
4
+ def cpu_count
5
+ return Java::Java.lang.Runtime.getRuntime.availableProcessors if defined? Java::Java
6
+ return File.read('/proc/cpuinfo').scan(/^processor\s*:/).size if File.exist? '/proc/cpuinfo'
7
+ require 'win32ole'
8
+ WIN32OLE.connect("winmgmts://").ExecQuery("select * from Win32_ComputerSystem").NumberOfProcessors
9
+ rescue LoadError
10
+ Integer `sysctl -n hw.ncpu 2>/dev/null` rescue 1
11
+ end
12
+ end
13
+
14
+ namespace :unicorn do
15
+ def rails_root
16
+ ENV['RAILS_PATH'] || Rails.root
17
+ end
18
+
19
+ def unicorn_pid
20
+ File.join(rails_root, 'tmp', 'pids', 'unicorn.pid')
21
+ end
22
+
23
+ def unicorn_config
24
+ gem_path = Gem::Specification.find_by_name("simple-rails-deploy").gem_dir
25
+ File.join(gem_path, 'lib', 'configs', 'unicorn.rb')
26
+ end
27
+
28
+ def workers_count
29
+ if Rails.env.staging? || Rails.env.development?
30
+ return 1
31
+ elsif Rails.env.production?
32
+ # workers count == cpu cores count
33
+ return System.cpu_count
34
+ else
35
+ return 2
36
+ end
37
+ end
38
+
39
+ desc "Start unicorn"
40
+ task :start do
41
+ # Get unicorn pid
42
+ pidfile = unicorn_pid
43
+ if File.exists? pidfile
44
+ abort 'Unicorn is already running'
45
+ else
46
+ system_call = "env RAILS_PATH=#{rails_root} WORKERS_COUNT=#{workers_count} bundle exec unicorn_rails -c #{unicorn_config} -D"
47
+ if system(system_call)
48
+ puts "Started and running with pid: #{File.read pidfile}"
49
+ else
50
+ puts "Unicorn failed to start. System call was: '#{system_call}' "
51
+ end
52
+ end
53
+ end
54
+
55
+ desc "Restart unicorn"
56
+ task :restart do
57
+ # Get unicorn pid
58
+ pidfile = unicorn_pid
59
+ old_pidfile = unicorn_pid + '.oldbin'
60
+ abort 'unicorn is either restarting or encounetred a serious crash in the previous restart attempt' if File.exists? old_pidfile
61
+ if File.exists? pidfile
62
+ begin
63
+ pid = File.read(pidfile).to_i
64
+ Process.kill 0, pid
65
+ Process.kill "USR2", pid
66
+ puts "Successfully asked unicorn to reload gracefully"
67
+ rescue Errno::EPERM
68
+ abort 'Lacking the rights to communicate with unicorn process'
69
+ rescue Errno::ESRCH
70
+ puts "Something bad happened in the past. Unicorn PID is here, unicorn is not. Starting a new instance."
71
+ File.delete pidfile
72
+ Rake::Task["unicorn:start"].invoke
73
+ end
74
+ else
75
+ puts "Unicorn is not running. Starting a new instance."
76
+ Rake::Task["unicorn:start"].invoke
77
+ end
78
+ end
79
+
80
+ desc "Stop unicorn"
81
+ task :stop do
82
+ # Get unicorn pid
83
+ pidfile = unicorn_pid
84
+ if File.exists? pidfile
85
+ begin
86
+ pid = File.read(pidfile).to_i
87
+ Process.kill 0, pid
88
+ Process.kill "QUIT", pid
89
+ puts "Successfully asked unicorn to shut down gracefully"
90
+ rescue Errno::EPERM
91
+ abort 'Lacking the rights to communicate with unicorn process'
92
+ rescue Errno::ESRCH
93
+ puts "Something bad happened in the past. Unicorn PID is here, unicorn is not"
94
+ end
95
+ else
96
+ puts "Unicorn is not running. Aborting"
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'rake'
4
+ $:.push File.expand_path("../lib", __FILE__)
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "simple-rails-deploy"
8
+ s.version = '0.0.1'
9
+
10
+ s.authors = ["Alex Rozumey"]
11
+ s.description = "It simplifies rails deployment process a lot"
12
+ s.email = "brain-geek@yandex.ua"
13
+
14
+ s.extra_rdoc_files = [
15
+ "LICENSE.txt",
16
+ "README.md"
17
+ ]
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+
24
+ s.homepage = "http://github.com/brain-geek/simple-rails-deploy"
25
+ s.licenses = ["MIT"]
26
+ s.rubygems_version = "1.8.15"
27
+ s.summary = ""
28
+
29
+ s.add_dependency(%q<rails>, '>=3.0.0')
30
+ s.add_dependency(%q<capistrano>)
31
+ s.add_dependency(%q<rvm-capistrano>)
32
+ s.add_dependency(%q<capistrano_colors>)
33
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple-rails-deploy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alex Rozumey
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: &70219440632360 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70219440632360
25
+ - !ruby/object:Gem::Dependency
26
+ name: capistrano
27
+ requirement: &70219440631060 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70219440631060
36
+ - !ruby/object:Gem::Dependency
37
+ name: rvm-capistrano
38
+ requirement: &70219440629620 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70219440629620
47
+ - !ruby/object:Gem::Dependency
48
+ name: capistrano_colors
49
+ requirement: &70219440628920 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70219440628920
58
+ description: It simplifies rails deployment process a lot
59
+ email: brain-geek@yandex.ua
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files:
63
+ - LICENSE.txt
64
+ - README.md
65
+ files:
66
+ - .gitignore
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - lib/configs/unicorn.rb
71
+ - lib/deploy/add-to-autostart.rb
72
+ - lib/deploy/robots-deny-all.rb
73
+ - lib/deploy/rvm.rb
74
+ - lib/deploy/sharing-files.rb
75
+ - lib/deploy/unicorn.rb
76
+ - lib/simple-rails-deploy.rb
77
+ - lib/simple-rails-deploy/common.rb
78
+ - lib/simple-rails-deploy/railtie.rb
79
+ - lib/tasks/unicorn.rake
80
+ - simple-rails-deploy.gemspec
81
+ homepage: http://github.com/brain-geek/simple-rails-deploy
82
+ licenses:
83
+ - MIT
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 1.8.16
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: ''
106
+ test_files: []