simple-rails-deploy 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []