airbrussh 0.4.1 → 0.5.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +35 -0
- data/.rubocop_todo.yml +21 -0
- data/.travis.yml +10 -1
- data/CHANGELOG.md +34 -6
- data/CONTRIBUTING.md +27 -0
- data/Gemfile +15 -0
- data/Guardfile +6 -0
- data/README.md +6 -6
- data/Rakefile +12 -2
- data/airbrussh.gemspec +10 -0
- data/bin/test_all.rb +15 -0
- data/lib/airbrussh.rb +0 -4
- data/lib/airbrussh/capistrano.rb +7 -7
- data/lib/airbrussh/colors.rb +24 -0
- data/lib/airbrussh/command_formatter.rb +77 -0
- data/lib/airbrussh/console.rb +11 -14
- data/lib/airbrussh/formatter.rb +78 -125
- data/lib/airbrussh/rake/command.rb +24 -0
- data/lib/airbrussh/rake/context.rb +73 -0
- data/lib/airbrussh/version.rb +1 -1
- metadata +110 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0a386319a132a613b48624a83110acc398c36b4
|
4
|
+
data.tar.gz: ae0e818ca6931928500bf516bed0a8f542c6a53f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e372e78dd7f096b2602c998ed5178409978f8f0e6be17a5034c202c8e05a666ab9ccf61ab15a1bed01d9b2f141035c25fbe67b7e605ce5c251d9fe67b14c858c
|
7
|
+
data.tar.gz: 771b4bf163c6c2b59bacc25bfc6f4d7fe9931121ba3280587e403b42ee5633518c6c4d0bcd1b3c8dc9d01a6432ade255d48d1f92d3a9e614d11c72f63a971af6
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
Exclude:
|
5
|
+
- "*.gemspec"
|
6
|
+
|
7
|
+
Metrics/AbcSize:
|
8
|
+
Exclude:
|
9
|
+
- "test/**/*"
|
10
|
+
|
11
|
+
Metrics/MethodLength:
|
12
|
+
Exclude:
|
13
|
+
- "test/**/*"
|
14
|
+
|
15
|
+
Metrics/ClassLength:
|
16
|
+
Exclude:
|
17
|
+
- "test/**/*"
|
18
|
+
|
19
|
+
Style/ClassAndModuleChildren:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Style/Documentation:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
Style/DoubleNegation:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
Style/HashSyntax:
|
29
|
+
EnforcedStyle: hash_rockets
|
30
|
+
|
31
|
+
Style/SpaceAroundEqualsInParameterDefault:
|
32
|
+
EnforcedStyle: no_space
|
33
|
+
|
34
|
+
Style/StringLiterals:
|
35
|
+
EnforcedStyle: double_quotes
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2015-05-10 16:52:41 -0700 using RuboCop version 0.31.0.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 1
|
9
|
+
# Configuration parameters: CountComments.
|
10
|
+
Metrics/ClassLength:
|
11
|
+
Max: 168
|
12
|
+
|
13
|
+
# Offense count: 5
|
14
|
+
# Configuration parameters: CountComments.
|
15
|
+
Metrics/MethodLength:
|
16
|
+
Max: 15
|
17
|
+
|
18
|
+
# Offense count: 1
|
19
|
+
# Configuration parameters: MinBodyLength.
|
20
|
+
Style/GuardClause:
|
21
|
+
Enabled: false
|
data/.travis.yml
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
-
|
3
|
+
- 1.9
|
4
|
+
- 2.0
|
5
|
+
- 2.1
|
6
|
+
- 2.2
|
7
|
+
env:
|
8
|
+
- sshkit="master"
|
9
|
+
# This is the old master before https://github.com/capistrano/sshkit/pull/257 was merged
|
10
|
+
- sshkit="ea211bcbbb71dab0152a18c2774922b7017e4edc"
|
11
|
+
- sshkit="= 1.7.1"
|
12
|
+
- sshkit="= 1.6.1"
|
4
13
|
before_install: gem install bundler --conservative --version '~> 1.8'
|
data/CHANGELOG.md
CHANGED
@@ -1,29 +1,57 @@
|
|
1
|
-
|
1
|
+
# Airbrussh Change Log
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
Airbrussh is in a pre-1.0 state. This means that its APIs and behavior are subject to breaking changes without deprecation notices. Until 1.0, version numbers will follow a [Semver][]-ish `0.y.z` format, where `y` is incremented when new features or breaking changes are introduced, and `z` is incremented for lesser changes or bug fixes.
|
6
|
+
|
7
|
+
## [Unreleased]
|
2
8
|
|
3
9
|
* Your contribution here!
|
4
10
|
|
5
|
-
## 0.
|
11
|
+
## [0.5.0][] (2015-06-24)
|
12
|
+
|
13
|
+
There are no changes to the actual behavior and feature set of Airbrussh in this release.
|
14
|
+
|
15
|
+
There are, however, many behind-the-scenes changes and improvements to overall code quality. This release also adds support for upcoming versions of SSHKit.
|
16
|
+
|
17
|
+
* Added Rubocop enforcement to Travis
|
18
|
+
* Added Code Climate and Coveralls checks (see badges in the README)
|
19
|
+
* Airbrussh now has good test coverage, and is tested by Travis against a matrix of Ruby and SSHKit versions ([@robd](https://github.com/robd))
|
20
|
+
* Changes to support the new SSHKit formatter API, as introduced in [SSHKit #257](https://github.com/capistrano/sshkit/pull/257) ([@robd](https://github.com/robd))
|
21
|
+
* `Airbrussh.reset` has been removed
|
22
|
+
* Airbrussh now has its own ANSI color code; it no longer relies on a third-party gem (i.e. `colorize`)
|
23
|
+
|
24
|
+
## [0.4.1][] (2015-05-06)
|
6
25
|
|
7
26
|
* Fix `Marshal.dump` warnings by removing `deep_copy` workaround that it is no longer needed for the latest SSHKit ([#10](https://github.com/mattbrictson/airbrussh/issues/10)).
|
8
27
|
|
9
|
-
## 0.4.0 (2015-05-03)
|
28
|
+
## [0.4.0][] (2015-05-03)
|
10
29
|
|
11
30
|
* Changes to ensure compatibility with the upcoming version of SSHKit ([ec3122b](https://github.com/mattbrictson/airbrussh/commit/ec3122b101de53f2304723da842d5c8b6f70f4f3)).
|
12
31
|
* Explicitly specify UTF-8 encoding for source files, for Ruby 1.9.3 compatibility ([#9](https://github.com/mattbrictson/airbrussh/issues/9)).
|
13
32
|
|
14
|
-
## 0.3.0 (2015-03-28)
|
33
|
+
## [0.3.0][] (2015-03-28)
|
15
34
|
|
16
35
|
* New `config.banner` option allows startup message to be disabled or changed (suggestion from [@justindowning](https://github.com/justindowning))
|
17
36
|
* New `config.command_output` option gives full control of whether airbrussh shows or hides the stderr and stdout data received from remote commands; see the usage section of the README for further explanation (suggestion from [@carlesso](https://github.com/carlesso))
|
18
37
|
|
19
|
-
## 0.2.1 (2015-03-02)
|
38
|
+
## [0.2.1][] (2015-03-02)
|
20
39
|
|
21
40
|
* Un-pin SSHKit dependency now that SSHKit 1.7.1 has been released.
|
22
41
|
|
23
|
-
## 0.2.0 (2015-03-02)
|
42
|
+
## [0.2.0][] (2015-03-02)
|
24
43
|
|
25
44
|
* Pin SSHKit dependency at `~> 1.6.1` to avoid a [bug in 1.7.0](https://github.com/capistrano/sshkit/issues/226) that causes command exit statuses to be omitted from the log.
|
26
45
|
|
27
46
|
## 0.0.1 (2015-02-19)
|
28
47
|
|
29
48
|
* Initial release
|
49
|
+
|
50
|
+
[Semver]: http://semver.org
|
51
|
+
[Unreleased]: https://github.com/mattbrictson/airbrussh/compare/v0.5.0...HEAD
|
52
|
+
[0.5.0]: https://github.com/mattbrictson/airbrussh/compare/v0.4.1...v0.5.0
|
53
|
+
[0.4.1]: https://github.com/mattbrictson/airbrussh/compare/v0.4.0...v0.4.1
|
54
|
+
[0.4.0]: https://github.com/mattbrictson/airbrussh/compare/v0.3.0...v0.4.0
|
55
|
+
[0.3.0]: https://github.com/mattbrictson/airbrussh/compare/v0.2.1...v0.3.0
|
56
|
+
[0.2.1]: https://github.com/mattbrictson/airbrussh/compare/v0.2.0...v0.2.1
|
57
|
+
[0.2.0]: https://github.com/mattbrictson/airbrussh/compare/v0.0.1...v0.2.0
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# Contributing to airbrussh
|
2
|
+
|
3
|
+
Have a feature idea, bug fix, or refactoring suggestion? Contributions are welcome!
|
4
|
+
|
5
|
+
## Pull requests
|
6
|
+
|
7
|
+
1. Check [Issues][] to see if your contribution has already been discussed and/or implemented.
|
8
|
+
2. If not, open an issue to discuss your contribution. I won't accept all changes and do not want to waste your time.
|
9
|
+
3. Once you have the :thumbsup:, fork the repo, make your changes, and open a PR.
|
10
|
+
4. Don't forget to add your contribution and credit yourself in `CHANGELOG.md`!
|
11
|
+
|
12
|
+
## Coding guidelines
|
13
|
+
|
14
|
+
* This project has a coding style enforced by [RuboCop][]. Use hash rockets and double-quoted strings, and otherwise try to follow the [Ruby style guide][style].
|
15
|
+
* Writing tests is strongly encouraged! This project uses Minitest.
|
16
|
+
|
17
|
+
## Getting started
|
18
|
+
|
19
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
20
|
+
|
21
|
+
* `rake` executes airbrussh's tests and RuboCop checks
|
22
|
+
* `bin/test_all.rb` executes the tests against all versions of SSHKit that airbrussh supports
|
23
|
+
* `guard` monitors the filesystem and automatically runs tests as you work
|
24
|
+
|
25
|
+
[Issues]: https://github.com/mattbrictson/airbrussh/issues
|
26
|
+
[RuboCop]: https://github.com/bbatsov/rubocop
|
27
|
+
[style]: https://github.com/bbatsov/ruby-style-guide
|
data/Gemfile
CHANGED
@@ -2,3 +2,18 @@ source "https://rubygems.org"
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in airbrussh.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
if (sshkit_version = ENV["sshkit"])
|
7
|
+
requirement = begin
|
8
|
+
Gem::Dependency.new("sshkit", sshkit_version).requirement
|
9
|
+
rescue ArgumentError
|
10
|
+
user, branch =
|
11
|
+
if sshkit_version.include?("#")
|
12
|
+
sshkit_version.split("#")
|
13
|
+
else
|
14
|
+
["capistrano", sshkit_version]
|
15
|
+
end
|
16
|
+
{ :github => "#{user}/sshkit", :branch => branch }
|
17
|
+
end
|
18
|
+
gem "sshkit", requirement
|
19
|
+
end
|
data/Guardfile
ADDED
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/airbrussh)
|
4
4
|
[](https://travis-ci.org/mattbrictson/airbrussh)
|
5
|
+
[](https://codeclimate.com/github/mattbrictson/airbrussh)
|
6
|
+
[](https://coveralls.io/r/mattbrictson/airbrussh?branch=master)
|
5
7
|
|
6
8
|
|
7
9
|
**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.
|
@@ -16,7 +18,7 @@ For more details on how exactly Airbrussh changes Capistrano's output and the re
|
|
16
18
|
|
17
19
|
**To use Airbrussh with Capistrano, you will need Capistrano 3.** Capistrano 2.x is not supported.
|
18
20
|
|
19
|
-
Airbrussh has been tested with MRI
|
21
|
+
Airbrussh has been tested with MRI 1.9+, Capistrano 3.4.0, and SSHKit 1.6.1+. Refer to the [Travis configuration](.travis.yml) for our latest test matrix. If you run into trouble using airbrussh in your environment, [open an issue on GitHub](https://github.com/mattbrictson/airbrussh/issues/new).
|
20
22
|
|
21
23
|
Airbrussh's only dependency is SSHKit >= 1.6.1.
|
22
24
|
|
@@ -159,12 +161,10 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
159
161
|
|
160
162
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
161
163
|
|
164
|
+
Airbrussh is designed to work against multiple versions of SSHKit and Ruby. In order to test this, we use the environment variable `sshkit` in order to run the tests against a specific version. The combinations of sshkit and ruby we support are specified in [.travis.yml](.travis.yml). To test all the versions locally, there is a `test_all.rb` bin file. This installs the gems and runs the tests for each sshkit version in [.travis.yml](.travis.yml). *Note: this will update your `Gemfile.lock` as each SSHKit gem version is installed. The gem version is restored to the default when the script exits.*
|
165
|
+
|
162
166
|
## Contributing
|
163
167
|
|
164
|
-
|
165
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
166
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
167
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
168
|
-
5. Create a new Pull Request
|
168
|
+
Contributions are welcome! Read [CONTRIBUTING.md](CONTRIBUTING.md) to get started.
|
169
169
|
|
170
170
|
[capistrano-fiftyfive]: https://github.com/mattbrictson/capistrano-fiftyfive
|
data/Rakefile
CHANGED
@@ -1,8 +1,18 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
-
require "rake/testtask"
|
3
2
|
|
3
|
+
require "rake/testtask"
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
5
|
t.libs << "test"
|
6
|
+
t.libs << "lib"
|
7
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
8
|
+
end
|
9
|
+
|
10
|
+
require "rubocop/rake_task"
|
11
|
+
RuboCop::RakeTask.new
|
12
|
+
|
13
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.1.0")
|
14
|
+
require "chandler/tasks"
|
15
|
+
task "release:rubygem_push" => "chandler:push"
|
6
16
|
end
|
7
17
|
|
8
|
-
task :default => :test
|
18
|
+
task :default => [:test, :rubocop]
|
data/airbrussh.gemspec
CHANGED
@@ -24,7 +24,17 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency "sshkit", [">= 1.6.1", "!= 1.7.0"]
|
25
25
|
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.8"
|
27
|
+
spec.add_development_dependency "coveralls"
|
28
|
+
spec.add_development_dependency "guard", ">= 2.2.2"
|
29
|
+
spec.add_development_dependency "guard-minitest"
|
27
30
|
spec.add_development_dependency "rake", "~> 10.0"
|
31
|
+
spec.add_development_dependency "rb-fsevent"
|
28
32
|
spec.add_development_dependency "minitest"
|
29
33
|
spec.add_development_dependency "minitest-reporters"
|
34
|
+
spec.add_development_dependency "rubocop", ">= 0.31.0"
|
35
|
+
spec.add_development_dependency "terminal-notifier-guard"
|
36
|
+
|
37
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.1.0")
|
38
|
+
spec.add_development_dependency "chandler"
|
39
|
+
end
|
30
40
|
end
|
data/bin/test_all.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "yaml"
|
3
|
+
require "English"
|
4
|
+
|
5
|
+
YAML.load_file(".travis.yml")["env"].each do |sshkit_version|
|
6
|
+
puts "\e[0;34;49m== Running tests against #{sshkit_version} ==\e[0m"
|
7
|
+
output = `#{sshkit_version} bundle update`
|
8
|
+
fail "bundle update failed: #{output}" unless $CHILD_STATUS.success?
|
9
|
+
system("#{sshkit_version} bundle exec rake test")
|
10
|
+
end
|
11
|
+
|
12
|
+
at_exit do
|
13
|
+
puts "\e[0;34;49m== Resetting sshkit ==\e[0m"
|
14
|
+
system("bundle update")
|
15
|
+
end
|
data/lib/airbrussh.rb
CHANGED
data/lib/airbrussh/capistrano.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require "airbrussh"
|
2
|
-
require "
|
2
|
+
require "airbrussh/colors"
|
3
3
|
require "sshkit/formatter/airbrussh"
|
4
4
|
|
5
5
|
# airbrush/capistrano uses a different default configuration
|
@@ -10,12 +10,12 @@ end
|
|
10
10
|
|
11
11
|
# Sanity check!
|
12
12
|
unless defined?(Capistrano) && defined?(:namespace)
|
13
|
-
$stderr.puts
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
$stderr.puts(
|
14
|
+
Airbrussh::Colors.red(
|
15
|
+
"WARNING: airbrussh/capistrano must be loaded by Capistrano in order "\
|
16
|
+
"to work.\nRequire this gem within your application's Capfile, as "\
|
17
|
+
"described here:\nhttps://github.com/mattbrictson/airbrussh#installation"
|
18
|
+
))
|
19
19
|
end
|
20
20
|
|
21
21
|
# Hook into Capistrano's init process to set the formatter
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Airbrussh
|
2
|
+
# Very basic support for ANSI color, so that we don't have to rely on
|
3
|
+
# any external dependencies.
|
4
|
+
module Colors
|
5
|
+
ANSI_CODES = {
|
6
|
+
:red => 31,
|
7
|
+
:green => 32,
|
8
|
+
:yellow => 33,
|
9
|
+
:blue => 34,
|
10
|
+
:gray => 90
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
module_function
|
14
|
+
|
15
|
+
# Define red, green, blue, etc. methods that return a copy of the
|
16
|
+
# String that is wrapped in the corresponding ANSI color escape
|
17
|
+
# sequence.
|
18
|
+
ANSI_CODES.each do |name, code|
|
19
|
+
define_method(name) do |string|
|
20
|
+
"\e[0;#{code};49m#{string}\e[0m"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require "airbrussh/colors"
|
3
|
+
# rubocop:disable Style/AsciiComments
|
4
|
+
|
5
|
+
module Airbrussh
|
6
|
+
# Decorates an SSHKit::Command to add string output helpers.
|
7
|
+
class CommandFormatter < SimpleDelegator
|
8
|
+
include Airbrussh::Colors
|
9
|
+
|
10
|
+
# Prefixes the line with the command number and removes the newline.
|
11
|
+
#
|
12
|
+
# format_output("hello\n") # => "01 hello"
|
13
|
+
#
|
14
|
+
def format_output(line)
|
15
|
+
"#{number} #{line.chomp}"
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the abbreviated command (in yellow) with the number prefix.
|
19
|
+
#
|
20
|
+
# start_message # => "01 echo hello"
|
21
|
+
#
|
22
|
+
def start_message
|
23
|
+
"#{number} #{yellow(abbreviated)}"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns a green (success) or red (failure) message depending on the
|
27
|
+
# exit status.
|
28
|
+
#
|
29
|
+
# exit_message # => "✔ 01 user@host 0.084s"
|
30
|
+
# exit_message # => "✘ 01 user@host 0.084s"
|
31
|
+
#
|
32
|
+
# If `log_file` is specified, it is appended to the message
|
33
|
+
# in the failure case.
|
34
|
+
#
|
35
|
+
# exit_message("out.log")
|
36
|
+
# # => "✘ 01 user@host (see out.log for details) 0.084s"
|
37
|
+
#
|
38
|
+
def exit_message(log_file=nil)
|
39
|
+
if failure?
|
40
|
+
message = red(failure_message(log_file))
|
41
|
+
else
|
42
|
+
message = green(success_message)
|
43
|
+
end
|
44
|
+
message << " #{gray(runtime)}"
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def user_at_host
|
50
|
+
user_str = user { host.user }
|
51
|
+
host_str = host.to_s
|
52
|
+
[user_str, host_str].join("@")
|
53
|
+
end
|
54
|
+
|
55
|
+
def runtime
|
56
|
+
format("%5.3fs", super)
|
57
|
+
end
|
58
|
+
|
59
|
+
def abbreviated
|
60
|
+
to_s.sub(%r{^/usr/bin/env }, "")
|
61
|
+
end
|
62
|
+
|
63
|
+
def number
|
64
|
+
format("%02d", position + 1)
|
65
|
+
end
|
66
|
+
|
67
|
+
def success_message
|
68
|
+
"✔ #{number} #{user_at_host}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def failure_message(log_file)
|
72
|
+
message = "✘ #{number} #{user_at_host}"
|
73
|
+
message << " (see #{log_file} for details)" if log_file
|
74
|
+
message
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/lib/airbrussh/console.rb
CHANGED
@@ -9,8 +9,11 @@ module Airbrussh
|
|
9
9
|
# an ANSI color-capable console. When a console is not present (e.g. when
|
10
10
|
# running on a CI server) the output will gracefully degrade.
|
11
11
|
class Console
|
12
|
-
|
12
|
+
attr_reader :output, :config
|
13
|
+
|
14
|
+
def initialize(output, config=Airbrussh.configuration)
|
13
15
|
@output = output
|
16
|
+
@config = config
|
14
17
|
end
|
15
18
|
|
16
19
|
# Writes to the IO after first truncating the output to fit the console
|
@@ -20,21 +23,17 @@ module Airbrussh
|
|
20
23
|
def print_line(obj="")
|
21
24
|
string = obj.to_s
|
22
25
|
|
23
|
-
if console_width
|
24
|
-
|
25
|
-
end
|
26
|
-
unless color_enabled?
|
27
|
-
string = strip_ascii_color(string)
|
28
|
-
end
|
26
|
+
string = truncate_to_console_width(string) if console_width
|
27
|
+
string = strip_ascii_color(string) unless color_enabled?
|
29
28
|
|
30
29
|
write(string + "\n")
|
31
|
-
|
30
|
+
output.flush
|
32
31
|
end
|
33
32
|
|
34
33
|
# Writes directly through to the IO with no truncation or color logic.
|
35
34
|
# No newline is added.
|
36
35
|
def write(string)
|
37
|
-
|
36
|
+
output.write(string || "")
|
38
37
|
end
|
39
38
|
alias_method :<<, :write
|
40
39
|
|
@@ -43,9 +42,7 @@ module Airbrussh
|
|
43
42
|
width = console_width
|
44
43
|
|
45
44
|
if strip_ascii_color(string).length > width
|
46
|
-
while strip_ascii_color(string).length >= width
|
47
|
-
string.chop!
|
48
|
-
end
|
45
|
+
string.chop! while strip_ascii_color(string).length >= width
|
49
46
|
string << "…\e[0m"
|
50
47
|
else
|
51
48
|
string
|
@@ -57,7 +54,7 @@ module Airbrussh
|
|
57
54
|
end
|
58
55
|
|
59
56
|
def console_width
|
60
|
-
case (truncate =
|
57
|
+
case (truncate = config.truncate)
|
61
58
|
when :auto
|
62
59
|
IO.console.winsize.last if @output.tty?
|
63
60
|
when Fixnum
|
@@ -68,7 +65,7 @@ module Airbrussh
|
|
68
65
|
private
|
69
66
|
|
70
67
|
def color_enabled?
|
71
|
-
case
|
68
|
+
case config.color
|
72
69
|
when true
|
73
70
|
true
|
74
71
|
when :auto
|
data/lib/airbrussh/formatter.rb
CHANGED
@@ -1,44 +1,29 @@
|
|
1
|
-
|
1
|
+
require "airbrussh/colors"
|
2
|
+
require "airbrussh/command_formatter"
|
2
3
|
require "airbrussh/command_output"
|
3
4
|
require "airbrussh/console"
|
4
|
-
require "
|
5
|
-
require "
|
5
|
+
require "airbrussh/rake/command"
|
6
|
+
require "airbrussh/rake/context"
|
6
7
|
require "sshkit"
|
7
8
|
|
8
9
|
module Airbrussh
|
9
10
|
class Formatter < SSHKit::Formatter::Abstract
|
10
|
-
|
11
|
-
|
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
|
11
|
+
include Airbrussh::Colors
|
12
|
+
extend Forwardable
|
30
13
|
|
31
|
-
|
32
|
-
|
14
|
+
attr_reader :config, :context
|
15
|
+
def_delegator :context, :current_task_name
|
33
16
|
|
34
|
-
|
17
|
+
def initialize(io, config=Airbrussh.configuration)
|
18
|
+
super(io)
|
35
19
|
|
36
|
-
@
|
20
|
+
@config = config
|
21
|
+
@context = Airbrussh::Rake::Context.new(config)
|
37
22
|
|
38
23
|
@log_file = config.log_file
|
39
24
|
@log_file_formatter = create_log_file_formatter
|
40
25
|
|
41
|
-
@console = Airbrussh::Console.new(original_output)
|
26
|
+
@console = Airbrussh::Console.new(original_output, config)
|
42
27
|
write_log_file_delimiter
|
43
28
|
write_banner
|
44
29
|
end
|
@@ -46,14 +31,10 @@ module Airbrussh
|
|
46
31
|
def create_log_file_formatter
|
47
32
|
return SSHKit::Formatter::BlackHole.new(nil) if @log_file.nil?
|
48
33
|
SSHKit::Formatter::Pretty.new(
|
49
|
-
::Logger.new(@log_file, 1,
|
34
|
+
::Logger.new(@log_file, 1, 20_971_520)
|
50
35
|
)
|
51
36
|
end
|
52
37
|
|
53
|
-
def print_line(string)
|
54
|
-
@console.print_line(string)
|
55
|
-
end
|
56
|
-
|
57
38
|
def write_banner
|
58
39
|
return unless config.banner
|
59
40
|
if config.banner == :auto
|
@@ -74,136 +55,101 @@ module Airbrussh
|
|
74
55
|
@log_file_formatter << SSHKit::LogMessage.new(
|
75
56
|
SSHKit::Logger::INFO,
|
76
57
|
line
|
77
|
-
|
58
|
+
)
|
78
59
|
end
|
79
60
|
end
|
80
61
|
|
62
|
+
def log_command_start(command)
|
63
|
+
command = decorate(command)
|
64
|
+
@log_file_formatter.log_command_start(command)
|
65
|
+
write_command_start(command)
|
66
|
+
end
|
67
|
+
|
68
|
+
def log_command_data(command, stream_type, line)
|
69
|
+
command = decorate(command)
|
70
|
+
@log_file_formatter.log_command_data(command, stream_type, line)
|
71
|
+
write_command_output_line(command, stream_type, line)
|
72
|
+
end
|
73
|
+
|
74
|
+
def log_command_exit(command)
|
75
|
+
command = decorate(command)
|
76
|
+
@log_file_formatter.log_command_exit(command)
|
77
|
+
write_command_exit(command)
|
78
|
+
end
|
79
|
+
|
81
80
|
def write(obj)
|
82
81
|
# SSHKit's :pretty formatter mutates the stdout and stderr data in the
|
83
82
|
# command obj. So we need to dup it to ensure our copy is unscathed.
|
84
83
|
@log_file_formatter << obj.dup
|
85
84
|
|
86
85
|
case obj
|
87
|
-
when SSHKit::Command
|
88
|
-
|
86
|
+
when SSHKit::Command
|
87
|
+
command = decorate(obj)
|
88
|
+
write_command_start(command)
|
89
|
+
write_command_output(command)
|
90
|
+
write_command_exit(command) if command.finished?
|
91
|
+
when SSHKit::LogMessage
|
92
|
+
write_log_message(obj)
|
89
93
|
end
|
90
94
|
end
|
91
|
-
|
95
|
+
alias_method :<<, :write
|
92
96
|
|
93
97
|
def on_deploy_failure
|
94
98
|
return if @log_file.nil?
|
95
99
|
err = Airbrussh::Console.new($stderr)
|
96
100
|
err.print_line
|
97
101
|
err.print_line(red("** DEPLOY FAILED"))
|
98
|
-
err.print_line(yellow(
|
99
|
-
|
100
|
-
))
|
102
|
+
err.print_line(yellow("** Refer to #{@log_file} for details. "\
|
103
|
+
"Here are the last 20 lines:"))
|
101
104
|
err.print_line
|
102
105
|
system("tail -n 20 #{@log_file.shellescape} 1>&2")
|
103
106
|
end
|
104
107
|
|
105
108
|
private
|
106
109
|
|
110
|
+
attr_accessor :last_printed_task
|
111
|
+
|
107
112
|
def write_log_message(log_message)
|
108
|
-
return
|
113
|
+
return if debug?(log_message)
|
109
114
|
print_task_if_changed
|
110
|
-
|
115
|
+
print_indented_line(gray(log_message.to_s))
|
111
116
|
end
|
112
117
|
|
113
|
-
def
|
114
|
-
return
|
115
|
-
|
118
|
+
def write_command_start(command)
|
119
|
+
return if debug?(command)
|
116
120
|
print_task_if_changed
|
117
|
-
|
118
|
-
ctx = context_for_command(command)
|
119
|
-
number = '%02d' % ctx.number
|
120
|
-
|
121
|
-
if ctx.first_execution?
|
122
|
-
description = yellow(ctx.shell_string)
|
123
|
-
print_line " #{number} #{description}"
|
124
|
-
end
|
125
|
-
|
126
|
-
write_command_output(command, number)
|
127
|
-
|
128
|
-
if command.finished?
|
129
|
-
status = format_command_completion_status(command, number)
|
130
|
-
print_line " #{status}"
|
131
|
-
end
|
121
|
+
print_indented_line(command.start_message) if command.first_execution?
|
132
122
|
end
|
133
123
|
|
134
124
|
# Prints the data from the stdout and stderr streams of the given command,
|
135
125
|
# but only if enabled (see Airbrussh::Configuration#command_output).
|
136
|
-
def write_command_output(command
|
126
|
+
def write_command_output(command)
|
137
127
|
# Use a bit of meta-programming here, since stderr and stdout logic
|
138
128
|
# are identical except for different method names.
|
139
129
|
%w(stderr stdout).each do |stream|
|
140
|
-
next unless config.public_send("command_output_#{stream}?")
|
141
130
|
CommandOutput.for(command).each_line(stream) do |line|
|
142
|
-
|
131
|
+
write_command_output_line(command, stream, line)
|
143
132
|
end
|
144
133
|
end
|
145
134
|
end
|
146
135
|
|
147
|
-
def
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
print_line "#{clock} #{blue(status.task)}"
|
152
|
-
end
|
136
|
+
def write_command_output_line(command, stream, line)
|
137
|
+
hide_command_output = !config.public_send("command_output_#{stream}?")
|
138
|
+
return if hide_command_output || debug?(command)
|
139
|
+
print_indented_line(command.format_output(line))
|
153
140
|
end
|
154
141
|
|
155
|
-
def
|
156
|
-
|
157
|
-
if
|
158
|
-
changed = false
|
159
|
-
else
|
160
|
-
changed = true
|
161
|
-
@tasks[task] = []
|
162
|
-
end
|
142
|
+
def print_task_if_changed
|
143
|
+
return if current_task_name.nil?
|
144
|
+
return if current_task_name == last_printed_task
|
163
145
|
|
164
|
-
|
165
|
-
|
166
|
-
:commands => @tasks[task],
|
167
|
-
:changed => changed
|
168
|
-
)
|
146
|
+
self.last_printed_task = current_task_name
|
147
|
+
print_line("#{clock} #{blue(current_task_name)}")
|
169
148
|
end
|
170
149
|
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
shell_string = command.to_s.sub(%r(^/usr/bin/env ), "")
|
176
|
-
|
177
|
-
if task_commands.include?(shell_string)
|
178
|
-
first_execution = false
|
179
|
-
else
|
180
|
-
first_execution = true
|
181
|
-
task_commands << shell_string
|
182
|
-
end
|
183
|
-
|
184
|
-
number = task_commands.index(shell_string) + 1
|
185
|
-
|
186
|
-
OpenStruct.new({
|
187
|
-
:first_execution? => first_execution,
|
188
|
-
:number => number,
|
189
|
-
:shell_string => shell_string
|
190
|
-
})
|
191
|
-
end
|
192
|
-
|
193
|
-
def format_command_completion_status(command, number)
|
194
|
-
user = command.user { command.host.user }
|
195
|
-
host = command.host.to_s
|
196
|
-
user_at_host = [user, host].join("@")
|
197
|
-
|
198
|
-
status = if command.failure?
|
199
|
-
red("✘ #{number} #{user_at_host} (see #{@log_file} for details)")
|
200
|
-
else
|
201
|
-
green("✔ #{number} #{user_at_host}")
|
202
|
-
end
|
203
|
-
|
204
|
-
runtime = light_black("%5.3fs" % command.runtime)
|
205
|
-
|
206
|
-
status + " " + runtime
|
150
|
+
def write_command_exit(command)
|
151
|
+
return if debug?(command)
|
152
|
+
print_indented_line(command.exit_message(@log_file), -2)
|
207
153
|
end
|
208
154
|
|
209
155
|
def clock
|
@@ -213,17 +159,24 @@ module Airbrussh
|
|
213
159
|
minutes = (duration / 60).to_i
|
214
160
|
seconds = (duration - minutes * 60).to_i
|
215
161
|
|
216
|
-
"%02d:%02d"
|
162
|
+
format("%02d:%02d", minutes, seconds)
|
217
163
|
end
|
218
164
|
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
165
|
+
def debug?(obj)
|
166
|
+
obj.verbosity <= SSHKit::Logger::DEBUG
|
167
|
+
end
|
168
|
+
|
169
|
+
def decorate(command)
|
170
|
+
Airbrussh::CommandFormatter.new(@context.decorate_command(command))
|
171
|
+
end
|
172
|
+
|
173
|
+
def print_line(string)
|
174
|
+
@console.print_line(string)
|
223
175
|
end
|
224
176
|
|
225
|
-
def
|
226
|
-
|
177
|
+
def print_indented_line(string, offset=0)
|
178
|
+
indent = " " * (6 + offset)
|
179
|
+
print_line([indent, string].join)
|
227
180
|
end
|
228
181
|
end
|
229
182
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Airbrussh
|
2
|
+
module Rake
|
3
|
+
# Decorates an SSHKit Command to add Rake-specific contextual information:
|
4
|
+
#
|
5
|
+
# * first_execution? - is this the first time this command has been run in
|
6
|
+
# the context of the current rake task?
|
7
|
+
# * position - zero-based position of this command in the list of
|
8
|
+
# all commands that have been run in the current rake task
|
9
|
+
#
|
10
|
+
class Command < SimpleDelegator
|
11
|
+
attr_reader :first_execution, :position
|
12
|
+
|
13
|
+
def initialize(command, first_execution, position)
|
14
|
+
super(command)
|
15
|
+
@first_execution = first_execution
|
16
|
+
@position = position
|
17
|
+
end
|
18
|
+
|
19
|
+
def first_execution?
|
20
|
+
first_execution
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "airbrussh/rake/command"
|
3
|
+
|
4
|
+
module Airbrussh
|
5
|
+
module Rake
|
6
|
+
# Maintains information about what Rake task is currently being invoked,
|
7
|
+
# in order to be able to decorate SSHKit commands with additional
|
8
|
+
# context-sensitive information. Works via a monkey patch to Rake::Task,
|
9
|
+
# which can be disabled via by setting
|
10
|
+
# Airbrussh.configuration.monkey_patch_rake = false.
|
11
|
+
#
|
12
|
+
class Context
|
13
|
+
def initialize(config=Airbrussh.configuration)
|
14
|
+
@history = []
|
15
|
+
@enabled = config.monkey_patch_rake
|
16
|
+
self.class.install_monkey_patch if enabled?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the name of the currently-executing rake task, if it can be
|
20
|
+
# determined. If monkey patching is disabled, this will be nil.
|
21
|
+
def current_task_name
|
22
|
+
return nil unless enabled?
|
23
|
+
self.class.current_task_name
|
24
|
+
end
|
25
|
+
|
26
|
+
# Decorate an SSHKit Command with Rake::Command to provide additional
|
27
|
+
# context-sensitive information.
|
28
|
+
def decorate_command(command)
|
29
|
+
reset_history_if_task_changed
|
30
|
+
|
31
|
+
first_execution = !history.include?(command.to_s)
|
32
|
+
history << command.to_s
|
33
|
+
history.uniq!
|
34
|
+
|
35
|
+
Airbrussh::Rake::Command.new(
|
36
|
+
command,
|
37
|
+
first_execution,
|
38
|
+
history.index(command.to_s)
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
class << self
|
43
|
+
attr_accessor :current_task_name
|
44
|
+
|
45
|
+
def install_monkey_patch
|
46
|
+
return if ::Rake::Task.instance_methods.include?(:_airbrussh_execute)
|
47
|
+
|
48
|
+
::Rake::Task.class_exec do
|
49
|
+
alias_method :_airbrussh_execute, :execute
|
50
|
+
def execute(args=nil) # rubocop:disable Lint/NestedMethodDefinition
|
51
|
+
::Airbrussh::Rake::Context.current_task_name = name.to_s
|
52
|
+
_airbrussh_execute(args)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
attr_reader :history
|
61
|
+
attr_accessor :last_task_name
|
62
|
+
|
63
|
+
def reset_history_if_task_changed
|
64
|
+
history.clear if last_task_name != current_task_name
|
65
|
+
self.last_task_name = current_task_name
|
66
|
+
end
|
67
|
+
|
68
|
+
def enabled?
|
69
|
+
@enabled
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/airbrussh/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airbrussh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Brictson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sshkit
|
@@ -44,6 +44,48 @@ dependencies:
|
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '1.8'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: coveralls
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
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
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: guard
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 2.2.2
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 2.2.2
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: guard-minitest
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
47
89
|
- !ruby/object:Gem::Dependency
|
48
90
|
name: rake
|
49
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,6 +100,20 @@ dependencies:
|
|
58
100
|
- - "~>"
|
59
101
|
- !ruby/object:Gem::Version
|
60
102
|
version: '10.0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rb-fsevent
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
61
117
|
- !ruby/object:Gem::Dependency
|
62
118
|
name: minitest
|
63
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,6 +142,48 @@ dependencies:
|
|
86
142
|
- - ">="
|
87
143
|
- !ruby/object:Gem::Version
|
88
144
|
version: '0'
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: rubocop
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: 0.31.0
|
152
|
+
type: :development
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: 0.31.0
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: terminal-notifier-guard
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: chandler
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
type: :development
|
181
|
+
prerelease: false
|
182
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '0'
|
89
187
|
description: A replacement log formatter for SSHKit that makes Capistrano output much
|
90
188
|
easier on the eyes. Just add Airbrussh to your Capfile and enjoy concise, useful
|
91
189
|
log output that is easy to read.
|
@@ -96,22 +194,31 @@ extensions: []
|
|
96
194
|
extra_rdoc_files: []
|
97
195
|
files:
|
98
196
|
- ".gitignore"
|
197
|
+
- ".rubocop.yml"
|
198
|
+
- ".rubocop_todo.yml"
|
99
199
|
- ".travis.yml"
|
100
200
|
- CHANGELOG.md
|
201
|
+
- CONTRIBUTING.md
|
101
202
|
- Gemfile
|
203
|
+
- Guardfile
|
102
204
|
- LICENSE.txt
|
103
205
|
- README.md
|
104
206
|
- Rakefile
|
105
207
|
- airbrussh.gemspec
|
106
208
|
- bin/console
|
107
209
|
- bin/setup
|
210
|
+
- bin/test_all.rb
|
108
211
|
- demo.gif
|
109
212
|
- lib/airbrussh.rb
|
110
213
|
- lib/airbrussh/capistrano.rb
|
214
|
+
- lib/airbrussh/colors.rb
|
215
|
+
- lib/airbrussh/command_formatter.rb
|
111
216
|
- lib/airbrussh/command_output.rb
|
112
217
|
- lib/airbrussh/configuration.rb
|
113
218
|
- lib/airbrussh/console.rb
|
114
219
|
- lib/airbrussh/formatter.rb
|
220
|
+
- lib/airbrussh/rake/command.rb
|
221
|
+
- lib/airbrussh/rake/context.rb
|
115
222
|
- lib/airbrussh/version.rb
|
116
223
|
- lib/sshkit/formatter/airbrussh.rb
|
117
224
|
homepage: https://github.com/mattbrictson/airbrussh
|
@@ -134,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
241
|
version: '0'
|
135
242
|
requirements: []
|
136
243
|
rubyforge_project:
|
137
|
-
rubygems_version: 2.4.
|
244
|
+
rubygems_version: 2.4.8
|
138
245
|
signing_key:
|
139
246
|
specification_version: 4
|
140
247
|
summary: Airbrussh pretties up your SSHKit and Capistrano output
|