vedeu 0.0.3 → 0.0.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/.gitignore +2 -1
- data/Gemfile +0 -1
- data/Guardfile +0 -8
- data/README.md +33 -1
- data/Rakefile +0 -8
- data/bin/vedeu +9 -0
- data/lib/vedeu.rb +23 -6
- data/lib/vedeu/application.rb +47 -0
- data/lib/vedeu/interface/interface.rb +37 -0
- data/lib/vedeu/interface/interfaces.rb +49 -0
- data/lib/vedeu/output/background.rb +23 -0
- data/lib/vedeu/output/base.rb +49 -0
- data/lib/vedeu/output/colour.rb +30 -0
- data/lib/vedeu/output/compositor.rb +60 -0
- data/lib/vedeu/output/directive.rb +34 -0
- data/lib/vedeu/output/esc.rb +37 -0
- data/lib/vedeu/output/foreground.rb +23 -0
- data/lib/vedeu/output/position.rb +22 -0
- data/lib/vedeu/output/style.rb +32 -0
- data/lib/vedeu/output/translator.rb +62 -0
- data/lib/vedeu/process/command.rb +51 -0
- data/lib/vedeu/process/commands.rb +58 -0
- data/lib/vedeu/process/process.rb +31 -0
- data/lib/vedeu/support/terminal.rb +139 -0
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/application_test.rb +18 -0
- data/test/lib/vedeu/interface/interface_test.rb +76 -0
- data/test/lib/vedeu/interface/interfaces_test.rb +63 -0
- data/test/lib/vedeu/output/background_test.rb +10 -0
- data/test/lib/vedeu/output/base_test.rb +10 -0
- data/test/lib/vedeu/output/colour_test.rb +67 -0
- data/test/lib/vedeu/output/compositor_test.rb +106 -0
- data/test/lib/vedeu/output/directive_test.rb +55 -0
- data/test/lib/vedeu/output/esc_test.rb +71 -0
- data/test/lib/vedeu/output/foreground_test.rb +10 -0
- data/test/lib/vedeu/output/position_test.rb +33 -0
- data/test/lib/vedeu/output/style_test.rb +59 -0
- data/test/lib/vedeu/output/translator_test.rb +52 -0
- data/test/lib/vedeu/process/command_test.rb +54 -0
- data/test/lib/vedeu/process/commands_test.rb +62 -0
- data/test/lib/vedeu/process/process_test.rb +11 -0
- data/test/lib/vedeu/support/terminal_test.rb +140 -0
- data/test/lib/vedeu/version_test.rb +9 -0
- data/test/support/test_app/bin/testapp +32 -0
- data/test/test_helper.rb +4 -0
- data/vedeu.gemspec +0 -6
- metadata +60 -99
- data/.rubocop.yml +0 -2
- data/features/.gitkeep +0 -0
- data/lib/vedeu/buffer.rb +0 -106
- data/lib/vedeu/colour.rb +0 -98
- data/lib/vedeu/terminal.rb +0 -25
- data/test/lib/vedeu/buffer_test.rb +0 -114
- data/test/lib/vedeu/colour_test.rb +0 -57
- data/test/lib/vedeu/terminal_test.rb +0 -30
data/lib/vedeu/version.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Application do
|
5
|
+
let(:described_class){ Application }
|
6
|
+
let(:instance) { described_class.new(interfaces, options) }
|
7
|
+
let(:interfaces) {}
|
8
|
+
let(:options) { {} }
|
9
|
+
|
10
|
+
describe '#start' do
|
11
|
+
before { Esc.stubs(:clear).returns('') }
|
12
|
+
|
13
|
+
subject { instance.start }
|
14
|
+
|
15
|
+
it { skip }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Interface do
|
5
|
+
let(:described_class) { Interface }
|
6
|
+
let(:instance) { described_class.new(options) }
|
7
|
+
let(:options) { {} }
|
8
|
+
|
9
|
+
before do
|
10
|
+
Terminal.stubs(:width).returns(80)
|
11
|
+
Terminal.stubs(:height).returns(25)
|
12
|
+
Terminal.stubs(:show_cursor)
|
13
|
+
Terminal.stubs(:hide_cursor)
|
14
|
+
end
|
15
|
+
|
16
|
+
it { instance.must_be_instance_of(Interface) }
|
17
|
+
|
18
|
+
describe '#initial' do
|
19
|
+
subject { instance.initial }
|
20
|
+
|
21
|
+
context 'capturing output' do
|
22
|
+
let(:io) { capture_io { subject }.join }
|
23
|
+
|
24
|
+
it { io.must_be_instance_of(String) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#main' do
|
29
|
+
subject { instance.main }
|
30
|
+
|
31
|
+
it { subject.must_be_instance_of(NilClass) }
|
32
|
+
|
33
|
+
context 'capturing output' do
|
34
|
+
let(:io) { capture_io { subject }.join }
|
35
|
+
|
36
|
+
it { io.must_be_instance_of(String) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#input' do
|
41
|
+
subject { instance.input }
|
42
|
+
|
43
|
+
it { subject.must_be_instance_of(NilClass) }
|
44
|
+
|
45
|
+
context 'capturing output' do
|
46
|
+
let(:io) { capture_io { subject }.join }
|
47
|
+
|
48
|
+
it { io.must_be_instance_of(String) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#output' do
|
53
|
+
subject { instance.output }
|
54
|
+
|
55
|
+
it { subject.must_be_instance_of(NilClass) }
|
56
|
+
|
57
|
+
context 'capturing output' do
|
58
|
+
let(:io) { capture_io { subject }.join }
|
59
|
+
|
60
|
+
it { io.must_be_instance_of(String) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#width' do
|
65
|
+
subject { instance.width }
|
66
|
+
|
67
|
+
it { subject.must_be_instance_of(Fixnum) }
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#height' do
|
71
|
+
subject { instance.height }
|
72
|
+
|
73
|
+
it { subject.must_be_instance_of(Fixnum) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Interfaces do
|
5
|
+
let(:described_class) { Interfaces }
|
6
|
+
let(:instance) { described_class.new }
|
7
|
+
let(:block) {}
|
8
|
+
|
9
|
+
it { instance.must_be_instance_of(Interfaces) }
|
10
|
+
|
11
|
+
describe '.default' do
|
12
|
+
subject { described_class.default }
|
13
|
+
|
14
|
+
it { subject.must_be_instance_of(Interfaces) }
|
15
|
+
|
16
|
+
it 'adds the dummy interface to the interface list' do
|
17
|
+
subject.show.wont_be_empty
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.define' do
|
22
|
+
subject { described_class.define }
|
23
|
+
|
24
|
+
it { subject.must_be_instance_of(Interfaces) }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#add' do
|
28
|
+
let(:interface_name) {}
|
29
|
+
let(:klass) { Class }
|
30
|
+
let(:options) { {} }
|
31
|
+
|
32
|
+
subject { instance.add(interface_name, klass, options) }
|
33
|
+
|
34
|
+
it { subject.must_be_instance_of(Hash) }
|
35
|
+
|
36
|
+
it { subject.wont_be_empty }
|
37
|
+
|
38
|
+
context 'when the interface class does not exist' do
|
39
|
+
before { Object.stubs(:const_defined?).returns(false) }
|
40
|
+
|
41
|
+
it { proc { subject }.must_raise(UndefinedInterface) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#show' do
|
46
|
+
subject { instance.show }
|
47
|
+
|
48
|
+
it { subject.must_be_instance_of(Hash) }
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#initial' do
|
52
|
+
subject { instance.initial }
|
53
|
+
|
54
|
+
it { subject.must_be_instance_of(Array) }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#main' do
|
58
|
+
subject { instance.main }
|
59
|
+
|
60
|
+
it { subject.must_be_instance_of(Array) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Colour do
|
5
|
+
let(:described_class) { Colour }
|
6
|
+
let(:instance) { described_class.new }
|
7
|
+
let(:pair) { [] }
|
8
|
+
|
9
|
+
it { instance.must_be_instance_of(Colour) }
|
10
|
+
|
11
|
+
describe '.set' do
|
12
|
+
subject { described_class.set(pair) }
|
13
|
+
|
14
|
+
it { subject.must_be_instance_of(String) }
|
15
|
+
|
16
|
+
context 'when the foreground and background are specified as symbols' do
|
17
|
+
context 'when both the foreground and background is specified' do
|
18
|
+
let(:pair) { [:red, :yellow] }
|
19
|
+
|
20
|
+
it 'returns the code for red on yellow' do
|
21
|
+
subject.must_equal("\e[38;5;31m\e[48;5;43m")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when a foreground is specified' do
|
26
|
+
let(:pair) { [:blue] }
|
27
|
+
|
28
|
+
it 'returns the code for blue on default' do
|
29
|
+
subject.must_equal("\e[38;5;34m\e[48;5;49m")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when a background is specified' do
|
34
|
+
let(:pair) { [nil, :cyan] }
|
35
|
+
|
36
|
+
it 'returns the code for default with cyan background' do
|
37
|
+
subject.must_equal("\e[38;5;39m\e[48;5;46m")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when an invalid foreground/background is specified' do
|
42
|
+
let(:pair) { [:melon, :raspberry] }
|
43
|
+
|
44
|
+
it 'returns the default code' do
|
45
|
+
subject.must_equal("\e[38;5;39m\e[48;5;49m")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when no foreground/background is specified' do
|
50
|
+
let(:pair) { [] }
|
51
|
+
|
52
|
+
it 'returns the reset code' do
|
53
|
+
subject.must_equal("\e[38;5;39m\e[48;5;49m")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when the foreground and background are specified as strings' do
|
59
|
+
let(:pair) { ['#ff0000', '#0000ff'] }
|
60
|
+
|
61
|
+
it 'returns the default code' do
|
62
|
+
subject.must_equal("\e[38;5;196m\e[48;5;21m")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Compositor do
|
5
|
+
let(:described_class) { Compositor }
|
6
|
+
let(:instance) { described_class.new(rows) }
|
7
|
+
let(:rows) { [[]] }
|
8
|
+
|
9
|
+
before { Terminal.stubs(:output) }
|
10
|
+
|
11
|
+
it { instance.must_be_instance_of(Compositor) }
|
12
|
+
|
13
|
+
describe '.write' do
|
14
|
+
subject { described_class.write(rows) }
|
15
|
+
|
16
|
+
it { subject.must_be_instance_of(String) }
|
17
|
+
|
18
|
+
context 'when empty' do
|
19
|
+
let(:rows) { [] }
|
20
|
+
|
21
|
+
it { subject.must_be_instance_of(NilClass) }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when unstyled' do
|
25
|
+
context 'and a single line' do
|
26
|
+
let(:rows) { [['Some text...']] }
|
27
|
+
|
28
|
+
it { subject.must_equal('Some text...') }
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'and multi-line' do
|
32
|
+
let(:rows) {
|
33
|
+
[
|
34
|
+
['Some text...'],
|
35
|
+
['Some more text...']
|
36
|
+
]
|
37
|
+
}
|
38
|
+
|
39
|
+
it { subject.must_equal("Some text...\nSome more text...") }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when styled' do
|
44
|
+
context 'with colour pair' do
|
45
|
+
context 'and a single line' do
|
46
|
+
let(:rows) {
|
47
|
+
[
|
48
|
+
[[:red, :white], 'Some text...']
|
49
|
+
]
|
50
|
+
}
|
51
|
+
|
52
|
+
it { subject.must_equal("\e[38;5;31m\e[48;5;47mSome text...") }
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'and multi-line' do
|
56
|
+
let(:rows) {
|
57
|
+
[
|
58
|
+
[[:red, :white], 'Some text...'],
|
59
|
+
[[:blue, :yellow], 'Some more text...']
|
60
|
+
]
|
61
|
+
}
|
62
|
+
|
63
|
+
it { subject.must_equal("\e[38;5;31m\e[48;5;47mSome text...\n" \
|
64
|
+
"\e[38;5;34m\e[48;5;43mSome more text...") }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'with a style' do
|
69
|
+
context 'and a single line' do
|
70
|
+
let(:rows) {
|
71
|
+
[
|
72
|
+
[:bold, 'Some text...']
|
73
|
+
]
|
74
|
+
}
|
75
|
+
|
76
|
+
it { subject.must_equal("\e[1mSome text...") }
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'and multi-line' do
|
80
|
+
let(:rows) {
|
81
|
+
[
|
82
|
+
[:inverse, 'Some text...'],
|
83
|
+
[:underline, 'Some more text...']
|
84
|
+
]
|
85
|
+
}
|
86
|
+
|
87
|
+
it { subject.must_equal("\e[7mSome text...\n" \
|
88
|
+
"\e[4mSome more text...") }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with an unknown style' do
|
93
|
+
let(:rows) {
|
94
|
+
[
|
95
|
+
[:unknown, 'Some text...']
|
96
|
+
]
|
97
|
+
}
|
98
|
+
|
99
|
+
it 'renders in the default style' do
|
100
|
+
subject.must_equal("Some text...")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Directive do
|
5
|
+
let(:described_class) { Directive }
|
6
|
+
let(:instance) { described_class.new(directive) }
|
7
|
+
let(:directive) {}
|
8
|
+
|
9
|
+
it { instance.must_be_instance_of(Directive) }
|
10
|
+
|
11
|
+
describe '.enact' do
|
12
|
+
subject { described_class.enact(directive) }
|
13
|
+
|
14
|
+
context 'when the directive is invalid' do
|
15
|
+
it 'raises an exception' do
|
16
|
+
proc { subject }.must_raise(InvalidDirective)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when the directive is valid' do
|
21
|
+
context 'when the directive is a collection' do
|
22
|
+
let(:directive) { [] }
|
23
|
+
|
24
|
+
context 'and the first element is a number' do
|
25
|
+
let(:directive) { [0, 0] }
|
26
|
+
|
27
|
+
before { Position.stubs(:set) }
|
28
|
+
|
29
|
+
it 'must be a position' do
|
30
|
+
skip
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'and the first element is a symbol' do
|
35
|
+
let(:directive) { [:default, :default] }
|
36
|
+
|
37
|
+
before { Colour.stubs(:set) }
|
38
|
+
|
39
|
+
it 'must be a colour' do
|
40
|
+
skip
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when the directive is individual' do
|
46
|
+
let(:directive) { :normal }
|
47
|
+
|
48
|
+
it 'must be a style' do
|
49
|
+
skip
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Esc do
|
5
|
+
let(:described_class) { Esc }
|
6
|
+
|
7
|
+
describe '.bold' do
|
8
|
+
subject { described_class.bold }
|
9
|
+
|
10
|
+
it { subject.must_be_instance_of(String) }
|
11
|
+
|
12
|
+
it { subject.must_equal("\e[1m") }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '.clear' do
|
16
|
+
subject { described_class.clear }
|
17
|
+
|
18
|
+
it { subject.must_be_instance_of(String) }
|
19
|
+
|
20
|
+
it { subject.must_equal("\e[2J") }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '.esc' do
|
24
|
+
subject { described_class.esc }
|
25
|
+
|
26
|
+
it { subject.must_be_instance_of(String) }
|
27
|
+
|
28
|
+
it { subject.must_equal("\e[") }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '.hide_cursor' do
|
32
|
+
subject { described_class.hide_cursor }
|
33
|
+
|
34
|
+
it { subject.must_be_instance_of(String) }
|
35
|
+
|
36
|
+
it { subject.must_equal("\e[?25l") }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '.inverse' do
|
40
|
+
subject { described_class.inverse }
|
41
|
+
|
42
|
+
it { subject.must_be_instance_of(String) }
|
43
|
+
|
44
|
+
it { subject.must_equal("\e[7m") }
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '.reset' do
|
48
|
+
subject { described_class.reset }
|
49
|
+
|
50
|
+
it { subject.must_be_instance_of(String) }
|
51
|
+
|
52
|
+
it { subject.must_equal("\e[0m") }
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '.show_cursor' do
|
56
|
+
subject { described_class.show_cursor }
|
57
|
+
|
58
|
+
it { subject.must_be_instance_of(String) }
|
59
|
+
|
60
|
+
it { subject.must_equal("\e[?25h") }
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '.underline' do
|
64
|
+
subject { described_class.underline }
|
65
|
+
|
66
|
+
it { subject.must_be_instance_of(String) }
|
67
|
+
|
68
|
+
it { subject.must_equal("\e[4m") }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|