eskimo 2.2.0 → 3.0.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/eskimo.rb +2 -29
- data/lib/eskimo/version.rb +1 -1
- metadata +16 -106
- data/lib/eskimo/component.rb +0 -37
- data/lib/eskimo/components/did_you_mean.rb +0 -34
- data/lib/eskimo/components/either.rb +0 -30
- data/lib/eskimo/components/gutter.rb +0 -33
- data/lib/eskimo/components/highlight.rb +0 -31
- data/lib/eskimo/components/highlight_column.rb +0 -61
- data/lib/eskimo/components/indent.rb +0 -25
- data/lib/eskimo/components/line_break.rb +0 -18
- data/lib/eskimo/components/soft_break.rb +0 -16
- data/lib/eskimo/components/spacer.rb +0 -33
- data/lib/eskimo/components/squeeze.rb +0 -43
- data/lib/eskimo/components/strip.rb +0 -15
- data/lib/eskimo/components/strip_left.rb +0 -15
- data/lib/eskimo/components/strip_right.rb +0 -15
- data/lib/eskimo/components/style.rb +0 -25
- data/lib/eskimo/components/truncate.rb +0 -31
- data/lib/eskimo/components/truncate_rear.rb +0 -25
- data/lib/eskimo/components/wrap.rb +0 -26
- data/lib/eskimo/constants.rb +0 -7
- data/lib/eskimo/renderer.rb +0 -46
- data/spec/component_spec.rb +0 -13
- data/spec/components/did_you_mean_spec.rb +0 -21
- data/spec/components/either_spec.rb +0 -21
- data/spec/components/gutter_spec.rb +0 -25
- data/spec/components/highlight_column_spec.rb +0 -63
- data/spec/components/highlight_spec.rb +0 -25
- data/spec/components/indent_spec.rb +0 -15
- data/spec/components/line_break_spec.rb +0 -17
- data/spec/components/soft_break_spec.rb +0 -17
- data/spec/components/spacer_spec.rb +0 -42
- data/spec/components/squeeze_spec.rb +0 -61
- data/spec/components/strip_left_spec.rb +0 -15
- data/spec/components/strip_right_spec.rb +0 -15
- data/spec/components/strip_spec.rb +0 -15
- data/spec/components/style_spec.rb +0 -25
- data/spec/components/truncate_rear_spec.rb +0 -35
- data/spec/components/truncate_spec.rb +0 -35
- data/spec/components/wrap_spec.rb +0 -15
- data/spec/renderer_spec.rb +0 -62
- data/spec/spec_helper.rb +0 -42
- data/spec/support/component_suite.rb +0 -15
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Indent text from the left.
|
6
|
-
#
|
7
|
-
# Indent.new(width: 8) do
|
8
|
-
# [ "Hello", SoftBreak.new, "World!" ]
|
9
|
-
# end
|
10
|
-
# # => " Hello"
|
11
|
-
# # " World!"
|
12
|
-
class Indent < Component
|
13
|
-
attr_reader :width
|
14
|
-
|
15
|
-
def initialize(width: 4, &children)
|
16
|
-
@width = width
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def render(**)
|
21
|
-
Strings.pad(super, [0,0,0,width])
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Insert a paragraph-like line-break.
|
6
|
-
#
|
7
|
-
# [ "Hello", LineBreak.new, "World!" ]
|
8
|
-
# # => "Hello"
|
9
|
-
# # ""
|
10
|
-
# # ""
|
11
|
-
# # "World!"
|
12
|
-
class LineBreak
|
13
|
-
def render(**)
|
14
|
-
"\n \n"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Space consecutive components with soft breaks.
|
6
|
-
#
|
7
|
-
# Spacer.new([
|
8
|
-
# "Hello",
|
9
|
-
# "World!"
|
10
|
-
# ])
|
11
|
-
# # => "Hello"
|
12
|
-
# # "World!"
|
13
|
-
#
|
14
|
-
# The soft breaks for each conditional component will be preserved only
|
15
|
-
# if they do render some content.
|
16
|
-
class Spacer
|
17
|
-
def initialize(children)
|
18
|
-
if !children.is_a?(Array) || block_given?
|
19
|
-
raise ArgumentError.new("Spacer works only with an Array of components")
|
20
|
-
end
|
21
|
-
|
22
|
-
@children = children
|
23
|
-
end
|
24
|
-
|
25
|
-
def render(**props)
|
26
|
-
rendered = @children.map(&props[:render])
|
27
|
-
|
28
|
-
without_blanks = rendered.reject(&:empty?)
|
29
|
-
without_blanks.join("\n")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Squeeze immediate consecutive soft breaks.
|
6
|
-
#
|
7
|
-
# Squeeze.new do
|
8
|
-
# [
|
9
|
-
# SoftBreak.new,
|
10
|
-
# ConditionalComponent.new,
|
11
|
-
#
|
12
|
-
# SoftBreak.new,
|
13
|
-
# false && SomeOtherComponent.new,
|
14
|
-
#
|
15
|
-
# SoftBreak.new,
|
16
|
-
# 'hello',
|
17
|
-
# ]
|
18
|
-
# end
|
19
|
-
# # => ""
|
20
|
-
# # "hello"
|
21
|
-
#
|
22
|
-
# The soft breaks for each conditional component will be preserved only
|
23
|
-
# if they do render some content.
|
24
|
-
class Squeeze
|
25
|
-
def initialize(children)
|
26
|
-
if !children.is_a?(Array) || block_given?
|
27
|
-
raise ArgumentError.new("Squeeze works only with an Array of components")
|
28
|
-
end
|
29
|
-
|
30
|
-
@children = children
|
31
|
-
end
|
32
|
-
|
33
|
-
def render(**props)
|
34
|
-
rendered = @children.map(&props[:render])
|
35
|
-
|
36
|
-
without_blanks = rendered.reject(&:empty?)
|
37
|
-
without_blanks.reject.with_index do |element, index|
|
38
|
-
element == "\n" && without_blanks[index+1] == "\n"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Remove whitespace from the beginning.
|
6
|
-
#
|
7
|
-
# StripLeft.new { " hello world " }
|
8
|
-
# # => "hello world "
|
9
|
-
class StripLeft < Component
|
10
|
-
def render(**)
|
11
|
-
super.lstrip
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Remove whitespace from the end.
|
6
|
-
#
|
7
|
-
# StripRight.new { " hello world " }
|
8
|
-
# # => " hello world"
|
9
|
-
class StripRight < Component
|
10
|
-
def render(**)
|
11
|
-
super.rstrip
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Style text with colors and custom formatting.
|
6
|
-
#
|
7
|
-
# See [Pastel's documentation][pastel] for the accepted styles.
|
8
|
-
#
|
9
|
-
# [pastel]: https://github.com/piotrmurach/pastel
|
10
|
-
class Style < Component
|
11
|
-
attr_reader :pastel, :style
|
12
|
-
|
13
|
-
def initialize(*style, &children)
|
14
|
-
@style = style.flatten
|
15
|
-
@pastel = Pastel.new
|
16
|
-
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def render(**)
|
21
|
-
pastel.decorate(super, *style)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Truncate text from the beginning if it exceeds a certain width.
|
6
|
-
#
|
7
|
-
# Truncate.new(width: 3) do
|
8
|
-
# "foo bar"
|
9
|
-
# end
|
10
|
-
# # => "... bar"
|
11
|
-
class Truncate < Component
|
12
|
-
attr_reader :maxlen
|
13
|
-
|
14
|
-
def initialize(reserve: 0, width: Constants::SCREEN_COLUMNS, &children)
|
15
|
-
@maxlen = [0, width - reserve].max
|
16
|
-
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
def render(**)
|
21
|
-
text = super
|
22
|
-
|
23
|
-
if text.length >= maxlen
|
24
|
-
'...' + text[text.length - maxlen - 1 .. -1]
|
25
|
-
else
|
26
|
-
text
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'eskimo/components/truncate'
|
4
|
-
|
5
|
-
module Eskimo
|
6
|
-
module Components
|
7
|
-
# Truncate text from the rear if it exceeds a certain width.
|
8
|
-
#
|
9
|
-
# TruncateRear.new(width: 3) do
|
10
|
-
# "foo bar"
|
11
|
-
# end
|
12
|
-
# # => "foo..."
|
13
|
-
class TruncateRear < Truncate
|
14
|
-
def render(render:, **)
|
15
|
-
text = render[@children]
|
16
|
-
|
17
|
-
if text.length >= maxlen
|
18
|
-
text[0..maxlen - 1] + '...'
|
19
|
-
else
|
20
|
-
text
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
module Components
|
5
|
-
# Wrap a block text with newlines at a certain threshold.
|
6
|
-
#
|
7
|
-
# Wrap.new(width: 3) do
|
8
|
-
# "foobar"
|
9
|
-
# end
|
10
|
-
# # => "foo"
|
11
|
-
# # "bar"
|
12
|
-
#
|
13
|
-
class Wrap < Component
|
14
|
-
attr_reader :width
|
15
|
-
|
16
|
-
def initialize(width: Constants::SCREEN_COLUMNS, &children)
|
17
|
-
@width = width
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def render(**)
|
22
|
-
Strings.wrap(super, width)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/lib/eskimo/constants.rb
DELETED
data/lib/eskimo/renderer.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Eskimo
|
4
|
-
# Render a component or a list of ones.
|
5
|
-
class Renderer
|
6
|
-
# @param props [Hash]
|
7
|
-
# Properties to pass to each component being rendered.
|
8
|
-
def initialize(**props)
|
9
|
-
@props = { **props, render: method(:render) }
|
10
|
-
end
|
11
|
-
|
12
|
-
# @param components [Proc]
|
13
|
-
# A block that returns components to render.
|
14
|
-
def apply(&components)
|
15
|
-
render(components)
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def render(*components)
|
21
|
-
buf = +''
|
22
|
-
|
23
|
-
for component in components do
|
24
|
-
if component.is_a?(String)
|
25
|
-
buf << component
|
26
|
-
elsif component.is_a?(Array)
|
27
|
-
buf << render(*component)
|
28
|
-
elsif component.is_a?(Proc)
|
29
|
-
buf << render(component[**@props])
|
30
|
-
elsif component.respond_to?(:render)
|
31
|
-
buf << render(component.render(**@props))
|
32
|
-
elsif component
|
33
|
-
bail(component)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
buf
|
38
|
-
end
|
39
|
-
|
40
|
-
def bail(component)
|
41
|
-
raise ArgumentError.new(
|
42
|
-
"Eskimo: don't know how to render #{component.class} => #{component}"
|
43
|
-
)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/spec/component_spec.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe Eskimo::Component do
|
6
|
-
it 'accepts a block of children' do
|
7
|
-
expect(
|
8
|
-
Eskimo::Renderer.new.apply {
|
9
|
-
Eskimo::Component.new { ['hello', "\n", 'world!'] }
|
10
|
-
}
|
11
|
-
).to eq("hello\nworld!")
|
12
|
-
end
|
13
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe Eskimo::Components::DidYouMean do
|
6
|
-
it 'renders a suggestion' do
|
7
|
-
expect(
|
8
|
-
renderer.apply {
|
9
|
-
described_class.new(dictionary: [ 'abc', 'bca' ], item: 'abd')
|
10
|
-
}
|
11
|
-
).to eq("Did you mean? abc")
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'renders nothing if no suggestions were found' do
|
15
|
-
expect(
|
16
|
-
renderer.apply {
|
17
|
-
described_class.new(dictionary: [ 'abc', 'bca' ], item: 'asdf')
|
18
|
-
}
|
19
|
-
).to eq("")
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe Eskimo::Components::Either do
|
6
|
-
it 'renders the primary component' do
|
7
|
-
expect(
|
8
|
-
renderer.apply {
|
9
|
-
described_class.new(->(**) { false }, "Fallback here")
|
10
|
-
}
|
11
|
-
).to eq("Fallback here")
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'renders the fallback if the primary does not' do
|
15
|
-
expect(
|
16
|
-
renderer.apply {
|
17
|
-
described_class.new(->(**) { "Hi!" }, "Fallback here")
|
18
|
-
}
|
19
|
-
).to eq("Hi!")
|
20
|
-
end
|
21
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe Eskimo::Components::Gutter do
|
6
|
-
it 'prepends each line with the character' do
|
7
|
-
expect(
|
8
|
-
renderer.apply do
|
9
|
-
ESK::Gutter.new(char: '| ') do
|
10
|
-
"hello\nworld"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
).to eq("| hello\n| world")
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'inserts surrounding whitespace' do
|
17
|
-
expect(
|
18
|
-
renderer.apply do
|
19
|
-
ESK::Gutter.new(char: '| ', spacing: 2) do
|
20
|
-
"hello\nworld"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
).to eq("| \n| \n| hello\n| world\n| \n| ")
|
24
|
-
end
|
25
|
-
end
|