airbrussh 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 66dc41c940b4eac6103d25a09fa19e9fee07a863
4
+ data.tar.gz: ad675ee93d5b7e6bcfebbee06e7d9ee5ca384832
5
+ SHA512:
6
+ metadata.gz: fb2efbcfc660c198270768b65126d63efa2a503ff780dce66f59ecaa8b723231b534051c674e00dbef0834edf3b40e97e3fe6255c2877e8f0dbc38c4d5a3496c
7
+ data.tar.gz: 2350aacf020830da113e3664402fa95ca20bb2f23681ad8d18720d5ba5a6683842da0ede62b757b7843617a6d4f0241cc2e61e07b1edbb1d5468601b31f682e0
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
@@ -0,0 +1,3 @@
1
+ ## 0.0.1 (2015-02-19)
2
+
3
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in airbrussh.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Matt Brictson
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,113 @@
1
+ # Airbrussh
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/airbrussh.svg)](http://badge.fury.io/rb/airbrussh)
4
+
5
+
6
+ **Airbrussh is a replacement log formatter for SSHKit that makes your Capistrano output much easier on the eyes.** Just add it to your Capfile and enjoy concise, useful log output that is easy to read.
7
+
8
+ And don't worry: airbrussh saves Capistrano's default verbose output to a separate log file just in case you still need it for troubleshooting.
9
+
10
+ ![Sample output](https://raw.github.com/mattbrictson/airbrussh/master/demo.gif)
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem "airbrussh", :require => false
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Finally, add this line to your application's Capfile:
25
+
26
+ ```ruby
27
+ require "airbrussh/capistrano"
28
+ ```
29
+
30
+ **Important:** explicitly setting Capistrano's `:format` option in your deploy.rb will override airbrussh. Remove this line if you have it:
31
+
32
+ ```ruby
33
+ # Remove this
34
+ set :format, :pretty
35
+ ```
36
+
37
+ ## Usage
38
+
39
+ Airbrussh automatically replaces the default Capistrano log formatter, so there is nothing more you have to do. Just run `cap` as normal and enjoy the prettier output!
40
+
41
+ **Advanced:** Airbrussh can be configured by calling `Airbrussh.configure` in your `deploy.rb` file. You can do stage-specific configuration in e.g. `deploy/production.rb` as well. Here are the available options:
42
+
43
+ ```ruby
44
+ Airbrussh.configure do |config|
45
+ # Capistrano's default, un-airbrusshed output is saved to a file to
46
+ # facilitate debugging. To disable this entirely:
47
+ # config.log_file = nil
48
+ # Default:
49
+ config.log_file = "log/capistrano.log"
50
+
51
+ # Airbrussh patches Rake so it can access the name of the currently executing
52
+ # task. Set this to false if monkey patching is causing issues.
53
+ # Default:
54
+ config.monkey_patch_rake = true
55
+
56
+ # Ansi colors will be used in the output automatically based on whether the
57
+ # output is a TTY, or if the SSHKIT_COLOR environment variable is set.
58
+ # To disable color always:
59
+ # config.color = false
60
+ # Default:
61
+ config.color = :auto
62
+
63
+ # Output is automatically truncated to the width of the terminal window, if
64
+ # possible. If the width of the terminal can't be determined, no truncation
65
+ # is performed. To truncate to a fixed width:
66
+ # config.truncate = 80
67
+ # Or to disable truncation entirely:
68
+ # config.truncate = false
69
+ # Default:
70
+ config.truncate = :auto
71
+ end
72
+ ```
73
+
74
+ ## Usage outside of Capistrano
75
+
76
+ If you are using SSHKit directly, you can use Airbrussh without the Capistrano magic:
77
+
78
+ ```ruby
79
+ require "airbrussh"
80
+ SSHKit.config.output = Airbrussh::Formatter.new
81
+ ```
82
+
83
+ When Capistrano is not present, Airbrussh uses a slightly different default configuration:
84
+
85
+ ```ruby
86
+ Airbrussh.configure do |config|
87
+ config.log_file = nil
88
+ config.monkey_patch_rake = false
89
+ config.color = :auto
90
+ config.truncate = :auto
91
+ end
92
+ ```
93
+
94
+ ## History
95
+
96
+ Airbrussh started life as custom logging code within the [capistrano-fiftyfive][] collection of opinionated Capistrano recipes. In February 2015, the logging code was refactored into a standalone gem with its own configuration and documentation, and renamed `airbrussh`. Now anyone can using SSHKit or Capistrano can safely plug it into their projects!
97
+
98
+ ## Roadmap
99
+
100
+ Airbrussh needs work! The first priority is to add tests. Once good test coverage is in place, some clean up and refactoring is needed to make the core formatting code easier to understand.
101
+
102
+ If you have ideas for other improvements, please contribute!
103
+
104
+
105
+ ## Contributing
106
+
107
+ 1. Fork it ( https://github.com/[my-github-username]/airbrussh/fork )
108
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
109
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
110
+ 4. Push to the branch (`git push origin my-new-feature`)
111
+ 5. Create a new Pull Request
112
+
113
+ [capistrano-fiftyfive]: https://github.com/mattbrictson/capistrano-fiftyfive
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ end
7
+
8
+ task :default => :test
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "airbrussh/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "airbrussh"
8
+ spec.version = Airbrussh::VERSION
9
+ spec.authors = ["Matt Brictson"]
10
+ spec.email = ["airbrussh@mattbrictson.com"]
11
+ spec.summary = "Airbrussh pretties up your SSHKit and Capistrano output"
12
+ spec.description = "Airbrussh is a replacement log formatter for SSHKit "\
13
+ "that makes your Capistrano output much easier on the "\
14
+ "eyes. Just add it to your Capfile and enjoy concise, "\
15
+ "useful log output that is easy to read."
16
+ spec.homepage = "https://github.com/mattbrictson/airbrussh"
17
+ spec.license = "MIT"
18
+
19
+ spec.files = `git ls-files -z`.split("\x0")
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_dependency "sshkit", ">= 1.6.1"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.7"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "minitest"
29
+ spec.add_development_dependency "minitest-reporters"
30
+ end
Binary file
@@ -0,0 +1,17 @@
1
+ require "airbrussh/configuration"
2
+ require "airbrussh/formatter"
3
+ require "airbrussh/version"
4
+
5
+ module Airbrussh
6
+ def self.configuration
7
+ @configuration ||= Configuration.new
8
+ end
9
+
10
+ def self.reset
11
+ @configuration = Configuration.new
12
+ end
13
+
14
+ def self.configure
15
+ yield(configuration)
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ require "airbrussh"
2
+ require "colorize"
3
+ require "sshkit/formatter/airbrussh"
4
+
5
+ # airbrush/capistrano uses a different default configuration
6
+ Airbrussh.configure do |config|
7
+ config.log_file = "log/capistrano.log"
8
+ config.monkey_patch_rake = true
9
+ config.color = :auto
10
+ config.truncate = :auto
11
+ end
12
+
13
+ # Sanity check!
14
+ unless defined?(Capistrano) && defined?(:namespace)
15
+ $stderr.puts\
16
+ "WARNING: airbrussh/capistrano must be loaded by Capistrano in order "\
17
+ "to work.\n"\
18
+ "Require this gem within your application's Capfile, as described here:\n"\
19
+ "https://github.com/mattbrictson/airbrussh#installation"\
20
+ .colorize(:red)
21
+ end
22
+
23
+ # Hook into Capistrano's init process to set the formatter
24
+ namespace :load do
25
+ task :defaults do
26
+ set :format, :airbrussh
27
+ end
28
+ end
29
+
30
+ # Capistrano failure hook
31
+ namespace :deploy do
32
+ task :failed do
33
+ output = env.backend.config.output
34
+ output.on_deploy_failure if output.respond_to?(:on_deploy_failure)
35
+ end
36
+ end
@@ -0,0 +1,12 @@
1
+ module Airbrussh
2
+ class Configuration
3
+ attr_accessor :log_file, :monkey_patch_rake, :color, :truncate
4
+
5
+ def initialize
6
+ self.log_file = nil
7
+ self.monkey_patch_rake = false
8
+ self.color = :auto
9
+ self.truncate = :auto
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,80 @@
1
+ require "io/console"
2
+
3
+ module Airbrussh
4
+ # Helper class that wraps an IO object and provides methods for truncating
5
+ # output, assuming the IO object represents a console window.
6
+ #
7
+ # This is useful for writing log messages that will typically show up on
8
+ # an ANSI color-capable console. When a console is not present (e.g. when
9
+ # running on a CI server) the output will gracefully degrade.
10
+ class Console
11
+ def initialize(output)
12
+ @output = output
13
+ end
14
+
15
+ # Writes to the IO after first truncating the output to fit the console
16
+ # width. If the underlying IO is not a TTY, ANSI colors are removed from
17
+ # the output. A newline is always added. Color output can be forced by
18
+ # setting the SSHKIT_COLOR environment variable.
19
+ def print_line(obj="")
20
+ string = obj.to_s
21
+
22
+ if console_width
23
+ string = truncate_to_console_width(string)
24
+ end
25
+ unless color_enabled?
26
+ string = strip_ascii_color(string)
27
+ end
28
+
29
+ write(string + "\n")
30
+ @output.flush
31
+ end
32
+
33
+ # Writes directly through to the IO with no truncation or color logic.
34
+ # No newline is added.
35
+ def write(string)
36
+ @output.write(string || "")
37
+ end
38
+ alias_method :<<, :write
39
+
40
+ def truncate_to_console_width(string)
41
+ string = (string || "").rstrip
42
+ width = console_width
43
+
44
+ if strip_ascii_color(string).length > width
45
+ while strip_ascii_color(string).length >= width
46
+ string.chop!
47
+ end
48
+ string << "…\e[0m"
49
+ else
50
+ string
51
+ end
52
+ end
53
+
54
+ def strip_ascii_color(string)
55
+ (string || "").gsub(/\033\[[0-9;]*m/, "")
56
+ end
57
+
58
+ def console_width
59
+ case (truncate = Airbrussh.configuration.truncate)
60
+ when :auto
61
+ IO.console.winsize.last if @output.tty?
62
+ when Fixnum
63
+ truncate
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def color_enabled?
70
+ case Airbrussh.configuration.color
71
+ when true
72
+ true
73
+ when :auto
74
+ ENV["SSHKIT_COLOR"] || @output.tty?
75
+ else
76
+ false
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,203 @@
1
+ require "airbrussh/console"
2
+ require "colorize"
3
+ require "ostruct"
4
+ require "sshkit"
5
+
6
+ # TODO: honor Airbrussh.configuration!
7
+
8
+ module Airbrussh
9
+ class Formatter < SSHKit::Formatter::Abstract
10
+ class << self
11
+ attr_accessor :current_rake_task
12
+
13
+ def monkey_patch_rake_task!
14
+ return unless Airbrussh.configuration.monkey_patch_rake
15
+ return if @rake_patched
16
+
17
+ eval(<<-EVAL)
18
+ class ::Rake::Task
19
+ alias_method :_original_execute_airbrussh, :execute
20
+ def execute(args=nil)
21
+ #{name}.current_rake_task = name
22
+ _original_execute_airbrussh(args)
23
+ end
24
+ end
25
+ EVAL
26
+
27
+ @rake_patched = true
28
+ end
29
+ end
30
+
31
+ def initialize(io)
32
+ super
33
+
34
+ self.class.monkey_patch_rake_task!
35
+
36
+ @tasks = {}
37
+
38
+ @log_file = Airbrussh.configuration.log_file
39
+ @log_file_formatter = create_log_file_formatter
40
+
41
+ @console = Airbrussh::Console.new(original_output)
42
+ write_log_file_delimiter
43
+ write_banner
44
+ end
45
+
46
+ def create_log_file_formatter
47
+ return SSHKit::Formatter::BlackHole.new(nil) if @log_file.nil?
48
+ SSHKit::Formatter::Pretty.new(
49
+ ::Logger.new(@log_file, 1, 20971520)
50
+ )
51
+ end
52
+
53
+ def print_line(string)
54
+ @console.print_line(string)
55
+ end
56
+
57
+ def write_banner
58
+ return if @log_file.nil?
59
+ print_line "Using airbrussh format."
60
+ print_line "Verbose output is being written to #{blue(@log_file)}."
61
+ end
62
+
63
+ def write_log_file_delimiter
64
+ delimiter = []
65
+ delimiter << "-" * 75
66
+ delimiter << "START #{Time.now} cap #{ARGV.join(' ')}"
67
+ delimiter << "-" * 75
68
+ delimiter.each do |line|
69
+ @log_file_formatter << SSHKit::LogMessage.new(
70
+ SSHKit::Logger::INFO,
71
+ line
72
+ )
73
+ end
74
+ end
75
+
76
+ def write(obj)
77
+ @log_file_formatter << obj
78
+
79
+ case obj
80
+ when SSHKit::Command then write_command(obj)
81
+ when SSHKit::LogMessage then write_log_message(obj)
82
+ end
83
+ end
84
+ alias :<< :write
85
+
86
+ def on_deploy_failure
87
+ return if @log_file.nil?
88
+ err = Airbrussh::Console.new($stderr)
89
+ err.print_line
90
+ err.print_line(red("** DEPLOY FAILED"))
91
+ err.print_line(yellow(
92
+ "** Refer to #{@log_file} for details. Here are the last 20 lines:"
93
+ ))
94
+ err.print_line
95
+ system("tail -n 20 #{@log_file.shellescape} 1>&2")
96
+ end
97
+
98
+ private
99
+
100
+ def write_log_message(log_message)
101
+ return unless log_message.verbosity >= SSHKit::Logger::INFO
102
+ print_task_if_changed
103
+ @console.print_line(light_black(" " + log_message.to_s))
104
+ end
105
+
106
+ def write_command(command)
107
+ return unless command.verbosity > SSHKit::Logger::DEBUG
108
+
109
+ print_task_if_changed
110
+
111
+ ctx = context_for_command(command)
112
+ number = '%02d' % ctx.number
113
+
114
+ if ctx.first_execution?
115
+ description = yellow(ctx.shell_string)
116
+ print_line " #{number} #{description}"
117
+ end
118
+
119
+ if command.finished?
120
+ status = format_command_completion_status(command, number)
121
+ print_line " #{status}"
122
+ end
123
+ end
124
+
125
+ def print_task_if_changed
126
+ status = current_task_status
127
+
128
+ if status.changed && !status.task.empty?
129
+ print_line "#{clock} #{blue(status.task)}"
130
+ end
131
+ end
132
+
133
+ def current_task_status
134
+ task = self.class.current_rake_task.to_s
135
+ if @tasks[task]
136
+ changed = false
137
+ else
138
+ changed = true
139
+ @tasks[task] = []
140
+ end
141
+
142
+ OpenStruct.new(
143
+ :task => task,
144
+ :commands => @tasks[task],
145
+ :changed => changed
146
+ )
147
+ end
148
+
149
+ def context_for_command(command)
150
+ status = current_task_status
151
+ task_commands = status.commands
152
+
153
+ shell_string = command.to_s.sub(%r(^/usr/bin/env ), "")
154
+
155
+ if task_commands.include?(shell_string)
156
+ first_execution = false
157
+ else
158
+ first_execution = true
159
+ task_commands << shell_string
160
+ end
161
+
162
+ number = task_commands.index(shell_string) + 1
163
+
164
+ OpenStruct.new({
165
+ :first_execution? => first_execution,
166
+ :number => number,
167
+ :shell_string => shell_string
168
+ })
169
+ end
170
+
171
+ def format_command_completion_status(command, number)
172
+ user = command.user { command.host.user }
173
+ host = command.host.to_s
174
+ user_at_host = [user, host].join("@")
175
+
176
+ status = if command.failure?
177
+ red("✘ #{number} #{user_at_host} (see #{@log_file} for details)")
178
+ else
179
+ green("✔ #{number} #{user_at_host}")
180
+ end
181
+
182
+ runtime = light_black("%5.3fs" % command.runtime)
183
+
184
+ status + " " + runtime
185
+ end
186
+
187
+ def clock
188
+ @start_at ||= Time.now
189
+ duration = Time.now - @start_at
190
+
191
+ minutes = (duration / 60).to_i
192
+ seconds = (duration - minutes * 60).to_i
193
+
194
+ "%02d:%02d" % [minutes, seconds]
195
+ end
196
+
197
+ %w(light_black red blue green yellow).each do |color|
198
+ define_method(color) do |string|
199
+ string.to_s.colorize(color.to_sym)
200
+ end
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,3 @@
1
+ module Airbrussh
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,12 @@
1
+ require "airbrussh/formatter"
2
+
3
+ # Capistrano's formatter configuration requires that the formatter class
4
+ # be in the SSHKit::Formatter namespace. So we declare
5
+ # SSHKit::Formatter::Airbrussh that simply functions as an alias for
6
+ # Airbrussh::Formatter.
7
+ module SSHKit
8
+ module Formatter
9
+ class Airbrussh < Airbrussh::Formatter
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+ require "airbrussh"
3
+
4
+ require "minitest/autorun"
5
+ require "minitest/reporters"
6
+
7
+ Minitest::Reporters.use!(
8
+ Minitest::Reporters::ProgressReporter.new,
9
+ ENV,
10
+ Minitest.backtrace_filter
11
+ )
@@ -0,0 +1,11 @@
1
+ require "minitest_helper"
2
+
3
+ class TestAirbrussh < MiniTest::Unit::TestCase
4
+ def test_that_it_has_a_version_number
5
+ refute_nil ::Airbrussh::VERSION
6
+ end
7
+
8
+ def test_it_does_something_useful
9
+ assert false
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: airbrussh
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matt Brictson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sshkit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-reporters
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Airbrussh is a replacement log formatter for SSHKit that makes your Capistrano
84
+ output much easier on the eyes. Just add it to your Capfile and enjoy concise, useful
85
+ log output that is easy to read.
86
+ email:
87
+ - airbrussh@mattbrictson.com
88
+ executables: []
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".gitignore"
93
+ - ".travis.yml"
94
+ - CHANGELOG.md
95
+ - Gemfile
96
+ - LICENSE.txt
97
+ - README.md
98
+ - Rakefile
99
+ - airbrussh.gemspec
100
+ - demo.gif
101
+ - lib/airbrussh.rb
102
+ - lib/airbrussh/capistrano.rb
103
+ - lib/airbrussh/configuration.rb
104
+ - lib/airbrussh/console.rb
105
+ - lib/airbrussh/formatter.rb
106
+ - lib/airbrussh/version.rb
107
+ - lib/sshkit/formatter/airbrussh.rb
108
+ - test/minitest_helper.rb
109
+ - test/test_airbrussh.rb
110
+ homepage: https://github.com/mattbrictson/airbrussh
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.4.6
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: Airbrussh pretties up your SSHKit and Capistrano output
134
+ test_files:
135
+ - test/minitest_helper.rb
136
+ - test/test_airbrussh.rb