vedeu 0.0.31 → 0.0.32
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/README.md +6 -4
- data/lib/vedeu.rb +1 -0
- data/lib/vedeu/models/collection.rb +17 -0
- data/lib/vedeu/models/colour.rb +27 -5
- data/lib/vedeu/models/line_collection.rb +4 -9
- data/lib/vedeu/models/stream.rb +1 -1
- data/lib/vedeu/models/stream_collection.rb +4 -9
- data/lib/vedeu/support/coordinate.rb +149 -0
- data/lib/vedeu/support/esc.rb +4 -0
- data/lib/vedeu/support/menu.rb +103 -0
- data/lib/vedeu/support/terminal.rb +4 -0
- data/test/example_app/lib/app.rb +25 -6
- data/test/lib/vedeu/models/collection_test.rb +50 -0
- data/test/lib/vedeu/models/colour_test.rb +58 -1
- data/test/lib/vedeu/models/command_test.rb +2 -1
- data/test/lib/vedeu/models/interface_collection_test.rb +4 -3
- data/test/lib/vedeu/models/line_test.rb +3 -1
- data/test/lib/vedeu/models/stream_test.rb +6 -3
- data/test/lib/vedeu/output/text_adaptor_test.rb +1 -1
- data/test/lib/vedeu/repository/command_repository_test.rb +2 -1
- data/test/lib/vedeu/repository/interface_repository_test.rb +2 -1
- data/test/lib/vedeu/repository/repository_test.rb +2 -1
- data/test/lib/vedeu/repository/storage_test.rb +6 -3
- data/test/lib/vedeu/support/coordinate_test.rb +363 -0
- data/test/lib/vedeu/support/esc_test.rb +8 -0
- data/test/lib/vedeu/support/menu_test.rb +202 -0
- data/test/lib/vedeu/support/parser_test.rb +2 -1
- data/test/lib/vedeu/support/parsing/hash_parser_test.rb +6 -3
- data/test/lib/vedeu/support/parsing/json_parser_test.rb +2 -1
- data/test/lib/vedeu/support/terminal_test.rb +9 -0
- data/test/lib/vedeu/support/translator_test.rb +2 -1
- data/test/test_helper.rb +12 -0
- data/vedeu.gemspec +1 -1
- metadata +11 -8
- data/lib/vedeu/models/background.rb +0 -13
- data/lib/vedeu/models/foreground.rb +0 -13
- data/test/lib/vedeu/models/background_test.rb +0 -19
- data/test/lib/vedeu/models/foreground_test.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0f9669e1076e596ff5730f44aa1e4563fc24fb6
|
4
|
+
data.tar.gz: 7316c60bdbf2067b1ee27726bd94524f8554af47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7233c00d83179e6d1374fca99bea3d477f83e5991e09a8a85211d83c590d47de83ab67adca91c39628f0050240e01921cc932c2cda64826f619fea618b8e0abc
|
7
|
+
data.tar.gz: 758b39394201c72a704d0fce2188272474f4c62ee73ec5589c3938f87fea664c8576b0fb69b67dc0c808a6298e7a7bb3676838694447326d31202182fbf7d33c
|
data/README.md
CHANGED
@@ -54,8 +54,8 @@ To understand how Vedeu works, you need to familiarise yourself with some terms.
|
|
54
54
|
y: 1,
|
55
55
|
x: 1,
|
56
56
|
z: 1,
|
57
|
-
width:
|
58
|
-
height: 10,
|
57
|
+
width: 10, # see notes below
|
58
|
+
height: 10,
|
59
59
|
colour: {
|
60
60
|
foreground: '#ffffff',
|
61
61
|
background: '#000000'
|
@@ -69,8 +69,10 @@ Referring to the above example, interfaces have a name, and various default attr
|
|
69
69
|
`:x` sets the starting column point.
|
70
70
|
`:z` an integer specifying the z-index of the interface.
|
71
71
|
(See Layers)
|
72
|
-
|
73
|
-
`:
|
72
|
+
|
73
|
+
`:width` sets character width of the interface
|
74
|
+
`:height` sets character height of the interface
|
75
|
+
Note: not setting a width or height will set the values to the terminal's reported width and height.
|
74
76
|
|
75
77
|
`:foreground` sets the default foreground colour. (See Colours)
|
76
78
|
`:background` sets the default background colour.
|
data/lib/vedeu.rb
CHANGED
@@ -4,6 +4,7 @@ require 'logger'
|
|
4
4
|
require_relative 'vedeu/repository/command_repository'
|
5
5
|
require_relative 'vedeu/repository/interface_repository'
|
6
6
|
require_relative 'vedeu/repository/event_repository'
|
7
|
+
require_relative 'vedeu/support/coordinate'
|
7
8
|
require_relative 'vedeu/support/exit'
|
8
9
|
require_relative 'vedeu/launcher'
|
9
10
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Vedeu
|
2
|
+
module Collection
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def coercer(value, model, key)
|
6
|
+
return [] if value.nil? || value.empty?
|
7
|
+
|
8
|
+
if value.is_a?(::String)
|
9
|
+
[model.new({ key => value })]
|
10
|
+
|
11
|
+
else
|
12
|
+
[value].flatten.map { |v| model.new(v) }
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/vedeu/models/colour.rb
CHANGED
@@ -1,22 +1,44 @@
|
|
1
1
|
require 'oj'
|
2
2
|
require 'virtus'
|
3
3
|
|
4
|
-
require_relative '
|
5
|
-
require_relative 'background'
|
4
|
+
require_relative '../support/esc'
|
6
5
|
|
7
6
|
module Vedeu
|
8
7
|
class Colour
|
9
8
|
include Virtus.model
|
10
9
|
|
11
|
-
attribute :foreground,
|
12
|
-
attribute :background,
|
10
|
+
attribute :foreground, String
|
11
|
+
attribute :background, String
|
12
|
+
|
13
|
+
def foreground
|
14
|
+
@fg ||= Esc.foreground_colour(css_foreground)
|
15
|
+
end
|
16
|
+
|
17
|
+
def background
|
18
|
+
@bg ||= Esc.background_colour(css_background)
|
19
|
+
end
|
20
|
+
|
21
|
+
def css_foreground
|
22
|
+
@foreground || ''
|
23
|
+
end
|
24
|
+
|
25
|
+
def css_background
|
26
|
+
@background || ''
|
27
|
+
end
|
13
28
|
|
14
29
|
def to_json
|
15
|
-
Oj.dump(
|
30
|
+
Oj.dump(as_hash, mode: :compat)
|
16
31
|
end
|
17
32
|
|
18
33
|
def to_s
|
19
34
|
foreground + background
|
20
35
|
end
|
36
|
+
|
37
|
+
def as_hash
|
38
|
+
{
|
39
|
+
foreground: css_foreground,
|
40
|
+
background: css_background,
|
41
|
+
}
|
42
|
+
end
|
21
43
|
end
|
22
44
|
end
|
@@ -1,19 +1,14 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
|
+
require_relative 'collection'
|
3
4
|
require_relative 'line'
|
4
5
|
|
5
6
|
module Vedeu
|
6
7
|
class LineCollection < Virtus::Attribute
|
7
|
-
|
8
|
-
return [] if values.nil? || values.empty?
|
9
|
-
|
10
|
-
if values.is_a?(::String)
|
11
|
-
[Line.new({ streams: values })]
|
8
|
+
include Collection
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
10
|
+
def coerce(values)
|
11
|
+
coercer(values, Line, :streams)
|
17
12
|
end
|
18
13
|
end
|
19
14
|
end
|
data/lib/vedeu/models/stream.rb
CHANGED
@@ -1,19 +1,14 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
|
+
require_relative 'collection'
|
3
4
|
require_relative 'stream'
|
4
5
|
|
5
6
|
module Vedeu
|
6
7
|
class StreamCollection < Virtus::Attribute
|
7
|
-
|
8
|
-
return [] if values.nil? || values.empty?
|
9
|
-
|
10
|
-
if values.is_a?(::String)
|
11
|
-
[Stream.new({ text: values })]
|
8
|
+
include Collection
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
10
|
+
def coerce(values)
|
11
|
+
coercer(values, Stream, :text)
|
17
12
|
end
|
18
13
|
end
|
19
14
|
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require_relative 'terminal'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
class OutOfBoundsError < StandardError; end
|
5
|
+
|
6
|
+
class Coordinate
|
7
|
+
def initialize(attrs = {})
|
8
|
+
@attrs = attrs
|
9
|
+
@height = attrs.fetch(:height)
|
10
|
+
@width = attrs.fetch(:width)
|
11
|
+
@terminal_height = attrs.fetch(:terminal_height, Terminal.height)
|
12
|
+
@terminal_width = attrs.fetch(:terminal_width, Terminal.width)
|
13
|
+
@y = attrs.fetch(:y, 1)
|
14
|
+
@x = attrs.fetch(:x, 1)
|
15
|
+
@centred = attrs.fetch(:centred, true)
|
16
|
+
end
|
17
|
+
|
18
|
+
def terminal_height
|
19
|
+
fail OutOfBoundsError,
|
20
|
+
'Value must be greater than or equal to 1.' if @terminal_height < 1
|
21
|
+
|
22
|
+
if @terminal_height > Terminal.height
|
23
|
+
fail OutOfBoundsError, 'Cannot set terminal_height to be ' \
|
24
|
+
'greater than the actual terminal ' \
|
25
|
+
'height.'
|
26
|
+
else
|
27
|
+
@terminal_height
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def height
|
32
|
+
fail OutOfBoundsError,
|
33
|
+
'Value must be greater than or equal to 1.' if @height < 1
|
34
|
+
|
35
|
+
if @height > terminal_height
|
36
|
+
fail OutOfBoundsError, 'Cannot set height to be greater ' \
|
37
|
+
'than the specified or actual ' \
|
38
|
+
'terminal height.'
|
39
|
+
else
|
40
|
+
@height
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def y
|
45
|
+
fail OutOfBoundsError,
|
46
|
+
'Value must be greater than or equal to 1.' if @y < 1
|
47
|
+
|
48
|
+
if @y > height
|
49
|
+
fail OutOfBoundsError, 'Cannot set y position to be greater' \
|
50
|
+
' that the specified height or' \
|
51
|
+
' actual terminal height.'
|
52
|
+
else
|
53
|
+
@y
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def terminal_width
|
58
|
+
fail OutOfBoundsError,
|
59
|
+
'Value must be greater than or equal to 1.' if @terminal_width < 1
|
60
|
+
|
61
|
+
if @terminal_width > Terminal.width
|
62
|
+
fail OutOfBoundsError, 'Cannot set terminal_width to be ' \
|
63
|
+
'greater than the actual terminal ' \
|
64
|
+
'width.'
|
65
|
+
else
|
66
|
+
@terminal_width
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def width
|
71
|
+
fail OutOfBoundsError,
|
72
|
+
'Value must be greater than or equal to 1.' if @width < 1
|
73
|
+
|
74
|
+
if @width > terminal_width
|
75
|
+
fail OutOfBoundsError, 'Cannot set width to be greater ' \
|
76
|
+
'than the specified or actual ' \
|
77
|
+
'terminal width.'
|
78
|
+
else
|
79
|
+
@width
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def x
|
84
|
+
fail OutOfBoundsError,
|
85
|
+
'Value must be greater than or equal to 1.' if @x < 1
|
86
|
+
|
87
|
+
if @x > width
|
88
|
+
fail OutOfBoundsError, 'Cannot set x position to be greater' \
|
89
|
+
' that the specified width or' \
|
90
|
+
' actual terminal width.'
|
91
|
+
else
|
92
|
+
@x
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def centred
|
97
|
+
!!(@centred)
|
98
|
+
end
|
99
|
+
|
100
|
+
def centre
|
101
|
+
[(terminal_height / 2), (terminal_width / 2)]
|
102
|
+
end
|
103
|
+
|
104
|
+
def centre_y
|
105
|
+
centre.first
|
106
|
+
end
|
107
|
+
|
108
|
+
def centre_x
|
109
|
+
centre.last
|
110
|
+
end
|
111
|
+
|
112
|
+
def top
|
113
|
+
if centred
|
114
|
+
centre_y - (height / 2)
|
115
|
+
else
|
116
|
+
y
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def left
|
121
|
+
if centred
|
122
|
+
centre_x - (width / 2)
|
123
|
+
else
|
124
|
+
x
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def bottom
|
129
|
+
top + height
|
130
|
+
end
|
131
|
+
|
132
|
+
def right
|
133
|
+
left + width
|
134
|
+
end
|
135
|
+
|
136
|
+
def position
|
137
|
+
{
|
138
|
+
y: top,
|
139
|
+
x: left,
|
140
|
+
height: height,
|
141
|
+
width: width,
|
142
|
+
centred: centred,
|
143
|
+
bottom: bottom,
|
144
|
+
right: right,
|
145
|
+
}
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
data/lib/vedeu/support/esc.rb
CHANGED
@@ -6,6 +6,8 @@ module Vedeu
|
|
6
6
|
extend self
|
7
7
|
|
8
8
|
def background_colour(value = '#000000')
|
9
|
+
return '' if value.empty?
|
10
|
+
|
9
11
|
["\e[48;5;", colour_translator(value), 'm'].join
|
10
12
|
end
|
11
13
|
|
@@ -18,6 +20,8 @@ module Vedeu
|
|
18
20
|
end
|
19
21
|
|
20
22
|
def foreground_colour(value = '#ffffff')
|
23
|
+
return '' if value.empty?
|
24
|
+
|
21
25
|
["\e[38;5;", colour_translator(value), 'm'].join
|
22
26
|
end
|
23
27
|
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module Vedeu
|
2
|
+
class Menu
|
3
|
+
def initialize(collection)
|
4
|
+
@collection = collection
|
5
|
+
@current = 0
|
6
|
+
@selected = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def current
|
10
|
+
@current
|
11
|
+
end
|
12
|
+
|
13
|
+
def selected
|
14
|
+
@selected
|
15
|
+
end
|
16
|
+
|
17
|
+
def current_item
|
18
|
+
[@current, @collection[@current]]
|
19
|
+
end
|
20
|
+
|
21
|
+
def selected_item
|
22
|
+
return nil unless @selected
|
23
|
+
|
24
|
+
[@selected, @collection[@selected]]
|
25
|
+
end
|
26
|
+
|
27
|
+
def items
|
28
|
+
items = []
|
29
|
+
@collection.each_with_index do |item, index|
|
30
|
+
if index == @current && index == @selected
|
31
|
+
items << [true, true, item]
|
32
|
+
|
33
|
+
elsif index == @current
|
34
|
+
items << [false, true, item]
|
35
|
+
|
36
|
+
elsif index == @selected
|
37
|
+
items << [true, false, item]
|
38
|
+
|
39
|
+
else
|
40
|
+
items << [false, false, item]
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
items
|
45
|
+
end
|
46
|
+
|
47
|
+
def render
|
48
|
+
lines = []
|
49
|
+
items.each do |(sel, cur, item)|
|
50
|
+
if sel && cur
|
51
|
+
lines << "*> #{item}"
|
52
|
+
|
53
|
+
elsif cur
|
54
|
+
lines << " > #{item}"
|
55
|
+
|
56
|
+
elsif sel
|
57
|
+
lines << "* #{item}"
|
58
|
+
|
59
|
+
else
|
60
|
+
lines << " #{item}"
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
lines
|
65
|
+
end
|
66
|
+
|
67
|
+
def top
|
68
|
+
@current = 0
|
69
|
+
end
|
70
|
+
|
71
|
+
def bottom
|
72
|
+
@current = last
|
73
|
+
end
|
74
|
+
|
75
|
+
def next
|
76
|
+
@current += 1 if @current < last
|
77
|
+
|
78
|
+
self
|
79
|
+
end
|
80
|
+
|
81
|
+
def prev
|
82
|
+
@current -= 1 if @current > 0
|
83
|
+
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
87
|
+
def select
|
88
|
+
@selected = @current
|
89
|
+
end
|
90
|
+
|
91
|
+
def deselect
|
92
|
+
@selected = nil
|
93
|
+
end
|
94
|
+
|
95
|
+
def last
|
96
|
+
@collection.size - 1
|
97
|
+
end
|
98
|
+
|
99
|
+
def size
|
100
|
+
@collection.size
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|