lobstr 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,19 @@
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
18
+ config/lobstr.yml
19
+ Lobfile
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.9.2
5
+ - jruby-19mode
6
+ - rbx-19mode
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Eric Marden
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,59 @@
1
+ # Lobstr
2
+
3
+ [![Build Status](https://secure.travis-ci.org/xentek/lobstr.png)](http://travis-ci.org/xentek/lobstr)
4
+
5
+ deployments so easy, even a zoidberg can do it.
6
+
7
+ ![why not lobstr?](http://f.cl.ly/items/0S392f3e3f00373A2l3Y/why-not-lobstr.jpg)
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'lobstr'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install lobstr
22
+
23
+ ## Usage
24
+
25
+ ````bash
26
+ $ lob deploy branch@environment
27
+ ````
28
+
29
+ Since `deploy` is the default task, Lobstr supports additional syntax to
30
+ save your typing fingers:
31
+
32
+ ````bash
33
+ # without branch or @ (requires task name though), currently defaults to "master"
34
+ $ lob deploy production
35
+
36
+ # without task name, but full branch and environment
37
+ $ lob branch@environment
38
+
39
+ # without task name or environment, currently defaults to "production"
40
+ $ lob branch@
41
+
42
+ # without task name or branch, currently defaults to "master"
43
+ $ lob @producuction
44
+
45
+ # without any input, currently defaults to "master@production"
46
+ $ lob
47
+ ````
48
+
49
+ ## Configuration
50
+
51
+ *Coming soon*
52
+
53
+ ## Contributing
54
+
55
+ 1. Fork it
56
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
57
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
58
+ 4. Push to the branch (`git push origin my-new-feature`)
59
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ desc "run the specs"
4
+ task :spec do
5
+ puts `bundle exec turn -Ispec spec/*_spec.rb`
6
+ end
7
+ task :default => :spec
8
+ task :test => :spec
9
+ task :specs => :spec
data/bin/lob ADDED
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'thor'
4
+ require 'lobstr'
5
+
6
+ class Lob < Thor
7
+
8
+
9
+ desc "deploy TARGET", "lobs code at the branch and environment you specify"
10
+ long_desc "lobs code at the branch and environment you specify, separated by @
11
+ \n\n
12
+ Example: lob deploy master@production"
13
+ def deploy(target='master@production')
14
+ if File.exist? 'Lobfile'
15
+ Lobstr.target = target
16
+ load "Lobfile"
17
+ else
18
+ lobstr target do
19
+ connect do
20
+ deploy
21
+ end
22
+ end
23
+ end
24
+ end
25
+ default_task :deploy
26
+
27
+ desc "rollback ENVIRONMENT", "rolls the last deployment back"
28
+ def rollback(environment)
29
+ lobstr environment do
30
+ connect do
31
+ rollback
32
+ notify(:rollback)
33
+ end
34
+ end
35
+ end
36
+
37
+ desc "setup ENVIRONMENT", "runs your setup recipe"
38
+ method_option :file, :type => :string, :aliases => '-f'
39
+ def setup(environment)
40
+ if options['file']
41
+ if File.exist? options['file']
42
+ load options['file']
43
+ else
44
+ say "#{set_color(options['file'] ,:yellow)} #{set_color('does not exist', :red)}"
45
+ end
46
+ else
47
+ lobstr environment do
48
+ connect do
49
+ setup
50
+ notify(:setup)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ desc "config", "displays current configuration"
57
+ long_desc "displays current configuration"
58
+ method_option :init, :type => :boolean, :default => false,
59
+ :desc => "creates the configurtion file, unless it exists"
60
+ method_option :reset, :type => :boolean, :default => false,
61
+ :desc => "removes current configuration file and creates a new one"
62
+ def config
63
+ @config = Lobstr::Config.new
64
+
65
+ if options['init']
66
+ say "Created Lobstr Config:", :green if @config.create
67
+ end
68
+
69
+ if options['reset']
70
+ say "Reset Lobstr Config:", :red if @config.reset
71
+ end
72
+
73
+ say @config.print
74
+ end
75
+ end
76
+
77
+ begin
78
+ ENV['THOR_DEBUG'] = '1'
79
+ Lob.start
80
+ rescue Thor::UndefinedTaskError => e
81
+ if ARGV[0] =~ /@/
82
+ Lob.new.invoke(:deploy, ARGV)
83
+ else
84
+ Lob.new.say e.message, :red
85
+ end
86
+ rescue => e
87
+ p e
88
+ p e.backtrace.last
89
+ Lob.new.say e.message, :on_red
90
+ end
data/lib/lobstr.rb ADDED
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'yaml'
4
+ require 'net/ssh'
5
+ require 'highline/import'
6
+ require 'lobstr/base'
7
+ require 'lobstr/config'
8
+ require 'lobstr/deploy'
9
+ require 'lobstr/error'
10
+ require 'lobstr/version'
11
+
12
+ module Lobstr
13
+ class << self ; attr_accessor :target ; end
14
+ end
15
+
16
+ def lobstr(target = nil, config_file = 'config/lobstr.yml', &block)
17
+ target ||= Lobstr.target
18
+ Lobstr::Deploy.new(target, config_file, &block)
19
+ end
@@ -0,0 +1,33 @@
1
+ require 'minitest/mock'
2
+ module Lobstr
3
+ class Base
4
+ attr_accessor :branch, :environment, :config, :ssh
5
+ def parse_target(target)
6
+ branch,environment = target.split('@', 2)
7
+
8
+ if environment.nil? # e.g. production
9
+ environment = branch
10
+ branch = 'master'
11
+ end
12
+
13
+ branch = "master" if branch.empty? # e.g. @production
14
+ environment = "production" if environment.empty? # e.g. master@
15
+ [branch,environment]
16
+ end
17
+
18
+ def connect(&block)
19
+ @ssh = ::Net::SSH.start(@config['ssh_host'],
20
+ @config['ssh_user'],
21
+ :keys => [@config['ssh_key']])
22
+ instance_eval(&block) if block_given?
23
+ end
24
+
25
+ def remote_task(cmd)
26
+ @ssh.exec! cmd
27
+ end
28
+
29
+ def local_task(cmd)
30
+ `#{cmd}`
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,61 @@
1
+ module Lobstr
2
+ class Config
3
+ attr_accessor :config_file, :config_path
4
+
5
+ def initialize(config = 'config/lobstr.yml')
6
+ @config_file = config
7
+ @config_path = File.dirname config
8
+ end
9
+
10
+ def template
11
+ <<-TEMPLATE.gsub!(/^ /,'')
12
+ lobstr: &defaults
13
+ app: lobstr
14
+ repos: git://github.com/xentek/lobstr.git
15
+ path: ~/lobstr
16
+ ssh_host: localhost
17
+ ssh_user: xentek
18
+ ssh_key: ~/.ssh/id_rsa
19
+ branch: master
20
+ environment: production
21
+ production:
22
+ <<: *defaults
23
+ TEMPLATE
24
+ end
25
+
26
+ def create
27
+ raise Lobstr::Error::ConfigFileExists, @config_file if config_file_exists?
28
+ Dir.mkdir(@config_path) unless Dir.exist?(@config_path)
29
+ File.open(@config_file, 'w') {|f| f.write(template) }
30
+ end
31
+
32
+ def reset
33
+ File.delete(@config_file) if config_file_exists?
34
+ create
35
+ end
36
+
37
+ def parse(environment = 'production')
38
+ check_config_file
39
+ config = YAML.load_file(@config_file)[environment]
40
+ raise Lobstr::Error::InvalidEnvironment, environment if config.nil?
41
+ config
42
+ end
43
+
44
+ def print
45
+ check_config_file
46
+ File.open(@config_file, 'r').read
47
+ end
48
+
49
+ private
50
+
51
+ def config_file_exists?
52
+ File.exist? @config_file
53
+ end
54
+
55
+ def check_config_file
56
+ unless config_file_exists?
57
+ raise Lobstr::Error::ConfigFileMissing, @config_file
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,89 @@
1
+ module Lobstr
2
+ class Deploy < ::Lobstr::Base
3
+ def initialize(target, config_file = 'config/lobstr.yml', &block)
4
+ @branch,@environment = parse_target(target)
5
+ @config = Lobstr::Config.new(config_file).parse(@environment)
6
+ if block_given?
7
+ return instance_eval(&block)
8
+ else
9
+ return self
10
+ end
11
+ end
12
+
13
+ def deploy
14
+ connect do
15
+ update
16
+ bundle_install
17
+ notify
18
+ end
19
+ end
20
+
21
+ def update
22
+ remote_task "cd #{@config['path']}"
23
+ remote_task "git fetch origin"
24
+ remote_task "git reset --hard #{@branch}"
25
+ remote_task "cd #{@config['path']}"
26
+ remote_task 'git reflog delete --rewrite HEAD@{1}'
27
+ remote_task 'git reflog delete --rewrite HEAD@{1}'
28
+ end
29
+
30
+ def restart(sudo = true)
31
+ sudoit = (sudo) ? 'sudo' : ''
32
+ remote_task "#{sudoit} /etc/init.d/#{@config['app']}"
33
+ end
34
+
35
+ def rollback
36
+ remote_task "cd #{@config['path']}"
37
+ remote_task "git fetch origin"
38
+ remote_task "git reset --hard HEAD@{1}"
39
+ end
40
+
41
+ def notify(event = :deployment)
42
+ "notify of #{event}"
43
+ end
44
+
45
+ def setup(&block)
46
+ return instance_eval(&block) if block_given?
47
+ remote_task "git clone #{@config['repos']} #{@config['path']}"
48
+ bundle_install
49
+ export_foreman
50
+ end
51
+
52
+ def bundle_install(options = {})
53
+ if config.has_key? 'bundler'
54
+ options = @config['bundler'].merge(options)
55
+ else
56
+ options = {
57
+ 'deployment' => nil,
58
+ 'path' => 'vendor/bundle',
59
+ 'without' => 'development test'
60
+ }.merge(options)
61
+ end
62
+ options_string = ''
63
+ options.each { |k,v| options_string += "--#{k} #{v} " }
64
+ remote_task "bundle install #{options_string}"
65
+ end
66
+
67
+ def export_foreman(format='upstart', location='/etc/init', options={})
68
+ valid_formats = ['bluepill','inittab','runit','upstart']
69
+ unless valid_formats.include? format
70
+ raise Lobstr::Error::InvalidExportFormat
71
+ end
72
+ if @config.has_key? 'foreman'
73
+ options = @config['foreman'].merge(options)
74
+ else
75
+ options = {
76
+ 'app' => @config['app'],
77
+ 'log' => "#{@config['path']}/log",
78
+ 'user' => @config['ssh_user'],
79
+ 'procfile' => "#{@config['path']}/Procfile"
80
+ }.merge(options)
81
+ end
82
+
83
+ options_string = ''
84
+ options.each { |k,v| options_string += "--#{k} #{v} " }
85
+
86
+ remote_task "foreman export #{format} #{location} #{options_string}"
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,23 @@
1
+ module Lobstr
2
+ module Error
3
+
4
+ class InvalidEnvironment < StandardError
5
+ def initialize(environment)
6
+ super "Invalid Environment: #{environment}. Can't load config."
7
+ end
8
+ end
9
+
10
+ class ConfigFileExists < StandardError
11
+ def initialize(config_file)
12
+ super "#{config_file} already exists"
13
+ end
14
+ end
15
+
16
+ class ConfigFileMissing < StandardError
17
+ def initialize(config_file)
18
+ super "#{config_file} is missing. try: \n\n$ lob config --init"
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Lobstr
2
+ VERSION = "0.0.1"
3
+ end
data/lobstr.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lobstr/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "lobstr"
8
+ gem.version = Lobstr::VERSION
9
+ gem.authors = ["Eric Marden"]
10
+ gem.email = ["eric@xentek.net"]
11
+ gem.description = %q{deployments so easy, even a zoidberg can do it}
12
+ gem.summary = gem.description
13
+ gem.homepage = "https://github.com/xentek/lobstr"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ gem.required_ruby_version = '>= 1.9.2'
20
+
21
+ gem.add_runtime_dependency('psych', '~> 1.3') unless RUBY_PLATFORM == 'java'
22
+
23
+ gem.add_dependency('thor', '~> 0.16')
24
+ gem.add_dependency('net-ssh', '~> 2.5')
25
+ gem.add_dependency('highline', '~> 1.6')
26
+
27
+ gem.add_development_dependency('rake', '~> 0.9.2')
28
+ gem.add_development_dependency('minitest', '~> 3.4')
29
+ gem.add_development_dependency('ansi', '~> 1.4')
30
+ gem.add_development_dependency('turn', '~> 0.9')
31
+ gem.add_development_dependency('pry', '~> 0.9')
32
+ gem.add_development_dependency('mocha', '~> 0.12')
33
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lobstr::Base do
4
+
5
+ before do
6
+ @deploy = Lobstr::Base.new
7
+ end
8
+
9
+ describe "parse_target" do
10
+ it "can parse deployment target (full): branch@env" do
11
+ @deploy.parse_target('branch@env').must_equal ['branch','env']
12
+ end
13
+
14
+ it "can parse deployment target (branch only): branch@" do
15
+ @deploy.parse_target('branch@').must_equal ['branch','production']
16
+ end
17
+
18
+ it "can parse deployment target (env only): @environment" do
19
+ @deploy.parse_target('@environment').must_equal ['master','environment']
20
+ end
21
+
22
+ it "can parse deployment target (env only) - alt syntax: environment" do
23
+ @deploy.parse_target('@environment').must_equal ['master','environment']
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,102 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lobstr::Config do
4
+ before do
5
+ @config_file = 'spec/config/lobstr.yml'
6
+ @config = Lobstr::Config.new(@config_file)
7
+ end
8
+
9
+ after do
10
+ clean_up_config_file @config_file
11
+ end
12
+
13
+ describe "template" do
14
+ it "has a config template" do
15
+ @config.create
16
+ @config.template.wont_equal nil
17
+ end
18
+ end
19
+
20
+ describe "create" do
21
+ before do
22
+ clean_up_config_file @config_file
23
+ end
24
+
25
+ it "can create a config file" do
26
+ @config.create
27
+ File.exist?(@config_file).must_equal true
28
+ end
29
+
30
+ it "won't create a config file if it exists already" do
31
+ @config.create
32
+ lambda { @config.create }.must_raise Lobstr::Error::ConfigFileExists
33
+ end
34
+ end
35
+
36
+ describe "reset" do
37
+ it "can reset the configuration" do
38
+ @config.create
39
+ @config.reset
40
+ File.exist?(@config_file).must_equal true
41
+ end
42
+ end
43
+
44
+ describe "parse" do
45
+ before do
46
+ @config.create
47
+ end
48
+
49
+ it "has a repos" do
50
+ @config.parse['repos'].must_equal 'git://github.com/xentek/lobstr.git'
51
+ end
52
+
53
+ it "has a path" do
54
+ @config.parse['path'].must_equal '~/lobstr'
55
+ end
56
+
57
+ it "has an ssh host" do
58
+ @config.parse['ssh_host'].must_equal 'localhost'
59
+ end
60
+
61
+ it "has an ssh user" do
62
+ @config.parse['ssh_user'].must_equal 'xentek'
63
+ end
64
+
65
+ it "has an ssh key" do
66
+ @config.parse['ssh_key'].must_equal '~/.ssh/id_rsa'
67
+ end
68
+
69
+ it "has a branch" do
70
+ @config.parse['branch'].must_equal 'master'
71
+ end
72
+
73
+ it "has an environment" do
74
+ @config.parse['environment'].must_equal 'production'
75
+ end
76
+ end
77
+
78
+ describe "print" do
79
+ it "can print the contents of the config file" do
80
+ @config.create
81
+ @config.print.wont_equal nil
82
+ end
83
+ end
84
+
85
+ describe "config_file_exists?" do
86
+ it "will return true if config file exists" do
87
+ @config.create
88
+ @config.send(:config_file_exists?).must_equal true
89
+ end
90
+
91
+ it "will return false if config file does not exist" do
92
+ @config.send(:config_file_exists?).must_equal false
93
+ end
94
+ end
95
+
96
+ describe "check_config_file" do
97
+ it "will throw an error if config file does not exist" do
98
+ check = lambda { @config.send(:check_config_file) }
99
+ check.must_raise Lobstr::Error::ConfigFileMissing
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lobstr::Deploy do
4
+
5
+ before do
6
+ @config_file = 'spec/config/lobstr.yml'
7
+ @c = Lobstr::Config.new(@config_file)
8
+ @c.reset
9
+ @c = @c.parse('lobstr')
10
+ @deploy = Lobstr::Deploy.new('@lobstr', @config_file)
11
+ session = mock('Net::SSH::Connection::Session')
12
+ $-w = nil
13
+ Net::SSH = mock('Net::SSH')
14
+ Net::SSH.expects(:start).with(@c['ssh_host'],@c['ssh_user'],{:keys=>[@c['ssh_key']]}).returns(session)
15
+ $-w = false
16
+ end
17
+
18
+ after do
19
+ clean_up_config_file @config_file
20
+ end
21
+
22
+ it "can connect" do
23
+ @deploy.connect do
24
+ @ssh.expects(:exec!).with('echo "yo"')
25
+ @ssh.exec! 'echo "yo"'
26
+ end
27
+ end
28
+
29
+ it "can set the app up" do
30
+ @deploy.expects(:bundle_install)
31
+ @deploy.expects(:foreman_export)
32
+ @deploy.connect do
33
+ @ssh.expects(:exec!).with("git clone #{@config['repos']} #{@config['path']}")
34
+ setup
35
+ end
36
+ end
37
+
38
+ it "can deploy" do
39
+ @deploy.expects(:update)
40
+ @deploy.expects(:bundle_install)
41
+ @deploy.expects(:notify)
42
+ @deploy.deploy
43
+ end
44
+
45
+ it "can update" do
46
+ @deploy.connect do
47
+ @ssh.expects(:exec!).with("cd #{@config['path']}")
48
+ @ssh.expects(:exec!).with("git fetch origin")
49
+ @ssh.expects(:exec!).with("git reset --hard #{@branch}")
50
+ @ssh.expects(:exec!).with("cd #{@config['path']}")
51
+ @ssh.expects(:exec!).with("git reflog delete --rewrite HEAD@{1}")
52
+ @ssh.expects(:exec!).with("git reflog delete --rewrite HEAD@{1}")
53
+ update
54
+ end
55
+ end
56
+
57
+ it "can rollback" do
58
+ @deploy.connect do
59
+ @ssh.expects(:exec!).with("cd #{@config['path']}")
60
+ @ssh.expects(:exec!).with("git fetch origin")
61
+ @ssh.expects(:exec!).with("git reset --hard HEAD@{1}")
62
+ rollback
63
+ end
64
+ end
65
+
66
+ it "can notify" do
67
+ skip "until this method does something, there is nothing to test"
68
+ end
69
+
70
+ it "can install bundled gems" do
71
+ @deploy.connect do
72
+ @ssh.expects(:exec!).with('bundle install --deployment --path vendor/bundle --without development test ')
73
+ bundle_install
74
+ end
75
+ end
76
+
77
+ it "can export Procfiles with foreman" do
78
+ @deploy.connect do
79
+ @ssh.expects(:exec!).with("foreman export upstart /etc/init --app #{@config['app']} --log #{@config['path']}/log --user #{@config['ssh_user']} --procfile #{@config['path']}/Procfile ")
80
+ export_foreman
81
+ end
82
+ end
83
+
84
+ end
@@ -0,0 +1,14 @@
1
+ require 'lobstr'
2
+ require "mocha"
3
+ begin; require 'turn/autorun'; rescue LoadError; end
4
+ Turn.config do |c|
5
+ c.natural = true
6
+ c.ansi = true
7
+ c.format = :pretty
8
+ end
9
+
10
+ def clean_up_config_file(config_file = 'spec/config/lobstr.yml')
11
+ config_path = File.dirname config_file
12
+ File.delete config_file if File.exist? config_file
13
+ Dir.delete config_path if Dir.exist? config_path
14
+ end
metadata ADDED
@@ -0,0 +1,228 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lobstr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Eric Marden
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: psych
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: thor
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '0.16'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.16'
46
+ - !ruby/object:Gem::Dependency
47
+ name: net-ssh
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '2.5'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.5'
62
+ - !ruby/object:Gem::Dependency
63
+ name: highline
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '1.6'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '1.6'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.9.2
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.9.2
94
+ - !ruby/object:Gem::Dependency
95
+ name: minitest
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '3.4'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '3.4'
110
+ - !ruby/object:Gem::Dependency
111
+ name: ansi
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '1.4'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: '1.4'
126
+ - !ruby/object:Gem::Dependency
127
+ name: turn
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: '0.9'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: '0.9'
142
+ - !ruby/object:Gem::Dependency
143
+ name: pry
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: '0.9'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: '0.9'
158
+ - !ruby/object:Gem::Dependency
159
+ name: mocha
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: '0.12'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: '0.12'
174
+ description: deployments so easy, even a zoidberg can do it
175
+ email:
176
+ - eric@xentek.net
177
+ executables:
178
+ - lob
179
+ extensions: []
180
+ extra_rdoc_files: []
181
+ files:
182
+ - .gitignore
183
+ - .travis.yml
184
+ - Gemfile
185
+ - LICENSE.txt
186
+ - README.md
187
+ - Rakefile
188
+ - bin/lob
189
+ - lib/lobstr.rb
190
+ - lib/lobstr/base.rb
191
+ - lib/lobstr/config.rb
192
+ - lib/lobstr/deploy.rb
193
+ - lib/lobstr/error.rb
194
+ - lib/lobstr/version.rb
195
+ - lobstr.gemspec
196
+ - spec/lobstr_base_spec.rb
197
+ - spec/lobstr_config_spec.rb
198
+ - spec/lobstr_deploy_spec.rb
199
+ - spec/spec_helper.rb
200
+ homepage: https://github.com/xentek/lobstr
201
+ licenses: []
202
+ post_install_message:
203
+ rdoc_options: []
204
+ require_paths:
205
+ - lib
206
+ required_ruby_version: !ruby/object:Gem::Requirement
207
+ none: false
208
+ requirements:
209
+ - - ! '>='
210
+ - !ruby/object:Gem::Version
211
+ version: 1.9.2
212
+ required_rubygems_version: !ruby/object:Gem::Requirement
213
+ none: false
214
+ requirements:
215
+ - - ! '>='
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ requirements: []
219
+ rubyforge_project:
220
+ rubygems_version: 1.8.23
221
+ signing_key:
222
+ specification_version: 3
223
+ summary: deployments so easy, even a zoidberg can do it
224
+ test_files:
225
+ - spec/lobstr_base_spec.rb
226
+ - spec/lobstr_config_spec.rb
227
+ - spec/lobstr_deploy_spec.rb
228
+ - spec/spec_helper.rb