cap-util 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.log
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ .rvmrc
8
+ .rbenv-version
9
+ Gemfile.lock
10
+ InstalledFiles
11
+ _yardoc
12
+ coverage
13
+ doc/
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'bundler', '~>1.1'
6
+ gem 'rake', '~>0.9.2'
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 <TODO: copyright holders>
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,92 @@
1
+ # CapUtil
2
+
3
+ A set of utilities for writing cap tasks. Use these to help extract business logic from your tasks and test them.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'cap-util'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install cap-util
18
+
19
+ ## The Mixin
20
+
21
+ The main `CapUtil` mixin can be used to make any class a cap utility. All the cap util requires is that your class define a `cap` method that returns an instance of a cap invocations.
22
+
23
+ ```ruby
24
+ # in some_great_util.rb
25
+ require 'cap-util'
26
+
27
+ class SomeGreatUtil
28
+ include CapUtil
29
+
30
+ def initialize(cap)
31
+ @cap = cap
32
+ end
33
+
34
+ def do_something
35
+ run "echo something"
36
+ end
37
+ end
38
+
39
+ # in Capfile
40
+ require 'some_great_util.rb'
41
+
42
+ desc "some great util"
43
+ task :some_great_util do
44
+ SomeGreatUtil.new(self).do_something
45
+ end
46
+ ```
47
+
48
+ The goal here is to move all cap task business logic into neat little classes that can be unit tested. In addition, the mixin provides a bunch of helpers for running commands, halting tasks, outputting info, and timing tasks.
49
+
50
+ ## FakeCap helper
51
+
52
+ The `FakeCap` helper class is handy to use when testing your cap utils. CapUtil uses it in its own test suite. It fakes a common subset of cap functions so that they can be safely tested against. Extend it to suit your own test suite's needs.
53
+
54
+ ## UnsetVar helper
55
+
56
+ The `UnsetVar` helper class is handy for defining cap vars that need to have a value set in some other context. Think of it as the equivalent of raising a `NotImplementedError` in a method. If the variable used without being overridden first, the deploy is halted with a message.
57
+
58
+ To use:
59
+
60
+ ```ruby
61
+ # in your Capfile...
62
+
63
+ # halt with the default msg ":application var not set."
64
+ set :application, CapUtil::UnsetVar.new(:application)
65
+
66
+ # halt with the custom msg ":stage var not set (no stage task used)."
67
+ set :stage, CapUtil::UnsetVar(:stage, "no stage task used")
68
+ ```
69
+
70
+ ## RakeTask util
71
+
72
+ This util is handy for running a rake task remotely using a cap task. It constructs a command that cd's to the rakefile root dir and runs the specified task. That constructed command that command can then be run using cap.
73
+
74
+ By default, it expects the rakefile to be in the `:current_path` and uses bundler to run `rake`. These defaults can be overriden by passing options to the constructor.
75
+
76
+ To use, do something like:
77
+
78
+ ```ruby
79
+ # in your Capfile...
80
+
81
+ task :some_rake_task do
82
+ CapUtil::RakeTask.new(self, "a:task:to:run").run
83
+ end
84
+ ```
85
+
86
+ ## Contributing
87
+
88
+ 1. Fork it
89
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
90
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
91
+ 4. Push to the branch (`git push origin my-new-feature`)
92
+ 5. Create new Pull Request
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'assert/rake_tasks'
4
+ Assert::RakeTasks.install
5
+
6
+ require 'bundler/gem_tasks'
7
+
8
+ task :default => :build
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/cap-util/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "cap-util"
6
+ gem.version = CapUtil::VERSION
7
+ gem.description = %q{A set of utilities for writing cap tasks.}
8
+ gem.summary = %q{A set of utilities for writing cap tasks.}
9
+
10
+ gem.authors = ["Kelly Redding"]
11
+ gem.email = ["kelly@kellyredding.com"]
12
+ gem.homepage = "http://github.com/redding/cap-util"
13
+
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ gem.require_paths = ["lib"]
18
+
19
+ gem.add_development_dependency("assert")
20
+ gem.add_dependency("capistrano")
21
+ gem.add_dependency("scmd", ["~>1.1"])
22
+
23
+ end
@@ -0,0 +1,29 @@
1
+ require 'cap-util/say'
2
+ require 'cap-util/run'
3
+ require 'cap-util/halt'
4
+ require 'cap-util/time'
5
+
6
+ require 'cap-util/unset_var'
7
+
8
+ module CapUtil
9
+
10
+ def self.included(receiver)
11
+ receiver.send(:attr_accessor, :cap)
12
+
13
+ receiver.send(:include, CapUtil::Say)
14
+ receiver.send(:include, CapUtil::Halt)
15
+ receiver.send(:include, CapUtil::Run)
16
+ receiver.send(:include, CapUtil::Time)
17
+ end
18
+
19
+ def get(*args, &block)
20
+ cap.get(*args, &block)
21
+ end
22
+
23
+ def hostname
24
+ val = ""
25
+ run("hostname") {|ch, stream, out| val = out.strip}
26
+ val
27
+ end
28
+
29
+ end
@@ -0,0 +1,35 @@
1
+ require 'ostruct'
2
+
3
+ module CapUtil
4
+ class FakeCap
5
+
6
+ attr_reader :roles, :cmds_run
7
+
8
+ def initialize(*args)
9
+ @struct = OpenStruct.new
10
+ @roles = []
11
+ @cmds_run = []
12
+ end
13
+
14
+ def method_missing(method, *args, &block)
15
+ @struct.send(method, *args, &block)
16
+ end
17
+
18
+ def respond_to?(method)
19
+ @struct.respond_to?(method) ? true : super
20
+ end
21
+
22
+ def run(*args)
23
+ @cmds_run << args
24
+ end
25
+
26
+ def fetch(var_name)
27
+ self.send("fetch_#{var_name}")
28
+ end
29
+
30
+ def role(name, hostname, opts)
31
+ @roles << [name, hostname, opts]
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ module CapUtil
2
+
3
+ class DeployHalted < RuntimeError
4
+ def backtrace; []; end
5
+ end
6
+
7
+ def self.halt(msg='deploy halted')
8
+ raise CapUtil::DeployHalted, color(msg, :bold, :yellow)
9
+ end
10
+
11
+ module Halt
12
+
13
+ def self.included(receiver)
14
+ receiver.send(:extend, HaltMethods)
15
+ receiver.send(:include, HaltMethods)
16
+ end
17
+
18
+ module HaltMethods
19
+ def halt(*args); CapUtil.halt(*args); end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,30 @@
1
+ require 'cap-util'
2
+
3
+ module CapUtil
4
+
5
+ # This defines a base utiltiy for building tasks that run rake tasks. Pass
6
+ # in the rake task name and this will make sure it is run with the appropriate
7
+ # settings and environment
8
+
9
+ class RakeTask
10
+ include CapUtil
11
+
12
+ attr_reader :cmd
13
+
14
+ def initialize(cap, task, opts=nil)
15
+ @cap = cap
16
+
17
+ opts ||= {}
18
+ opts[:root] ||= :current_path
19
+ opts[:rake] ||= "bundle exec rake"
20
+ opts[:env] ||= ""
21
+ rakefile_root = cap.send(opts[:root])
22
+
23
+ @cmd = "cd #{rakefile_root} && #{opts[:env]} #{opts[:rake]} #{task}"
24
+ end
25
+
26
+ def run; super(@cmd); end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,60 @@
1
+ require 'scmd'
2
+
3
+ module CapUtil
4
+
5
+ def self.run_locally(cmd_str)
6
+ cmd = Scmd.new(cmd_str)
7
+
8
+ log "running `#{cmd}'"
9
+ cmd.run
10
+ log_error(cmd.stderr) if !cmd.success?
11
+
12
+ cmd
13
+ end
14
+
15
+ def self.run_locally_with_stdin(cmd_str, input)
16
+ cmd = Scmd.new(cmd_str)
17
+
18
+ log "running `#{cmd}'"
19
+ cmd.run(input)
20
+ log_error(cmd.stderr) if !cmd.success?
21
+
22
+ cmd
23
+ end
24
+
25
+ module Run
26
+
27
+ def self.included(receiver)
28
+ receiver.send(:extend, RunLocalMethods)
29
+ receiver.send(:include, RunLocalMethods)
30
+ receiver.send(:include, InstanceMethods)
31
+ end
32
+
33
+ module RunLocalMethods
34
+ def run_locally(*args); CapUtil.run_locally(*args); end
35
+ def run_locally_with_stdin(*args); CapUtil.run_locally_with_stdin(*args); end
36
+ end
37
+
38
+ module InstanceMethods
39
+
40
+ def run(*args, &block)
41
+ cap.run(*args, &block)
42
+ end
43
+
44
+ def run_with_stdin(cmd_str, input, opts={})
45
+ run(cmd_str, opts.merge(:pty => true)) {|ch, stream, out| ch.send_data(input + "\n")}
46
+ end
47
+
48
+ def run_as(user, cmd_str, opts={}, &block)
49
+ as_cmd_str = "su #{user} -lc '#{cmd_str.gsub("'", "\\'")}'"
50
+ run(as_cmd_str, opts, &block)
51
+ end
52
+
53
+ def run_as_with_stdin(user, cmd_str, input, opts={})
54
+ run_as(user, cmd_str, opts) {|ch, stream, out| ch.send_data(input + "\n")}
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,41 @@
1
+ require 'capistrano/cli'
2
+
3
+ module CapUtil
4
+
5
+ def self.color(*args)
6
+ Capistrano::CLI.ui.color(*args)
7
+ end
8
+
9
+ def self.say(msg, *args)
10
+ Capistrano::CLI.ui.say(" #{msg}", *args)
11
+ end
12
+
13
+ def self.log(msg, *args)
14
+ say("* #{msg}", *args)
15
+ end
16
+
17
+ def self.log_error(msg, *args)
18
+ say(" #{color "[ERROR]", :bold, :red} #{msg}", *args)
19
+ end
20
+
21
+ def self.log_warning(msg, *args)
22
+ say(" #{color "[WARN]", :bold, :yellow} #{msg}", *args)
23
+ end
24
+
25
+ module Say
26
+
27
+ def self.included(receiver)
28
+ receiver.send(:extend, SayMethods)
29
+ receiver.send(:include, SayMethods)
30
+ end
31
+
32
+ module SayMethods
33
+ def color(*args); CapUtil.color(*args); end
34
+ def say(*args); CapUtil.say(*args); end
35
+ def log(*args); CapUtil.log(*args); end
36
+ def log_error(*args); CapUtil.log_error(*args); end
37
+ def log_warning(*args); CapUtil.log_warning(*args); end
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,30 @@
1
+ require 'cap-util/timer'
2
+
3
+ module CapUtil
4
+
5
+ def self.time(timer_set, name, &block)
6
+ timer_set[name] = CapUtil::Timer.new(name)
7
+ if !block.nil?
8
+ begin
9
+ timer_set[name].start
10
+ block.call
11
+ ensure
12
+ timer_set[name].end
13
+ end
14
+ end
15
+ timer_set[name]
16
+ end
17
+
18
+ module Time
19
+
20
+ def self.included(receiver)
21
+ receiver.send(:extend, TimeMethods)
22
+ receiver.send(:include, TimeMethods)
23
+ end
24
+
25
+ module TimeMethods
26
+ def time(*args, &block); CapUtil.time(*args, &block); end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ module CapUtil
2
+ class Timer
3
+
4
+ def self.pretty_time(elapsed)
5
+ "#{elapsed / 60}:#{(elapsed % 60).to_s.rjust(2, '0')}"
6
+ end
7
+
8
+ attr_reader :name, :start_time, :end_time, :elapsed_time
9
+
10
+ def initialize(name, quiet=nil)
11
+ @name, @start_time, @end_time, @elapsed_time = name, 0, 0, 0
12
+ @quiet = !!(quiet == :quiet)
13
+ end
14
+
15
+ def start(time=nil)
16
+ say " Starting #{CapUtil.color @name, :cyan}." if !@quiet
17
+ @start_time = (time || Time.now)
18
+ end
19
+
20
+ def end(time=nil)
21
+ @end_time = (time || Time.now)
22
+ @elapsed_time = @end_time - @start_time
23
+ if !@quiet
24
+ elapsed = self.class.pretty_time(@elapsed_time.to_i)
25
+ say " #{CapUtil.color @name, :bold, :yellow} completed in"\
26
+ " #{CapUtil.color elapsed, :underline, :yellow}."
27
+ end
28
+ @end_time
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,10 @@
1
+ module CapUtil
2
+ module UnsetVar
3
+
4
+ def self.new(name, msg=nil)
5
+ halt_msg = msg ? ":#{name} var not set (#{msg})." : ":#{name} var not set."
6
+ Proc.new { CapUtil.halt(halt_msg) }
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module CapUtil
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,69 @@
1
+ require 'assert'
2
+
3
+ module CapUtil
4
+
5
+ class CapUtilTests < Assert::Context
6
+ desc "the CapUtil module"
7
+ setup do
8
+ @mod = CapUtil
9
+ end
10
+ subject { @mod }
11
+
12
+ should have_imeth :halt, :time
13
+ should have_imeths :color, :say, :log, :log_error, :log_warning
14
+ should have_imeths :run_locally, :run_locally_with_stdin
15
+
16
+ end
17
+
18
+ class HaltTests < CapUtilTests
19
+ desc "`halt` util methods"
20
+
21
+ should "raise a `DeployHalted` custom exception" do
22
+ assert_raises(CapUtil::DeployHalted) { subject.halt }
23
+ end
24
+ end
25
+
26
+ class CapUtilMixinTests < Assert::Context
27
+ desc "the CapUtil mixin"
28
+ setup do
29
+ @cap_util = TestHelpers::AnCapUtil.new(FakeCap.new)
30
+ end
31
+ subject { @cap_util }
32
+
33
+ should have_accessor :cap
34
+
35
+ should have_cmeth :halt
36
+ should have_imeth :halt
37
+
38
+ should have_cmeths :color, :say, :log, :log_error, :log_warning
39
+ should have_imeths :color, :say, :log, :log_error, :log_warning
40
+
41
+ should have_cmeths :run_locally, :run_locally_with_stdin
42
+ should have_imeths :run_locally, :run_locally_with_stdin
43
+ should have_imeths :run, :run_with_stdin, :run_as, :run_as_with_stdin
44
+
45
+ should have_cmeth :time
46
+ should have_imeth :time
47
+
48
+ should have_imeths :get, :hostname
49
+
50
+ end
51
+
52
+ class DeployHaltedTests < Assert::Context
53
+ desc "the CapUtility DeployHalted custome exception"
54
+ setup do
55
+ @err = CapUtil::DeployHalted.new
56
+ end
57
+ subject { @err }
58
+
59
+ should "be a `RuntimeError`" do
60
+ assert_kind_of RuntimeError, subject
61
+ end
62
+
63
+ should "have no backtrace" do
64
+ assert_empty subject.backtrace
65
+ end
66
+
67
+ end
68
+
69
+ end
@@ -0,0 +1,30 @@
1
+ require 'assert'
2
+
3
+ require 'cap-util/fake_cap'
4
+
5
+ module CapUtil
6
+
7
+ class FakeCapTests < Assert::Context
8
+ desc "the fake cap helper"
9
+ setup do
10
+ @fc = FakeCap.new
11
+ end
12
+ subject { @fc }
13
+
14
+ should have_imeths :method_missing, :respond_to?
15
+ should have_imeths :run, :fetch, :role
16
+ should have_readers :roles, :cmds_run
17
+
18
+ should "store off args to run cmd calls" do
19
+ assert_empty subject.cmds_run
20
+
21
+ subject.run(:a, 1)
22
+ assert_equal [:a, 1], subject.cmds_run.last
23
+
24
+ subject.run
25
+ assert_equal [], subject.cmds_run.last
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,21 @@
1
+ # this file is automatically required in when you require 'assert' in your tests
2
+ # put test helpers here
3
+
4
+ # add root dir to the load path
5
+ $LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
6
+
7
+ require 'cap-util'
8
+ require 'cap-util/fake_cap'
9
+
10
+ module TestHelpers
11
+
12
+ class AnCapUtil
13
+ include CapUtil
14
+
15
+ def initialize(cap)
16
+ @cap = cap
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,9 @@
1
+ require 'assert/setup'
2
+
3
+ # this file is required in when the 'irb' rake test is run.
4
+ # b/c 'assert/setup' is required above, the test helper will be
5
+ # required in as well.
6
+
7
+ # put any IRB setup code here
8
+
9
+ require 'cap-util'
@@ -0,0 +1,57 @@
1
+ require 'assert'
2
+
3
+ require 'cap-util/rake_task'
4
+
5
+ module CapUtil
6
+
7
+ class RakeTaskTests < Assert::Context
8
+ desc "the rake task util"
9
+ setup do
10
+ @fake_cap = FakeCap.new
11
+ @fake_cap.fetch_rake = "bundle exec rake"
12
+ @fake_cap.current_path = "/a/current/path"
13
+ @fake_cap.release_path = "/dat/release/path"
14
+ @rake_task_util = RakeTask.new(@fake_cap, 'a:task:to:run')
15
+ end
16
+ subject { @rake_task_util }
17
+
18
+ should have_imeths :run
19
+
20
+ should "build a rake task to run" do
21
+ assert_match 'rake ', subject.cmd
22
+ assert_match ' a:task:to:run', subject.cmd
23
+ end
24
+
25
+ should "run the task with bundler by default" do
26
+ assert_match 'bundle exec rake', subject.cmd
27
+ end
28
+
29
+ should "run the task with a custom rake if given" do
30
+ task = RakeTask.new(@fake_cap, '', :rake => '/path/to/rake')
31
+ assert_match '/path/to/rake', task.cmd
32
+ end
33
+
34
+ should "use cap's current path by default" do
35
+ assert_match "cd #{@fake_cap.current_path} &&", subject.cmd
36
+ end
37
+
38
+ should "use a custom cap path if given" do
39
+ task = RakeTask.new(@fake_cap, '', :root => :release_path)
40
+ assert_match "cd #{@fake_cap.release_path} &&", task.cmd
41
+ end
42
+
43
+ should "use a custom env var string if given" do
44
+ task = RakeTask.new(@fake_cap, '', :env => "FOO=bar")
45
+ assert_match "FOO=bar bundle", task.cmd
46
+ end
47
+
48
+ should "run its rake cmd" do
49
+ exp_cmd = "cd /a/current/path && bundle exec rake a:task:to:run"
50
+ subject.run
51
+
52
+ assert_equal [exp_cmd], @fake_cap.cmds_run.last
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,49 @@
1
+ require 'assert'
2
+
3
+ require 'cap-util/timer'
4
+
5
+ module CapUtil
6
+
7
+ class TimerTests < Assert::Context
8
+ desc "the Timer helper class"
9
+ setup do
10
+ @timer_util = Timer.new('a timer', :quiet)
11
+ end
12
+ subject { @timer_util }
13
+
14
+ should have_readers :name, :start_time, :end_time, :elapsed_time
15
+ should have_imeths :start, :end
16
+ should have_cmeth :pretty_time
17
+
18
+ should "know its name" do
19
+ assert_equal 'a timer', subject.name
20
+ end
21
+
22
+ should "default its start, end, and elapsed times" do
23
+ assert_equal 0, subject.start_time
24
+ assert_equal 0, subject.end_time
25
+ assert_equal 0, subject.elapsed_time
26
+ end
27
+
28
+ should "record its start time on `start`" do
29
+ exp_start_time = ::Time.now
30
+ subject.start(exp_start_time)
31
+
32
+ assert_equal exp_start_time, subject.start_time
33
+ end
34
+
35
+ should "record its end and elapsed time on `end`" do
36
+ exp_start_time = ::Time.now
37
+ subject.start(exp_start_time)
38
+ sleep 1
39
+ exp_end_time = ::Time.now
40
+ subject.end(exp_end_time)
41
+
42
+ assert_equal exp_end_time, subject.end_time
43
+ assert_equal (exp_end_time - exp_start_time), subject.elapsed_time
44
+ assert_equal "0:01", Timer.pretty_time(subject.elapsed_time.to_i)
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,44 @@
1
+ require 'assert'
2
+
3
+ require 'cap-util/unset_var'
4
+
5
+ module CapUtil
6
+
7
+ class UnsetVarTests < Assert::Context
8
+ desc "the unset var helper"
9
+ setup do
10
+ @var_name = 'test'
11
+ @unset = UnsetVar.new(@var_name)
12
+ end
13
+ subject { @unset }
14
+
15
+ should "be a proc" do
16
+ assert_kind_of ::Proc, subject
17
+ end
18
+
19
+ should "raise `DeployHalted` when called" do
20
+ assert_raises(CapUtil::DeployHalted) { subject.call }
21
+ end
22
+
23
+ should "raise with a default msg based on the variable name" do
24
+ exp_msg = ":#{@var_name} var not set."
25
+ begin
26
+ subject.call
27
+ rescue CapUtil::DeployHalted => err
28
+ assert_match exp_msg, err.message
29
+ end
30
+ end
31
+
32
+ should "accept a custom msg to raise with" do
33
+ exp_msg = ":#{@var_name} var not set (a custom err msg)."
34
+ unset = CapUtil::UnsetVar.new(@var_name, exp_msg)
35
+ begin
36
+ unset.call
37
+ rescue CapUtil::DeployHalted => err
38
+ assert_match exp_msg, err.message
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cap-util
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Kelly Redding
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-10-16 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: assert
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 3
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ requirement: *id001
33
+ prerelease: false
34
+ - !ruby/object:Gem::Dependency
35
+ name: capistrano
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ hash: 3
42
+ segments:
43
+ - 0
44
+ version: "0"
45
+ type: :runtime
46
+ requirement: *id002
47
+ prerelease: false
48
+ - !ruby/object:Gem::Dependency
49
+ name: scmd
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ hash: 13
56
+ segments:
57
+ - 1
58
+ - 1
59
+ version: "1.1"
60
+ type: :runtime
61
+ requirement: *id003
62
+ prerelease: false
63
+ description: A set of utilities for writing cap tasks.
64
+ email:
65
+ - kelly@kellyredding.com
66
+ executables: []
67
+
68
+ extensions: []
69
+
70
+ extra_rdoc_files: []
71
+
72
+ files:
73
+ - .gitignore
74
+ - Gemfile
75
+ - LICENSE
76
+ - README.md
77
+ - Rakefile
78
+ - cap-util.gemspec
79
+ - lib/cap-util.rb
80
+ - lib/cap-util/fake_cap.rb
81
+ - lib/cap-util/halt.rb
82
+ - lib/cap-util/rake_task.rb
83
+ - lib/cap-util/run.rb
84
+ - lib/cap-util/say.rb
85
+ - lib/cap-util/time.rb
86
+ - lib/cap-util/timer.rb
87
+ - lib/cap-util/unset_var.rb
88
+ - lib/cap-util/version.rb
89
+ - test/cap_util_tests.rb
90
+ - test/fake_cap_tests.rb
91
+ - test/helper.rb
92
+ - test/irb.rb
93
+ - test/rake_task_tests.rb
94
+ - test/timer_tests.rb
95
+ - test/unset_var_tests.rb
96
+ homepage: http://github.com/redding/cap-util
97
+ licenses: []
98
+
99
+ post_install_message:
100
+ rdoc_options: []
101
+
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 3
110
+ segments:
111
+ - 0
112
+ version: "0"
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ hash: 3
119
+ segments:
120
+ - 0
121
+ version: "0"
122
+ requirements: []
123
+
124
+ rubyforge_project:
125
+ rubygems_version: 1.8.24
126
+ signing_key:
127
+ specification_version: 3
128
+ summary: A set of utilities for writing cap tasks.
129
+ test_files:
130
+ - test/cap_util_tests.rb
131
+ - test/fake_cap_tests.rb
132
+ - test/helper.rb
133
+ - test/irb.rb
134
+ - test/rake_task_tests.rb
135
+ - test/timer_tests.rb
136
+ - test/unset_var_tests.rb