capistrano-grove 1.0.1 → 2.0.0pre

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 1.8.7
5
+ - ree
6
+ script: bundle exec rspec spec
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ 2013-04-XX => v2.0.0pre
2
+
3
+ * complete rewrite to be a true Capistrano extension
4
+ * now built on Capnotify
5
+ * changed grove_channel_key to grove_channel_token
6
+ * got rid of grove_message
7
+
1
8
  2012-05-29 => v1.0.1
2
9
 
3
10
  documentation changes
data/Gemfile CHANGED
@@ -2,4 +2,3 @@ source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in capistrano-grove.gemspec
4
4
  gemspec
5
- gem 'rspec'
data/README.md CHANGED
@@ -1,78 +1,104 @@
1
- # Capistrano grove.io notifications
1
+ # Capistrano::Grove [![Build Status](https://travis-ci.org/spikegrobstein/capistrano-grove.png)](https://travis-ci.org/spikegrobstein/capistrano-grove)
2
2
 
3
- Easily send notifications to your [grove.io](http://grove.io) channel after a deploy.
3
+ Note: This documentation is for the as yet to be released version 2.0.0 of Capistrano::Grove.
4
+ I expect this to be ready for release in the next few days.
4
5
 
5
- ## Getting started
6
+ Send deployment notifications to your [grove.io](http://grove.io) channel via Capistrano.
7
+ Never again will members of your team not be made aware of events during your deployment.
8
+ Alert them to maintenance page changes, migrations and deployment events by using this gem.
9
+
10
+ ## Installation
6
11
 
7
- In your application's `Gemfile` put the following:
12
+ Add this line to your application's Gemfile:
8
13
 
9
14
  gem 'capistrano-grove'
10
15
 
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install capistrano-grove
23
+
24
+ In your `Capfile`, add:
11
25
 
12
- Once you get your gems installed via `bundle install`, you can configure
13
- `capistrano-grove`.
26
+ require 'capistrano-grove'
14
27
 
15
- Alternatively, you can install `capistrano-grove` via `gem`:
28
+ ## Getting started
29
+
30
+ Capistrano::Grove is built on Capnotify which provides a series of built-in notifications.
31
+ This gem plugs into those notifications and sends them to your grove.io channel.
32
+
33
+ Once you've gone through the above installation procedure, all you need to do is set
34
+ your `grove_channel_token` as a Capistrano variable as follows:
16
35
 
17
- gem install capistrano-grove
36
+ set :grove_channel_token, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
18
37
 
19
- At the top of your `Capfile` you should also add the following:
38
+ With that, you'll start receiving notifications to your channel for migrations,
39
+ deployment and maintenance page changes.
20
40
 
21
- require 'grove/capistrano'
41
+ In addition to the above, you can configure how your messages appear:
22
42
 
23
- The only required parameter to use this plugin is the `grove_channel_key` variable.
24
- You can get your channel key from the grove.io website. Initialize it as follows:
43
+ set :grove_service_name, 'MyDeployer'
44
+ set :grove_icon_url, 'https://grove.io/static/img/webapp-logo.png'
45
+ set :grove_url, 'http://example.com'
25
46
 
26
- set :grove_channel_key, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
47
+ Because Capistrano::Grove is built on Capnotify, you should refer to that documentation
48
+ for further customizing the messages that are posted to your channel:
27
49
 
28
- `capistrano-grove` comes with one task: `grove:notify`. This task posts the
29
- `grove_message` variable to the grove.io service and will be usable after you set
30
- the above variable.
50
+ https://github.com/spikegrobstein/capnotify
31
51
 
32
- To automatially notify on grove.io after a deploy, set an `after` hook:
52
+ You can also use the `grove.notify` function anywhere in your Capistrano recipes to post
53
+ messages to your channel ad-hoc. For example:
33
54
 
34
- after 'deploy', 'grove:notify'
55
+ grove.notify 'Greetings from Capistrano!'
35
56
 
36
57
  ## Variables
37
58
 
38
- ### grove_channel_key
59
+ The following are Capistrano variables and are used via the `set` function.
39
60
 
40
- The channel key from the grove.io website. This is the only variable that is required
41
- to get `capistrano-grove` working.
61
+ ### grove_channel_token
62
+
63
+ The channel token from the grove.io website. This is the only variable that is required
64
+ to get Capistrano::Grove working.
42
65
 
43
66
  ### grove_service
44
67
 
45
- The name of the service that the notification comes from. This should not contain
46
- spaces as that causes the grove.io webservice some grief.
68
+ The name of the service, aka the handle of the user, that the notification comes from.
69
+ This defaults to 'Deploybot'
70
+
71
+ *This should not contain spaces as that causes the grove.io webservice some grief.*
47
72
 
48
73
  ### grove_icon_url
49
74
 
50
- This is the URL to the icon that your notification uses.
75
+ This should be a URL to an image that the service will use as its avatar in the channel.
51
76
 
52
77
  ### grove_url
53
78
 
54
79
  When clicking your notification in the grove.io notification window, this is the URL
55
80
  that you're taken to.
56
81
 
57
- ### grove_message
82
+ ## Functions
83
+
84
+ ### grove.notify
58
85
 
59
- Each time that the `grove:notify` task is run, `grove_message` is the message that
60
- is posted. Typically, you'd want to set this with a block so it can be lazily
61
- evaluated.
86
+ Capistrano::Grove comes with a single function: `grove.notify` for posting messages
87
+ to your channel. It takes a single parameter-the message to post.
62
88
 
63
- It defaults to:
89
+ Example:
64
90
 
65
- "Successful deployment of #{ fetch(:application, 'application') }."
91
+ grove.notify "That was easy!"
66
92
 
67
93
  ## Author
68
94
 
69
- `capistrano-grove` is written by Spike Grobstein
95
+ Capistrano::Grove is written by Spike Grobstein
70
96
  spikegrobstein@mac.com
71
97
  http://spike.grobste.in
72
98
  https://github.com/spikegrobstein
73
99
 
74
100
  ## License
75
101
 
76
- ©2012 Spike Grobstein
102
+ ©2012-2013 Spike Grobstein
77
103
  MIT License (see `LICENSE` file included in this package).
78
104
 
@@ -18,6 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency('capistrano', '>= 2.12.0')
21
+ s.add_dependency('capnotify', "~> 0.1pre")
22
22
  s.add_dependency('grove-rb', '>= 0.2.0')
23
+
24
+ s.add_development_dependency('rspec')
25
+ s.add_development_dependency('pry')
23
26
  end
@@ -0,0 +1,16 @@
1
+ module Capistrano
2
+ module Grove
3
+ class Client
4
+ attr_accessor :grove_client
5
+
6
+ def initialize(channel_key, options)
7
+ @grove_client = ::Grove.new(channel_key, options)
8
+ end
9
+
10
+ # post +message+ as a notification. Returns true om-success and false on-failure.
11
+ def notify(message)
12
+ !( @grove_client.post(message).status >= 400 )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Grove
3
- VERSION = "1.0.1"
3
+ VERSION = "2.0.0pre"
4
4
  end
5
5
  end
@@ -1,21 +1,61 @@
1
+ require "capnotify"
1
2
  require "capistrano-grove/version"
3
+ require "capistrano-grove/client"
2
4
  require "grove-rb"
3
5
 
4
6
  module Capistrano
5
7
  module Grove
6
8
 
7
- class Client
8
- attr_accessor :grove_client
9
+ def self.load_into(config)
10
+ config.load do
11
+ Capistrano.plugin :grove, Capistrano::Grove
12
+
13
+ def _cset(name, *args, &block)
14
+ unless exists?(name)
15
+ set(name, *args, &block)
16
+ end
17
+ end
18
+
19
+ # the channel's API key
20
+ _cset(:grove_channel_token) { abort "Please set grove_channel_token!" }
21
+
22
+ # the name of the service doing the posting
23
+ _cset :grove_service, 'DeployBot'
24
+
25
+ # url to the icon to use.
26
+ _cset :grove_icon_url, nil
27
+
28
+ # the url you want to use for your bot
29
+ _cset :grove_url, nil
30
+
31
+ # capnotify hooks
32
+ on(:deploy_start) { grove.notify fetch(:capnotify_deploy_start_msg) }
33
+ on(:deploy_complete) { grove.notify fetch(:capnotify_deploy_complete_msg) }
34
+ on(:migrate_start) { grove.notify fetch(:capnotify_migrate_start_msg) }
35
+ on(:migrate_complete) { grove.notify fetch(:capnotify_migrate_complete_msg) }
36
+ on(:maintenance_page_up) { grove.notify fetch(:capnotify_maintenance_page_up_msg) }
37
+ on(:maintenance_page_down) { grove.notify fetch(:capnotify_maintenance_page_down_msg) }
9
38
 
10
- def initialize(channel_key, options)
11
- @grove_client = ::Grove.new(channel_key, options)
12
39
  end
40
+ end
41
+
42
+ # send a notification to the grove service
43
+ def notify(message)
44
+ g = Client.new(grove_channel_token,
45
+ :service => grove_service,
46
+ :icon_url => grove_icon_url,
47
+ :url => grove_url
48
+ )
13
49
 
14
- # post +message+ as a notification. Returns true om-success and false on-failure.
15
- def notify(message)
16
- !( @grove_client.post(message).status >= 400 )
50
+ unless g.notify(message)
51
+ # error
52
+ logger.important "Failed to send notification to grove.io"
17
53
  end
18
54
  end
19
55
 
20
56
  end
21
57
  end
58
+
59
+ if Capistrano::Configuration.instance
60
+ Capistrano::Grove.load_into(Capistrano::Configuration.instance)
61
+ end
File without changes
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capistrano::Grove do
4
+
5
+ let(:config) { Capistrano::Configuration.new }
6
+ let(:client) { double('grove').as_null_object }
7
+
8
+ before do
9
+ Capistrano::Grove.load_into(config)
10
+ end
11
+
12
+
13
+ context "when notifying" do
14
+ context "when failing to set grove_channel_token" do
15
+
16
+ it "should raise an error" do
17
+ expect { config.grove.notify }.to raise_error
18
+ end
19
+
20
+ end
21
+
22
+ context "when grove_channel_token is set" do
23
+ before do
24
+ config.load do
25
+ set :grove_channel_token, 'asdfasdfasdf'
26
+ end
27
+ end
28
+
29
+ after do
30
+ config.grove.notify 'msg'
31
+ end
32
+
33
+ it "should use :grove_channel_token" do
34
+ new_channel_token = '12345678901234567890123456789012'
35
+ config.set(:grove_channel_token, new_channel_token)
36
+
37
+ client.stub(:notify => true)
38
+
39
+ Capistrano::Grove::Client.should_receive(:new).with do |channel_token, options|
40
+ channel_token.should == new_channel_token
41
+ end.and_return(client)
42
+ end
43
+
44
+ it "should use :grove_service" do
45
+ new_grove_service = 'testing-service'
46
+ config.set(:grove_service, new_grove_service)
47
+
48
+ client.stub(:notify => true)
49
+
50
+ Capistrano::Grove::Client.should_receive(:new).with do |channel_token, options|
51
+ options[:service].should == new_grove_service
52
+ end.and_return(client)
53
+ end
54
+
55
+ it "should use :grove_icon_url" do
56
+ new_grove_icon_url = 'http://example.com/testing/icon.png'
57
+ config.set(:grove_icon_url, new_grove_icon_url)
58
+
59
+ client.stub(:notify => true)
60
+
61
+ Capistrano::Grove::Client.should_receive(:new).with do |channel_token, options|
62
+ options[:icon_url].should == new_grove_icon_url
63
+ end.and_return(client)
64
+ end
65
+
66
+ it "should use :grove_url" do
67
+ new_grove_url = 'http://testing.com/capistrano-grove'
68
+ config.set(:grove_url, new_grove_url)
69
+
70
+ client.stub(:notify => true)
71
+
72
+ Capistrano::Grove::Client.should_receive(:new).with do |channel_token, options|
73
+ options[:url].should == new_grove_url
74
+ end.and_return(client)
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ end
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,5 @@ require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
4
  require 'capistrano-grove'
5
+ require 'pry'
5
6
 
6
- Rspec.configure do |config|
7
- # config
8
- end
metadata CHANGED
@@ -1,66 +1,90 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: capistrano-grove
3
- version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 1
10
- version: 1.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0pre
5
+ prerelease: 5
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Spike Grobstein
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-05-30 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: capistrano
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
12
+ date: 2013-04-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: capnotify
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 63
29
- segments:
30
- - 2
31
- - 12
32
- - 0
33
- version: 2.12.0
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.1pre
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: grove-rb
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.1pre
30
+ - !ruby/object:Gem::Dependency
31
+ name: grove-rb
32
+ requirement: !ruby/object:Gem::Requirement
40
33
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 23
45
- segments:
46
- - 0
47
- - 2
48
- - 0
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
49
37
  version: 0.2.0
50
38
  type: :runtime
51
- version_requirements: *id002
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.2.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: pry
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
52
78
  description: Customizable Capistrano tasks for communicating with the grove.io webservice.
53
- email:
79
+ email:
54
80
  - spikegrobstein@mac.com
55
81
  executables: []
56
-
57
82
  extensions: []
58
-
59
83
  extra_rdoc_files: []
60
-
61
- files:
84
+ files:
62
85
  - .gitignore
63
86
  - .rspec
87
+ - .travis.yml
64
88
  - CHANGELOG
65
89
  - Gemfile
66
90
  - LICENSE
@@ -68,43 +92,37 @@ files:
68
92
  - Rakefile
69
93
  - capistrano-grove.gemspec
70
94
  - lib/capistrano-grove.rb
95
+ - lib/capistrano-grove/client.rb
71
96
  - lib/capistrano-grove/version.rb
72
- - lib/grove/capistrano.rb
73
- - spec/grove/capistrano_spec.rb
97
+ - spec/capistrano-grove/client_spec.rb
98
+ - spec/capistrano-grove_spec.rb
74
99
  - spec/spec_helper.rb
75
100
  homepage: https://github.com/spikegrobstein/capistrano-grove
76
101
  licenses: []
77
-
78
102
  post_install_message:
79
103
  rdoc_options: []
80
-
81
- require_paths:
104
+ require_paths:
82
105
  - lib
83
- required_ruby_version: !ruby/object:Gem::Requirement
106
+ required_ruby_version: !ruby/object:Gem::Requirement
84
107
  none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- hash: 3
89
- segments:
90
- - 0
91
- version: "0"
92
- required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
113
  none: false
94
- requirements:
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- hash: 3
98
- segments:
99
- - 0
100
- version: "0"
114
+ requirements:
115
+ - - ! '>'
116
+ - !ruby/object:Gem::Version
117
+ version: 1.3.1
101
118
  requirements: []
102
-
103
119
  rubyforge_project: capistrano-grove
104
- rubygems_version: 1.8.12
120
+ rubygems_version: 1.8.24
105
121
  signing_key:
106
122
  specification_version: 3
107
123
  summary: Post to grove.io after a deploy.
108
- test_files:
109
- - spec/grove/capistrano_spec.rb
124
+ test_files:
125
+ - spec/capistrano-grove/client_spec.rb
126
+ - spec/capistrano-grove_spec.rb
110
127
  - spec/spec_helper.rb
128
+ has_rdoc:
@@ -1,43 +0,0 @@
1
- require 'capistrano'
2
- require 'capistrano-grove'
3
-
4
- module Capistrano
5
- module Grove
6
-
7
- def self.load_into(config)
8
- config.load do
9
- set :grove_channel_key, '' # the channel's API key
10
- set :grove_service, 'DeployBot' # the name of the service posting
11
- set :grove_icon_url, nil # url to the icon to use.
12
- set :grove_url, nil # the url you want to use for your bot
13
-
14
- # the message that gets posted.
15
- # set this before calling grove:notify to customize
16
- set(:grove_message) {
17
- "Successful deployment of #{ fetch(:application, 'application') }."
18
- }
19
-
20
- namespace :grove do
21
-
22
- desc "Notify the grove.io service."
23
- task :notify do
24
- g = Client.new(grove_channel_key,
25
- :service => grove_service,
26
- :icon_url => grove_icon_url,
27
- :url => grove_url
28
- )
29
-
30
- unless g.notify(grove_message)
31
- # error
32
- logger.important "Failed to send notification to grove.io"
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
40
-
41
- if Capistrano::Configuration.instance
42
- Capistrano::Grove.load_into(Capistrano::Configuration.instance)
43
- end
@@ -1,73 +0,0 @@
1
- require 'capistrano'
2
- require 'grove-rb'
3
-
4
- require File.dirname(__FILE__) + '/../../lib/grove/capistrano'
5
-
6
- describe Capistrano::Grove do
7
-
8
- let(:config) { Capistrano::Configuration.new }
9
- let(:grove) { double('grove').as_null_object }
10
-
11
- context "when notifying" do
12
-
13
- before do
14
- Capistrano::Grove.load_into(config)
15
- end
16
-
17
- after do
18
- config.find_and_execute_task('grove:notify')
19
- end
20
-
21
- it "should notify with the :grove_message" do
22
- Capistrano::Grove::Client.should_receive(:new).and_return(grove)
23
-
24
- grove.should_receive(:notify).with(config.fetch(:grove_message)).and_return(true)
25
- end
26
-
27
- it "should use :grove_channel_key" do
28
- new_channel_key = '12345678901234567890123456789012'
29
- config.set(:grove_channel_key, new_channel_key)
30
-
31
- grove.stub(:notify => true)
32
-
33
- Capistrano::Grove::Client.should_receive(:new).with do |channel_key, options|
34
- channel_key.should == new_channel_key
35
- end.and_return(grove)
36
- end
37
-
38
- it "should use :grove_service" do
39
- new_grove_service = 'testing-service'
40
- config.set(:grove_service, new_grove_service)
41
-
42
- grove.stub(:notify => true)
43
-
44
- Capistrano::Grove::Client.should_receive(:new).with do |channel_key, options|
45
- options[:service].should == new_grove_service
46
- end.and_return(grove)
47
- end
48
-
49
- it "should use :grove_icon_url" do
50
- new_grove_icon_url = 'http://example.com/testing/icon.png'
51
- config.set(:grove_icon_url, new_grove_icon_url)
52
-
53
- grove.stub(:notify => true)
54
-
55
- Capistrano::Grove::Client.should_receive(:new).with do |channel_key, options|
56
- options[:icon_url].should == new_grove_icon_url
57
- end.and_return(grove)
58
- end
59
-
60
- it "should use :grove_url" do
61
- new_grove_url = 'http://testing.com/capistrano-grove'
62
- config.set(:grove_url, new_grove_url)
63
-
64
- grove.stub(:notify => true)
65
-
66
- Capistrano::Grove::Client.should_receive(:new).with do |channel_key, options|
67
- options[:url].should == new_grove_url
68
- end.and_return(grove)
69
- end
70
-
71
- end
72
-
73
- end