terminal 0.0.1.alpha → 0.0.1.alpha.2
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/Rakefile +6 -0
- data/Readme.md +94 -0
- data/bin/terminal +24 -0
- data/lib/terminal.rb +8 -1
- data/lib/terminal/cli.rb +16 -0
- data/lib/terminal/color.rb +7 -0
- data/lib/terminal/node.rb +15 -0
- data/lib/terminal/renderer.rb +169 -0
- data/lib/terminal/reset.rb +16 -0
- data/lib/terminal/version.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/terminal/renderer_spec.rb +0 -0
- data/terminal.gemspec +3 -0
- metadata +44 -6
- data/LICENSE.txt +0 -22
- data/README.md +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 487092c63dea202f02bd076d7e4158eea89bd58a
|
4
|
+
data.tar.gz: 6199129f8e34c4216edb4300334305e9b3846deb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db1e32fcb67aa51ffaa827864a0bbabb2d1bbd96853df00e4b8696fa1ea7d2c5f27f4d7a0015140524e2912dbfbf1fcca3a6493191cb7631cd3930cb67fc8200
|
7
|
+
data.tar.gz: fcdda1990aec64e1bbd7795f2f10b7fe133abeeb754782b85a9041b8e0823ecab7bbee44d27b7e9f6f938e5ebfbab50903ccaa0106688059e329fca8446e1f43
|
data/Rakefile
CHANGED
data/Readme.md
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+

|
2
|
+
|
3
|
+
[](https://rubygems.org/gems/terminal)
|
4
|
+
|
5
|
+
Terminal takes any arbitrary crazy shell output (ASCII), and turns it into beautifully rendered HTML.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'terminal'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
```bash
|
18
|
+
$ bundle
|
19
|
+
```
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
```bash
|
24
|
+
gem install terminal
|
25
|
+
```
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
Terminal.render("...")
|
31
|
+
```
|
32
|
+
|
33
|
+
### Command Line
|
34
|
+
|
35
|
+
Terminal ships with a command line utility. For example, you can pipe `rspec` output to it:
|
36
|
+
|
37
|
+
```bash
|
38
|
+
rspec --color --tty | terminal
|
39
|
+
```
|
40
|
+
|
41
|
+
Or use output saved earlier:
|
42
|
+
|
43
|
+
```bash
|
44
|
+
rspec --tty --color > output.txt
|
45
|
+
terminal output.txt
|
46
|
+
```
|
47
|
+
|
48
|
+
With `rspec`, you'll need to use the `--tty` and `--color` options to force it to output colors.
|
49
|
+
|
50
|
+
### With the Buildbox API
|
51
|
+
|
52
|
+
First install [jq](http://stedolan.github.io/jq/), if you have [Homebrew](http://brew.sh/) installed, you can just `brew install jq`.
|
53
|
+
|
54
|
+
Then, you can:
|
55
|
+
|
56
|
+
```bash
|
57
|
+
$JOB_LOG_URL="https://api.buildbox.io/v1/accounts/[account]/projects/[project]/builds/[build]/jobs/[job]/log?api_key=[api-key]"
|
58
|
+
echo $(curl $JOB_LOG_URL -s | jq '.content') | terminal
|
59
|
+
```
|
60
|
+
|
61
|
+
For more information on the Buildbox Builds API, see: https://buildbox.io/docs/api/builds
|
62
|
+
|
63
|
+
## Contributing
|
64
|
+
|
65
|
+
1. Fork it ( https://github.com/[my-github-username]/terminal/fork )
|
66
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
67
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
68
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
69
|
+
5. Create a new Pull Request
|
70
|
+
|
71
|
+
## Licence
|
72
|
+
|
73
|
+
> Copyright (c) 2014 Keith Pitt, Buildbox
|
74
|
+
>
|
75
|
+
> MIT License
|
76
|
+
>
|
77
|
+
> Permission is hereby granted, free of charge, to any person obtaining
|
78
|
+
> a copy of this software and associated documentation files (the
|
79
|
+
> "Software"), to deal in the Software without restriction, including
|
80
|
+
> without limitation the rights to use, copy, modify, merge, publish,
|
81
|
+
> distribute, sublicense, and/or sell copies of the Software, and to
|
82
|
+
> permit persons to whom the Software is furnished to do so, subject to
|
83
|
+
> the following conditions:
|
84
|
+
>
|
85
|
+
> The above copyright notice and this permission notice shall be
|
86
|
+
> included in all copies or substantial portions of the Software.
|
87
|
+
>
|
88
|
+
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
89
|
+
> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
90
|
+
> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
91
|
+
> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
92
|
+
> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
93
|
+
> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
94
|
+
> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/bin/terminal
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
|
4
|
+
|
5
|
+
require 'terminal'
|
6
|
+
|
7
|
+
def help
|
8
|
+
puts <<-usage
|
9
|
+
Usage:
|
10
|
+
$ cat output.text | terminal
|
11
|
+
$ terminal output.text
|
12
|
+
|
13
|
+
Help:
|
14
|
+
$ terminal -h
|
15
|
+
|
16
|
+
See https://buildboxhq.github.io/terminal for more information.
|
17
|
+
usage
|
18
|
+
end
|
19
|
+
|
20
|
+
if ($stdin.tty? && ARGV.empty?) || ARGV.delete('-h') || ARGV.delete('--help')
|
21
|
+
help
|
22
|
+
else
|
23
|
+
puts Terminal.render(ARGF.read)
|
24
|
+
end
|
data/lib/terminal.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
require "terminal/version"
|
2
|
+
require "terminal/node"
|
3
|
+
require "terminal/color"
|
4
|
+
require "terminal/reset"
|
5
|
+
require "terminal/renderer"
|
6
|
+
require "terminal/cli"
|
2
7
|
|
3
8
|
module Terminal
|
4
|
-
|
9
|
+
def self.render(output)
|
10
|
+
Terminal::Renderer.new.render(output)
|
11
|
+
end
|
5
12
|
end
|
data/lib/terminal/cli.rb
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
require 'escape_utils'
|
2
|
+
|
3
|
+
module Terminal
|
4
|
+
class Renderer
|
5
|
+
def render(output)
|
6
|
+
return "" if output.nil? || output.strip.length == 0
|
7
|
+
|
8
|
+
# Limit the entire size of the output to 4 meg (4 * megabyte * kilabyte)
|
9
|
+
max_total_size = 4 * 1024 * 1024
|
10
|
+
if output.bytesize > max_total_size
|
11
|
+
output = output.byteslice(0, max_total_size)
|
12
|
+
output << "\n\nWarning: Terminal has chopped off the rest of the build as it's over the allowed #{number_to_human_size(max_total_size)} limit for logs."
|
13
|
+
end
|
14
|
+
|
15
|
+
# Limit each line to (x) chars
|
16
|
+
max_line_length = 50_000
|
17
|
+
output = output.split("\n").map do |line|
|
18
|
+
if line.length > max_line_length
|
19
|
+
line = line[0..max_line_length]
|
20
|
+
line << " Warning: Terminal has chopped the rest of this line off as it's over the allowed #{max_line_length} characters per line limit."
|
21
|
+
else
|
22
|
+
line
|
23
|
+
end
|
24
|
+
end.join("\n")
|
25
|
+
|
26
|
+
# Now do the terminal rendering
|
27
|
+
output = emulate_terminal_rendering(sanitize(output))
|
28
|
+
|
29
|
+
# Replace empty lines with a non breaking space.
|
30
|
+
output.gsub(/$^/, " ")
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# \n moves the cursor to a new line
|
36
|
+
# \r moves the cursor to the begining of the line
|
37
|
+
# \b moves the cursor back one
|
38
|
+
# \e[0m reset color information
|
39
|
+
# \e[?m use the ? color going forward
|
40
|
+
def emulate_terminal_rendering(string)
|
41
|
+
# Splits the output into intersting parts.
|
42
|
+
parts = string.scan(/[\n\r\b]|\e\[[\d;]+m|\e|[^\n\r\b\e]+/)
|
43
|
+
|
44
|
+
lines = []
|
45
|
+
|
46
|
+
index = 0
|
47
|
+
length = string.length
|
48
|
+
|
49
|
+
line = []
|
50
|
+
cursor = 0
|
51
|
+
|
52
|
+
# Every time a color is found, we increment this
|
53
|
+
# counter, every time it resets, we decrement.
|
54
|
+
# We do this so we close all the open spans at the
|
55
|
+
# end of the output.
|
56
|
+
colors_opened = 0
|
57
|
+
|
58
|
+
parts.each do |char|
|
59
|
+
case char
|
60
|
+
when "\n"
|
61
|
+
lines << line
|
62
|
+
line = []
|
63
|
+
cursor = 0
|
64
|
+
when "\r"
|
65
|
+
cursor = 0
|
66
|
+
when "\b"
|
67
|
+
pointer = cursor-1
|
68
|
+
|
69
|
+
# Seek backwards until something that isn't a color is reached.
|
70
|
+
# Colors aren't affected by \b
|
71
|
+
while pointer > 0
|
72
|
+
char_at_pointer = line[pointer]
|
73
|
+
break unless char_at_pointer.kind_of?(Terminal::Color)
|
74
|
+
|
75
|
+
pointer -= 1
|
76
|
+
end
|
77
|
+
|
78
|
+
cursor -= (cursor - pointer)
|
79
|
+
when "\e"
|
80
|
+
# Seek the next few characters to tell if theres a color present
|
81
|
+
seeked = string[index..(index + 10)]
|
82
|
+
|
83
|
+
# Does the next lot of characters look like a color code?
|
84
|
+
matched = seeked.to_s.match(/\A\e\[(.*)m\z/)
|
85
|
+
|
86
|
+
# If it does, skip over the characters that are the color,
|
87
|
+
# and track it at a single color object in the line. We do this
|
88
|
+
# so when we \b after a color, we skip back across the whole color
|
89
|
+
# not just the last character in the color sequence.
|
90
|
+
if matched
|
91
|
+
color_code = matched[1].to_s
|
92
|
+
|
93
|
+
# Determine what sort of color code it is.
|
94
|
+
if color_code == "0"
|
95
|
+
line[cursor] = Terminal::Reset.new(colors_opened)
|
96
|
+
|
97
|
+
colors_opened = 0
|
98
|
+
else
|
99
|
+
line[cursor] = Terminal::Color.new(color_code)
|
100
|
+
|
101
|
+
colors_opened += 1
|
102
|
+
end
|
103
|
+
|
104
|
+
index += 3 + color_code.length
|
105
|
+
cursor += 1
|
106
|
+
|
107
|
+
next
|
108
|
+
end
|
109
|
+
else
|
110
|
+
line[cursor] = char
|
111
|
+
cursor += 1
|
112
|
+
end
|
113
|
+
|
114
|
+
# The cursor can't go back furthur than 0, so if you \b at the begining
|
115
|
+
# of a line, nothing happens.
|
116
|
+
cursor = 0 if cursor < 0
|
117
|
+
|
118
|
+
index += 1
|
119
|
+
end
|
120
|
+
|
121
|
+
# Add back in the last line if the end of the output
|
122
|
+
# didn't end with a \n
|
123
|
+
lines << line if line.any?
|
124
|
+
|
125
|
+
# Be sure to reset any unclosed colors.
|
126
|
+
if colors_opened > 0
|
127
|
+
lines << [ Terminal::Reset.new(colors_opened) ]
|
128
|
+
end
|
129
|
+
|
130
|
+
# Join all the strings back together again
|
131
|
+
lines = lines.map do |parts|
|
132
|
+
completed_line = parts.map(&:to_s).join("")
|
133
|
+
end.join("\n")
|
134
|
+
|
135
|
+
# Now escape all the things
|
136
|
+
lines = EscapeUtils.escape_html(lines)
|
137
|
+
|
138
|
+
matches = []
|
139
|
+
|
140
|
+
# Now we can easily gsub colors like a baws
|
141
|
+
lines.gsub!(/\e\[([0-9;]+)m/) do |match|
|
142
|
+
color_codes = $1.split(';')
|
143
|
+
|
144
|
+
if color_codes == [ "0" ]
|
145
|
+
"</span>"
|
146
|
+
else
|
147
|
+
classes = color_codes.map { |code| "c#{code}" }
|
148
|
+
|
149
|
+
"<span class='#{classes.join(" ")}'>"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
lines
|
154
|
+
end
|
155
|
+
|
156
|
+
def sanitize(string)
|
157
|
+
string = string.dup.force_encoding('UTF-8')
|
158
|
+
if string.valid_encoding?
|
159
|
+
string
|
160
|
+
else
|
161
|
+
string.
|
162
|
+
force_encoding('ASCII-8BIT').
|
163
|
+
encode!('UTF-8',
|
164
|
+
invalid: :replace,
|
165
|
+
undef: :replace)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
data/lib/terminal/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
File without changes
|
data/terminal.gemspec
CHANGED
@@ -18,6 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_dependency "escape_utils", "~> 1.0"
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.6"
|
22
24
|
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec"
|
23
26
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terminal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.alpha
|
4
|
+
version: 0.0.1.alpha.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Pitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: escape_utils
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,20 +52,42 @@ dependencies:
|
|
38
52
|
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
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'
|
41
69
|
description: Renders ASCII as HTML
|
42
70
|
email:
|
43
71
|
- me@keithpitt.com
|
44
|
-
executables:
|
72
|
+
executables:
|
73
|
+
- terminal
|
45
74
|
extensions: []
|
46
75
|
extra_rdoc_files: []
|
47
76
|
files:
|
48
77
|
- ".gitignore"
|
49
78
|
- Gemfile
|
50
|
-
- LICENSE.txt
|
51
|
-
- README.md
|
52
79
|
- Rakefile
|
80
|
+
- Readme.md
|
81
|
+
- bin/terminal
|
53
82
|
- lib/terminal.rb
|
83
|
+
- lib/terminal/cli.rb
|
84
|
+
- lib/terminal/color.rb
|
85
|
+
- lib/terminal/node.rb
|
86
|
+
- lib/terminal/renderer.rb
|
87
|
+
- lib/terminal/reset.rb
|
54
88
|
- lib/terminal/version.rb
|
89
|
+
- spec/spec_helper.rb
|
90
|
+
- spec/terminal/renderer_spec.rb
|
55
91
|
- terminal.gemspec
|
56
92
|
homepage: https://github.com/buildboxhq/terminal
|
57
93
|
licenses:
|
@@ -77,4 +113,6 @@ rubygems_version: 2.3.0
|
|
77
113
|
signing_key:
|
78
114
|
specification_version: 4
|
79
115
|
summary: Renders ASCII as HTML
|
80
|
-
test_files:
|
116
|
+
test_files:
|
117
|
+
- spec/spec_helper.rb
|
118
|
+
- spec/terminal/renderer_spec.rb
|
data/LICENSE.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2014 Keith Pitt
|
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
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# Terminal
|
2
|
-
|
3
|
-
TODO: Write a gem description
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
Add this line to your application's Gemfile:
|
8
|
-
|
9
|
-
gem 'terminal'
|
10
|
-
|
11
|
-
And then execute:
|
12
|
-
|
13
|
-
$ bundle
|
14
|
-
|
15
|
-
Or install it yourself as:
|
16
|
-
|
17
|
-
$ gem install terminal
|
18
|
-
|
19
|
-
## Usage
|
20
|
-
|
21
|
-
TODO: Write usage instructions here
|
22
|
-
|
23
|
-
## Contributing
|
24
|
-
|
25
|
-
1. Fork it ( https://github.com/[my-github-username]/terminal/fork )
|
26
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create a new Pull Request
|