airbrussh 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +113 -0
- data/Rakefile +8 -0
- data/airbrussh.gemspec +30 -0
- data/demo.gif +0 -0
- data/lib/airbrussh.rb +17 -0
- data/lib/airbrussh/capistrano.rb +36 -0
- data/lib/airbrussh/configuration.rb +12 -0
- data/lib/airbrussh/console.rb +80 -0
- data/lib/airbrussh/formatter.rb +203 -0
- data/lib/airbrussh/version.rb +3 -0
- data/lib/sshkit/formatter/airbrussh.rb +12 -0
- data/test/minitest_helper.rb +11 -0
- data/test/test_airbrussh.rb +11 -0
- metadata +136 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
data/Rakefile
ADDED
data/airbrussh.gemspec
ADDED
@@ -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
|
data/demo.gif
ADDED
Binary file
|
data/lib/airbrussh.rb
ADDED
@@ -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,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,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
|
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
|