capistrano-fanfare 0.0.22 → 0.0.23

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -3,6 +3,8 @@ language: ruby
3
3
  matrix:
4
4
  allow_failures:
5
5
  - rvm: ruby-head
6
+ - rvm: rbx-19mode
7
+ - rvm: rbx-18mode
6
8
 
7
9
  rvm:
8
10
  - 1.9.3
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # <a name="title"></a> Capistrano::Fanfare [![Build Status](https://secure.travis-ci.org/fnichol/capistrano-fanfare.png)](http://travis-ci.org/fnichol/capistrano-fanfare) [![Dependency Status](https://gemnasium.com/fnichol/capistrano-fanfare.png)](https://gemnasium.com/fnichol/capistrano-fanfare)
1
+ # <a name="title"></a> Capistrano::Fanfare [![Build Status](https://secure.travis-ci.org/fnichol/capistrano-fanfare.png)](http://travis-ci.org/fnichol/capistrano-fanfare) [![Dependency Status](https://gemnasium.com/fnichol/capistrano-fanfare.png)](https://gemnasium.com/fnichol/capistrano-fanfare) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/fnichol/capistrano-fanfare)
2
2
 
3
3
  **Notice:** This README is under active development.
4
4
 
@@ -38,6 +38,7 @@ Create a `Capfile` that looks like:
38
38
  fanfare_recipe 'colors'
39
39
  fanfare_recipe 'ssh'
40
40
  fanfare_recipe 'console'
41
+ fanfare_recipe 'log'
41
42
  fanfare_recipe 'campfire'
42
43
  fanfare_recipe 'airbrake'
43
44
 
@@ -107,6 +108,8 @@ There are several optional recipes that need additional gems in your Gemfile:
107
108
  Connect to your infrastructure nodes without thinking.
108
109
  * [console](#recipes-console):
109
110
  Rails 2/3, Sinatra, and Rack consoles, running in one command.
111
+ * [log](#recipes-log):
112
+ Ability to tail logs and load logs into a local editor.
110
113
  * [colors](#recipes-colors):
111
114
  Deploys, but prettier.
112
115
  * [campfire](#recipes-campfire):
@@ -172,6 +175,10 @@ a few additional helpers.
172
175
 
173
176
  > Rails 2/3, Sinatra, and Rack consoles, running in one command.
174
177
 
178
+ #### <a name="recipes-log"></a> log
179
+
180
+ > Ability to tail logs and load logs into a local editor.
181
+
175
182
  #### <a name="recipes-colors"></a> colors
176
183
 
177
184
  > Deploys, but prettier.
@@ -11,6 +11,13 @@ module Capistrano
11
11
  def fanfare_recipe(recipe)
12
12
  require "capistrano/fanfare/#{recipe}"
13
13
  end
14
+
15
+ def fanfare_require(gem_name, path = gem_name)
16
+ require path
17
+ rescue LoadError => error
18
+ raise "#{gem_name} gem could not be loaded: (#{error.message}). " +
19
+ "Please ensure it is in your Gemfile."
20
+ end
14
21
  end
15
22
  end
16
23
  end
@@ -2,15 +2,7 @@ require 'capistrano'
2
2
 
3
3
  module Capistrano::Fanfare::Airbrake
4
4
  def self.load_into(configuration)
5
- configuration.load do
6
- begin
7
- require 'airbrake/capistrano'
8
-
9
- rescue LoadError => error
10
- raise "airbrake gem could not be loaded: (#{error.message}). " +
11
- "Please ensure it is in your Gemfile."
12
- end
13
- end
5
+ configuration.load { fanfare_require 'airbrake', 'airbrake/capistrano' }
14
6
  end
15
7
  end
16
8
 
@@ -3,13 +3,7 @@ require 'capistrano'
3
3
  module Capistrano::Fanfare::Campfire
4
4
  def self.load_into(configuration)
5
5
  configuration.load do
6
- begin
7
- require 'campy'
8
-
9
- rescue LoadError => error
10
- raise "campy gem could not be loaded: (#{error.message}). " +
11
- "Please ensure it is in your Gemfile."
12
- end
6
+ fanfare_require 'campy'
13
7
 
14
8
  set(:campfire_yaml_file) do
15
9
  yaml_file = File.expand_path(ENV['CAMPFIRE_YAML_FILE'] || '~/.campfire.yml')
@@ -1,17 +1,11 @@
1
1
  require 'capistrano'
2
2
  require 'capistrano/fanfare/foreman/strategy'
3
3
 
4
- begin
5
- require 'foreman/procfile'
6
-
7
- rescue LoadError => error
8
- raise "Foreman gem could not be loaded: (#{error.message}). " +
9
- "Please ensure it is in your Gemfile."
10
- end
11
-
12
4
  module Capistrano::Fanfare::Foreman
13
5
  def self.load_into(configuration)
14
6
  configuration.load do
7
+ fanfare_require 'foreman', 'foreman/procfile'
8
+
15
9
  set(:local_procfile) { ENV['PROCFILE'] || "Procfile" }
16
10
  set(:user_home) { capture("echo $HOME").chomp }
17
11
 
@@ -0,0 +1,92 @@
1
+ require 'capistrano'
2
+ require 'tempfile'
3
+
4
+ module Capistrano::Fanfare::Log
5
+ def self.load_into(configuration)
6
+ configuration.load do
7
+ set :tail_cmd, "tail"
8
+
9
+ def resolve_logfile
10
+ rack_env = fetch(:rails_env, nil) || fetch(:rack_env, nil) || "production"
11
+
12
+ File.join(current_path, "log", "#{rack_env}.log")
13
+ end
14
+
15
+ def resolve_editor
16
+ ENV['editor'] || ENV['EDITOR'] || ENV['VISUAL'] || "vi"
17
+ end
18
+
19
+ def log_exec(cmd)
20
+ exec cmd
21
+ end
22
+
23
+ # =========================================================================
24
+ # These are the tasks that are available to help with deploying web apps.
25
+ # You can have cap give you a summary of them with `cap -T'.
26
+ # =========================================================================
27
+
28
+ namespace :log do
29
+ desc <<-DESC
30
+ Tails the deployed application log.You can set the rails \
31
+ environment by setting the :rails_env variable. The defaults are:
32
+
33
+ set :rails_env, "production"
34
+ set :tail_cmd, "tail"
35
+ DESC
36
+ task :tail, :role => :app, :except => { :no_release => true } do
37
+ stream("#{tail_cmd} -f #{resolve_logfile}")
38
+ end
39
+
40
+ desc <<-DESC
41
+ View log files in local editor. You can set the rails environment \
42
+ and tail command by setting variables. The defaults are:
43
+
44
+ set :rails_env, "production"
45
+ set :tail, "tail"
46
+
47
+ To override the default number of lines (500), you can pass in \
48
+ the `n' environment variable like so:
49
+
50
+ $ cap log:view n=900
51
+
52
+ To override your EDITOR/VISUAL environment settings for your visual \
53
+ editor, you can pass in the `editor' environment variable like so:
54
+
55
+ $ cap log:view editor=nano
56
+
57
+ Otherwise this task will try to resolve your editor in the \
58
+ following order:
59
+
60
+ 1) use the `editor' environment override variable value
61
+ 2) use the `EDITOR' shell environment variable value
62
+ 3) use the `VISUAL' shell environment variable value
63
+ 4) use `vi' which should be in almost any PATH
64
+ DESC
65
+ task :view, :role => :app, :except => { :no_release => true } do
66
+ line_nums = ENV["n"] || 500
67
+ cmd = "#{tail_cmd} -n #{line_nums} #{resolve_logfile}"
68
+ logs = Hash.new { |h,k| h[k] = '' }
69
+
70
+ run(cmd) do |channel, stream, data|
71
+ logs[channel[:host]] << data
72
+ break if stream == :err
73
+ end
74
+
75
+ tmpfile = Tempfile.open('w')
76
+ logs.each do |host, log|
77
+ tmpfile.write("--- #{host} ---\n\n")
78
+ tmpfile.write(log + "\n")
79
+ end
80
+ tmpfile.flush
81
+ tmpfile.close
82
+
83
+ log_exec "#{resolve_editor} #{tmpfile.path}"
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ if Capistrano::Configuration.instance
91
+ Capistrano::Fanfare::Log.load_into(Capistrano::Configuration.instance)
92
+ end
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Fanfare
3
- VERSION = "0.0.22"
3
+ VERSION = "0.0.23"
4
4
  end
5
5
  end
data/spec/log_spec.rb ADDED
@@ -0,0 +1,119 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/capistrano'
3
+ require 'capistrano/fanfare'
4
+ require 'capistrano/fanfare/log'
5
+ require 'mocha'
6
+
7
+ describe Capistrano::Fanfare::Log do
8
+ before do
9
+ @config = Capistrano::Configuration.new
10
+ Capistrano::Fanfare::Log.load_into(@config)
11
+ @config.extend(MiniTest::Capistrano::ConfigurationExtension)
12
+ end
13
+
14
+ describe "for variables" do
15
+ it "sets :tail_cmd to 'tail'" do
16
+ @config.fetch(:tail_cmd).must_equal "tail"
17
+ end
18
+ end
19
+
20
+ describe "for namespace :log" do
21
+ before do
22
+ @config.set :tail_cmd, "/usr/bin/tail"
23
+ @config.set :current_path, "/my/path"
24
+ end
25
+
26
+ describe "task :tail" do
27
+ it "tails a log file based on :rails_env variable" do
28
+ @config.set :rails_env, "uat"
29
+ @config.find_and_execute_task("log:tail")
30
+
31
+ @config.must_have_streamed "/usr/bin/tail -f /my/path/log/uat.log"
32
+ end
33
+
34
+ it "tails a log file based on :rack_env variable" do
35
+ @config.set :rack_env, "staging"
36
+ @config.find_and_execute_task("log:tail")
37
+
38
+ @config.must_have_streamed "/usr/bin/tail -f /my/path/log/staging.log"
39
+ end
40
+
41
+ it "tails the production log file if :rails_env and :rack_env does not exist" do
42
+ @config.find_and_execute_task("log:tail")
43
+
44
+ @config.must_have_streamed "/usr/bin/tail -f /my/path/log/production.log"
45
+ end
46
+ end
47
+
48
+ describe "task :view" do
49
+ before do
50
+ @config.stubs(:log_exec).returns(true)
51
+ @tempfile = Tempfile.open('w')
52
+ Tempfile.stubs(:open).with('w').returns(@tempfile)
53
+ end
54
+
55
+ describe "resolving log file" do
56
+ it "runs a tail on a log file based on :rails_env variable" do
57
+ @config.set :rails_env, "uat"
58
+ @config.find_and_execute_task("log:view")
59
+
60
+ @config.must_have_run "/usr/bin/tail -n 500 /my/path/log/uat.log"
61
+ end
62
+
63
+ it "runs a tail on a log file based on :rack_env variable" do
64
+ @config.set :rack_env, "staging"
65
+ @config.find_and_execute_task("log:view")
66
+
67
+ @config.must_have_run "/usr/bin/tail -n 500 /my/path/log/staging.log"
68
+ end
69
+
70
+ it "runs a tail of the production log file if :rails_env and :rack_env does not exist" do
71
+ @config.find_and_execute_task("log:view")
72
+
73
+ @config.must_have_run "/usr/bin/tail -n 500 /my/path/log/production.log"
74
+ end
75
+ end
76
+
77
+ it "runs a tail on a log file with a specified line count" do
78
+ ENV['_SPEC_n'] = ENV['n']
79
+ ENV['n'] = '987'
80
+ @config.find_and_execute_task("log:view")
81
+
82
+ @config.must_have_run "/usr/bin/tail -n 987 /my/path/log/production.log"
83
+ ENV['n'] = ENV.delete('_SPEC_n')
84
+ end
85
+
86
+ describe "resolving an editor" do
87
+ ENV_EDITORS = %w{VISUAL EDITOR editor}
88
+
89
+ before do
90
+ ENV_EDITORS.each do |e|
91
+ ENV["_SPEC_#{e}"] = ENV[e]
92
+ ENV.delete(e)
93
+ end
94
+ end
95
+
96
+ after do
97
+ ENV_EDITORS.each do |e|
98
+ ENV[e] = ENV.delete("_SPEC_#{e}")
99
+ end
100
+ end
101
+
102
+ it "opens the logfile in vi by default" do
103
+ @config.expects(:log_exec).with("vi #{@tempfile.path}")
104
+
105
+ @config.find_and_execute_task("log:view")
106
+ end
107
+
108
+ ENV_EDITORS.each do |v|
109
+ it "opens the logfile in the editor in ENV['#{v}']" do
110
+ ENV[v] = "/this/editor/#{v}"
111
+ @config.expects(:log_exec).with("#{ENV[v]} #{@tempfile.path}")
112
+
113
+ @config.find_and_execute_task("log:view")
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-fanfare
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.22
4
+ version: 0.0.23
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-16 00:00:00.000000000 Z
12
+ date: 2012-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: capistrano
@@ -155,6 +155,7 @@ files:
155
155
  - lib/capistrano/fanfare/foreman/strategy/runit.rb
156
156
  - lib/capistrano/fanfare/git_style.rb
157
157
  - lib/capistrano/fanfare/info.rb
158
+ - lib/capistrano/fanfare/log.rb
158
159
  - lib/capistrano/fanfare/multistage.rb
159
160
  - lib/capistrano/fanfare/ssh.rb
160
161
  - lib/capistrano/fanfare/version.rb
@@ -178,6 +179,7 @@ files:
178
179
  - spec/git_style_strategy_spec.rb
179
180
  - spec/info_spec.rb
180
181
  - spec/loading_spec.rb
182
+ - spec/log_spec.rb
181
183
  - spec/multistage_spec.rb
182
184
  - spec/ssh_spec.rb
183
185
  homepage: https://github.com/fnichol/capistrano-fanfare
@@ -194,7 +196,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
194
196
  version: '0'
195
197
  segments:
196
198
  - 0
197
- hash: -3688449692979042499
199
+ hash: 1800512189970899155
198
200
  required_rubygems_version: !ruby/object:Gem::Requirement
199
201
  none: false
200
202
  requirements:
@@ -203,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
205
  version: '0'
204
206
  segments:
205
207
  - 0
206
- hash: -3688449692979042499
208
+ hash: 1800512189970899155
207
209
  requirements: []
208
210
  rubyforge_project:
209
211
  rubygems_version: 1.8.24
@@ -231,5 +233,6 @@ test_files:
231
233
  - spec/git_style_strategy_spec.rb
232
234
  - spec/info_spec.rb
233
235
  - spec/loading_spec.rb
236
+ - spec/log_spec.rb
234
237
  - spec/multistage_spec.rb
235
238
  - spec/ssh_spec.rb