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
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Position do
|
5
|
+
let(:described_class) { Position }
|
6
|
+
let(:instance) { described_class.new }
|
7
|
+
|
8
|
+
it { instance.must_be_instance_of(Position) }
|
9
|
+
|
10
|
+
describe '.set' do
|
11
|
+
subject { described_class.set }
|
12
|
+
|
13
|
+
it { subject.must_be_instance_of(String) }
|
14
|
+
|
15
|
+
context 'when no coordinates are provided' do
|
16
|
+
it 'returns a position escape sequence' do
|
17
|
+
subject.must_equal("\e[1;1H")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when coordinates are provided' do
|
22
|
+
let(:y) { 12 }
|
23
|
+
let(:x) { 19 }
|
24
|
+
|
25
|
+
subject { described_class.set(y, x) }
|
26
|
+
|
27
|
+
it 'returns a position escape sequence' do
|
28
|
+
subject.must_equal("\e[13;20H")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Style do
|
5
|
+
let(:described_class) { Style }
|
6
|
+
|
7
|
+
describe '.set' do
|
8
|
+
let(:style) {}
|
9
|
+
|
10
|
+
subject { described_class.set(style) }
|
11
|
+
|
12
|
+
it { subject.must_be_instance_of(String) }
|
13
|
+
|
14
|
+
it { subject.must_equal('') }
|
15
|
+
|
16
|
+
context 'when the style is bold' do
|
17
|
+
let(:style) { :bold }
|
18
|
+
|
19
|
+
it { subject.must_equal("\e[1m") }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when the style is clear' do
|
23
|
+
let(:style) { :clear }
|
24
|
+
|
25
|
+
it { subject.must_equal("\e[2J") }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when the style is hide_cursor' do
|
29
|
+
let(:style) { :hide_cursor }
|
30
|
+
|
31
|
+
it { subject.must_equal("\e[?25l") }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when the style is inverse' do
|
35
|
+
let(:style) { :inverse }
|
36
|
+
|
37
|
+
it { subject.must_equal("\e[7m") }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when the style is reset' do
|
41
|
+
let(:style) { :reset }
|
42
|
+
|
43
|
+
it { subject.must_equal("\e[0m") }
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when the style is show_cursor' do
|
47
|
+
let(:style) { :show_cursor }
|
48
|
+
|
49
|
+
it { subject.must_equal("\e[?25h") }
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when the style is underline' do
|
53
|
+
let(:style) { :underline }
|
54
|
+
|
55
|
+
it { subject.must_equal("\e[4m") }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Translator do
|
5
|
+
let(:described_class) { Translator }
|
6
|
+
let(:instance) { described_class.new(html_colour) }
|
7
|
+
let(:html_colour) {}
|
8
|
+
|
9
|
+
it { instance.must_be_instance_of(Translator) }
|
10
|
+
|
11
|
+
describe '#translate' do
|
12
|
+
{
|
13
|
+
'#ff0000' => 196, # red
|
14
|
+
'#00ff00' => 46, # green
|
15
|
+
'#0000ff' => 21, # blue
|
16
|
+
'#ffffff' => 231, # white
|
17
|
+
'#aadd00' => 148, # lime green
|
18
|
+
'#b94f1c' => 130, # sunset orange
|
19
|
+
}.map do |html_colour, terminal_colour|
|
20
|
+
context 'valid' do
|
21
|
+
it 'translation is performed' do
|
22
|
+
described_class.translate(html_colour).must_be_instance_of(Fixnum)
|
23
|
+
|
24
|
+
described_class.translate(html_colour).must_equal(terminal_colour)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'invalid' do
|
30
|
+
it 'returns nil when not present' do
|
31
|
+
described_class.translate.must_equal(nil)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns nil when the wrong type' do
|
35
|
+
described_class.translate(:wrong_type).must_equal(nil)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns nil when invalid format' do
|
39
|
+
described_class.translate('345678').must_equal(nil)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'returns nil when invalid format' do
|
43
|
+
described_class.translate('#h11111').must_equal(nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns nil when invalid format' do
|
47
|
+
described_class.translate('#1111').must_equal(nil)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
class DummyCommand
|
5
|
+
class << self
|
6
|
+
def dispatch; end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Command do
|
11
|
+
let(:described_class) { Command }
|
12
|
+
let(: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 { instance.must_be_instance_of(Command) }
|
19
|
+
|
20
|
+
describe '#define' do
|
21
|
+
subject do
|
22
|
+
described_class.define(cmd_name, cmd_klass, cmd_args, cmd_options)
|
23
|
+
end
|
24
|
+
|
25
|
+
it { subject.must_be_instance_of(Hash) }
|
26
|
+
|
27
|
+
it { subject.wont_be_empty }
|
28
|
+
|
29
|
+
context "when the command name is empty" do
|
30
|
+
let(:cmd_name) { "" }
|
31
|
+
|
32
|
+
it { proc { subject }.must_raise(InvalidCommand) }
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when the command class is empty" do
|
36
|
+
let(:cmd_klass) { "" }
|
37
|
+
|
38
|
+
it { proc { subject }.must_raise(InvalidCommand) }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when the command class is not defined" do
|
42
|
+
before { Object.stubs(:const_defined?).returns(false) }
|
43
|
+
|
44
|
+
it { proc { subject }.must_raise(InvalidCommand) }
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when the command class doesn't have a .dispatch method" do
|
48
|
+
before { cmd_klass.stubs(:singleton_methods).returns([]) }
|
49
|
+
|
50
|
+
it { proc { subject }.must_raise(InvalidCommand) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
class DummyCommandKlass
|
5
|
+
def self.dispatch; end
|
6
|
+
end
|
7
|
+
|
8
|
+
describe Commands do
|
9
|
+
let(:described_class) { Commands }
|
10
|
+
let(:instance) { described_class.instance }
|
11
|
+
let(:block) {}
|
12
|
+
|
13
|
+
it { instance.must_be_instance_of(Commands) }
|
14
|
+
|
15
|
+
describe '.execute' do
|
16
|
+
subject { described_class.execute }
|
17
|
+
|
18
|
+
it { skip }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.list' do
|
22
|
+
subject { described_class.list }
|
23
|
+
|
24
|
+
it { subject.must_be_instance_of(String) }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#define' do
|
28
|
+
let(:command_name) { "some_name" }
|
29
|
+
let(:command_klass) { DummyCommandKlass }
|
30
|
+
let(:args) { [] }
|
31
|
+
let(:options) { {} }
|
32
|
+
|
33
|
+
subject { instance.define(command_name, command_klass, args, options) }
|
34
|
+
|
35
|
+
it { subject.must_be_instance_of(Hash) }
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#execute' do
|
39
|
+
subject { instance.execute }
|
40
|
+
|
41
|
+
it { skip }
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#list' do
|
45
|
+
subject { instance.list }
|
46
|
+
|
47
|
+
it { subject.must_be_instance_of(String) }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe Exit do
|
52
|
+
let(:described_class) { Exit }
|
53
|
+
|
54
|
+
describe '.dispatch' do
|
55
|
+
subject { described_class.dispatch }
|
56
|
+
|
57
|
+
it { subject.must_be_instance_of(Symbol) }
|
58
|
+
|
59
|
+
it { subject.must_equal(:stop) }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Terminal do
|
5
|
+
let(:described_class) { Terminal }
|
6
|
+
let(:console) { stub }
|
7
|
+
|
8
|
+
before do
|
9
|
+
IO.stubs(:console).returns(console)
|
10
|
+
console.stubs(:winsize).returns([25, 80])
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '.input' do
|
14
|
+
before { console.stubs(:gets).returns("test") }
|
15
|
+
|
16
|
+
subject { described_class.input }
|
17
|
+
|
18
|
+
it { subject.must_be_instance_of(String) }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.output' do
|
22
|
+
before { console.stubs(:puts).returns("test") }
|
23
|
+
|
24
|
+
subject { described_class.output }
|
25
|
+
|
26
|
+
it { subject.must_be_instance_of(String) }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.width' do
|
30
|
+
subject { described_class.width }
|
31
|
+
|
32
|
+
it { subject.must_be_instance_of(Fixnum) }
|
33
|
+
|
34
|
+
it 'returns the width of the terminal' do
|
35
|
+
subject.must_equal(80)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '.height' do
|
40
|
+
subject { described_class.height }
|
41
|
+
|
42
|
+
it { subject.must_be_instance_of(Fixnum) }
|
43
|
+
|
44
|
+
it 'returns the height of the terminal' do
|
45
|
+
subject.must_equal(25)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '.size' do
|
50
|
+
subject { described_class.size }
|
51
|
+
|
52
|
+
it { subject.must_be_instance_of(Array) }
|
53
|
+
|
54
|
+
it 'returns the width and height of the terminal' do
|
55
|
+
subject.must_equal([25, 80])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '.open' do
|
60
|
+
subject { described_class.open }
|
61
|
+
|
62
|
+
it { skip }
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '.close' do
|
66
|
+
subject { described_class.close }
|
67
|
+
|
68
|
+
it { skip }
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '.cooked' do
|
72
|
+
subject { described_class.cooked }
|
73
|
+
|
74
|
+
it { skip }
|
75
|
+
end
|
76
|
+
|
77
|
+
describe '.raw' do
|
78
|
+
subject { described_class.raw }
|
79
|
+
|
80
|
+
it { skip }
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '.console' do
|
84
|
+
subject { described_class.console }
|
85
|
+
|
86
|
+
it { skip }
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '.clear_screen' do
|
90
|
+
before do
|
91
|
+
Esc.stubs(:clear).returns('')
|
92
|
+
console.stubs(:puts)
|
93
|
+
end
|
94
|
+
|
95
|
+
subject { described_class.clear_screen }
|
96
|
+
|
97
|
+
it { subject.must_be_instance_of(NilClass) }
|
98
|
+
|
99
|
+
context 'capturing output' do
|
100
|
+
let(:io) { capture_io { subject }.join }
|
101
|
+
|
102
|
+
it { io.must_be_instance_of(String) }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe '.show_cursor' do
|
107
|
+
before { console.stubs(:puts) }
|
108
|
+
|
109
|
+
subject { described_class.show_cursor }
|
110
|
+
|
111
|
+
it { subject.must_be_instance_of(NilClass) }
|
112
|
+
|
113
|
+
context 'capturing output' do
|
114
|
+
let(:io) { capture_io { subject }.join }
|
115
|
+
|
116
|
+
it { io.must_be_instance_of(String) }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe '.hide_cursor' do
|
121
|
+
before { console.stubs(:puts) }
|
122
|
+
|
123
|
+
subject { described_class.hide_cursor }
|
124
|
+
|
125
|
+
it { subject.must_be_instance_of(NilClass) }
|
126
|
+
|
127
|
+
context 'capturing output' do
|
128
|
+
let(:io) { capture_io { subject }.join }
|
129
|
+
|
130
|
+
it { io.must_be_instance_of(String) }
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe '#initial_setup!' do
|
135
|
+
subject { described_class.new.initial_setup! }
|
136
|
+
|
137
|
+
it { skip }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
-> { its -> { a } }
|
4
|
+
trap('INT') { exit! }
|
5
|
+
|
6
|
+
require_relative '../../../../lib/vedeu'
|
7
|
+
|
8
|
+
# define an interface
|
9
|
+
# Vedeu::Interfaces.define do |interface|
|
10
|
+
# interface.add("", ...)
|
11
|
+
# end
|
12
|
+
|
13
|
+
class Fake
|
14
|
+
def self.dispatch
|
15
|
+
puts "Fake dispatched..."
|
16
|
+
[
|
17
|
+
[[:white, :red], "Fake executed...", :reset],
|
18
|
+
[[:white, :green], "Test executed...", :reset],
|
19
|
+
]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# use default interface
|
24
|
+
Vedeu::Interfaces.default
|
25
|
+
|
26
|
+
# define some commands
|
27
|
+
Vedeu::Commands.define do |command|
|
28
|
+
command.add("test", Fake)
|
29
|
+
end
|
30
|
+
|
31
|
+
# create main loop
|
32
|
+
Vedeu::Application.start
|