ship-it 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in shipit.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem 'guard-rspec'
8
+ end
@@ -0,0 +1,10 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :version => 2 do
5
+ watch(%r{^spec/.+_spec\.rb$}) { "spec" }
6
+ watch(%r{^lib/(.+)\.rb$}) { "spec" }
7
+ watch(%r{^lib/shipit/(.+)\.rb$}) { "spec" }
8
+ watch('spec/spec_helper.rb') { "spec" }
9
+ end
10
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Eric J. Holmes
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,42 @@
1
+ # Shipit
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'shipit'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install shipit
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Hubot
24
+ How I want to deploy:
25
+
26
+ ```
27
+ hubot setup github/repo for deployment
28
+ hubot deploy repo/master to production #=> Deploying repo/master to the production environment
29
+ hubot deploy repo/feature to staging #=> Deploying repo/feature to the staging environment
30
+ hubot what's on staging? #=> repo/feature is currently on the staging environment
31
+ hubot lock staging because I'm collecting stats #=> Ok, I've locked the staging environment
32
+ hubot why is staging locked? #=> The staging environment is locked because User is collecting stats
33
+ hubot unlock staging #=> Ok, I've unlocked the staging environment
34
+ ```
35
+
36
+ ## Contributing
37
+
38
+ 1. Fork it
39
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
40
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
41
+ 4. Push to the branch (`git push origin my-new-feature`)
42
+ 5. Create new Pull Request
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env rake
2
+ $LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
3
+ ENV["RACK_ENV"] ||= "development"
4
+ require "bundler/gem_tasks"
5
+
6
+ require "shipit"
7
+ Shipit.setup(ENV)
8
+ require "shipit/tasks"
9
+
10
+ require 'rspec/core/rake_task'
11
+
12
+ RSpec::Core::RakeTask.new(:spec)
13
+
14
+ task :default => :spec
@@ -0,0 +1,3 @@
1
+ require "shipit"
2
+ Shipit.setup(ENV)
3
+ run Shipit.app
@@ -0,0 +1 @@
1
+ require "shipit"
@@ -0,0 +1,48 @@
1
+ require "active_record"
2
+ require "sinatra/base"
3
+ require "open3"
4
+
5
+ require "shipit/version"
6
+ require "shipit/app"
7
+
8
+ require "shipit/repository"
9
+ require "shipit/environment"
10
+ require "shipit/job"
11
+
12
+ module Shipit
13
+ class << self
14
+ def setup(settings)
15
+ env = settings["RACK_ENV"]
16
+ if env.nil? || env.empty?
17
+ raise Error, "RACK_ENV is required"
18
+ end
19
+
20
+ if env != "production"
21
+ settings["DATABASE_URL"] ||= "mysql2://root@localhost/shipit_#{env}"
22
+ end
23
+
24
+ database = URI(settings["DATABASE_URL"])
25
+ adapter = database.scheme == "postgres" ? "postgresql" : database.scheme
26
+
27
+ connection = {
28
+ :adapter => adapter,
29
+ :host => database.host,
30
+ :database => database.path[1..-1],
31
+ :username => database.user,
32
+ :password => database.password,
33
+ :reconnect => true,
34
+ }
35
+ ActiveRecord::Base.establish_connection(connection)
36
+ end
37
+
38
+ def app
39
+ @app ||= Rack::Builder.new {
40
+ run Shipit::App
41
+ }
42
+ end
43
+
44
+ def enable_mock!
45
+ Job.enable_mock!
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,15 @@
1
+ module Shipit
2
+ class App < Sinatra::Base
3
+ get '/' do
4
+ "ok"
5
+ end
6
+
7
+ post '/setup' do
8
+ Repository.setup(params)
9
+ end
10
+
11
+ post '/ship' do
12
+ Job.start(params)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ class CreateRepositories < ActiveRecord::Migration
2
+ def change
3
+ create_table :repositories do |t|
4
+ t.string :name
5
+ t.string :uri
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class CreateJobs < ActiveRecord::Migration
2
+ def change
3
+ create_table :jobs do |t|
4
+ t.string :env
5
+ t.string :output
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class AddRepositoryIdToJob < ActiveRecord::Migration
2
+ def change
3
+ add_column :jobs, :repository_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class CreateEnvironments < ActiveRecord::Migration
2
+ def change
3
+ create_table :environments do |t|
4
+ t.string :repository_id
5
+ t.string :name
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class RemoveEnvFromJob < ActiveRecord::Migration
2
+ def up
3
+ remove_column :jobs, :env
4
+ remove_column :jobs, :repository_id
5
+ end
6
+
7
+ def down
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddEnvironmentIdToJob < ActiveRecord::Migration
2
+ def change
3
+ add_column :jobs, :environment_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended to check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(:version => 20120701090245) do
15
+
16
+ create_table "environments", :force => true do |t|
17
+ t.string "repository_id"
18
+ t.string "name"
19
+ t.datetime "created_at", :null => false
20
+ t.datetime "updated_at", :null => false
21
+ end
22
+
23
+ create_table "jobs", :force => true do |t|
24
+ t.string "output"
25
+ t.datetime "created_at", :null => false
26
+ t.datetime "updated_at", :null => false
27
+ t.integer "environment_id"
28
+ end
29
+
30
+ create_table "repositories", :force => true do |t|
31
+ t.string "name"
32
+ t.string "uri"
33
+ t.datetime "created_at", :null => false
34
+ t.datetime "updated_at", :null => false
35
+ end
36
+
37
+ end
@@ -0,0 +1,15 @@
1
+ module Shipit
2
+ class Environment < ActiveRecord::Base
3
+ belongs_to :repository
4
+
5
+ def self.find_or_create(repo, name)
6
+ env = self.find_by_name(name) || begin
7
+ self.new(:repository => repo, :name => name).tap { |r| r.save }
8
+ end
9
+ end
10
+
11
+ def command
12
+ self.repository.command.gsub /{{env}}/, self.name
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,76 @@
1
+ module Shipit
2
+ class Job < ActiveRecord::Base
3
+ belongs_to :environment
4
+ belongs_to :repository
5
+
6
+ delegate :repository, :to => :environment
7
+
8
+ def self.start(params)
9
+ repo = Repository.find_by_name(params[:name])
10
+ env = Environment.find_or_create(repo, (params[:env] || "production"))
11
+ new(:environment => env).tap { |job| job.save }.run
12
+ end
13
+
14
+ # Runs the deploy
15
+ def run
16
+ self.clone
17
+ self.deploy
18
+ end
19
+
20
+ def clone
21
+ Kernel.system <<-SHELL
22
+ mkdir -p #{dir}
23
+ cd #{dir}
24
+ if [ ! -d './.git' ]; then
25
+ git init
26
+ git remote add origin #{repository.uri}
27
+ fi
28
+ git fetch -q origin
29
+ git reset -q --hard origin/#{branch}
30
+ SHELL
31
+ end
32
+
33
+ def deploy
34
+ self.output = ""
35
+ Bundler.with_clean_env do
36
+ IO.popen(command, :err => [:child, :out]) do |io|
37
+ io.each { |line| self.output << line }
38
+ end
39
+ end
40
+ self.save
41
+ end
42
+
43
+ # TODO: Make configurable
44
+ def branch
45
+ "master"
46
+ end
47
+
48
+ def command
49
+ "cd #{dir}; #{environment.command}"
50
+ end
51
+
52
+ # Mocks cloning and deploying
53
+ def self.enable_mock!
54
+ self.class_eval do
55
+ def clone
56
+ Kernel.system <<-SHELL
57
+ rm -rf #{dir}
58
+ mkdir -p #{File.dirname(dir)}
59
+ cp -r #{File.expand_path('../../../spec/fixtures/repo', __FILE__)} #{dir}
60
+ SHELL
61
+ end
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def dir
68
+ File.join(File.expand_path(tmpdir), repository.name)
69
+ end
70
+
71
+ def tmpdir
72
+ "tmp/repos"
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,16 @@
1
+ module Shipit
2
+ class Repository < ActiveRecord::Base
3
+ has_many :jobs
4
+
5
+ def self.setup(params)
6
+ uri = "git@github.com:#{params[:repo]}"
7
+ name = params[:name]
8
+ new(:uri => uri, :name => name).tap { |r| r.save }
9
+ end
10
+
11
+ # TODO: Make configurable
12
+ def command
13
+ "bundle install --path vendor/gems --binstubs; bundle exec rake {{env}} deploy"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,44 @@
1
+ require "rake"
2
+ require "rake/tasklib"
3
+
4
+ module Shipit
5
+ module Tasks
6
+ extend Rake::DSL
7
+
8
+ namespace :db do
9
+ desc "Run the migration(s)"
10
+ task :migrate do
11
+ path = db_dir.join("migrate").to_s
12
+ ActiveRecord::Migration.verbose = true
13
+ ActiveRecord::Migrator.migrate(path)
14
+
15
+ Rake::Task["db:schema:dump"].invoke
16
+ end
17
+
18
+ namespace :schema do
19
+ desc "Dump the database schema into a standard Rails schema.rb file"
20
+ task :dump do
21
+ require "active_record/schema_dumper"
22
+
23
+ path = db_dir.join("schema.rb").to_s
24
+
25
+ File.open(path, "w:utf-8") do |fd|
26
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, fd)
27
+ end
28
+ end
29
+ end
30
+
31
+ namespace :create do
32
+ desc "Create the databases"
33
+ task :all do
34
+ system "mysqladmin -uroot create shipit_development"
35
+ system "mysqladmin -uroot create shipit_test"
36
+ end
37
+ end
38
+ end
39
+
40
+ def self.db_dir
41
+ @db_dir ||= Pathname(__FILE__).expand_path.join("../database")
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,3 @@
1
+ module Shipit
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/shipit/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Eric J. Holmes"]
6
+ gem.email = ["eric@ejholmes.net"]
7
+ gem.description = %q{Shipit is a sinatra app for continous deployment}
8
+ gem.summary = %q{Shipit is a sinatra app for continous deployment}
9
+ gem.homepage = "https://github.com/ejholmes/shipit"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "ship-it"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Shipit::VERSION
17
+
18
+ gem.add_dependency "rake", "~> 0.9.2"
19
+ gem.add_dependency "sinatra", "~> 1.3.2"
20
+ gem.add_dependency "thin", "~> 1.3.1"
21
+ gem.add_dependency "activerecord", "~> 3.2.6"
22
+ gem.add_dependency "delayed_job_active_record", "~> 0.3.2"
23
+
24
+ gem.add_development_dependency "shotgun", "~> 0.9"
25
+ gem.add_development_dependency "rspec", "~> 2.10.0"
26
+ gem.add_development_dependency "mysql2", "~>0.3.0"
27
+ gem.add_development_dependency "rack-test"
28
+ gem.add_development_dependency "mocha"
29
+ end
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gem 'rake'
@@ -0,0 +1,7 @@
1
+ task :deploy do
2
+ puts "deployed ok"
3
+ end
4
+
5
+ task :production do
6
+ puts "deployed ok"
7
+ end
@@ -0,0 +1,78 @@
1
+ require "spec_helper"
2
+
3
+ describe Shipit do
4
+ include Rack::Test::Methods
5
+
6
+ describe "GET '/'" do
7
+ before do
8
+ get '/'
9
+ end
10
+
11
+ specify { last_response.should be_ok }
12
+ specify { last_response.body.should eq "ok" }
13
+ end
14
+
15
+ describe "POST '/setup'" do
16
+ before do
17
+ post '/setup', post_data
18
+ end
19
+
20
+ context "with valid data" do
21
+ let(:post_data) do
22
+ { :repo => "ejholmes/shipit", :name => "shipit" }
23
+ end
24
+
25
+ specify { last_response.should be_ok }
26
+
27
+ describe "the created repository" do
28
+ subject { Shipit::Repository.last }
29
+
30
+ it { should be_valid }
31
+ its(:name) { should eq 'shipit' }
32
+ its(:uri) { should eq 'git@github.com:ejholmes/shipit' }
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "POST '/ship'" do
38
+ before do
39
+ post '/ship', post_data
40
+ end
41
+
42
+ context "with valid data" do
43
+ let!(:repo) { Shipit::Repository.setup(:repo => "ejholmes/shipit", :name => "shipit") }
44
+ let(:post_data) do
45
+ { :name => "shipit", :env => "production" }
46
+ end
47
+
48
+ specify { last_response.should be_ok }
49
+
50
+ describe "the created job" do
51
+ subject { Shipit::Job.last }
52
+
53
+ it { should be_valid }
54
+ its(:output) { should =~ /.*deployed ok.*/}
55
+ specify { subject.environment.name.should eq "production" }
56
+ end
57
+ end
58
+ end
59
+
60
+ pending "POST '/lock'" do
61
+ before do
62
+ post '/lock', post_data
63
+ end
64
+
65
+ context "with valid data" do
66
+ let!(:repo) { Shipit::Repository.setup(:repo => "ejholmes/shipit", :name => "shipit") }
67
+ let(:post_data) do
68
+ { :name => "shipit", :env => "production", :message => "This environment is locked" }
69
+ end
70
+
71
+ describe "the repository" do
72
+ subject { repo }
73
+
74
+ it { should be_locked }
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,14 @@
1
+ ENV["RACK_ENV"] = "test"
2
+
3
+ require "rspec"
4
+ require "mocha"
5
+ require "rack/test"
6
+
7
+ require "shipit"
8
+ Shipit.setup(ENV)
9
+
10
+ def app
11
+ Shipit.app
12
+ end
13
+
14
+ Shipit.enable_mock!
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ship-it
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Eric J. Holmes
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &70117317397040 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70117317397040
25
+ - !ruby/object:Gem::Dependency
26
+ name: sinatra
27
+ requirement: &70117317395700 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.3.2
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70117317395700
36
+ - !ruby/object:Gem::Dependency
37
+ name: thin
38
+ requirement: &70117317394560 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.3.1
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70117317394560
47
+ - !ruby/object:Gem::Dependency
48
+ name: activerecord
49
+ requirement: &70117317393540 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 3.2.6
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70117317393540
58
+ - !ruby/object:Gem::Dependency
59
+ name: delayed_job_active_record
60
+ requirement: &70117317392300 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 0.3.2
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70117317392300
69
+ - !ruby/object:Gem::Dependency
70
+ name: shotgun
71
+ requirement: &70117317390660 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '0.9'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70117317390660
80
+ - !ruby/object:Gem::Dependency
81
+ name: rspec
82
+ requirement: &70117317389220 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 2.10.0
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70117317389220
91
+ - !ruby/object:Gem::Dependency
92
+ name: mysql2
93
+ requirement: &70117317378600 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 0.3.0
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70117317378600
102
+ - !ruby/object:Gem::Dependency
103
+ name: rack-test
104
+ requirement: &70117317378160 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70117317378160
113
+ - !ruby/object:Gem::Dependency
114
+ name: mocha
115
+ requirement: &70117317376280 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *70117317376280
124
+ description: Shipit is a sinatra app for continous deployment
125
+ email:
126
+ - eric@ejholmes.net
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - .gitignore
132
+ - Gemfile
133
+ - Guardfile
134
+ - LICENSE
135
+ - README.md
136
+ - Rakefile
137
+ - config.ru
138
+ - lib/ship-it.rb
139
+ - lib/shipit.rb
140
+ - lib/shipit/app.rb
141
+ - lib/shipit/database/migrate/20120630164223_create_repositories.rb
142
+ - lib/shipit/database/migrate/20120701075737_create_jobs.rb
143
+ - lib/shipit/database/migrate/20120701080236_add_repository_id_to_job.rb
144
+ - lib/shipit/database/migrate/20120701084955_create_environments.rb
145
+ - lib/shipit/database/migrate/20120701085528_remove_env_from_job.rb
146
+ - lib/shipit/database/migrate/20120701090245_add_environment_id_to_job.rb
147
+ - lib/shipit/database/schema.rb
148
+ - lib/shipit/environment.rb
149
+ - lib/shipit/job.rb
150
+ - lib/shipit/repository.rb
151
+ - lib/shipit/tasks.rb
152
+ - lib/shipit/version.rb
153
+ - shipit.gemspec
154
+ - spec/fixtures/repo/Gemfile
155
+ - spec/fixtures/repo/Rakefile
156
+ - spec/lib/shipit_spec.rb
157
+ - spec/spec_helper.rb
158
+ homepage: https://github.com/ejholmes/shipit
159
+ licenses: []
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ requirements: []
177
+ rubyforge_project:
178
+ rubygems_version: 1.8.11
179
+ signing_key:
180
+ specification_version: 3
181
+ summary: Shipit is a sinatra app for continous deployment
182
+ test_files:
183
+ - spec/fixtures/repo/Gemfile
184
+ - spec/fixtures/repo/Rakefile
185
+ - spec/lib/shipit_spec.rb
186
+ - spec/spec_helper.rb
187
+ has_rdoc: