terminal 1.0.2 → 2.0.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/Gemfile.lock +1 -3
- data/Readme.md +0 -9
- data/bin/terminal +2 -7
- data/lib/terminal/renderer.rb +1 -60
- data/lib/terminal/version.rb +1 -1
- data/spec/terminal/renderer_spec.rb +0 -32
- data/terminal.gemspec +0 -1
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8ff0192c84e2fe3da5e33be6c1e7c0e8abded70
|
4
|
+
data.tar.gz: 4b5dafa0764496c4810b0d505e3c55dfe6076e2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1136373e0556d6a0bbde37f1e4630c89a38d3dd470fa59151bc5048fc37b2234e999c21432f7b6b3245b47cda146b7bef70cae08a23e4492828ea34cb1cab695
|
7
|
+
data.tar.gz: 1038c20539c1a2c6574b5facfe98903ae9dffdf4c0789d02e34c148bd3d5e26407893467158ac2304900708e910f068c347a4108628d0e042d6c192f7fc2d3f7
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
terminal (
|
4
|
+
terminal (2.0.0)
|
5
5
|
escape_utils (~> 1.0)
|
6
|
-
gemoji (~> 2.1)
|
7
6
|
|
8
7
|
GEM
|
9
8
|
remote: https://rubygems.org/
|
@@ -11,7 +10,6 @@ GEM
|
|
11
10
|
benchmark-ips (2.1.1)
|
12
11
|
diff-lcs (1.2.5)
|
13
12
|
escape_utils (1.0.1)
|
14
|
-
gemoji (2.1.0)
|
15
13
|
hirb (0.7.3)
|
16
14
|
memory_profiler (0.0.4)
|
17
15
|
method_profiler (2.0.1)
|
data/Readme.md
CHANGED
@@ -51,15 +51,6 @@ Now in your views:
|
|
51
51
|
<div class="term-container"><%= Terminal.render(output) %></div>
|
52
52
|
```
|
53
53
|
|
54
|
-
### Emojis :+1:
|
55
|
-
|
56
|
-
Terminal converts unicode to proper `<img>` tags. We use the [gemoji](https://github.com/github/gemoji)
|
57
|
-
gem to do this. The path to the assets can be customized by passing the `:emoji_asset_path` option to `Terminal.render`
|
58
|
-
|
59
|
-
```ruby
|
60
|
-
Terminal.render(output, emoji_asset_path: "https://your.cdn.com/images/emoji")
|
61
|
-
```
|
62
|
-
|
63
54
|
### Command Line
|
64
55
|
|
65
56
|
Terminal ships with a command line utility. For example, you can pipe `rspec` output to it:
|
data/bin/terminal
CHANGED
@@ -6,8 +6,7 @@ $:.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
|
|
6
6
|
require 'terminal'
|
7
7
|
require 'optparse'
|
8
8
|
|
9
|
-
options = Struct.new(:preview
|
10
|
-
:emoji_asset_path).new
|
9
|
+
options = Struct.new(:preview).new
|
11
10
|
|
12
11
|
option_parser = OptionParser.new do |opts|
|
13
12
|
opts.banner = "Usage: #{opts.program_name} [options] <input file>"
|
@@ -16,10 +15,6 @@ option_parser = OptionParser.new do |opts|
|
|
16
15
|
options.preview = true
|
17
16
|
end
|
18
17
|
|
19
|
-
opts.on("--emoji-asset-path=PATH", "Path or URL to emoji image files") do |path|
|
20
|
-
options.emoji_asset_path = path
|
21
|
-
end
|
22
|
-
|
23
18
|
opts.on_tail("-h", "--help", "Show this help documentation") do
|
24
19
|
puts opts
|
25
20
|
exit
|
@@ -36,7 +31,7 @@ if ($stdin.tty? && ARGV.empty?)
|
|
36
31
|
end
|
37
32
|
|
38
33
|
raw = ARGF.read
|
39
|
-
rendered = Terminal.render(raw
|
34
|
+
rendered = Terminal.render(raw)
|
40
35
|
|
41
36
|
if options[:preview]
|
42
37
|
require 'tempfile'
|
data/lib/terminal/renderer.rb
CHANGED
@@ -1,16 +1,12 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'escape_utils'
|
4
|
-
require 'emoji'
|
5
4
|
require 'strscan'
|
6
5
|
|
7
6
|
module Terminal
|
8
7
|
class Renderer
|
9
8
|
MEGABYTES = 1024 * 1024
|
10
9
|
|
11
|
-
EMOJI_UNICODE_REGEXP = /[\u{1f600}-\u{1f64f}]|[\u{2702}-\u{27b0}]|[\u{1f680}-\u{1f6ff}]|[\u{24C2}-\u{1F251}]|[\u{1f300}-\u{1f5ff}]/
|
12
|
-
EMOJI_IGNORE = [ "heavy_check_mark".freeze, "heavy_multiplication_x".freeze ]
|
13
|
-
|
14
10
|
ESCAPE_CONTROL_CHARACTERS = "qQmKGgKAaBbCcDd".freeze
|
15
11
|
ESCAPE_CAPTURE_REGEX = /\e\[(.*)([#{ESCAPE_CONTROL_CHARACTERS}])/
|
16
12
|
|
@@ -18,23 +14,15 @@ module Terminal
|
|
18
14
|
|
19
15
|
def initialize(output, options = {})
|
20
16
|
@output = output
|
21
|
-
|
22
17
|
@options = options
|
23
|
-
@options[:emoji_asset_path] ||= "/assets/emojis"
|
24
|
-
|
25
18
|
@screen = Screen.new
|
26
19
|
end
|
27
20
|
|
28
21
|
def render
|
29
22
|
return "" if @output.nil?
|
30
23
|
|
31
|
-
|
32
|
-
output = dup_check_and_chomp_length(@output)
|
24
|
+
output = @output.dup
|
33
25
|
|
34
|
-
# Force encoding on the output first
|
35
|
-
force_encoding!(output)
|
36
|
-
|
37
|
-
# Now do the render the output to the screen
|
38
26
|
render_to_screen(output)
|
39
27
|
|
40
28
|
# Convert the screen to a string
|
@@ -46,36 +34,11 @@ module Terminal
|
|
46
34
|
# Now convert the colors to HTML
|
47
35
|
convert_to_html!(escaped_html)
|
48
36
|
|
49
|
-
# And emojify
|
50
|
-
replace_unicode_with_emoji!(escaped_html)
|
51
|
-
|
52
37
|
escaped_html
|
53
38
|
end
|
54
39
|
|
55
40
|
private
|
56
41
|
|
57
|
-
def dup_check_and_chomp_length(output)
|
58
|
-
# Limit the entire size of the output to 4 meg
|
59
|
-
max_total_size = 4 * MEGABYTES
|
60
|
-
if output.bytesize > max_total_size
|
61
|
-
new_output = output.byteslice(0, max_total_size)
|
62
|
-
new_output << "\n\nWarning: Terminal has chopped off the rest of the build as it's over the allowed 4 megabyte limit for logs."
|
63
|
-
new_output
|
64
|
-
else
|
65
|
-
output.dup
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def force_encoding!(string)
|
70
|
-
string.force_encoding('UTF-8')
|
71
|
-
|
72
|
-
if string.valid_encoding?
|
73
|
-
string
|
74
|
-
else
|
75
|
-
string.force_encoding('ASCII-8BIT').encode!('UTF-8', invalid: :replace, undef: :replace)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
42
|
def render_to_screen(string)
|
80
43
|
scanner = StringScanner.new(string)
|
81
44
|
|
@@ -147,27 +110,5 @@ module Terminal
|
|
147
110
|
# Replace empty lines with a non breaking space.
|
148
111
|
string.gsub!(/$^/, " ")
|
149
112
|
end
|
150
|
-
|
151
|
-
def replace_unicode_with_emoji!(string)
|
152
|
-
string.gsub!(EMOJI_UNICODE_REGEXP) do |match|
|
153
|
-
Terminal::Cache.cache(:emoji, match) { emoji_image_from_unicode(match) }
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
# The Emoji API will be transitioning to a nil-based find API, at the
|
158
|
-
# moment it raies exceptions for Emojis that can't be found:
|
159
|
-
# https://github.com/github/gemoji/commit/b1736a387c7c1c2af300506fea5603e2e1fb89d8
|
160
|
-
# Will support both for now.
|
161
|
-
def emoji_image_from_unicode(unicode)
|
162
|
-
emoji = Emoji.find_by_unicode(unicode)
|
163
|
-
|
164
|
-
if emoji && !EMOJI_IGNORE.include?(emoji.name)
|
165
|
-
path = File.join(@options[:emoji_asset_path], emoji.image_filename)
|
166
|
-
|
167
|
-
%(<img alt="#{emoji.name}" title="#{emoji.name}" src="#{path}" class="emoji" width="20" height="20" />)
|
168
|
-
else
|
169
|
-
unicode
|
170
|
-
end
|
171
|
-
end
|
172
113
|
end
|
173
114
|
end
|
data/lib/terminal/version.rb
CHANGED
@@ -20,13 +20,6 @@ describe Terminal::Renderer do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
describe "#render" do
|
23
|
-
it "chops off logs longer than 4 megabytes" do
|
24
|
-
long_string = "x" * 5 * 1024 * 1024
|
25
|
-
last_part_of_long_string = render(long_string).split("").last(1000).join("")
|
26
|
-
|
27
|
-
expect(last_part_of_long_string).to end_with("Warning: Terminal has chopped off the rest of the build as it's over the allowed 4 megabyte limit for logs.")
|
28
|
-
end
|
29
|
-
|
30
23
|
it "closes colors that get opened" do
|
31
24
|
raw = "he\033[32mllo"
|
32
25
|
|
@@ -196,31 +189,6 @@ describe Terminal::Renderer do
|
|
196
189
|
expect(render(raw)).to eql("hi amazing \e[12 nom nom nom friends")
|
197
190
|
end
|
198
191
|
|
199
|
-
it "renders unicode emoji" do
|
200
|
-
raw = "this is great 👍"
|
201
|
-
|
202
|
-
expect(render(raw)).to eql(%{this is great <img alt="+1" title="+1" src="/assets/emojis/unicode/1f44d.png" class="emoji" width="20" height="20" />})
|
203
|
-
end
|
204
|
-
|
205
|
-
it "returns nothing if the unicode emoji can't be found" do
|
206
|
-
expect(Emoji).to receive(:unicodes_index) { {} }
|
207
|
-
raw = "this is great 😎"
|
208
|
-
|
209
|
-
expect(render(raw)).to eql(%{this is great 😎})
|
210
|
-
end
|
211
|
-
|
212
|
-
it "leaves the tick emoji alone (it looks better and is colored)" do
|
213
|
-
raw = "works ✔"
|
214
|
-
|
215
|
-
expect(render(raw)).to eql(%{works ✔})
|
216
|
-
end
|
217
|
-
|
218
|
-
it "leaves the ✖ emoji alone as well" do
|
219
|
-
raw = "broke ✖"
|
220
|
-
|
221
|
-
expect(render(raw)).to eql(%{broke ✖})
|
222
|
-
end
|
223
|
-
|
224
192
|
it "handles colors with 3 attributes" do
|
225
193
|
raw = "\e[0;10;4m\e[1m\e[34mgood news\e[0;10m\n\neveryone"
|
226
194
|
|
data/terminal.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terminal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Pitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: escape_utils
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: gemoji
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.1'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2.1'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|