vedeu 0.0.7 → 0.0.8
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/.ruby-version +1 -1
- data/Guardfile +1 -1
- data/README.md +14 -0
- data/lib/vedeu.rb +1 -0
- data/lib/vedeu/interface/dummy.rb +13 -0
- data/lib/vedeu/interface/interface.rb +1 -1
- data/lib/vedeu/interface/interfaces.rb +10 -9
- data/lib/vedeu/output/colour.rb +2 -0
- data/lib/vedeu/output/compositor.rb +3 -23
- data/lib/vedeu/output/directive.rb +27 -14
- data/lib/vedeu/output/geometry.rb +6 -1
- data/lib/vedeu/output/position.rb +8 -3
- data/lib/vedeu/output/wordwrap.rb +84 -0
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/application_test.rb +15 -5
- data/test/lib/vedeu/interface/dummy_test.rb +5 -5
- data/test/lib/vedeu/interface/interface_test.rb +17 -7
- data/test/lib/vedeu/interface/interfaces_test.rb +29 -20
- data/test/lib/vedeu/output/background_test.rb +40 -3
- data/test/lib/vedeu/output/base_test.rb +2 -4
- data/test/lib/vedeu/output/colour_test.rb +6 -6
- data/test/lib/vedeu/output/compositor_test.rb +15 -15
- data/test/lib/vedeu/output/directive_test.rb +36 -35
- data/test/lib/vedeu/output/esc_test.rb +9 -9
- data/test/lib/vedeu/output/foreground_test.rb +39 -2
- data/test/lib/vedeu/output/geometry_test.rb +51 -7
- data/test/lib/vedeu/output/position_test.rb +15 -6
- data/test/lib/vedeu/output/renderer_test.rb +19 -1
- data/test/lib/vedeu/output/style_test.rb +1 -2
- data/test/lib/vedeu/output/wordwrap_test.rb +59 -0
- data/test/lib/vedeu/process/command_test.rb +8 -8
- data/test/lib/vedeu/process/commands_test.rb +27 -7
- data/test/lib/vedeu/process/exit_test.rb +1 -1
- data/test/lib/vedeu/support/terminal_test.rb +27 -24
- data/test/test_helper.rb +1 -1
- data/vedeu.gemspec +5 -5
- metadata +21 -19
@@ -14,7 +14,9 @@ module Vedeu
|
|
14
14
|
it { described_instance.must_be_instance_of(Geometry) }
|
15
15
|
|
16
16
|
describe '#z' do
|
17
|
-
subject { described_instance.z }
|
17
|
+
let(:subject) { described_instance.z }
|
18
|
+
|
19
|
+
it { subject.must_be_instance_of(Fixnum) }
|
18
20
|
|
19
21
|
context 'using a value' do
|
20
22
|
let(:values) { { z: 2 } }
|
@@ -28,7 +30,9 @@ module Vedeu
|
|
28
30
|
end
|
29
31
|
|
30
32
|
describe '#y' do
|
31
|
-
subject { described_instance.y }
|
33
|
+
let(:subject) { described_instance.y }
|
34
|
+
|
35
|
+
it { subject.must_be_instance_of(Fixnum) }
|
32
36
|
|
33
37
|
context 'using a value' do
|
34
38
|
let(:values) { { y: 17 } }
|
@@ -42,7 +46,9 @@ module Vedeu
|
|
42
46
|
end
|
43
47
|
|
44
48
|
describe '#x' do
|
45
|
-
subject { described_instance.x }
|
49
|
+
let(:subject) { described_instance.x }
|
50
|
+
|
51
|
+
it { subject.must_be_instance_of(Fixnum) }
|
46
52
|
|
47
53
|
context 'using a value' do
|
48
54
|
let(:values) { { x: 33 } }
|
@@ -56,7 +62,9 @@ module Vedeu
|
|
56
62
|
end
|
57
63
|
|
58
64
|
describe '#width' do
|
59
|
-
subject { described_instance.width }
|
65
|
+
let(:subject) { described_instance.width }
|
66
|
+
|
67
|
+
it { subject.must_be_instance_of(Fixnum) }
|
60
68
|
|
61
69
|
context 'using a value' do
|
62
70
|
let(:values) { { width: 50 } }
|
@@ -64,13 +72,21 @@ module Vedeu
|
|
64
72
|
it { subject.must_equal(50) }
|
65
73
|
end
|
66
74
|
|
75
|
+
context 'using :auto' do
|
76
|
+
let(:values) { { width: :auto } }
|
77
|
+
|
78
|
+
it { subject.must_equal(80) }
|
79
|
+
end
|
80
|
+
|
67
81
|
context 'using the default' do
|
68
82
|
it { subject.must_equal(80) }
|
69
83
|
end
|
70
84
|
end
|
71
85
|
|
72
86
|
describe '#height' do
|
73
|
-
subject { described_instance.height }
|
87
|
+
let(:subject) { described_instance.height }
|
88
|
+
|
89
|
+
it { subject.must_be_instance_of(Fixnum) }
|
74
90
|
|
75
91
|
context 'using a value' do
|
76
92
|
let(:values) { { height: 20 } }
|
@@ -78,13 +94,21 @@ module Vedeu
|
|
78
94
|
it { subject.must_equal(20) }
|
79
95
|
end
|
80
96
|
|
97
|
+
context 'using :auto' do
|
98
|
+
let(:values) { { height: :auto } }
|
99
|
+
|
100
|
+
it { subject.must_equal(25) }
|
101
|
+
end
|
102
|
+
|
81
103
|
context 'using the default' do
|
82
104
|
it { subject.must_equal(25) }
|
83
105
|
end
|
84
106
|
end
|
85
107
|
|
86
108
|
describe '#dy' do
|
87
|
-
subject { described_instance.dy }
|
109
|
+
let(:subject) { described_instance.dy }
|
110
|
+
|
111
|
+
it { subject.must_be_instance_of(Fixnum) }
|
88
112
|
|
89
113
|
context 'when the value is greater than the available terminal size' do
|
90
114
|
it 'clips the value to the terminal size' do
|
@@ -100,7 +124,9 @@ module Vedeu
|
|
100
124
|
end
|
101
125
|
|
102
126
|
describe '#dx' do
|
103
|
-
subject { described_instance.dx }
|
127
|
+
let(:subject) { described_instance.dx }
|
128
|
+
|
129
|
+
it { subject.must_be_instance_of(Fixnum) }
|
104
130
|
|
105
131
|
context 'when the value is greater than the available terminal size' do
|
106
132
|
it 'clips the value to the terminal size' do
|
@@ -111,8 +137,26 @@ module Vedeu
|
|
111
137
|
context 'when the value is less than the available size' do
|
112
138
|
let(:values) { { x: 17, width: 21 } }
|
113
139
|
|
140
|
+
it { subject.must_be_instance_of(Fixnum) }
|
141
|
+
|
114
142
|
it { subject.must_equal(38) }
|
115
143
|
end
|
116
144
|
end
|
145
|
+
|
146
|
+
describe '#vx' do
|
147
|
+
let(:subject) { described_instance.vx }
|
148
|
+
|
149
|
+
it { subject.must_be_instance_of(Fixnum) }
|
150
|
+
|
151
|
+
it { subject.must_equal(1) }
|
152
|
+
end
|
153
|
+
|
154
|
+
describe '#vy' do
|
155
|
+
let(:subject) { described_instance.vy }
|
156
|
+
|
157
|
+
it { subject.must_be_instance_of(Fixnum) }
|
158
|
+
|
159
|
+
it { subject.must_equal(1) }
|
160
|
+
end
|
117
161
|
end
|
118
162
|
end
|
@@ -3,31 +3,40 @@ require_relative '../../../test_helper'
|
|
3
3
|
module Vedeu
|
4
4
|
describe Position do
|
5
5
|
let(:described_class) { Position }
|
6
|
-
let(:
|
6
|
+
let(:described_instance) { described_class.new }
|
7
7
|
|
8
|
-
it {
|
8
|
+
it { described_instance.must_be_instance_of(Position) }
|
9
9
|
|
10
10
|
describe '.set' do
|
11
|
-
subject { described_class.set }
|
11
|
+
let(:subject) { described_class.set }
|
12
12
|
|
13
13
|
it { subject.must_be_instance_of(String) }
|
14
14
|
|
15
15
|
context 'when no coordinates are provided' do
|
16
16
|
it 'returns a position escape sequence' do
|
17
|
-
subject.must_equal(
|
17
|
+
subject.must_equal('')
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'when coordinates are provided' do
|
22
|
+
let(:subject) { described_class.set(y, x) }
|
22
23
|
let(:y) { 12 }
|
23
24
|
let(:x) { 19 }
|
24
25
|
|
25
|
-
subject { described_class.set(y, x) }
|
26
|
-
|
27
26
|
it 'returns a position escape sequence' do
|
28
27
|
subject.must_equal("\e[13;20H")
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
31
|
+
|
32
|
+
describe '.reset' do
|
33
|
+
let(:subject) { described_class.reset }
|
34
|
+
|
35
|
+
it { subject.must_be_instance_of(String) }
|
36
|
+
|
37
|
+
it 'returns a position escape sequence' do
|
38
|
+
subject.must_equal("\e[1;1H")
|
39
|
+
end
|
40
|
+
end
|
32
41
|
end
|
33
42
|
end
|
@@ -4,6 +4,24 @@ module Vedeu
|
|
4
4
|
describe Renderer do
|
5
5
|
let(:described_class) { Renderer }
|
6
6
|
let(:described_instance) { described_class.new(composition) }
|
7
|
-
let(:composition) {}
|
7
|
+
let(:composition) { [] }
|
8
|
+
|
9
|
+
it { described_instance.must_be_instance_of(Renderer) }
|
10
|
+
|
11
|
+
describe '.write' do
|
12
|
+
let(:subject) { described_class.write(composition) }
|
13
|
+
|
14
|
+
it { subject.must_be_instance_of(Array) }
|
15
|
+
|
16
|
+
it { subject.must_equal([]) }
|
17
|
+
|
18
|
+
context 'capturing i/o' do
|
19
|
+
let(:captured) { capture_io { subject }.join }
|
20
|
+
|
21
|
+
it { captured.must_be_instance_of(String) }
|
22
|
+
|
23
|
+
it { captured.must_equal("") }
|
24
|
+
end
|
25
|
+
end
|
8
26
|
end
|
9
27
|
end
|
@@ -5,10 +5,9 @@ module Vedeu
|
|
5
5
|
let(:described_class) { Style }
|
6
6
|
|
7
7
|
describe '.set' do
|
8
|
+
let(:subject) { described_class.set(style) }
|
8
9
|
let(:style) {}
|
9
10
|
|
10
|
-
subject { described_class.set(style) }
|
11
|
-
|
12
11
|
it { subject.must_be_instance_of(String) }
|
13
12
|
|
14
13
|
it { subject.must_equal('') }
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Wordwrap do
|
5
|
+
let(:described_class) { Wordwrap }
|
6
|
+
let(:value) {
|
7
|
+
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' \
|
8
|
+
"Curabitur aliquet turpis id dui condimentum elementum.\n" \
|
9
|
+
'Pellentesque blandit vulputate imperdiet. Quisque ut arcu ' \
|
10
|
+
"dolor. Morbi nec vulputate purus.\n\nQuisque porta feugiat " \
|
11
|
+
'egestas. Aenean ac ipsum varius, lobortis lacus at, mattis ' \
|
12
|
+
"est.\nQuisque viverra facilisis tortor, id convallis metus " \
|
13
|
+
'laoreet quis. Curabitur auctor nunc blandit enim volutpat ' \
|
14
|
+
'hendrerit. Phasellus accumsan tempor iaculis. Ut in semper ' \
|
15
|
+
"massa. Cras quis viverra elit.\n\nInteger vitae mattis est. " \
|
16
|
+
'Cras id nisl porttitor lectus placerat gravida sit amet ' \
|
17
|
+
"quis diam.\n\nDonec mollis, nisi sit amet congue sagittis, " \
|
18
|
+
'sapien magna rhoncus justo, vel molestie metus sapien eget ' \
|
19
|
+
"libero.\n\n\n"
|
20
|
+
}
|
21
|
+
let(:options) { {} }
|
22
|
+
|
23
|
+
describe '#wordwrap' do
|
24
|
+
let(:formatted_value) {
|
25
|
+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " \
|
26
|
+
"Curabitur\naliquet turpis id dui condimentum elementum.\n" \
|
27
|
+
"Pellentesque blandit vulputate imperdiet. Quisque ut arcu " \
|
28
|
+
"dolor.\nMorbi nec vulputate purus.\n\nQuisque porta " \
|
29
|
+
"feugiat egestas. Aenean ac ipsum varius, lobortis\nlacus " \
|
30
|
+
"at, mattis est.\nQuisque viverra facilisis tortor, id " \
|
31
|
+
"convallis metus laoreet quis.\nCurabitur auctor nunc " \
|
32
|
+
"blandit enim volutpat hendrerit. Phasellus\naccumsan " \
|
33
|
+
"tempor iaculis. Ut in semper massa. Cras quis viverra " \
|
34
|
+
"elit.\n\nInteger vitae mattis est. Cras id nisl porttitor " \
|
35
|
+
"lectus placerat\ngravida sit amet quis diam.\n\nDonec " \
|
36
|
+
"mollis, nisi sit amet congue sagittis, sapien magna " \
|
37
|
+
"rhoncus\njusto, vel molestie metus sapien eget libero."
|
38
|
+
}
|
39
|
+
|
40
|
+
subject { described_class.this(value, options) }
|
41
|
+
|
42
|
+
it 'returns formatted text' do
|
43
|
+
subject.must_equal(formatted_value)
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when the content should be pruned' do
|
47
|
+
let(:options) { { width: 70, prune: true } }
|
48
|
+
let(:formatted_value) {
|
49
|
+
'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' \
|
50
|
+
" Curabitur a...\e[0m"
|
51
|
+
}
|
52
|
+
|
53
|
+
it 'returns formatted text' do
|
54
|
+
subject.must_equal(formatted_value)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -8,14 +8,14 @@ module Vedeu
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe Command do
|
11
|
-
let(:described_class)
|
12
|
-
let(:
|
13
|
-
let(:cmd_name)
|
14
|
-
let(:cmd_klass)
|
15
|
-
let(:cmd_args)
|
16
|
-
let(:cmd_options)
|
17
|
-
|
18
|
-
it {
|
11
|
+
let(:described_class) { Command }
|
12
|
+
let(:described_instance) { described_class.new(cmd_name, cmd_klass, cmd_args, cmd_options) }
|
13
|
+
let(:cmd_name) { "dummy" }
|
14
|
+
let(:cmd_klass) { DummyCommand }
|
15
|
+
let(:cmd_args) { [] }
|
16
|
+
let(:cmd_options) { {} }
|
17
|
+
|
18
|
+
it { described_instance.must_be_instance_of(Command) }
|
19
19
|
|
20
20
|
describe '#define' do
|
21
21
|
subject do
|
@@ -11,31 +11,51 @@ module Vedeu
|
|
11
11
|
let(:described_class) { Commands }
|
12
12
|
|
13
13
|
describe '.define' do
|
14
|
-
subject { described_class.define }
|
14
|
+
let(:subject) { described_class.define }
|
15
15
|
|
16
|
-
|
16
|
+
context 'when a block is given' do
|
17
|
+
let(:subject) { described_class.define { :nil } }
|
18
|
+
|
19
|
+
it 'yields the block' do
|
20
|
+
subject.must_be_instance_of(Symbol)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when a block is not given' do
|
25
|
+
it { subject.must_be_instance_of(Module) }
|
26
|
+
end
|
17
27
|
end
|
18
28
|
|
19
29
|
describe '.execute' do
|
20
|
-
subject { described_class.execute }
|
30
|
+
let(:subject) { described_class.execute(command) }
|
31
|
+
let(:command) {}
|
32
|
+
|
33
|
+
context 'when the command does not exist' do
|
34
|
+
it { subject.must_be_instance_of(NilClass) }
|
35
|
+
end
|
21
36
|
|
22
|
-
|
37
|
+
context 'when the command exists' do
|
38
|
+
let(:command) { 'exit' }
|
39
|
+
|
40
|
+
before { Exit.stubs(:dispatch).returns(true) }
|
41
|
+
|
42
|
+
it { subject.must_be_instance_of(TrueClass) }
|
43
|
+
end
|
23
44
|
end
|
24
45
|
|
25
46
|
describe '.list' do
|
26
|
-
subject { described_class.list }
|
47
|
+
let(:subject) { described_class.list }
|
27
48
|
|
28
49
|
it { subject.must_be_instance_of(String) }
|
29
50
|
end
|
30
51
|
|
31
52
|
describe '.add' do
|
53
|
+
let(:subject) { described_class.add(command_name, command_klass, args, options) }
|
32
54
|
let(:command_name) { "some_name" }
|
33
55
|
let(:command_klass) { DummyCommand }
|
34
56
|
let(:args) { [] }
|
35
57
|
let(:options) { {} }
|
36
58
|
|
37
|
-
subject { described_class.add(command_name, command_klass, args, options) }
|
38
|
-
|
39
59
|
it { subject.must_be_instance_of(Hash) }
|
40
60
|
end
|
41
61
|
end
|
@@ -12,23 +12,25 @@ module Vedeu
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '.input' do
|
15
|
-
|
15
|
+
let(:subject) { described_class.input }
|
16
16
|
|
17
|
-
|
17
|
+
before { console.stubs(:gets).returns("test\n") }
|
18
18
|
|
19
19
|
it { subject.must_be_instance_of(String) }
|
20
|
+
|
21
|
+
it { subject.must_equal("test") }
|
20
22
|
end
|
21
23
|
|
22
24
|
describe '.output' do
|
23
|
-
|
25
|
+
let(:subject) { described_class.output }
|
24
26
|
|
25
|
-
|
27
|
+
before { console.stubs(:print).returns("test") }
|
26
28
|
|
27
29
|
it { subject.must_be_instance_of(String) }
|
28
30
|
end
|
29
31
|
|
30
32
|
describe '.width' do
|
31
|
-
subject { described_class.width }
|
33
|
+
let(:subject) { described_class.width }
|
32
34
|
|
33
35
|
it { subject.must_be_instance_of(Fixnum) }
|
34
36
|
|
@@ -38,7 +40,7 @@ module Vedeu
|
|
38
40
|
end
|
39
41
|
|
40
42
|
describe '.height' do
|
41
|
-
subject { described_class.height }
|
43
|
+
let(:subject) { described_class.height }
|
42
44
|
|
43
45
|
it { subject.must_be_instance_of(Fixnum) }
|
44
46
|
|
@@ -48,7 +50,7 @@ module Vedeu
|
|
48
50
|
end
|
49
51
|
|
50
52
|
describe '.size' do
|
51
|
-
subject { described_class.size }
|
53
|
+
let(:subject) { described_class.size }
|
52
54
|
|
53
55
|
it { subject.must_be_instance_of(Array) }
|
54
56
|
|
@@ -58,39 +60,39 @@ module Vedeu
|
|
58
60
|
end
|
59
61
|
|
60
62
|
describe '.open' do
|
61
|
-
subject { described_class.open }
|
63
|
+
let(:subject) { described_class.open }
|
62
64
|
|
63
65
|
it { skip }
|
64
66
|
end
|
65
67
|
|
66
68
|
describe '.close' do
|
67
|
-
subject { described_class.close }
|
69
|
+
let(:subject) { described_class.close }
|
68
70
|
|
69
71
|
it { skip }
|
70
72
|
end
|
71
73
|
|
72
74
|
describe '.cooked' do
|
73
|
-
subject { described_class.cooked }
|
75
|
+
let(:subject) { described_class.cooked }
|
74
76
|
|
75
77
|
it { skip }
|
76
78
|
end
|
77
79
|
|
78
80
|
describe '.raw' do
|
79
|
-
subject { described_class.raw }
|
81
|
+
let(:subject) { described_class.raw }
|
80
82
|
|
81
83
|
it { skip }
|
82
84
|
end
|
83
85
|
|
84
86
|
describe '.console' do
|
85
|
-
subject { described_class.console }
|
87
|
+
let(:subject) { described_class.console }
|
86
88
|
|
87
89
|
it { skip }
|
88
90
|
end
|
89
91
|
|
90
92
|
describe '.clear_screen' do
|
91
|
-
|
93
|
+
let(:subject) { described_class.clear_screen }
|
92
94
|
|
93
|
-
|
95
|
+
before { Esc.stubs(:clear).returns('') }
|
94
96
|
|
95
97
|
it { subject.must_be_instance_of(NilClass) }
|
96
98
|
|
@@ -102,13 +104,14 @@ module Vedeu
|
|
102
104
|
end
|
103
105
|
|
104
106
|
describe '.clear_line' do
|
105
|
-
subject { described_class.clear_line }
|
107
|
+
let(:subject) { described_class.clear_line(index) }
|
108
|
+
let(:index) { 0 }
|
106
109
|
|
107
|
-
it {
|
110
|
+
it { subject.must_be_instance_of(NilClass) }
|
108
111
|
end
|
109
112
|
|
110
113
|
describe '.show_cursor' do
|
111
|
-
subject { described_class.show_cursor }
|
114
|
+
let(:subject) { described_class.show_cursor }
|
112
115
|
|
113
116
|
it { subject.must_be_instance_of(NilClass) }
|
114
117
|
|
@@ -120,7 +123,7 @@ module Vedeu
|
|
120
123
|
end
|
121
124
|
|
122
125
|
describe '.hide_cursor' do
|
123
|
-
subject { described_class.hide_cursor }
|
126
|
+
let(:subject) { described_class.hide_cursor }
|
124
127
|
|
125
128
|
it { subject.must_be_instance_of(NilClass) }
|
126
129
|
|
@@ -132,21 +135,21 @@ module Vedeu
|
|
132
135
|
end
|
133
136
|
|
134
137
|
describe '#initialize' do
|
135
|
-
subject { described_class.new }
|
138
|
+
let(:subject) { described_class.new }
|
136
139
|
|
137
|
-
it {
|
140
|
+
it { subject.must_be_instance_of(Terminal) }
|
138
141
|
end
|
139
142
|
|
140
143
|
describe '#open' do
|
141
|
-
subject { described_class.new.open }
|
144
|
+
let(:subject) { described_class.new.open }
|
142
145
|
|
143
|
-
it {
|
146
|
+
it { subject.must_be_instance_of(NilClass) }
|
144
147
|
end
|
145
148
|
|
146
149
|
describe '#initial_setup!' do
|
147
|
-
subject { described_class.new.initial_setup! }
|
150
|
+
let(:subject) { described_class.new.initial_setup! }
|
148
151
|
|
149
|
-
it {
|
152
|
+
it { subject.must_be_instance_of(NilClass) }
|
150
153
|
end
|
151
154
|
end
|
152
155
|
end
|