natty-ui 0.11.2 → 0.12.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/examples/8bit-colors.rb +3 -3
- data/examples/animate.rb +6 -6
- data/examples/progress.rb +8 -3
- data/lib/natty-ui/animation/binary.rb +1 -2
- data/lib/natty-ui/animation/default.rb +9 -13
- data/lib/natty-ui/animation/matrix.rb +0 -4
- data/lib/natty-ui/animation/type_writer.rb +5 -5
- data/lib/natty-ui/animation.rb +6 -6
- data/lib/natty-ui/ansi/constants.rb +6 -6
- data/lib/natty-ui/ansi_wrapper.rb +2 -6
- data/lib/natty-ui/frame.rb +53 -0
- data/lib/natty-ui/glyph.rb +64 -0
- data/lib/natty-ui/preload.rb +5 -2
- data/lib/natty-ui/spinner.rb +120 -0
- data/lib/natty-ui/version.rb +1 -1
- data/lib/natty-ui/wrapper/ask.rb +1 -1
- data/lib/natty-ui/wrapper/framed.rb +3 -3
- data/lib/natty-ui/wrapper/list_in_columns.rb +1 -1
- data/lib/natty-ui/wrapper/message.rb +2 -2
- data/lib/natty-ui/wrapper/progress.rb +3 -21
- data/lib/natty-ui/wrapper/request.rb +1 -1
- data/lib/natty-ui/wrapper/table.rb +6 -9
- data/lib/natty-ui.rb +4 -64
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0aa357f7937c367ecc77396e7241f33a774973d773b99c6923cc975199755a14
|
4
|
+
data.tar.gz: '060778aaca552a23c57e39e4efd8adf3eff07658e6a712708b6c8e46c5077bc1'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c79a14e0f8b02181a19268958c8784e306f66853e0e09f40ae630043a3f89b699aaaaee72622d06fff43df0eab9814908b5d692f748df0c7ff5f67d4cac1b460
|
7
|
+
data.tar.gz: 7b27b83b5592b3ec556e640d7d583983ec42615ac036c40a0f5b2a305616e3df846f292aae191952e312aeaf6d9e4be99ab84ed123c1853acbf055c515b9335f
|
data/examples/8bit-colors.rb
CHANGED
@@ -7,7 +7,7 @@ ui.h1 'NattyUI: 8-bit Color Support'
|
|
7
7
|
ui.space
|
8
8
|
|
9
9
|
color = ->(i) { "[bg#{i = i.to_s(16).rjust(2, '0')}] #{i} " }
|
10
|
-
ui.msg 'System Colors'
|
10
|
+
ui.msg 'System Colors' do
|
11
11
|
ui.puts <<~COLORS
|
12
12
|
[#ff]#{0.upto(7).map(&color).join}
|
13
13
|
[#00]#{8.upto(15).map(&color).join}
|
@@ -15,7 +15,7 @@ ui.msg 'System Colors', glyph: :point do
|
|
15
15
|
COLORS
|
16
16
|
end
|
17
17
|
|
18
|
-
ui.msg '6x6x6 Color Cube'
|
18
|
+
ui.msg '6x6x6 Color Cube' do
|
19
19
|
[16, 22, 28].each do |b|
|
20
20
|
b.step(b + 185, by: 36) do |i|
|
21
21
|
left = i.upto(i + 5).map(&color).join
|
@@ -26,7 +26,7 @@ ui.msg '6x6x6 Color Cube', glyph: :point do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
ui.msg 'Grayscale'
|
29
|
+
ui.msg 'Grayscale' do
|
30
30
|
ui.puts <<~GRAYSCALE
|
31
31
|
[#ff]#{232.upto(243).map(&color).join}
|
32
32
|
[#ff]#{244.upto(255).map(&color).join}
|
data/examples/animate.rb
CHANGED
@@ -13,32 +13,32 @@ TEXT = <<~TEXT.tr("\n", ' ')
|
|
13
13
|
aliquip ex ea commodo [bold]consequat[/].
|
14
14
|
TEXT
|
15
15
|
|
16
|
-
ui.message 'Default Animation'
|
16
|
+
ui.message 'Default Animation' do
|
17
17
|
ui.animate TEXT, animation: :default
|
18
18
|
end
|
19
19
|
ui.space
|
20
20
|
|
21
|
-
ui.message 'Shiny Rainbow'
|
21
|
+
ui.message 'Shiny Rainbow' do
|
22
22
|
ui.animate TEXT, animation: :rainbow
|
23
23
|
end
|
24
24
|
ui.space
|
25
25
|
|
26
|
-
ui.message 'Binary Encoded'
|
26
|
+
ui.message 'Binary Encoded' do
|
27
27
|
ui.animate TEXT, animation: :binary, style: 'green', alt_style: :bright_green
|
28
28
|
end
|
29
29
|
ui.space
|
30
30
|
|
31
|
-
ui.message 'Matrix Style'
|
31
|
+
ui.message 'Matrix Style' do
|
32
32
|
ui.animate TEXT, animation: :matrix
|
33
33
|
end
|
34
34
|
ui.space
|
35
35
|
|
36
|
-
ui.message 'Typewriter Like'
|
36
|
+
ui.message 'Typewriter Like' do
|
37
37
|
ui.animate TEXT, animation: :type_writer
|
38
38
|
end
|
39
39
|
ui.space
|
40
40
|
|
41
|
-
ui.message 'Default Styled'
|
41
|
+
ui.message 'Default Styled' do
|
42
42
|
ui.animate TEXT, style: 'bold bright_white on_red'
|
43
43
|
end
|
44
44
|
ui.space
|
data/examples/progress.rb
CHANGED
@@ -7,8 +7,13 @@ ui.h1 'NattyUI: Progress Indication'
|
|
7
7
|
ui.space
|
8
8
|
|
9
9
|
# just simulate some work
|
10
|
-
|
11
|
-
def
|
10
|
+
if ENV.key?('NO_WAIT')
|
11
|
+
def something = nil
|
12
|
+
def some = nil
|
13
|
+
else
|
14
|
+
def something = sleep(0.5)
|
15
|
+
def some = sleep(0.15)
|
16
|
+
end
|
12
17
|
|
13
18
|
ui.info 'Tasks are sections to visualize step by step processing.' do
|
14
19
|
ui.task 'Assemble assets' do
|
@@ -25,7 +30,7 @@ ui.info 'Tasks are sections to visualize step by step processing.' do
|
|
25
30
|
|
26
31
|
ui.task 'Compile files...' do
|
27
32
|
%w[readme.txt main.css main.html sub.html].each do |name|
|
28
|
-
ui.msg "Compile file [bright_yellow]./source/#{name}[/]..."
|
33
|
+
ui.msg "Compile file [bright_yellow]./source/#{name}[/]...", glyph: :dot
|
29
34
|
something
|
30
35
|
end
|
31
36
|
ui.done 'Files compiled.'
|
@@ -12,9 +12,8 @@ module NattyUI
|
|
12
12
|
35.times do |i|
|
13
13
|
binary.each do |chars|
|
14
14
|
rc = rand_char
|
15
|
-
rc = @style + rc if rc.size == 1
|
16
15
|
chars.pop
|
17
|
-
chars.unshift(rc)
|
16
|
+
chars.unshift(rc.size == 1 ? @style + rc : rc)
|
18
17
|
puts(stream, chars.join)
|
19
18
|
end
|
20
19
|
(stream << @top).flush
|
@@ -11,23 +11,19 @@ module NattyUI
|
|
11
11
|
@lines.each do |line, size|
|
12
12
|
time = 0.25 / size
|
13
13
|
stream << style
|
14
|
+
line = Text.plain(line)
|
14
15
|
if (num += 1).odd?
|
15
16
|
stream << @pos1
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
sleep(time)
|
21
|
-
end
|
17
|
+
line.each_char do |char|
|
18
|
+
(stream << char).flush
|
19
|
+
sleep(time)
|
20
|
+
end
|
22
21
|
else
|
23
22
|
stream << Ansi.cursor_column(@prefix_width + size - 1)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
(stream << char << CURSOR_LEFT).flush
|
29
|
-
sleep(time)
|
30
|
-
end
|
23
|
+
line.reverse.each_char do |char|
|
24
|
+
(stream << char << CURSOR_LEFT).flush
|
25
|
+
sleep(time)
|
26
|
+
end
|
31
27
|
end
|
32
28
|
stream << Ansi::RESET << @pos1 << line << Ansi::LINE_NEXT
|
33
29
|
end
|
@@ -22,10 +22,6 @@ module NattyUI
|
|
22
22
|
pos.pop(count).each { enc[_1] = line[_1] }
|
23
23
|
pos.sample(pos.size / 3).each { enc[_1] = CHARS.sample }
|
24
24
|
end
|
25
|
-
|
26
|
-
# next stream << Ansi::LINE_NEXT if pos.size < 4
|
27
|
-
# pos.shift(pos.size / 8).each { enc[_1] = line[_1] }
|
28
|
-
# pos.sample(pos.size / 2).each { enc[_1] = CHARS.sample }
|
29
25
|
puts(stream, enc)
|
30
26
|
end
|
31
27
|
(stream << @top).flush
|
@@ -10,15 +10,15 @@ module NattyUI
|
|
10
10
|
@style = attribute(:style, :default)
|
11
11
|
@cursor_style = attribute(:cursor_style, 0x2e)
|
12
12
|
@lines.each do |line, size|
|
13
|
+
line = Text.plain(line)
|
13
14
|
if (num += 1).odd?
|
14
15
|
stream << @pos1
|
15
|
-
|
16
|
+
line.each_char { cursor(stream, _1).flush }
|
16
17
|
else
|
17
18
|
stream << Ansi.cursor_column(@prefix_width + size - 1)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
.each_char { (cursor(stream, _1) << CURSOR_2LEFT).flush }
|
19
|
+
line.reverse.each_char do |char|
|
20
|
+
(cursor(stream, char) << CURSOR_2LEFT).flush
|
21
|
+
end
|
22
22
|
end
|
23
23
|
stream << Ansi::RESET << @pos1 << line << Ansi::LINE_NEXT
|
24
24
|
end
|
data/lib/natty-ui/animation.rb
CHANGED
@@ -2,19 +2,19 @@
|
|
2
2
|
|
3
3
|
module NattyUI
|
4
4
|
module Animation
|
5
|
-
def self.
|
6
|
-
def self.defined?(name) = @defined.key?(name)
|
7
|
-
def self.define(**kwargs) = @defined.merge!(kwargs)
|
5
|
+
def self.names = @all.keys
|
8
6
|
|
9
7
|
def self.[](name)
|
10
8
|
return if name.nil?
|
11
|
-
klass = @
|
9
|
+
klass = @all[name] || @all[:default]
|
12
10
|
return klass unless klass.is_a?(String)
|
13
11
|
require(klass)
|
14
|
-
klass = @
|
12
|
+
klass = @all[name] and return klass
|
15
13
|
raise(LoadError, "unknown animation - #{name}")
|
16
14
|
end
|
17
15
|
|
16
|
+
def self.define(**kwargs) = @all.merge!(kwargs)
|
17
|
+
|
18
18
|
class Base
|
19
19
|
attr_reader :lines_written
|
20
20
|
|
@@ -58,7 +58,7 @@ module NattyUI
|
|
58
58
|
private_constant :Base
|
59
59
|
|
60
60
|
dir = __dir__
|
61
|
-
@
|
61
|
+
@all = {
|
62
62
|
binary: "#{dir}/animation/binary",
|
63
63
|
default: "#{dir}/animation/default",
|
64
64
|
matrix: "#{dir}/animation/matrix",
|
@@ -59,17 +59,17 @@ module NattyUI::Ansi
|
|
59
59
|
REVEAL = self[:reveal].freeze
|
60
60
|
|
61
61
|
# @!visibility private
|
62
|
-
CLS =
|
62
|
+
CLS = "#{CURSOR_HOME}#{SCREEN_ERASE}".freeze
|
63
63
|
|
64
64
|
# @!visibility private
|
65
|
-
CLL =
|
65
|
+
CLL = "#{CURSOR_FIRST_COLUMN}#{LINE_ERASE}".freeze
|
66
66
|
|
67
67
|
# @!visibility private
|
68
68
|
SCREEN_BLANK =
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
"#{CURSOR_SAFE_POS}#{
|
70
|
+
SCREEN_ALTERNATE
|
71
|
+
}#{CURSOR_HOME}#{SCREEN_ERASE}#{RESET}".freeze
|
72
72
|
|
73
73
|
# @!visibility private
|
74
|
-
SCREEN_UNBLANK =
|
74
|
+
SCREEN_UNBLANK = "#{RESET}#{SCREEN_ALTERNATE_OFF}#{CURSOR_RESTORE_POS}".freeze
|
75
75
|
end
|
@@ -85,11 +85,7 @@ module NattyUI
|
|
85
85
|
(wrapper.stream << @msg << Ansi::CURSOR_HIDE).flush
|
86
86
|
@msg = "#{Ansi::CLL}#{@msg}"
|
87
87
|
return @msg << BAR_COLOR if @max_value
|
88
|
-
|
89
|
-
@spinner =
|
90
|
-
Enumerator.new do |y|
|
91
|
-
spinner.each_char { y << "#{spinner_color}#{_1}" } while true
|
92
|
-
end
|
88
|
+
@spinner = NattyUI::Spinner[spinner]
|
93
89
|
end
|
94
90
|
|
95
91
|
def redraw
|
@@ -162,7 +158,7 @@ module NattyUI
|
|
162
158
|
|
163
159
|
def initialize(parent, title:, glyph:, **opts)
|
164
160
|
color = COLORS[glyph] || COLORS[:default]
|
165
|
-
glyph = NattyUI
|
161
|
+
glyph = NattyUI::Glyph[glyph]
|
166
162
|
prefix_width = Text.width(glyph) + 1
|
167
163
|
parent.puts(
|
168
164
|
title,
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NattyUI
|
4
|
+
# Helper class to select frame types.
|
5
|
+
# @see Features#framed
|
6
|
+
# @see Features#table
|
7
|
+
module Frame
|
8
|
+
# Define frame type used by default.
|
9
|
+
#
|
10
|
+
# @attribute [w] self.default
|
11
|
+
# @param value [Symbol] type name
|
12
|
+
# @return [Symbol] type name
|
13
|
+
def self.default=(value)
|
14
|
+
@default = self[value.nil? || value == :default ? :rounded : value]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Defined frame type names.
|
18
|
+
# @see []
|
19
|
+
#
|
20
|
+
# @attribute [r] self.names
|
21
|
+
# @return [Array<Symbol>] supported attribute names
|
22
|
+
def self.names = @all.keys
|
23
|
+
|
24
|
+
# @param name [Symbol, String]
|
25
|
+
# defined type name (see {.names})
|
26
|
+
# or frame elements
|
27
|
+
# @return [String] frame definition
|
28
|
+
def self.[](name)
|
29
|
+
return @default if name == :default
|
30
|
+
if name.is_a?(Symbol)
|
31
|
+
ret = @all[name] and return ret
|
32
|
+
elsif name.is_a?(String)
|
33
|
+
return name if name.size == 11
|
34
|
+
return name * 11 if name.size == 1
|
35
|
+
end
|
36
|
+
raise(ArgumentError, "invalid frame type - #{name}")
|
37
|
+
end
|
38
|
+
|
39
|
+
@all = {
|
40
|
+
cols: ' │ │ ',
|
41
|
+
double: '╔╗╚╝║═╬╦╩╠╣',
|
42
|
+
heavy: '┏┓┗┛┃━╋┳┻┣┫',
|
43
|
+
rounded: '╭╮╰╯│─┼┬┴├┤',
|
44
|
+
rows: ' ── ',
|
45
|
+
semi: '╒╕╘╛│═╪╤╧╞╡',
|
46
|
+
semi2: '╓╖╙╜│─╫╥╨╟╢',
|
47
|
+
simple: '┌┐└┘│─┼┬┴├┤',
|
48
|
+
undecorated: ' '
|
49
|
+
}.compare_by_identity
|
50
|
+
|
51
|
+
self.default = nil
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'text'
|
4
|
+
|
5
|
+
module NattyUI
|
6
|
+
# Helper class to select glyph types.
|
7
|
+
# @see Features#message
|
8
|
+
module Glyph
|
9
|
+
# Define glyph type used by default.
|
10
|
+
# @attribute [w] self.default
|
11
|
+
# @param value [Symbol] type name
|
12
|
+
# @return [Symbol] type name
|
13
|
+
def self.default=(value)
|
14
|
+
@default = self[value.nil? || value == :default ? :point : value]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Defined glyph type names.
|
18
|
+
# @see []
|
19
|
+
#
|
20
|
+
# @attribute [r] self.names
|
21
|
+
# @return [Array<Symbol>] supported attribute names
|
22
|
+
def self.names = @all.keys
|
23
|
+
|
24
|
+
# @param name [Symbol, #to_s]
|
25
|
+
# defined type name (see {.names})
|
26
|
+
# or glyph
|
27
|
+
# @return [String] glyph definition
|
28
|
+
def self.[](name)
|
29
|
+
return @default if name == :default
|
30
|
+
Text.embellish(
|
31
|
+
if name.is_a?(Symbol)
|
32
|
+
@all[name] or raise(ArgumentError, "invalid glyph type - #{name}")
|
33
|
+
else
|
34
|
+
name.to_s
|
35
|
+
end
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
@all = {
|
40
|
+
completed: '[b 52]✓',
|
41
|
+
dot: '[27]•',
|
42
|
+
error: '[b d0]𝙓',
|
43
|
+
failed: '[b c4]𝑭',
|
44
|
+
information: '[b 77]𝒊',
|
45
|
+
point: '[27]◉',
|
46
|
+
query: '[b 27]▸',
|
47
|
+
task: '[b 27]➔',
|
48
|
+
warning: '[b dd]!'
|
49
|
+
}.compare_by_identity
|
50
|
+
|
51
|
+
# GLYPH = {
|
52
|
+
# default: '●',
|
53
|
+
# information: '🅸 ',
|
54
|
+
# warning: '🆆 ',
|
55
|
+
# error: '🅴 ',
|
56
|
+
# completed: '✓',
|
57
|
+
# failed: '🅵 ',
|
58
|
+
# task: '➔',
|
59
|
+
# query: '🆀 '
|
60
|
+
# }.compare_by_identity.freeze
|
61
|
+
|
62
|
+
self.default = nil
|
63
|
+
end
|
64
|
+
end
|
data/lib/natty-ui/preload.rb
CHANGED
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'ansi'
|
4
|
+
|
5
|
+
module NattyUI
|
6
|
+
# Helper class to select spinner types.
|
7
|
+
# @see Features#progress
|
8
|
+
module Spinner
|
9
|
+
class << self
|
10
|
+
# Define spinner type used by default.
|
11
|
+
# @attribute [w] self.default
|
12
|
+
# @param value [Symbol] type name
|
13
|
+
# @return [Symbol] type name
|
14
|
+
def default=(value)
|
15
|
+
@default = self[value.nil? || value == :default ? :pulse : value]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Defined spinner type names.
|
19
|
+
# @see []
|
20
|
+
#
|
21
|
+
# @attribute [r] self.names
|
22
|
+
# @return [Array<Symbol>] supported attribute names
|
23
|
+
def names = @all.keys
|
24
|
+
|
25
|
+
# @param name [Symbol, #to_a, #to_s]
|
26
|
+
# defined type name (see {.names})
|
27
|
+
# or spinner elements
|
28
|
+
# @return [Enumerator] spinner definition
|
29
|
+
def [](name)
|
30
|
+
return @default if name == :default
|
31
|
+
parts =
|
32
|
+
if name.is_a?(Symbol)
|
33
|
+
@all[name] or raise(ArgumentError, "invalid spinner type - #{name}")
|
34
|
+
else
|
35
|
+
name
|
36
|
+
end
|
37
|
+
parts =
|
38
|
+
(parts.respond_to?(:map) ? parts : parts.to_s.chars).map do |part|
|
39
|
+
"#{@style}#{part}"
|
40
|
+
end
|
41
|
+
raise(ArgumentError, "invalid spinner type - #{name}") if parts.empty?
|
42
|
+
parts = parts.zip(parts).flatten(1) while parts.size < 6
|
43
|
+
Enumerator.new { |y| parts.each { y << _1 } while true }
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def slide(a, b, size, prefix = nil, suffix = prefix)
|
49
|
+
Enumerator.new do |y|
|
50
|
+
fn =
|
51
|
+
lambda do |i|
|
52
|
+
y << "#{prefix}#{a * (i += 1)}#{b * (size - i)}#{suffix}"
|
53
|
+
end
|
54
|
+
size.times(&fn)
|
55
|
+
a, b = b, a
|
56
|
+
size.times(&fn)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def bounce(a, b, size, prefix = nil, suffix = prefix)
|
61
|
+
Enumerator.new do |y|
|
62
|
+
fn =
|
63
|
+
lambda do |i|
|
64
|
+
y << "#{prefix}#{a * (i += 1)}#{b * (size - i)}#{suffix}"
|
65
|
+
end
|
66
|
+
size.times(&fn)
|
67
|
+
a, b = b, a
|
68
|
+
(size - 1).times(&fn)
|
69
|
+
fn = ->(i) { y << "#{prefix}#{a * i}#{b * (size - i)}#{suffix}" }
|
70
|
+
(size - 2).downto(0, &fn)
|
71
|
+
a, b = b, a
|
72
|
+
(size - 1).downto(0, &fn)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def move(a, b, size, prefix = nil, suffix = prefix)
|
77
|
+
Enumerator.new do |y|
|
78
|
+
size.times do |i|
|
79
|
+
y << "#{prefix}#{b * i}#{a}#{b * (size - i - 1)}#{suffix}"
|
80
|
+
end
|
81
|
+
y << "#{prefix}#{b * size}#{suffix}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
@style = Ansi[:bold, 220]
|
87
|
+
@all = {
|
88
|
+
bar: '▁▂▃▄▅▆▇█▇▆▅▄▃▂',
|
89
|
+
blink: '■□▪▫',
|
90
|
+
blocks: '▖▘▝▗',
|
91
|
+
bounce: bounce('◼︎', '◻︎', 7),
|
92
|
+
bounce2: bounce('▰', '▱', 7),
|
93
|
+
bounce3: bounce('● ', '◌ ', 7),
|
94
|
+
bounce4: bounce('=', ' ', 5, '[', ']'),
|
95
|
+
circle: '◐◓◑◒',
|
96
|
+
colors: '🟨🟨🟧🟧🟥🟥🟦🟦🟪🟪🟩🟩',
|
97
|
+
dots: '⣷⣯⣟⡿⢿⣻⣽⣾',
|
98
|
+
dots2: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
|
99
|
+
dots3: '⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓',
|
100
|
+
dots4: '⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆',
|
101
|
+
dots5: '⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋',
|
102
|
+
move: move('◼︎', '◻︎', 7),
|
103
|
+
move2: move('▰', '▱', 7),
|
104
|
+
move3: move('● ', '◌ ', 7),
|
105
|
+
move4: move('=', ' ', 5, '[', ']'),
|
106
|
+
pulse: '•✺◉●◉✺',
|
107
|
+
slide: slide('◼︎', '◻︎', 7),
|
108
|
+
slide2: slide('▰', '▱', 7),
|
109
|
+
slide3: slide('● ', '◌ ', 7),
|
110
|
+
slide4: slide('=', ' ', 5, '[', ']'),
|
111
|
+
slide5: slide('.', ' ', 3),
|
112
|
+
snake: '⠁⠉⠙⠸⢰⣠⣄⡆⠇⠃',
|
113
|
+
stod: '⡿⣟⣯⣷⣾⣽⣻⢿',
|
114
|
+
swap: '㊂㊀㊁',
|
115
|
+
vintage: '-\\|/'
|
116
|
+
}.compare_by_identity
|
117
|
+
|
118
|
+
self.default = nil
|
119
|
+
end
|
120
|
+
end
|
data/lib/natty-ui/version.rb
CHANGED
data/lib/natty-ui/wrapper/ask.rb
CHANGED
@@ -11,12 +11,12 @@ module NattyUI
|
|
11
11
|
# {Wrapper::Element#close}.
|
12
12
|
#
|
13
13
|
# @param [Array<#to_s>] args more objects to print
|
14
|
-
# @param [
|
14
|
+
# @param [Symbol, String] type frame type; see {NattyUI::Frame}
|
15
15
|
# @yieldparam [Wrapper::Framed] framed the created section
|
16
16
|
# @return [Object] the result of the code block
|
17
17
|
# @return [Wrapper::Framed] itself, when no code block is given
|
18
|
-
def framed(*args, type: :
|
19
|
-
_section(:Framed, args, type: NattyUI
|
18
|
+
def framed(*args, type: :default, &block)
|
19
|
+
_section(:Framed, args, type: NattyUI::Frame[type], &block)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -9,7 +9,7 @@ module NattyUI
|
|
9
9
|
#
|
10
10
|
# @param [#to_s] title object to print as section title
|
11
11
|
# @param [Array<#to_s>] args more objects to print
|
12
|
-
# @param [#to_s] glyph
|
12
|
+
# @param [Symbol, #to_s] glyph used for the title; see {NattyUI::Glyph}
|
13
13
|
# @yieldparam [Wrapper::Message] message the created section
|
14
14
|
# @return [Object] the result of the code block
|
15
15
|
# @return [Wrapper::Message] itself, when no code block is given
|
@@ -94,7 +94,7 @@ module NattyUI
|
|
94
94
|
protected
|
95
95
|
|
96
96
|
def initialize(parent, title:, glyph:)
|
97
|
-
glyph = NattyUI
|
97
|
+
glyph = NattyUI::Glyph[glyph]
|
98
98
|
prefix_width = Text.width(glyph) + 1
|
99
99
|
super(
|
100
100
|
parent,
|
@@ -18,11 +18,9 @@ module NattyUI
|
|
18
18
|
#
|
19
19
|
# @param [#to_s] title object to print as progress title
|
20
20
|
# @param [#to_f] max_value maximum value of the progress
|
21
|
-
# @param [
|
22
|
-
# :snake, :swap, :triangles, :vintage, #to_s] spinner type of spinner or
|
23
|
-
# spinner elements
|
21
|
+
# @param [Symbol, #to_a, #to_s] spinner spinner type; see {NattyUI::Spinner}
|
24
22
|
# @return [Wrapper::Progress] the created progress element
|
25
|
-
def progress(title, max_value: nil, spinner: :
|
23
|
+
def progress(title, max_value: nil, spinner: :default)
|
26
24
|
_element(:Progress, title, max_value, spinner)
|
27
25
|
end
|
28
26
|
end
|
@@ -42,26 +40,10 @@ module NattyUI
|
|
42
40
|
@final_text = [title]
|
43
41
|
@max_value = [0, max_value.to_f].max if max_value
|
44
42
|
@value = @progress = 0
|
45
|
-
draw(title,
|
43
|
+
draw(title, spinner)
|
46
44
|
self
|
47
45
|
end
|
48
46
|
|
49
|
-
SPINNER = {
|
50
|
-
bar: '▁▂▃▄▅▆▇█▇▆▅▄▃▂',
|
51
|
-
blink: '■□▪▫',
|
52
|
-
blocks: '▖▘▝▗',
|
53
|
-
braile: '⣷⣯⣟⡿⢿⣻⣽⣾',
|
54
|
-
braile_reverse: '⡿⣟⣯⣷⣾⣽⣻⢿',
|
55
|
-
circle: '◐◓◑◒',
|
56
|
-
colors: '🟨🟧🟥🟦🟪🟩',
|
57
|
-
pulse: '•✺◉●◉✺',
|
58
|
-
snake: '⠁⠉⠙⠸⢰⣠⣄⡆⠇⠃',
|
59
|
-
swap: '㊂㊀㊁',
|
60
|
-
triangles: '◢◣◤◥',
|
61
|
-
vintage: '-\\|/'
|
62
|
-
}.compare_by_identity.freeze
|
63
|
-
private_constant :SPINNER
|
64
|
-
|
65
47
|
def draw(title, _spinner)
|
66
48
|
(wrapper.stream << @parent.prefix << "➔ #{title} ").flush
|
67
49
|
end
|
@@ -7,14 +7,11 @@ module NattyUI
|
|
7
7
|
#
|
8
8
|
# Table view of data.
|
9
9
|
#
|
10
|
-
#
|
11
|
-
# :double, :heavy, :semi, :simple
|
12
|
-
#
|
13
|
-
# @overload table(*args, type: simple, expand: false)
|
10
|
+
# @overload table(*args, type: :default, expand: false)
|
14
11
|
# Display the given arrays as rows of a table.
|
15
12
|
#
|
16
13
|
# @param [#map<#map<#to_s>>] args one or more arrays representing rows of the table
|
17
|
-
# @param [Symbol] type frame type
|
14
|
+
# @param [Symbol, String] type frame type; see {NattyUI::Frame}
|
18
15
|
# @param [false, true. :equal] expand
|
19
16
|
#
|
20
17
|
# @example
|
@@ -33,10 +30,10 @@ module NattyUI
|
|
33
30
|
# # ───────┼───────┼───────────
|
34
31
|
# # kiwi │ 1.5$ │ Newzeeland
|
35
32
|
#
|
36
|
-
# @overload table(type:
|
33
|
+
# @overload table(type: :default, expand: false)
|
37
34
|
# Construct and display a table.
|
38
35
|
#
|
39
|
-
# @param [Symbol] type frame type
|
36
|
+
# @param [Symbol, String] type frame type; see {NattyUI::Frame}
|
40
37
|
# @param [false, true. :equal] expand
|
41
38
|
#
|
42
39
|
# @example
|
@@ -58,8 +55,8 @@ module NattyUI
|
|
58
55
|
#
|
59
56
|
# @yield [Table] table construction helper
|
60
57
|
# @return [Wrapper::Section, Wrapper] it's parent object
|
61
|
-
def table(*table, type: :
|
62
|
-
type = NattyUI
|
58
|
+
def table(*table, type: :default, expand: false)
|
59
|
+
type = NattyUI::Frame[type]
|
63
60
|
table = Table.create(*table)
|
64
61
|
yield(table) if block_given?
|
65
62
|
_element(:Table, table, type, expand)
|
data/lib/natty-ui.rb
CHANGED
@@ -135,34 +135,6 @@ module NattyUI
|
|
135
135
|
nil
|
136
136
|
end
|
137
137
|
|
138
|
-
# @return [Array<Symbol>] available glyph names
|
139
|
-
def glyph_names = GLYPH.keys
|
140
|
-
|
141
|
-
# Get a pre-defined glyph.
|
142
|
-
#
|
143
|
-
# @param [Symbol] name glyph name
|
144
|
-
# @return [String] the glyph
|
145
|
-
# @return [nil] when glyph is not defined
|
146
|
-
def glyph(name) = GLYPH[name]
|
147
|
-
|
148
|
-
# @return [Array<Symbol>] available frame names
|
149
|
-
def frame_names = FRAME.keys
|
150
|
-
|
151
|
-
# Get a frame definition.
|
152
|
-
#
|
153
|
-
# @param [Symbol] name frame type name
|
154
|
-
# @return [String] the frame definition
|
155
|
-
# @raise [ArgumentError] when an invalid name is specified
|
156
|
-
def frame(name)
|
157
|
-
if name.is_a?(Symbol)
|
158
|
-
ret = FRAME[name] and return ret
|
159
|
-
elsif name.is_a?(String)
|
160
|
-
return name if name.size == 11
|
161
|
-
return name * 11 if name.size == 1
|
162
|
-
end
|
163
|
-
raise(ArgumentError, "invalid frame type - #{name.inspect}")
|
164
|
-
end
|
165
|
-
|
166
138
|
private
|
167
139
|
|
168
140
|
def wrapper_class(stream, ansi)
|
@@ -188,44 +160,12 @@ module NattyUI
|
|
188
160
|
|
189
161
|
dir = __dir__
|
190
162
|
autoload(:Animation, File.join(dir, 'natty-ui', 'animation'))
|
163
|
+
autoload(:Frame, File.join(dir, 'natty-ui', 'frame'))
|
164
|
+
autoload(:Glyph, File.join(dir, 'natty-ui', 'glyph'))
|
191
165
|
autoload(:KEY_MAP, File.join(dir, 'natty-ui', 'key_map'))
|
166
|
+
autoload(:Spinner, File.join(dir, 'natty-ui', 'spinner'))
|
192
167
|
|
193
|
-
|
194
|
-
default: "#{Ansi[:bold, 255]}•#{Ansi::RESET}",
|
195
|
-
point: "#{Ansi[0x27]}◉#{Ansi::RESET}",
|
196
|
-
information: "#{Ansi[:bold, 119]}𝒊#{Ansi::RESET}",
|
197
|
-
warning: "#{Ansi[:bold, 221]}!#{Ansi::RESET}",
|
198
|
-
error: "#{Ansi[:bold, 208]}𝙓#{Ansi::RESET}",
|
199
|
-
completed: "#{Ansi[:bold, 82]}✓#{Ansi::RESET}",
|
200
|
-
failed: "#{Ansi[:bold, 196]}𝑭#{Ansi::RESET}",
|
201
|
-
task: "#{Ansi[:bold, 39]}➔#{Ansi::RESET}",
|
202
|
-
query: "#{Ansi[:bold, 39]}▸#{Ansi::RESET}"
|
203
|
-
}.compare_by_identity.freeze
|
204
|
-
|
205
|
-
# GLYPH = {
|
206
|
-
# default: '●',
|
207
|
-
# information: '🅸 ',
|
208
|
-
# warning: '🆆 ',
|
209
|
-
# error: '🅴 ',
|
210
|
-
# completed: '✓',
|
211
|
-
# failed: '🅵 ',
|
212
|
-
# task: '➔',
|
213
|
-
# query: '🆀 '
|
214
|
-
# }.compare_by_identity.freeze
|
215
|
-
|
216
|
-
FRAME = {
|
217
|
-
rounded: '╭╮╰╯│─┼┬┴├┤',
|
218
|
-
simple: '┌┐└┘│─┼┬┴├┤',
|
219
|
-
heavy: '┏┓┗┛┃━╋┳┻┣┫',
|
220
|
-
double: '╔╗╚╝║═╬╦╩╠╣',
|
221
|
-
semi: '╒╕╘╛│═╪╤╧╞╡',
|
222
|
-
semi2: '╓╖╙╜│─╫╥╨╟╢',
|
223
|
-
rows: ' ── ',
|
224
|
-
cols: ' │ │ ',
|
225
|
-
undecorated: ' '
|
226
|
-
}.compare_by_identity.freeze
|
227
|
-
|
228
|
-
private_constant :Animation, :KEY_MAP, :GLYPH, :FRAME
|
168
|
+
private_constant :Animation, :KEY_MAP
|
229
169
|
|
230
170
|
@element = StdOut
|
231
171
|
self.in_stream = STDIN
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: natty-ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Blumtritt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08-
|
11
|
+
date: 2024-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
This is the beautiful, nice, nifty, fancy, neat, pretty, cool, lovely,
|
@@ -49,8 +49,11 @@ files:
|
|
49
49
|
- lib/natty-ui/ansi.rb
|
50
50
|
- lib/natty-ui/ansi/constants.rb
|
51
51
|
- lib/natty-ui/ansi_wrapper.rb
|
52
|
+
- lib/natty-ui/frame.rb
|
53
|
+
- lib/natty-ui/glyph.rb
|
52
54
|
- lib/natty-ui/key_map.rb
|
53
55
|
- lib/natty-ui/preload.rb
|
56
|
+
- lib/natty-ui/spinner.rb
|
54
57
|
- lib/natty-ui/text.rb
|
55
58
|
- lib/natty-ui/text/east_asian_width.rb
|
56
59
|
- lib/natty-ui/version.rb
|