vedeu 0.1.3 → 0.1.4
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/Guardfile +5 -0
- data/README.md +34 -0
- data/deps.md +13 -13
- data/lib/vedeu.rb +1 -1
- data/lib/vedeu/instrumentation.rb +1 -1
- data/lib/vedeu/models/geometry.rb +76 -0
- data/lib/vedeu/models/interface.rb +9 -21
- data/lib/vedeu/models/stream.rb +16 -4
- data/lib/vedeu/output/clear_interface.rb +4 -4
- data/lib/vedeu/{support/translator.rb → output/colour_translator.rb} +1 -1
- data/lib/vedeu/output/erb_parser.rb +11 -0
- data/lib/vedeu/output/raw_parser.rb +9 -1
- data/lib/vedeu/output/render_interface.rb +3 -3
- data/lib/vedeu/support/esc.rb +8 -6
- data/lib/vedeu/support/helpers.rb +39 -18
- data/lib/vedeu/support/interface_template.rb +42 -19
- data/test/lib/vedeu/models/composition_test.rb +27 -21
- data/test/lib/vedeu/models/geometry_test.rb +183 -0
- data/test/lib/vedeu/models/interface_test.rb +26 -59
- data/test/lib/vedeu/models/stream_test.rb +57 -7
- data/test/lib/vedeu/output/clear_interface_test.rb +8 -4
- data/test/lib/vedeu/{support/translator_test.rb → output/colour_translator_test.rb} +8 -8
- data/test/lib/vedeu/output/erb_parser_test.rb +158 -70
- data/test/lib/vedeu/output/render_interface_test.rb +4 -3
- data/test/lib/vedeu/support/esc_test.rb +10 -2
- data/test/lib/vedeu/support/helpers_test.rb +11 -4
- data/test/lib/vedeu/support/interface_template_test.rb +58 -34
- data/test/support/colours.rb +2 -2
- data/test/support/erb/line.erb +4 -0
- data/test/support/erb/line_2x.erb +10 -0
- data/test/support/erb/line_foreground.erb +4 -0
- data/test/support/erb/line_foreground_2x.erb +5 -0
- data/vedeu.gemspec +2 -1
- metadata +30 -8
- data/lib/vedeu/support/geometry.rb +0 -172
- data/test/lib/vedeu/support/geometry_test.rb +0 -408
@@ -11,10 +11,12 @@ module Vedeu
|
|
11
11
|
foreground: '#ff0000',
|
12
12
|
background: '#000000'
|
13
13
|
},
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
geometry: {
|
15
|
+
y: 3,
|
16
|
+
x: 5,
|
17
|
+
width: 10,
|
18
|
+
height: 15,
|
19
|
+
},
|
18
20
|
current: "\e[1;1H#initialize"
|
19
21
|
})
|
20
22
|
}
|
@@ -31,24 +33,6 @@ module Vedeu
|
|
31
33
|
interface.colour.must_be_instance_of(Colour)
|
32
34
|
end
|
33
35
|
|
34
|
-
it 'has a y attribute' do
|
35
|
-
interface.y.must_equal(3)
|
36
|
-
Interface.new.y.must_equal(1)
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'has an x attribute' do
|
40
|
-
interface.x.must_equal(5)
|
41
|
-
Interface.new.x.must_equal(1)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'has a width attribute' do
|
45
|
-
interface.width.must_equal(10)
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'has a height attribute' do
|
49
|
-
interface.height.must_equal(15)
|
50
|
-
end
|
51
|
-
|
52
36
|
it 'has a current attribute' do
|
53
37
|
interface.current.must_equal("\e[1;1H#initialize")
|
54
38
|
end
|
@@ -58,18 +42,15 @@ module Vedeu
|
|
58
42
|
Interface.new({ cursor: false }).cursor.must_equal(false)
|
59
43
|
end
|
60
44
|
|
61
|
-
it 'has a centred attribute' do
|
62
|
-
interface.centred.must_equal(false)
|
63
|
-
Interface.new({ centred: true }).centred.must_equal(true)
|
64
|
-
end
|
65
|
-
|
66
45
|
describe '#enqueue' do
|
67
46
|
it 'delegates to the Queue class to enqueue itself' do
|
68
47
|
Queue.reset
|
69
48
|
interface = Interface.new({
|
70
49
|
name: 'Interface#enqueue',
|
71
|
-
|
72
|
-
|
50
|
+
geometry: {
|
51
|
+
width: 8,
|
52
|
+
height: 2,
|
53
|
+
},
|
73
54
|
lines: [ { streams: { text: 'a8f39' } } ]
|
74
55
|
})
|
75
56
|
interface.enqueue
|
@@ -81,28 +62,6 @@ module Vedeu
|
|
81
62
|
end
|
82
63
|
end
|
83
64
|
|
84
|
-
describe '#geometry' do
|
85
|
-
it 'delegates to the Geometry class' do
|
86
|
-
interface = Interface.new({
|
87
|
-
name: '#geometry',
|
88
|
-
width: 5,
|
89
|
-
height: 5
|
90
|
-
})
|
91
|
-
interface.geometry.must_be_instance_of(Geometry)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe '#origin' do
|
96
|
-
it 'delegates to the Geometry class to get the origin' do
|
97
|
-
interface = Interface.new({
|
98
|
-
name: '#origin',
|
99
|
-
width: 5,
|
100
|
-
height: 5
|
101
|
-
})
|
102
|
-
interface.origin.must_equal("\e[1;1H")
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
65
|
describe '#refresh' do
|
107
66
|
let(:attributes) {
|
108
67
|
{
|
@@ -112,8 +71,10 @@ module Vedeu
|
|
112
71
|
foreground: '#ff0000',
|
113
72
|
background: '#000000'
|
114
73
|
},
|
115
|
-
|
116
|
-
|
74
|
+
geometry: {
|
75
|
+
width: 3,
|
76
|
+
height: 3
|
77
|
+
}
|
117
78
|
}
|
118
79
|
}
|
119
80
|
|
@@ -140,8 +101,10 @@ module Vedeu
|
|
140
101
|
foreground: '#ff0000',
|
141
102
|
background: '#000000'
|
142
103
|
},
|
143
|
-
|
144
|
-
|
104
|
+
geometry: {
|
105
|
+
width: 11,
|
106
|
+
height: 3
|
107
|
+
}
|
145
108
|
}
|
146
109
|
interface = Interface.new(attributes)
|
147
110
|
interface.enqueue
|
@@ -167,8 +130,10 @@ module Vedeu
|
|
167
130
|
foreground: '#ff0000',
|
168
131
|
background: '#000000'
|
169
132
|
},
|
170
|
-
|
171
|
-
|
133
|
+
geometry: {
|
134
|
+
width: 11,
|
135
|
+
height: 3
|
136
|
+
}
|
172
137
|
}
|
173
138
|
interface = Interface.new(attributes)
|
174
139
|
interface.current = "\e[38;5;196m\e[48;5;16m" \
|
@@ -202,8 +167,10 @@ module Vedeu
|
|
202
167
|
foreground: '#ff0000',
|
203
168
|
background: '#000000'
|
204
169
|
},
|
205
|
-
|
206
|
-
|
170
|
+
geometry: {
|
171
|
+
width: 3,
|
172
|
+
height: 3
|
173
|
+
}
|
207
174
|
}).to_s.must_equal(
|
208
175
|
"\e[38;5;196m\e[48;5;16m" \
|
209
176
|
"\e[1;1H \e[1;1H" \
|
@@ -10,9 +10,13 @@ module Vedeu
|
|
10
10
|
background: '#000000'
|
11
11
|
},
|
12
12
|
text: 'Some text',
|
13
|
-
style: 'normal'
|
13
|
+
style: 'normal',
|
14
|
+
width: width,
|
15
|
+
align: align
|
14
16
|
})
|
15
17
|
}
|
18
|
+
let(:align) { :left }
|
19
|
+
let(:width) { 9 }
|
16
20
|
|
17
21
|
it 'has a colour attribute' do
|
18
22
|
stream.colour.must_be_instance_of(Colour)
|
@@ -26,13 +30,59 @@ module Vedeu
|
|
26
30
|
stream.style.must_equal("\e[24m\e[21m\e[27m")
|
27
31
|
end
|
28
32
|
|
33
|
+
it 'has a width attribute' do
|
34
|
+
stream.width.must_equal(9)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'has an align attribute' do
|
38
|
+
stream.align.must_equal(:left)
|
39
|
+
end
|
40
|
+
|
29
41
|
describe '#to_s' do
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
42
|
+
describe 'when a width is set and align is default' do
|
43
|
+
let(:width) { 20 }
|
44
|
+
|
45
|
+
it 'returns a String' do
|
46
|
+
stream.to_s.must_equal(
|
47
|
+
"\e[38;5;196m\e[48;5;16m" \
|
48
|
+
"\e[24m\e[21m\e[27m" \
|
49
|
+
"Some text "
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
describe 'and align is :centre' do
|
54
|
+
let(:align) { :centre }
|
55
|
+
|
56
|
+
it 'returns a String' do
|
57
|
+
stream.to_s.must_equal(
|
58
|
+
"\e[38;5;196m\e[48;5;16m" \
|
59
|
+
"\e[24m\e[21m\e[27m" \
|
60
|
+
" Some text "
|
61
|
+
)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe 'and align is :right' do
|
66
|
+
let(:align) { :right }
|
67
|
+
|
68
|
+
it 'returns a String' do
|
69
|
+
stream.to_s.must_equal(
|
70
|
+
"\e[38;5;196m\e[48;5;16m" \
|
71
|
+
"\e[24m\e[21m\e[27m" \
|
72
|
+
" Some text"
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe 'when a width is not set' do
|
79
|
+
it 'returns a String' do
|
80
|
+
stream.to_s.must_equal(
|
81
|
+
"\e[38;5;196m\e[48;5;16m" \
|
82
|
+
"\e[24m\e[21m\e[27m" \
|
83
|
+
"Some text"
|
84
|
+
)
|
85
|
+
end
|
36
86
|
end
|
37
87
|
end
|
38
88
|
end
|
@@ -11,8 +11,10 @@ module Vedeu
|
|
11
11
|
it 'returns the escape sequence to clear the whole interface' do
|
12
12
|
interface = Interface.new({
|
13
13
|
name: 'ClearInterface.call',
|
14
|
-
|
15
|
-
|
14
|
+
geometry: {
|
15
|
+
width: 5,
|
16
|
+
height: 2
|
17
|
+
}
|
16
18
|
})
|
17
19
|
ClearInterface.call(interface).must_equal(
|
18
20
|
"\e[1;1H \e[1;1H" \
|
@@ -23,8 +25,10 @@ module Vedeu
|
|
23
25
|
it 'returns the escape sequence to clear the whole interface with specified colours' do
|
24
26
|
interface = Interface.new({
|
25
27
|
name: 'ClearInterface.call',
|
26
|
-
|
27
|
-
|
28
|
+
geometry: {
|
29
|
+
width: 5,
|
30
|
+
height: 2,
|
31
|
+
},
|
28
32
|
colour: {
|
29
33
|
foreground: '#00ff00',
|
30
34
|
background: '#ffff00'
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require 'vedeu/
|
2
|
+
require 'vedeu/output/colour_translator'
|
3
3
|
|
4
4
|
module Vedeu
|
5
|
-
describe
|
5
|
+
describe ColourTranslator do
|
6
6
|
describe '#translate' do
|
7
7
|
{
|
8
8
|
'#ff0000' => 196, # red
|
@@ -13,29 +13,29 @@ module Vedeu
|
|
13
13
|
'#b94f1c' => 130, # sunset orange
|
14
14
|
}.map do |html_colour, terminal_colour|
|
15
15
|
it 'translation is performed' do
|
16
|
-
|
16
|
+
ColourTranslator.translate(html_colour)
|
17
17
|
.must_equal(terminal_colour)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'returns empty string when not present' do
|
22
|
-
|
22
|
+
ColourTranslator.translate.must_equal('')
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'returns empty string when the wrong type!' do
|
26
|
-
|
26
|
+
ColourTranslator.translate(:wrong_type).must_equal('')
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'returns empty string when invalid format' do
|
30
|
-
|
30
|
+
ColourTranslator.translate('345678').must_equal('')
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'returns empty string when invalid format' do
|
34
|
-
|
34
|
+
ColourTranslator.translate('#h11111').must_equal('')
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'returns empty string when invalid format' do
|
38
|
-
|
38
|
+
ColourTranslator.translate('#1111').must_equal('')
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -68,85 +68,173 @@ module Vedeu
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
}
|
85
|
-
}, {
|
86
|
-
streams: {
|
87
|
-
text: "\e[48;5;201mDefault text on magenta background."
|
88
|
-
}
|
89
|
-
}, {
|
90
|
-
streams: {
|
91
|
-
text: "\e[38;5;196m\e[48;5;17mRed text on dark blue background."
|
92
|
-
}
|
71
|
+
|
72
|
+
it 'parses the template and colour directives within' do
|
73
|
+
user_view = UserView.new
|
74
|
+
user_view.stub(:path, 'test/support/erb/colour.erb') do
|
75
|
+
ERBParser.parse(user_view).must_equal(
|
76
|
+
{
|
77
|
+
interfaces: [
|
78
|
+
{
|
79
|
+
name: 'test',
|
80
|
+
lines: [
|
81
|
+
{
|
82
|
+
streams: {
|
83
|
+
text: "\e[38;5;52mDark red text on default background."
|
93
84
|
}
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
85
|
+
}, {
|
86
|
+
streams: {
|
87
|
+
text: "\e[48;5;201mDefault text on magenta background."
|
88
|
+
}
|
89
|
+
}, {
|
90
|
+
streams: {
|
91
|
+
text: "\e[38;5;196m\e[48;5;17mRed text on dark blue background."
|
92
|
+
}
|
93
|
+
}
|
94
|
+
]
|
95
|
+
}
|
96
|
+
]
|
97
|
+
}
|
98
|
+
)
|
100
99
|
end
|
101
100
|
end
|
102
101
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
user_view.
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
{
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
102
|
+
it 'parses the template and style directives within' do
|
103
|
+
user_view = UserView.new
|
104
|
+
user_view.stub(:path, 'test/support/erb/style.erb') do
|
105
|
+
ERBParser.parse(user_view).must_equal(
|
106
|
+
{
|
107
|
+
interfaces: [
|
108
|
+
{
|
109
|
+
name: 'test',
|
110
|
+
lines: [
|
111
|
+
{
|
112
|
+
streams: { text: 'Empty style leads to nothing.' }
|
113
|
+
}, {
|
114
|
+
streams: { text: "\e[4mUnderlined text." }
|
115
|
+
}, {
|
116
|
+
streams: { text: 'Unknown style leads to nothing.' }
|
117
|
+
}
|
118
|
+
]
|
119
|
+
}
|
120
|
+
]
|
121
|
+
}
|
122
|
+
)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'parses the template and both colour and style directives within' do
|
127
|
+
user_view = UserView.new
|
128
|
+
user_view.stub(:path, 'test/support/erb/colour_style.erb') do
|
129
|
+
ERBParser.parse(user_view).must_equal(
|
130
|
+
{
|
131
|
+
interfaces: [
|
132
|
+
{
|
133
|
+
name: 'test',
|
134
|
+
lines: [
|
135
|
+
{
|
136
|
+
streams: {
|
137
|
+
text: "\e[38;5;21m\e[4m\e[48;5;17mBlue underline text on dark blue background."
|
119
138
|
}
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
139
|
+
}
|
140
|
+
]
|
141
|
+
}
|
142
|
+
]
|
143
|
+
}
|
144
|
+
)
|
126
145
|
end
|
127
146
|
end
|
128
147
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
user_view.
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
{
|
140
|
-
|
141
|
-
text: "\e[38;5;21m\e[4m\e[48;5;17mBlue underline text on dark blue background."
|
142
|
-
}
|
148
|
+
it 'treats sections of the template as one line' do
|
149
|
+
user_view = UserView.new
|
150
|
+
user_view.stub(:path, 'test/support/erb/line.erb') do
|
151
|
+
ERBParser.parse(user_view).must_equal(
|
152
|
+
{
|
153
|
+
interfaces: [
|
154
|
+
{
|
155
|
+
name: 'test',
|
156
|
+
lines: [
|
157
|
+
{
|
158
|
+
streams: {
|
159
|
+
text: " This is line one. This is line two."
|
143
160
|
}
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
161
|
+
}
|
162
|
+
]
|
163
|
+
}
|
164
|
+
]
|
165
|
+
}
|
166
|
+
)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'treats sections of the template as one line with a foreground' do
|
171
|
+
user_view = UserView.new
|
172
|
+
user_view.stub(:path, 'test/support/erb/line_foreground.erb') do
|
173
|
+
ERBParser.parse(user_view).must_equal(
|
174
|
+
{
|
175
|
+
interfaces: [
|
176
|
+
{
|
177
|
+
name: 'test',
|
178
|
+
lines: [
|
179
|
+
{
|
180
|
+
streams: {
|
181
|
+
text: " \e[38;5;226mThis is line one.\e[38;2;39m This is line two."
|
182
|
+
}
|
183
|
+
}
|
184
|
+
]
|
185
|
+
}
|
186
|
+
]
|
187
|
+
}
|
188
|
+
)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'treats sections of the template as one line with a foreground' do
|
193
|
+
user_view = UserView.new
|
194
|
+
user_view.stub(:path, 'test/support/erb/line_foreground_2x.erb') do
|
195
|
+
ERBParser.parse(user_view).must_equal(
|
196
|
+
{
|
197
|
+
interfaces: [
|
198
|
+
{
|
199
|
+
name: 'test',
|
200
|
+
lines: [
|
201
|
+
{
|
202
|
+
streams: {
|
203
|
+
text: " \e[38;5;226mThis is line one.\e[38;2;39m \e[38;5;196mThis is line two.\e[38;2;39m This is line three."
|
204
|
+
}
|
205
|
+
}
|
206
|
+
]
|
207
|
+
}
|
208
|
+
]
|
209
|
+
}
|
210
|
+
)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'treats sections of the template as one line' do
|
215
|
+
skip
|
216
|
+
user_view = UserView.new
|
217
|
+
user_view.stub(:path, 'test/support/erb/line_2x.erb') do
|
218
|
+
ERBParser.parse(user_view).must_equal(
|
219
|
+
{
|
220
|
+
interfaces: [
|
221
|
+
{
|
222
|
+
name: 'test',
|
223
|
+
lines: [
|
224
|
+
{
|
225
|
+
streams: {
|
226
|
+
text: " This is line one. This is line two."
|
227
|
+
}
|
228
|
+
}, {
|
229
|
+
streams: {
|
230
|
+
text: " This is line three. This is line four."
|
231
|
+
}
|
232
|
+
}
|
233
|
+
]
|
234
|
+
}
|
235
|
+
]
|
236
|
+
}
|
237
|
+
)
|
150
238
|
end
|
151
239
|
end
|
152
240
|
end
|