instapusher2 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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +5 -0
- data/LICENSE +22 -0
- data/README.md +82 -0
- data/Rakefile +2 -0
- data/bin/instapusher2 +40 -0
- data/instapusher2.gemspec +21 -0
- data/lib/instapusher2.rb +12 -0
- data/lib/instapusher2/commands.rb +65 -0
- data/lib/instapusher2/configuration.rb +53 -0
- data/lib/instapusher2/git.rb +31 -0
- data/lib/instapusher2/job_submission.rb +54 -0
- data/lib/instapusher2/railtie.rb +16 -0
- data/lib/instapusher2/special_instruction_for_production.rb +21 -0
- data/lib/instapusher2/tag_the_release.rb +25 -0
- data/lib/instapusher2/version.rb +3 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e7ebb292c110fdb9d84d44aaab283eb2865aacfb
|
4
|
+
data.tar.gz: 9bd5020b8fdfc2961530828b75be70197f229cbc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 62bbba92fbe34b0180f160d351a73a588194e3d7deb8670e12d48bfd9a229573bc37831d32a73d05bf74243bb967692542ad3d3be8a30605bc04132c9dd54bfc
|
7
|
+
data.tar.gz: fc89c9933644db324e2326be2b1d0b36a01dcb0bd1c97275b0963d534005898a8b315065c9f4c43a18b7d09f9df6574d8c9324e446f762db5e5c525255dd20d2
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Neeraj Singh
|
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.
|
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# Instapusher
|
2
|
+
|
3
|
+
Makes it easy to push to heroku.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
gem install instapusher
|
8
|
+
|
9
|
+
## Setting up account
|
10
|
+
|
11
|
+
* Login at instapusher.com .
|
12
|
+
* Execute `instapusher --api-key` on local machine .
|
13
|
+
|
14
|
+
## Usage
|
15
|
+
|
16
|
+
In order to deploy your code first make sure that you are in the branch that you want to deploy.
|
17
|
+
Then execute this command.
|
18
|
+
|
19
|
+
```
|
20
|
+
instapusher
|
21
|
+
```
|
22
|
+
|
23
|
+
It detects project name and a branch from the git repo and starts deploying your project.
|
24
|
+
|
25
|
+
### Running background jobs and other rake tasks
|
26
|
+
|
27
|
+
Instapusher does not create workers on heroku for your project.
|
28
|
+
Background jobs or rake tasks should be run manually from the console.
|
29
|
+
|
30
|
+
``` sh
|
31
|
+
heroku run rake <TASK_NAME> --app <APP_NAME_GIVEN_BY_INSTAPUSHER>
|
32
|
+
```
|
33
|
+
|
34
|
+
For eg. to run delayed job workers
|
35
|
+
|
36
|
+
``` sh
|
37
|
+
heroku run rake jobs:work --app my-awesome-app-42-add-devise-authentication-ip
|
38
|
+
```
|
39
|
+
|
40
|
+
## Setup Instapusher server
|
41
|
+
|
42
|
+
You can provide the env variable `LOCAL` like:
|
43
|
+
|
44
|
+
instapusher --local
|
45
|
+
|
46
|
+
To enable debug messages do
|
47
|
+
|
48
|
+
instapusher --debug
|
49
|
+
|
50
|
+
Pass host info like this
|
51
|
+
|
52
|
+
INSTAPUSHER_HOST=instapusher.com instapusher
|
53
|
+
|
54
|
+
Also there are other env variables like `INSTAPUSHER_PROJECT` and `INSTAPUSHER_BRANCH`.
|
55
|
+
|
56
|
+
INSTAPUSHER_HOST=instapusher.com INSTAPUSHER_PROJECT=rails INSTAPUSHER_BRANCH=master instapusher
|
57
|
+
|
58
|
+
ALSO you can pass your `api_key`
|
59
|
+
|
60
|
+
API_KEY=xxxx instapusher
|
61
|
+
|
62
|
+
## What problem it solves
|
63
|
+
|
64
|
+
Here at BigBinary we create a separate branch for each feature we work
|
65
|
+
on. Let's say that I am working on `authentication with facebook`.
|
66
|
+
When I am done with the feature then I send pull request to my team
|
67
|
+
members to review. However in order to review the work all the team
|
68
|
+
members need to pull down the branch and fire up `rails server` and then
|
69
|
+
review.
|
70
|
+
|
71
|
+
We like to see things working. So we developed `instapusher` to push a
|
72
|
+
feature branch to heroku instantly with one command. Executing
|
73
|
+
`instapusher` prints a url and we put that url in the pull request so
|
74
|
+
that team members can actually test the feature.
|
75
|
+
|
76
|
+
## Here is how it works
|
77
|
+
|
78
|
+
A video is coming up.
|
79
|
+
|
80
|
+
## License
|
81
|
+
|
82
|
+
`instapusher` is released under MIT License.
|
data/Rakefile
ADDED
data/bin/instapusher2
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/instapusher2'
|
4
|
+
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
options = {}
|
8
|
+
OptionParser.new do |opts|
|
9
|
+
|
10
|
+
opts.on("-v", "--version", "show version") do |v|
|
11
|
+
options[:version] = v
|
12
|
+
end
|
13
|
+
|
14
|
+
opts.on("--quick", "Run quickly") do |v|
|
15
|
+
options[:quick] = v
|
16
|
+
end
|
17
|
+
|
18
|
+
opts.on("--local", "Run locally") do |v|
|
19
|
+
options[:local] = v
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.on("--debug", "Show debug messages") do |v|
|
23
|
+
options[:debug] = v
|
24
|
+
end
|
25
|
+
|
26
|
+
opts.on("--api-key", "Setup Instapusher api key") do |v|
|
27
|
+
options[:api_key] = v
|
28
|
+
end
|
29
|
+
|
30
|
+
end.parse!
|
31
|
+
|
32
|
+
if options[:version]
|
33
|
+
puts Instapusher2::VERSION
|
34
|
+
|
35
|
+
elsif options[:api_key]
|
36
|
+
Instapusher2::Configuration.ask_for_and_write_api_key
|
37
|
+
|
38
|
+
else
|
39
|
+
Instapusher2::Commands.new(options).deploy
|
40
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/instapusher2/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Neeraj Singh"]
|
6
|
+
gem.email = ["neeraj@bigbinary.com"]
|
7
|
+
gem.description = %q{instapusher makes it easy to push code to heroku}
|
8
|
+
gem.summary = %q{instapusher gem makes it easy to push code to heroku}
|
9
|
+
gem.homepage = "http://bigbinary.com"
|
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 = "instapusher2"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Instapusher2::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency("hashr", ">= 0.0.19")
|
19
|
+
gem.add_dependency("json")
|
20
|
+
gem.add_dependency("activesupport")
|
21
|
+
end
|
data/lib/instapusher2.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require_relative './instapusher2/git'
|
2
|
+
require_relative './instapusher2/commands'
|
3
|
+
require_relative './instapusher2/version'
|
4
|
+
require_relative './instapusher2/configuration'
|
5
|
+
require_relative './instapusher2/job_submission'
|
6
|
+
require_relative './instapusher2/special_instruction_for_production'
|
7
|
+
require_relative './instapusher2/tag_the_release'
|
8
|
+
require 'active_support/all'
|
9
|
+
require 'json'
|
10
|
+
|
11
|
+
module Instapusher2
|
12
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative "../instapusher2"
|
2
|
+
require 'net/http'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module Instapusher2
|
6
|
+
class Commands
|
7
|
+
|
8
|
+
attr_reader :debug, :api_key, :branch_name, :project_name
|
9
|
+
|
10
|
+
def initialize init_options = {}
|
11
|
+
@debug = init_options[:debug]
|
12
|
+
@quick = init_options[:quick]
|
13
|
+
@local = init_options[:local]
|
14
|
+
|
15
|
+
git = Git.new
|
16
|
+
@branch_name = init_options[:project_name] || ENV['INSTAPUSHER_BRANCH'] || git.current_branch
|
17
|
+
@project_name = init_options[:branch_name] || ENV['INSTAPUSHER_PROJECT'] || git.project_name
|
18
|
+
end
|
19
|
+
|
20
|
+
def deploy
|
21
|
+
verify_api_key
|
22
|
+
#SpecialInstructionForProduction.new.run if production?
|
23
|
+
|
24
|
+
job_submission = JobSubmission.new(debug, options)
|
25
|
+
job_submission.submit_the_job
|
26
|
+
|
27
|
+
if job_submission.success?
|
28
|
+
job_submission.feedback_to_user
|
29
|
+
TagTheRelease.new(branch_name, debug).tagit if production?
|
30
|
+
else
|
31
|
+
puts job_submission.error_message
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def options
|
38
|
+
@options ||= begin
|
39
|
+
{ project: project_name,
|
40
|
+
branch: branch_name,
|
41
|
+
owner: Git.new.repo_owner,
|
42
|
+
quick: @quick,
|
43
|
+
local: @local,
|
44
|
+
api_key: api_key }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def verify_api_key
|
49
|
+
@api_key = ENV['API_KEY'] || Instapusher::Configuration.api_key(debug) || ""
|
50
|
+
|
51
|
+
if @api_key.to_s.length == 0
|
52
|
+
puts ''
|
53
|
+
abort "No instapusher API key was found. Please execute instapusher --api-key to setup instapusher API key."
|
54
|
+
|
55
|
+
elsif debug
|
56
|
+
puts "api_key is #{@api_key}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def production?
|
61
|
+
branch_name.intern == :production
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
# used to read api_key
|
4
|
+
module Instapusher2
|
5
|
+
module Configuration
|
6
|
+
extend self
|
7
|
+
@_settings = {}
|
8
|
+
attr_reader :_settings
|
9
|
+
|
10
|
+
def load(debug = false, filename=nil)
|
11
|
+
filename ||= File.join(ENV['HOME'], '.instapusher')
|
12
|
+
|
13
|
+
unless File.exist? filename
|
14
|
+
File.new(filename, File::CREAT|File::TRUNC|File::RDWR, 0644).close
|
15
|
+
end
|
16
|
+
|
17
|
+
@_settings = YAML::load_file(filename) || {}
|
18
|
+
|
19
|
+
if debug
|
20
|
+
puts @_settings.inspect
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def ask_for_api_key
|
25
|
+
puts ""
|
26
|
+
puts "Note: Your instapusher API key is available at http://www.instapusher.com/my/api_key"
|
27
|
+
puts ""
|
28
|
+
puts "Enter your Instapusher API key:"
|
29
|
+
api_key = ask
|
30
|
+
api_key
|
31
|
+
end
|
32
|
+
|
33
|
+
def ask_for_and_write_api_key
|
34
|
+
api_key = ask_for_api_key
|
35
|
+
instapusher_config = {"api_key" => api_key}
|
36
|
+
File.open(File.join(Dir.home, ".instapusher2"), "w") do |file|
|
37
|
+
file.write instapusher_config.to_yaml
|
38
|
+
end
|
39
|
+
|
40
|
+
puts ""
|
41
|
+
puts "You are all set. Start using instapusher2."
|
42
|
+
end
|
43
|
+
|
44
|
+
def ask
|
45
|
+
$stdin.gets.to_s.strip
|
46
|
+
end
|
47
|
+
|
48
|
+
def method_missing(name, *args, &block)
|
49
|
+
self.load
|
50
|
+
@_settings[name.to_s]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Instapusher2
|
2
|
+
class Git
|
3
|
+
def current_branch
|
4
|
+
result = %x{git branch}.split("\n")
|
5
|
+
if result.empty?
|
6
|
+
raise "It seems your app is not a git repo"
|
7
|
+
else
|
8
|
+
result.select { |b| b =~ /^\*/ }.first.split(" ").last.strip
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def current_user
|
13
|
+
`git config user.name`.chop!
|
14
|
+
end
|
15
|
+
|
16
|
+
def project_name
|
17
|
+
result = `git config remote.origin.url`.chop!.scan(/\/([^\/]+)?$/).flatten.first
|
18
|
+
result.sub!(/\.git$/, '') if result
|
19
|
+
result ||= File.basename(Dir.getwd)
|
20
|
+
result
|
21
|
+
end
|
22
|
+
|
23
|
+
def repo_owner
|
24
|
+
string = `git remote -v | grep fetch | grep origin`
|
25
|
+
regex = /.*:(.*)\/.*/
|
26
|
+
match_data = string.match(regex)
|
27
|
+
match_data.to_a.last
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Instapusher2
|
2
|
+
class JobSubmission
|
3
|
+
|
4
|
+
attr_reader :options, :debug, :job_status_url, :response_body
|
5
|
+
|
6
|
+
DEFAULT_HOSTNAME = 'instapusher.com'
|
7
|
+
|
8
|
+
def initialize debug, options
|
9
|
+
@debug = debug
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def success?
|
14
|
+
job_status_url && job_status_url != ""
|
15
|
+
end
|
16
|
+
|
17
|
+
def pre_submission_feedback_to_user
|
18
|
+
puts "url to hit: #{url_to_submit_job.inspect}"
|
19
|
+
puts "options being passed to the url: #{options.inspect}"
|
20
|
+
puts "connecting to #{url_to_submit_job} to send data"
|
21
|
+
end
|
22
|
+
|
23
|
+
def feedback_to_user
|
24
|
+
puts 'The application will be deployed to: ' + response_body['heroku_url']
|
25
|
+
puts 'Monitor the job status at: ' + job_status_url
|
26
|
+
cmd = "open #{job_status_url}"
|
27
|
+
`#{cmd}`
|
28
|
+
end
|
29
|
+
|
30
|
+
def error_message
|
31
|
+
response_body['error']
|
32
|
+
end
|
33
|
+
|
34
|
+
def submit_the_job
|
35
|
+
pre_submission_feedback_to_user if debug
|
36
|
+
|
37
|
+
response = Net::HTTP.post_form URI.parse(url_to_submit_job), options
|
38
|
+
@response_body = ::JSON.parse(response.body)
|
39
|
+
puts "response_body: #{response_body.inspect}" if debug
|
40
|
+
@job_status_url = response_body['status'] || response_body['job_status_url']
|
41
|
+
end
|
42
|
+
|
43
|
+
def url_to_submit_job
|
44
|
+
@url ||= begin
|
45
|
+
hostname = if options[:local]
|
46
|
+
"localhost:3000"
|
47
|
+
else
|
48
|
+
ENV['INSTAPUSHER_HOST'] || DEFAULT_HOSTNAME
|
49
|
+
end
|
50
|
+
"http://#{hostname}/heroku.json"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Instapusher2
|
2
|
+
class SpecialInstructionForProduction
|
3
|
+
|
4
|
+
def run
|
5
|
+
question = "You are deploying to production. Did you take backup? If not then execute rake handy:heroku:backup_production and then come back. "
|
6
|
+
STDOUT.puts question
|
7
|
+
STDOUT.puts "Answer 'yes' or 'no' "
|
8
|
+
|
9
|
+
input = STDIN.gets.chomp.downcase
|
10
|
+
|
11
|
+
if %w(yes y).include?(input)
|
12
|
+
#do nothing
|
13
|
+
elsif %w(no n).include?(input)
|
14
|
+
abort "Please try again when you have taken the backup"
|
15
|
+
else
|
16
|
+
abort "Please answer yes or no"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Instapusher2
|
2
|
+
class TagTheRelease
|
3
|
+
|
4
|
+
attr_reader :branch_name, :debug
|
5
|
+
|
6
|
+
def initialize branch_name, debug
|
7
|
+
@branch_name = branch_name
|
8
|
+
@debug = debug
|
9
|
+
end
|
10
|
+
|
11
|
+
def tagit
|
12
|
+
version_number = Time.current.to_s.parameterize
|
13
|
+
tag_name = "#{branch_name}-#{version_number}"
|
14
|
+
|
15
|
+
cmd = "git tag -a -m \"Version #{tag_name}\" #{tag_name}"
|
16
|
+
puts cmd if debug
|
17
|
+
system cmd
|
18
|
+
|
19
|
+
cmd = "git push --tags"
|
20
|
+
puts cmd if debug
|
21
|
+
system cmd
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: instapusher2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Neeraj Singh
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hashr
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.19
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.19
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: instapusher makes it easy to push code to heroku
|
56
|
+
email:
|
57
|
+
- neeraj@bigbinary.com
|
58
|
+
executables:
|
59
|
+
- instapusher2
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- .gitignore
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- bin/instapusher2
|
69
|
+
- instapusher2.gemspec
|
70
|
+
- lib/instapusher2.rb
|
71
|
+
- lib/instapusher2/commands.rb
|
72
|
+
- lib/instapusher2/configuration.rb
|
73
|
+
- lib/instapusher2/git.rb
|
74
|
+
- lib/instapusher2/job_submission.rb
|
75
|
+
- lib/instapusher2/railtie.rb
|
76
|
+
- lib/instapusher2/special_instruction_for_production.rb
|
77
|
+
- lib/instapusher2/tag_the_release.rb
|
78
|
+
- lib/instapusher2/version.rb
|
79
|
+
homepage: http://bigbinary.com
|
80
|
+
licenses: []
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.0.3
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: instapusher gem makes it easy to push code to heroku
|
102
|
+
test_files: []
|