vedeu 0.0.39 → 0.0.40
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 +0 -30
- data/Rakefile +8 -9
- data/bin/log +13 -0
- data/deps.md +11 -95
- data/lib/vedeu.rb +14 -46
- data/lib/vedeu/application.rb +4 -8
- data/lib/vedeu/instrumentation.rb +111 -0
- data/lib/vedeu/launcher.rb +2 -2
- data/lib/vedeu/models/attributes/interface_collection.rb +2 -2
- data/lib/vedeu/models/attributes/line_collection.rb +2 -2
- data/lib/vedeu/models/attributes/stream_collection.rb +2 -2
- data/lib/vedeu/models/colour.rb +1 -1
- data/lib/vedeu/models/composition.rb +1 -1
- data/lib/vedeu/models/interface.rb +18 -10
- data/lib/vedeu/models/line.rb +3 -3
- data/lib/vedeu/models/presentation.rb +1 -1
- data/lib/vedeu/models/stream.rb +2 -2
- data/lib/vedeu/models/style.rb +1 -1
- data/lib/vedeu/output/render_interface.rb +1 -1
- data/lib/vedeu/{support → parsing}/compositor.rb +1 -1
- data/lib/vedeu/parsing/hash_parser.rb +1 -1
- data/lib/vedeu/parsing/parser.rb +6 -10
- data/lib/vedeu/{models/builders → support}/builder.rb +19 -9
- data/lib/vedeu/support/esc.rb +1 -1
- data/lib/vedeu/support/events.rb +15 -19
- data/lib/vedeu/support/geometry.rb +3 -3
- data/lib/vedeu/{input → support}/input.rb +6 -9
- data/lib/vedeu/support/menu.rb +3 -3
- data/lib/vedeu/support/persistence.rb +41 -0
- data/lib/vedeu/support/terminal.rb +1 -1
- data/test/example_app/lib/app.rb +85 -5
- data/test/lib/vedeu/application_test.rb +2 -2
- data/test/lib/vedeu/configuration_test.rb +2 -2
- data/test/lib/vedeu/launcher_test.rb +2 -2
- data/test/lib/vedeu/models/attributes/collection_test.rb +2 -2
- data/test/lib/vedeu/models/attributes/interface_collection_test.rb +4 -4
- data/test/lib/vedeu/models/attributes/line_collection_test.rb +3 -3
- data/test/lib/vedeu/models/attributes/stream_collection_test.rb +3 -3
- data/test/lib/vedeu/models/colour_test.rb +2 -2
- data/test/lib/vedeu/models/composition_test.rb +19 -19
- data/test/lib/vedeu/models/interface_test.rb +46 -34
- data/test/lib/vedeu/models/line_test.rb +2 -2
- data/test/lib/vedeu/models/presentation_test.rb +2 -2
- data/test/lib/vedeu/models/stream_test.rb +2 -2
- data/test/lib/vedeu/models/style_test.rb +31 -31
- data/test/lib/vedeu/output/clear_interface_test.rb +5 -5
- data/test/lib/vedeu/output/render_interface_test.rb +5 -6
- data/test/lib/vedeu/output/template.rb +2 -1
- data/test/lib/vedeu/{support → parsing}/compositor_test.rb +6 -4
- data/test/lib/vedeu/parsing/hash_parser_test.rb +2 -2
- data/test/lib/vedeu/parsing/json_parser_test.rb +2 -2
- data/test/lib/vedeu/parsing/parser_test.rb +6 -5
- data/test/lib/vedeu/parsing/text_adaptor_test.rb +2 -2
- data/test/lib/vedeu/{models/builders/interface_builder_test.rb → support/builder_test.rb} +10 -10
- data/test/lib/vedeu/support/esc_test.rb +2 -2
- data/test/lib/vedeu/support/events_test.rb +2 -2
- data/test/lib/vedeu/support/geometry_test.rb +2 -2
- data/test/lib/vedeu/{input → support}/input_test.rb +6 -7
- data/test/lib/vedeu/support/menu_test.rb +2 -2
- data/test/lib/vedeu/support/persistence_test.rb +55 -0
- data/test/lib/vedeu/support/queue_test.rb +2 -2
- data/test/lib/vedeu/support/terminal_test.rb +2 -2
- data/test/lib/vedeu/support/translator_test.rb +2 -2
- data/test/lib/vedeu/support/wordwrap_test.rb +2 -2
- data/test/lib/vedeu_test.rb +17 -2
- data/test/support/bench.rb +34 -0
- data/test/test_helper.rb +3 -11
- data/vedeu.gemspec +2 -2
- metadata +20 -44
- data/lib/vedeu/models/builders/command_builder.rb +0 -10
- data/lib/vedeu/models/builders/interface_builder.rb +0 -32
- data/lib/vedeu/models/command.rb +0 -23
- data/lib/vedeu/output/output.rb +0 -14
- data/lib/vedeu/process/process.rb +0 -51
- data/lib/vedeu/repository/command_repository.rb +0 -31
- data/lib/vedeu/repository/interface_repository.rb +0 -31
- data/lib/vedeu/repository/repository.rb +0 -41
- data/lib/vedeu/repository/storage.rb +0 -40
- data/lib/vedeu/support/exit.rb +0 -9
- data/test/lib/vedeu/models/builders/builder_test.rb +0 -11
- data/test/lib/vedeu/models/builders/command_builder_test.rb +0 -16
- data/test/lib/vedeu/models/command_test.rb +0 -40
- data/test/lib/vedeu/output/output_test.rb +0 -19
- data/test/lib/vedeu/process/process_test.rb +0 -71
- data/test/lib/vedeu/repository/command_repository_test.rb +0 -55
- data/test/lib/vedeu/repository/interface_repository_test.rb +0 -67
- data/test/lib/vedeu/repository/repository_test.rb +0 -81
- data/test/lib/vedeu/repository/storage_test.rb +0 -70
- data/test/lib/vedeu/support/exit_test.rb +0 -12
- data/test/support/dummy_command.rb +0 -9
data/test/example_app/lib/app.rb
CHANGED
@@ -27,6 +27,27 @@ module Example
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
class MenuCommand
|
31
|
+
def self.dispatch
|
32
|
+
@command ||= new
|
33
|
+
@command.dispatch
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize; end
|
37
|
+
|
38
|
+
def dispatch
|
39
|
+
Vedeu::Parser.parse({ 'example' => render })
|
40
|
+
end
|
41
|
+
|
42
|
+
def render
|
43
|
+
menu.render.map { |item| "#{item}\n" }
|
44
|
+
end
|
45
|
+
|
46
|
+
def menu
|
47
|
+
@_menu ||= Vedeu::Menu.new(['hydrogen', 'carbon', 'nitrogen', 'oxygen'])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
30
51
|
class App
|
31
52
|
include Vedeu
|
32
53
|
|
@@ -36,7 +57,7 @@ module Example
|
|
36
57
|
colour foreground: '#ff0000', background: '#000000'
|
37
58
|
cursor false
|
38
59
|
width 40
|
39
|
-
height
|
60
|
+
height 5
|
40
61
|
centred true
|
41
62
|
end
|
42
63
|
|
@@ -58,18 +79,77 @@ module Example
|
|
58
79
|
keypress 't'
|
59
80
|
end
|
60
81
|
|
82
|
+
# command 'menu' do
|
83
|
+
# entity MenuCommand
|
84
|
+
# keyword 'menu'
|
85
|
+
# keypress 'm'
|
86
|
+
# end
|
87
|
+
|
61
88
|
command 'exit' do
|
62
89
|
entity Vedeu::Exit
|
63
90
|
keyword 'exit'
|
64
91
|
keypress 'q'
|
65
92
|
end
|
66
93
|
|
94
|
+
event :show_menu do
|
95
|
+
MenuCommand.dispatch
|
96
|
+
|
97
|
+
# Vedeu::Output.render
|
98
|
+
end
|
99
|
+
|
67
100
|
event :key do |key|
|
68
101
|
case key
|
69
|
-
when
|
70
|
-
when :f1
|
71
|
-
when :f2
|
72
|
-
when
|
102
|
+
when "v" then puts "v was pressed."
|
103
|
+
when :f1 then puts "F1 was pressed."
|
104
|
+
when :f2 then run(:some_event, [:args, :go, :here])
|
105
|
+
when "x" then run(:_exit_)
|
106
|
+
|
107
|
+
when :up then
|
108
|
+
run(:menu_prev)
|
109
|
+
run(:menu_render)
|
110
|
+
run(:show_menu)
|
111
|
+
run(:refresh)
|
112
|
+
|
113
|
+
when :down then
|
114
|
+
run(:menu_next)
|
115
|
+
run(:menu_render)
|
116
|
+
run(:show_menu)
|
117
|
+
run(:refresh)
|
118
|
+
|
119
|
+
when :page_up then
|
120
|
+
run(:menu_top)
|
121
|
+
run(:menu_render)
|
122
|
+
run(:show_menu)
|
123
|
+
run(:refresh)
|
124
|
+
|
125
|
+
when :page_down then
|
126
|
+
run(:menu_bottom)
|
127
|
+
run(:menu_render)
|
128
|
+
run(:show_menu)
|
129
|
+
run(:refresh)
|
130
|
+
|
131
|
+
when :enter then
|
132
|
+
run(:menu_select)
|
133
|
+
run(:app_select_item, m)
|
134
|
+
run(:menu_render)
|
135
|
+
run(:show_menu)
|
136
|
+
run(:refresh)
|
137
|
+
|
138
|
+
when :backspace then
|
139
|
+
run(:menu_deselect)
|
140
|
+
run(:menu_render)
|
141
|
+
run(:show_menu)
|
142
|
+
run(:refresh)
|
143
|
+
|
144
|
+
when "r" then
|
145
|
+
run(:menu_render)
|
146
|
+
run(:show_menu)
|
147
|
+
run(:refresh)
|
148
|
+
|
149
|
+
when "m" then
|
150
|
+
run(:show_menu)
|
151
|
+
run(:refresh)
|
152
|
+
|
73
153
|
else
|
74
154
|
end
|
75
155
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'test_helper'
|
2
|
+
require 'vedeu/models/attributes/interface_collection'
|
3
|
+
require 'vedeu/models/composition'
|
4
4
|
|
5
5
|
module Vedeu
|
6
6
|
describe InterfaceCollection do
|
7
7
|
describe '#coerce' do
|
8
|
-
before {
|
8
|
+
before { Persistence.reset }
|
9
9
|
|
10
10
|
it 'returns an empty collection when there are no interfaces' do
|
11
11
|
composition = Composition.new
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'test_helper'
|
2
|
+
require 'vedeu/models/attributes/line_collection'
|
3
|
+
require 'vedeu/models/interface'
|
4
4
|
|
5
5
|
module Vedeu
|
6
6
|
describe LineCollection do
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'test_helper'
|
2
|
+
require 'vedeu/models/attributes/stream_collection'
|
3
|
+
require 'vedeu/models/line'
|
4
4
|
|
5
5
|
module Vedeu
|
6
6
|
describe StreamCollection do
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'test_helper'
|
2
|
+
require 'vedeu/models/composition'
|
3
|
+
require 'vedeu/support/persistence'
|
4
4
|
|
5
5
|
module Vedeu
|
6
6
|
describe Composition do
|
@@ -36,13 +36,13 @@ module Vedeu
|
|
36
36
|
]
|
37
37
|
}
|
38
38
|
|
39
|
-
Composition.new(attributes).to_json.must_equal("{\"interfaces\":[{\"colour\":{\"foreground\":\"\#ffff33\",\"background\":\"\#ffff77\"},\"style\":\"\",\"name\":\"Composition#to_json\",\"lines\":[],\"y\":1,\"x\":1,\"
|
39
|
+
Composition.new(attributes).to_json.must_equal("{\"interfaces\":[{\"colour\":{\"foreground\":\"\#ffff33\",\"background\":\"\#ffff77\"},\"style\":\"\",\"name\":\"Composition#to_json\",\"lines\":[],\"y\":1,\"x\":1,\"width\":5,\"height\":5,\"cursor\":true}]}")
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
describe '#to_s' do
|
44
44
|
it 'returns the stringified content for a single interface, single line, single stream' do
|
45
|
-
|
45
|
+
Persistence.create({ name: 'int1_lin1_str1', y: 3, x: 3, width: 10, height: 3 })
|
46
46
|
json = File.read('test/support/json/int1_lin1_str1.json')
|
47
47
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
48
48
|
|
@@ -55,7 +55,7 @@ module Vedeu
|
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'returns the stringified content for a single interface, single line, multiple streams' do
|
58
|
-
|
58
|
+
Persistence.create({ name: 'int1_lin1_str3', y: 3, x: 3, width: 10, height: 3 })
|
59
59
|
json = File.read('test/support/json/int1_lin1_str3.json')
|
60
60
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
61
61
|
|
@@ -68,7 +68,7 @@ module Vedeu
|
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'returns the stringified content for a single interface, multiple lines, single stream' do
|
71
|
-
|
71
|
+
Persistence.create({ name: 'int1_lin2_str1', y: 3, x: 3, width: 10, height: 3 })
|
72
72
|
json = File.read('test/support/json/int1_lin2_str1.json')
|
73
73
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
74
74
|
|
@@ -82,7 +82,7 @@ module Vedeu
|
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'returns the stringified content for a single interface, multiple lines, multiple streams' do
|
85
|
-
|
85
|
+
Persistence.create({ name: 'int1_lin2_str3', y: 3, x: 3, width: 10, height: 3 })
|
86
86
|
json = File.read('test/support/json/int1_lin2_str3.json')
|
87
87
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
88
88
|
|
@@ -98,7 +98,7 @@ module Vedeu
|
|
98
98
|
it 'returns the stringified content for a single interface, multiple lines, multiple streams, streams contain styles' do
|
99
99
|
json = File.read('test/support/json/int1_lin2_str3_styles.json')
|
100
100
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
101
|
-
|
101
|
+
Persistence.create({ name: 'int1_lin2_str3_styles', y: 3, x: 3, width: 10, height: 3 })
|
102
102
|
|
103
103
|
Composition.new(attributes).to_s.must_equal(
|
104
104
|
"\e[3;3H \e[3;3H" \
|
@@ -109,8 +109,8 @@ module Vedeu
|
|
109
109
|
end
|
110
110
|
|
111
111
|
it 'returns the stringified content for multiple interfaces, single line, single stream' do
|
112
|
-
|
113
|
-
|
112
|
+
Persistence.create({ name: 'int2_lin1_str1_1', y: 3, x: 3, width: 10, height: 3 })
|
113
|
+
Persistence.create({ name: 'int2_lin1_str1_2', y: 6, x: 6, width: 10, height: 3 })
|
114
114
|
json = File.read('test/support/json/int2_lin1_str1.json')
|
115
115
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
116
116
|
|
@@ -127,8 +127,8 @@ module Vedeu
|
|
127
127
|
end
|
128
128
|
|
129
129
|
it 'returns the stringified content for multiple interfaces, single line, multiple streams' do
|
130
|
-
|
131
|
-
|
130
|
+
Persistence.create({ name: 'int2_lin1_str3_1', y: 3, x: 3, width: 10, height: 3 })
|
131
|
+
Persistence.create({ name: 'int2_lin1_str3_2', y: 6, x: 6, width: 10, height: 3 })
|
132
132
|
json = File.read('test/support/json/int2_lin1_str3.json')
|
133
133
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
134
134
|
|
@@ -145,8 +145,8 @@ module Vedeu
|
|
145
145
|
end
|
146
146
|
|
147
147
|
it 'returns the stringified content for multiple interfaces, multiple lines, single stream' do
|
148
|
-
|
149
|
-
|
148
|
+
Persistence.create({ name: 'int2_lin2_str1_1', y: 3, x: 3, width: 10, height: 3 })
|
149
|
+
Persistence.create({ name: 'int2_lin2_str1_2', y: 6, x: 6, width: 10, height: 3 })
|
150
150
|
json = File.read('test/support/json/int2_lin2_str1.json')
|
151
151
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
152
152
|
|
@@ -165,8 +165,8 @@ module Vedeu
|
|
165
165
|
end
|
166
166
|
|
167
167
|
it 'returns the stringified content for multiple interfaces, multiple lines, multiple streams' do
|
168
|
-
|
169
|
-
|
168
|
+
Persistence.create({ name: 'int2_lin2_str3_1', y: 3, x: 3, width: 10, height: 3 })
|
169
|
+
Persistence.create({ name: 'int2_lin2_str3_2', y: 6, x: 6, width: 10, height: 3 })
|
170
170
|
json = File.read('test/support/json/int2_lin2_str3.json')
|
171
171
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
172
172
|
|
@@ -185,8 +185,8 @@ module Vedeu
|
|
185
185
|
end
|
186
186
|
|
187
187
|
it 'returns the stringified content for multiple interfaces, multiple lines, multiple streams, streams contain styles' do
|
188
|
-
|
189
|
-
|
188
|
+
Persistence.create({ name: 'int2_lin2_str3_styles_1', y: 3, x: 3, width: 10, height: 3 })
|
189
|
+
Persistence.create({ name: 'int2_lin2_str3_styles_2', y: 6, x: 6, width: 10, height: 3 })
|
190
190
|
json = File.read('test/support/json/int2_lin2_str3_styles.json')
|
191
191
|
attributes = JSON.load(json, nil, symbolize_names: true)
|
192
192
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'test_helper'
|
2
|
+
require 'vedeu/models/interface'
|
3
3
|
|
4
4
|
module Vedeu
|
5
5
|
describe Interface do
|
@@ -13,7 +13,6 @@ module Vedeu
|
|
13
13
|
},
|
14
14
|
y: 3,
|
15
15
|
x: 5,
|
16
|
-
z: 2,
|
17
16
|
width: 10,
|
18
17
|
height: 15,
|
19
18
|
current: "\e[1;1H#initialize"
|
@@ -42,11 +41,6 @@ module Vedeu
|
|
42
41
|
Interface.new.x.must_equal(1)
|
43
42
|
end
|
44
43
|
|
45
|
-
it 'has a z attribute' do
|
46
|
-
interface.z.must_equal(2)
|
47
|
-
Interface.new.z.must_equal(1)
|
48
|
-
end
|
49
|
-
|
50
44
|
it 'has a width attribute' do
|
51
45
|
interface.width.must_equal(10)
|
52
46
|
end
|
@@ -71,7 +65,19 @@ module Vedeu
|
|
71
65
|
|
72
66
|
describe '#enqueue' do
|
73
67
|
it 'delegates to the Queue class to enqueue itself' do
|
74
|
-
|
68
|
+
Queue.reset
|
69
|
+
interface = Interface.new({
|
70
|
+
name: 'Interface#enqueue',
|
71
|
+
width: 5,
|
72
|
+
height: 2,
|
73
|
+
lines: [ { streams: { text: 'a8f39' } } ]
|
74
|
+
})
|
75
|
+
interface.enqueue
|
76
|
+
interface.dequeue.must_equal(
|
77
|
+
"\e[1;1H \e[1;1H" \
|
78
|
+
"\e[2;1H \e[2;1H" \
|
79
|
+
"\e[1;1Ha8f39"
|
80
|
+
)
|
75
81
|
end
|
76
82
|
end
|
77
83
|
|
@@ -112,12 +118,14 @@ module Vedeu
|
|
112
118
|
}
|
113
119
|
|
114
120
|
it 'returns a blank interface when there is no content to display (initial state)' do
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
+
Terminal.stub(:output, nil) do
|
122
|
+
Interface.new(attributes).refresh.must_equal(
|
123
|
+
"\e[38;5;196m\e[48;5;16m" \
|
124
|
+
"\e[1;1H \e[1;1H" \
|
125
|
+
"\e[2;1H \e[2;1H" \
|
126
|
+
"\e[3;1H \e[3;1H"
|
127
|
+
)
|
128
|
+
end
|
121
129
|
end
|
122
130
|
|
123
131
|
it 'returns the fresh content when content is queued up to be displayed' do
|
@@ -138,15 +146,17 @@ module Vedeu
|
|
138
146
|
interface = Interface.new(attributes)
|
139
147
|
interface.enqueue
|
140
148
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
149
|
+
Terminal.stub(:output, nil) do
|
150
|
+
interface.refresh.must_equal(
|
151
|
+
"\e[38;5;196m\e[48;5;16m" \
|
152
|
+
"\e[1;1H \e[1;1H" \
|
153
|
+
"\e[2;1H \e[2;1H" \
|
154
|
+
"\e[3;1H \e[3;1H" \
|
155
|
+
"\e[1;1H#refresh" \
|
156
|
+
"\e[2;1H#refresh" \
|
157
|
+
"\e[3;1H#refresh"
|
158
|
+
)
|
159
|
+
end
|
150
160
|
end
|
151
161
|
|
152
162
|
it 'returns the previously shown content when there is stale content from last run' do
|
@@ -169,15 +179,17 @@ module Vedeu
|
|
169
179
|
"\e[2;1H#refresh" \
|
170
180
|
"\e[3;1H#refresh"
|
171
181
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
182
|
+
Terminal.stub(:output, nil) do
|
183
|
+
interface.refresh.must_equal(
|
184
|
+
"\e[38;5;196m\e[48;5;16m" \
|
185
|
+
"\e[1;1H \e[1;1H" \
|
186
|
+
"\e[2;1H \e[2;1H" \
|
187
|
+
"\e[3;1H \e[3;1H" \
|
188
|
+
"\e[1;1H#refresh" \
|
189
|
+
"\e[2;1H#refresh" \
|
190
|
+
"\e[3;1H#refresh"
|
191
|
+
)
|
192
|
+
end
|
181
193
|
end
|
182
194
|
end
|
183
195
|
|
@@ -212,7 +224,7 @@ module Vedeu
|
|
212
224
|
},
|
213
225
|
width: 3,
|
214
226
|
height: 3
|
215
|
-
}).to_json.must_equal("{\"colour\":{\"foreground\":\"#ff0000\",\"background\":\"#000000\"},\"style\":\"\",\"name\":\"#to_json\",\"lines\":[],\"y\":1,\"x\":1,\"
|
227
|
+
}).to_json.must_equal("{\"colour\":{\"foreground\":\"#ff0000\",\"background\":\"#000000\"},\"style\":\"\",\"name\":\"#to_json\",\"lines\":[],\"y\":1,\"x\":1,\"width\":3,\"height\":3,\"cursor\":true}")
|
216
228
|
end
|
217
229
|
end
|
218
230
|
end
|