capistrano-blaze 0.1.0 → 0.2.0

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.
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm 1.9.3@capistrano-blaze
1
+ rvm 1.9.3-p125@capistrano-blaze
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - jruby-18mode
7
+ - jruby-19mode
8
+ - rbx-18mode
9
+ - rbx-19mode
10
+ - ruby-head
11
+ - jruby-head
12
+ - ree
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Capistrano::Blaze
2
2
 
3
- Because Capistrano::Campfire had to many dependencies and a hard setup, this is
4
- my attempt at making it easier.
3
+ [![Build Status](https://secure.travis-ci.org/iain/capistrano-blaze.png?branch=master)](http://travis-ci.org/iain/capistrano-blaze)
5
4
 
6
- This gem has no runtime dependencies and should just work right out of the box.
7
- All you need to do is to provide your Campfire credentials.
5
+ This tiny gem notifies you on Campfire when you use Capistrano. The only
6
+ thing you have to configure is your Campfire credentials, the proper hooks are
7
+ automatically added.
8
8
 
9
9
  ## Installation
10
10
 
@@ -14,20 +14,6 @@ Add this line to your application's Gemfile:
14
14
  gem 'capistrano-blaze', :require => false
15
15
  ```
16
16
 
17
- And then execute:
18
-
19
- ``` shell
20
- $ bundle
21
- ```
22
-
23
- Or install it yourself as:
24
-
25
- ``` shell
26
- $ gem install capistrano-blaze
27
- ```
28
-
29
- ## Usage
30
-
31
17
  Add to your `config/deploy.rb`:
32
18
 
33
19
  ``` ruby
@@ -17,4 +17,6 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.add_development_dependency "rspec", "~> 2.9"
19
19
  gem.add_development_dependency "webmock", "~> 1.8.4"
20
+ gem.add_development_dependency "rake", "~> 0.9.2"
21
+ gem.add_dependency "json"
20
22
  end
@@ -1,68 +1,44 @@
1
1
  require 'net/http'
2
2
  require 'json'
3
- require 'ostruct'
4
3
  require 'capistrano/blaze/version'
4
+ require 'capistrano/blaze/message'
5
+ require 'capistrano/blaze/configuration'
5
6
  require 'capistrano/blaze/recipes' if defined?(Capistrano::Configuration)
6
7
 
7
8
  module Capistrano
8
9
  module Blaze
9
10
  extend self
10
11
 
11
- def configure(opts = {})
12
- @config = OpenStruct.new(opts)
13
- yield @config if block_given?
12
+ def configure
13
+ yield configuration
14
+ end
15
+
16
+ def configuration
17
+ @configuration ||= Configuration.new
14
18
  end
15
19
 
16
20
  def speak(message)
17
- port = @config.ssl ? 443 : 80
21
+ configuration.validate!
22
+ port = configuration.ssl ? 443 : 80
18
23
 
19
- req = Net::HTTP::Post.new("/room/#{@config.room_id}/speak.json")
20
- req.basic_auth @config.token, 'X'
24
+ req = Net::HTTP::Post.new("/room/#{configuration.room_id}/speak.json")
25
+ req.basic_auth configuration.token, 'X'
21
26
  req.body = { :message => { :body => message } }.to_json
22
27
  req.content_type = "application/json"
28
+ req["User-Agent"] = "Capistrano::Blaze"
23
29
 
24
- res = Net::HTTP.start("#{@config.account}.campfirenow.com", port, :use_ssl => @config.ssl) do |http|
30
+ res = Net::HTTP.start("#{configuration.account}.campfirenow.com", port, :use_ssl => configuration.ssl) do |http|
25
31
  http.request(req)
26
32
  end
27
33
 
28
34
  if res.is_a?(Net::HTTPSuccess)
29
- puts "Campfire message sent!"
35
+ warn "Campfire message sent!"
30
36
  else
31
- puts "Campfire communication failed!"
32
- puts res.inspect
33
- puts res.body.inspect
37
+ warn "Campfire communication failed!"
38
+ warn res.inspect
39
+ warn res.body.inspect
34
40
  end
35
41
  end
36
42
 
37
- def failure(context, exception)
38
- speak ":warning: #{user} failed to deploy #{stage(context)}#{context.application}, via `#{command}`: #{exception.to_s} (#{exception.class.inspect})"
39
- end
40
-
41
- def success(context)
42
- speak "#{user} succesfully deployed #{stage(context)}#{context.application}, via `#{command}`"
43
- end
44
-
45
- def test(context)
46
- speak ":heart: #{context.application}!"
47
- end
48
-
49
- private
50
-
51
- def stage(context)
52
- if context.respond_to?(:stage)
53
- "to the #{context.stage} stage of "
54
- else
55
- ""
56
- end
57
- end
58
-
59
- def user
60
- `whoami`.strip
61
- end
62
-
63
- def command
64
- [ 'cap', *$* ] * ' '
65
- end
66
-
67
43
  end
68
44
  end
@@ -0,0 +1,38 @@
1
+ module Capistrano
2
+ module Blaze
3
+
4
+ class Configuration
5
+
6
+ attr_accessor :account, :room_id, :token, :ssl
7
+
8
+ def []=(option, value)
9
+ send "#{option}=", value
10
+ end
11
+
12
+ def [](option)
13
+ send option
14
+ end
15
+
16
+ def validate!
17
+ %w(account room_id token).each do |option|
18
+ if send(option).nil?
19
+ fail MissingOption.new(option)
20
+ end
21
+ end
22
+ end
23
+
24
+ class MissingOption < RuntimeError
25
+
26
+ def initialize(option)
27
+ @option = option
28
+ end
29
+
30
+ def to_s
31
+ "Please specify the #{@option} option"
32
+ end
33
+
34
+ end
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,75 @@
1
+ module Capistrano
2
+ module Blaze
3
+ class Message
4
+
5
+ def self.start(context)
6
+ new(context).start
7
+ end
8
+
9
+ def self.failure(context, exception)
10
+ new(context, exception).failure
11
+ end
12
+
13
+ def self.success(context)
14
+ new(context).success
15
+ end
16
+
17
+ def self.test(context)
18
+ new(context).test
19
+ end
20
+
21
+ attr_reader :context, :exception
22
+
23
+ def initialize(context, exception = nil)
24
+ @context, @exception = context, exception
25
+ end
26
+
27
+ def start
28
+ speak "#{user} is deploying #{what}, via `#{command}`"
29
+ end
30
+
31
+ def failure
32
+ speak ":warning: #{user} failed to deploy #{what}, via `#{command}`: #{exception_message}"
33
+ end
34
+
35
+ def success
36
+ speak "#{user} succesfully deployed #{what}, via `#{command}`"
37
+ end
38
+
39
+ def test
40
+ speak ":heart: #{context.application}!"
41
+ end
42
+
43
+ private
44
+
45
+ def exception_message
46
+ "#{exception.to_s} (#{exception.class.inspect})"
47
+ end
48
+
49
+ def speak(message)
50
+ Blaze.speak(message)
51
+ end
52
+
53
+ def what
54
+ stage + context.application
55
+ end
56
+
57
+ def stage
58
+ if context.respond_to?(:stage)
59
+ "to the #{context.stage} stage of "
60
+ else
61
+ ""
62
+ end
63
+ end
64
+
65
+ def user
66
+ `whoami`.strip
67
+ end
68
+
69
+ def command
70
+ [ 'cap', *ARGV ] * ' '
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -2,23 +2,28 @@ Capistrano::Configuration.instance(:must_exist).load do
2
2
 
3
3
  at_exit do
4
4
  if exception = $!
5
- Capistrano::Blaze.failure(self, exception)
5
+ Capistrano::Blaze::Message.failure(self, exception)
6
6
  end
7
7
  end
8
8
 
9
9
  namespace :campfire do
10
10
 
11
+ task :start do
12
+ Capistrano::Blaze::Message.start(self)
13
+ end
14
+
11
15
  task :success do
12
- Capistrano::Blaze.success(self)
16
+ Capistrano::Blaze::Message.success(self)
13
17
  end
14
18
 
15
19
  desc "Sends a test message to Campfire"
16
20
  task :test_config do
17
- Capistrano::Blaze.test(self)
21
+ Capistrano::Blaze::Message.test(self)
18
22
  end
19
23
 
20
24
  end
21
25
 
26
+ before "deploy", "campfire:start"
22
27
  after "deploy:restart", "campfire:success"
23
28
 
24
29
  end
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Blaze
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -0,0 +1,33 @@
1
+ require 'capistrano/blaze'
2
+ require 'webmock'
3
+
4
+ describe Capistrano::Blaze do
5
+ include WebMock::API
6
+
7
+ around do |example|
8
+ $stderr = StringIO.new
9
+ example.run
10
+ $stderr = STDERR
11
+ end
12
+
13
+ it "can speak" do
14
+ token = "abc"
15
+ room_id = 1234
16
+ account = "abcd"
17
+
18
+ stub_request(:post, "http://#{token}:X@#{account}.campfirenow.com/room/#{room_id}/speak.json").
19
+ with(:body => "{\"message\":{\"body\":\"Ik ben een gem aan het maken\"}}",
20
+ :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Capistrano::Blaze'}).
21
+ to_return(:status => 200, :body => "", :headers => {})
22
+
23
+ subject.configure do |config|
24
+ config.account = account
25
+ config.room_id = room_id
26
+ config.token = token
27
+ config.ssl = false
28
+ end
29
+
30
+ subject.speak "Ik ben een gem aan het maken"
31
+ end
32
+
33
+ end
@@ -0,0 +1,20 @@
1
+ require 'capistrano/blaze/configuration'
2
+
3
+ describe Capistrano::Blaze::Configuration do
4
+
5
+ REQUIRED = %W(account room_id token)
6
+
7
+ before do
8
+ REQUIRED.each do |option|
9
+ subject[option] = "foo"
10
+ end
11
+ end
12
+
13
+ REQUIRED.each do |option|
14
+ it "requires #{option} to be set" do
15
+ subject[option] = nil
16
+ expect { subject.validate! }.to raise_error("Please specify the #{option} option")
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,68 @@
1
+ require 'capistrano/blaze/message'
2
+
3
+ describe Capistrano::Blaze::Message do
4
+
5
+ subject { Capistrano::Blaze::Message }
6
+ let(:exception) { RuntimeError.new("woops") }
7
+
8
+ before do
9
+ subject.any_instance.stub(:user) { "your mom" }
10
+ end
11
+
12
+ it "sends a test message" do
13
+ should_speak(":heart: basecamp!")
14
+ context = stub(:application => "basecamp")
15
+ subject.test(context)
16
+ end
17
+
18
+ context "with multistage extension" do
19
+
20
+ let(:context) { stub(:stage => "production", :application => "basecamp") }
21
+
22
+ it "displays a start message" do
23
+ should_speak("your mom is deploying to the production stage of basecamp, via `#{command}`")
24
+ subject.start(context)
25
+ end
26
+
27
+ it "displays a failure message" do
28
+ should_speak(":warning: your mom failed to deploy to the production stage of basecamp, via `#{command}`: woops (RuntimeError)")
29
+ subject.failure(context, exception)
30
+ end
31
+
32
+ it "displays success message" do
33
+ should_speak("your mom succesfully deployed to the production stage of basecamp, via `#{command}`")
34
+ subject.success(context)
35
+ end
36
+
37
+ end
38
+
39
+ context "without multistage extension" do
40
+
41
+ let(:context) { stub(:application => "basecamp") }
42
+
43
+ it "displays a start message" do
44
+ should_speak("your mom is deploying basecamp, via `#{command}`")
45
+ subject.start(context)
46
+ end
47
+
48
+ it "displays success message" do
49
+ should_speak("your mom succesfully deployed basecamp, via `#{command}`")
50
+ subject.success(context)
51
+ end
52
+
53
+ it "displays failure message" do
54
+ should_speak(":warning: your mom failed to deploy basecamp, via `#{command}`: woops (RuntimeError)")
55
+ subject.failure(context, exception)
56
+ end
57
+
58
+ end
59
+
60
+ def command
61
+ [ 'cap', *ARGV ] * ' '
62
+ end
63
+
64
+ def should_speak(message)
65
+ Capistrano::Blaze.should_receive(:speak).with(message)
66
+ end
67
+
68
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-blaze
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ date: 2012-04-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &70320790341820 !ruby/object:Gem::Requirement
17
+ requirement: &70252880436580 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '2.9'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70320790341820
25
+ version_requirements: *70252880436580
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: webmock
28
- requirement: &70320790341320 !ruby/object:Gem::Requirement
28
+ requirement: &70252880436080 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,7 +33,29 @@ dependencies:
33
33
  version: 1.8.4
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70320790341320
36
+ version_requirements: *70252880436080
37
+ - !ruby/object:Gem::Dependency
38
+ name: rake
39
+ requirement: &70252880435620 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 0.9.2
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *70252880435620
48
+ - !ruby/object:Gem::Dependency
49
+ name: json
50
+ requirement: &70252880435240 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *70252880435240
37
59
  description: A simple campfire plugin for capistrano
38
60
  email:
39
61
  - iain@iain.nl
@@ -44,15 +66,20 @@ files:
44
66
  - .gitignore
45
67
  - .rspec
46
68
  - .rvmrc
69
+ - .travis.yml
47
70
  - Gemfile
48
71
  - MIT-LICENSE
49
72
  - README.md
50
73
  - Rakefile
51
74
  - capistrano-blaze.gemspec
52
75
  - lib/capistrano/blaze.rb
76
+ - lib/capistrano/blaze/configuration.rb
77
+ - lib/capistrano/blaze/message.rb
53
78
  - lib/capistrano/blaze/recipes.rb
54
79
  - lib/capistrano/blaze/version.rb
55
- - spec/camp_spec.rb
80
+ - spec/blaze_spec.rb
81
+ - spec/configuration_spec.rb
82
+ - spec/message_spec.rb
56
83
  homepage: https://github.com/iain/capistrano-blaze
57
84
  licenses: []
58
85
  post_install_message:
@@ -78,4 +105,6 @@ signing_key:
78
105
  specification_version: 3
79
106
  summary: A simple campfire plugin for capistrano
80
107
  test_files:
81
- - spec/camp_spec.rb
108
+ - spec/blaze_spec.rb
109
+ - spec/configuration_spec.rb
110
+ - spec/message_spec.rb
data/spec/camp_spec.rb DELETED
@@ -1,63 +0,0 @@
1
- require 'capistrano/blaze'
2
- require 'webmock'
3
-
4
- describe Capistrano::Blaze do
5
- include WebMock::API
6
-
7
- it "can speak" do
8
- token = "abc"
9
- room_id = 1234
10
- account = "abcd"
11
-
12
- stub_request(:post, "https://#{token}:X@#{account}.campfirenow.com/room/#{room_id}/speak.json").
13
- with(:body => "{\"message\":{\"body\":\"Ik ben een gem aan het maken\"}}",
14
- :headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}).
15
- to_return(:status => 200, :body => "", :headers => {})
16
-
17
- subject.configure do |config|
18
- config.account = account
19
- config.room_id = room_id
20
- config.token = token
21
- config.ssl = true
22
- end
23
- subject.speak "Ik ben een gem aan het maken"
24
- end
25
-
26
- before do
27
- subject.stub(:user) { "iain" }
28
- end
29
-
30
- it "displays a failure message" do
31
- subject.should_receive(:speak).with(":warning: iain failed to deploy to the production stage of basecamp, via `cap #{ARGV.join(' ')}`: woops (RuntimeError)")
32
- context = stub(:stage => "production", :application => "basecamp")
33
- exception = RuntimeError.new("woops")
34
- subject.failure(context, exception)
35
- end
36
-
37
- it "displays success message" do
38
- subject.should_receive(:speak).with("iain succesfully deployed to the production stage of basecamp, via `cap #{ARGV.join(' ')}`")
39
- context = stub(:stage => "production", :application => "basecamp")
40
- subject.success(context)
41
- end
42
-
43
- it "sends a test message" do
44
- subject.should_receive(:speak).with(":heart: basecamp!")
45
- context = stub(:application => "basecamp")
46
- subject.test(context)
47
- end
48
-
49
- it "displays success message without a stage" do
50
- subject.should_receive(:speak).with("iain succesfully deployed basecamp, via `cap #{ARGV.join(' ')}`")
51
- context = stub(:application => "basecamp")
52
- subject.success(context)
53
- end
54
-
55
- it "displays failure message without a stage" do
56
- subject.should_receive(:speak).with(":warning: iain failed to deploy basecamp, via `cap #{ARGV.join(' ')}`: woops (RuntimeError)")
57
- context = stub(:application => "basecamp")
58
- exception = RuntimeError.new("woops")
59
- subject.failure(context, exception)
60
- end
61
-
62
-
63
- end