vedeu 0.0.16 → 0.0.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +44 -36
- data/lib/vedeu.rb +2 -0
- data/lib/vedeu/output/background.rb +1 -1
- data/lib/vedeu/output/buffer.rb +96 -0
- data/lib/vedeu/output/compositor.rb +5 -0
- data/lib/vedeu/output/cursor.rb +57 -0
- data/lib/vedeu/output/esc.rb +15 -8
- data/lib/vedeu/output/foreground.rb +1 -1
- data/lib/vedeu/output/style.rb +2 -2
- data/lib/vedeu/repository/interface.rb +8 -0
- data/lib/vedeu/repository/interface_repository.rb +4 -0
- data/lib/vedeu/support/terminal.rb +2 -2
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/output/background_test.rb +2 -2
- data/test/lib/vedeu/output/buffer_test.rb +167 -0
- data/test/lib/vedeu/output/colour_test.rb +5 -5
- data/test/lib/vedeu/output/cursor_test.rb +187 -0
- data/test/lib/vedeu/output/directive_test.rb +1 -1
- data/test/lib/vedeu/output/esc_test.rb +24 -12
- data/test/lib/vedeu/output/foreground_test.rb +2 -2
- data/test/lib/vedeu/repository/interface_repository_test.rb +8 -0
- data/test/lib/vedeu/repository/interface_test.rb +20 -1
- data/test/lib/vedeu/support/terminal_test.rb +24 -2
- data/test/support/colours.rb +8 -0
- data/test/test_helper.rb +0 -1
- data/vedeu.gemspec +1 -2
- metadata +12 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 466d28a16f573a911f2e5c83cfd109dcb261399e
|
4
|
+
data.tar.gz: 701bcb2687c4b2d80562c8be9e44e3c3e1c16088
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a38d99aa14a7b147c493571f01b0c699f122d50cc94b2e1cacb365a0159109f4688ca2b200ed349d89b74edac751e043b7e5a3b195cbd0961fd457c0ba541acc
|
7
|
+
data.tar.gz: 6592f6616ddaa92c8e004bfab81a77e673838a69e1614244f868d93c26e890685adf265c27cf7b5e2f4d14fb1cc512b697181a10d45977d513363fb5627871d0
|
data/README.md
CHANGED
@@ -33,56 +33,60 @@ TODO: Write detailed documentation
|
|
33
33
|
| |
|
34
34
|
| |-- Output
|
35
35
|
| |-- Compositor
|
36
|
-
|
|
36
|
+
| |
|
37
|
+
| |-- Directive
|
38
|
+
| | |-- Colour
|
39
|
+
| | | |-- Background < Base
|
40
|
+
| | | |-- Foreground < Base
|
41
|
+
| | |
|
42
|
+
| | |-- Position
|
43
|
+
| | | |-- Esc
|
44
|
+
| | |
|
45
|
+
| | |-- Style
|
46
|
+
| | | |-- Cursor
|
47
|
+
| | | |-- Esc
|
48
|
+
| | |
|
49
|
+
| | |-- Wordwrap
|
50
|
+
| |
|
51
|
+
| |-- InterfaceRepository
|
52
|
+
| |-- Position
|
53
|
+
| | |-- Esc
|
54
|
+
| |
|
55
|
+
| |-- Renderer
|
56
|
+
| |-- Terminal
|
57
|
+
| |-- Queue
|
37
58
|
|
|
38
59
|
|-- InterfaceRepository
|
39
60
|
|-- Terminal
|
40
61
|
|
41
62
|
Base
|
42
|
-
|-- Translator
|
43
63
|
|-- Esc
|
64
|
+
|-- Translator
|
65
|
+
|
66
|
+
Command
|
67
|
+
|-- CommandRepository
|
68
|
+
|
69
|
+
Exit
|
44
70
|
|
45
71
|
Interface
|
46
|
-
|--
|
47
|
-
| |--
|
48
|
-
|
|
49
|
-
| |
|
50
|
-
| |-- Exit
|
51
|
-
|
|
52
|
-
|-- Compositor
|
53
|
-
| |-- Directive
|
54
|
-
| | |-- Colour
|
55
|
-
| | | |-- Foreground < Base
|
56
|
-
| | | |-- Background < Base
|
57
|
-
| | |
|
58
|
-
| | |-- Position
|
59
|
-
| | | |-- Esc
|
60
|
-
| | |
|
61
|
-
| | |-- Style
|
62
|
-
| | |-- Esc
|
63
|
-
| |
|
64
|
-
| |-- InterfaceRepository
|
65
|
-
| |-- Position
|
66
|
-
| | |-- Esc
|
67
|
-
| |
|
68
|
-
| |-- Renderer
|
69
|
-
| |-- Terminal
|
72
|
+
|-- Colour
|
73
|
+
| |-- Background < Base
|
74
|
+
| |-- Foreground < Base
|
70
75
|
|
|
71
76
|
|-- Geometry
|
72
77
|
| |-- Terminal
|
73
78
|
|
|
74
|
-
|-- Input
|
75
79
|
|-- InterfaceRepository
|
76
|
-
|
77
|
-
|
80
|
+
|
81
|
+
Repository
|
82
|
+
|-- Storage
|
78
83
|
|
79
84
|
Terminal
|
85
|
+
|-- Cursor
|
80
86
|
|-- Esc
|
81
87
|
|-- Position
|
82
88
|
|-- Esc
|
83
89
|
|
84
|
-
Wordwrap
|
85
|
-
|
86
90
|
### On Interfaces
|
87
91
|
|
88
92
|
When we create the interface we define it's width, height, and origin (y, x).
|
@@ -108,7 +112,7 @@ Diagrams were produced using the Railroad Diagram Generator at `http://bottlecap
|
|
108
112
|
include Vedeu
|
109
113
|
|
110
114
|
interface 'status', { y: 1, x: 1, width: :auto, height: 1 }
|
111
|
-
interface 'main', { y: 2, x: 1, width: :auto, height: :auto }
|
115
|
+
interface 'main', { y: 2, x: 1, width: :auto, height: :auto, fg: :red, bg: :black }
|
112
116
|
|
113
117
|
command 'exit', Vedeu::Exit.dispatch, { keyword: "exit", keypress: "q" }
|
114
118
|
command 'help', MyApp.help, { keyword: "help", keypress: "h" }
|
@@ -117,7 +121,11 @@ Diagrams were produced using the Railroad Diagram Generator at `http://bottlecap
|
|
117
121
|
## Contributing
|
118
122
|
|
119
123
|
1. Fork it ( http://github.com/<my-github-username>/vedeu/fork )
|
120
|
-
2.
|
121
|
-
3.
|
122
|
-
4.
|
123
|
-
5. Create
|
124
|
+
2. Clone it
|
125
|
+
3. `bundle`
|
126
|
+
4. `rake` or `bundle exec guard`
|
127
|
+
5. Create your feature branch (`git checkout -b my-new-feature`)
|
128
|
+
6. Write some tests, write some code, have some fun
|
129
|
+
7. Commit your changes (`git commit -am 'Add some feature'`)
|
130
|
+
8. Push to the branch (`git push origin my-new-feature`)
|
131
|
+
9. Create new Pull Request
|
data/lib/vedeu.rb
CHANGED
@@ -6,7 +6,9 @@ require_relative 'vedeu/support/terminal'
|
|
6
6
|
|
7
7
|
require_relative 'vedeu/output/base'
|
8
8
|
require_relative 'vedeu/output/background'
|
9
|
+
require_relative 'vedeu/output/buffer'
|
9
10
|
require_relative 'vedeu/output/compositor'
|
11
|
+
require_relative 'vedeu/output/cursor'
|
10
12
|
require_relative 'vedeu/output/directive'
|
11
13
|
require_relative 'vedeu/output/foreground'
|
12
14
|
require_relative 'vedeu/output/geometry'
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Vedeu
|
2
|
+
class OutOfRangeError < StandardError; end
|
3
|
+
|
4
|
+
class Buffer
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
attr_accessor :buffer
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
@options = options
|
11
|
+
@buffer = Array.new(height) { Array.new(width) { :cell } }
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
each { |row| puts row.inspect }
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def each(&block)
|
20
|
+
buffer.each(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def cell(y, x)
|
24
|
+
raise OutOfRangeError if invalid_reference?(y, x)
|
25
|
+
buffer[y][x]
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_cell(y, x, v = '')
|
29
|
+
raise OutOfRangeError if invalid_reference?(y, x)
|
30
|
+
buffer[y][x] = v
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_row(y = 0, v = '')
|
34
|
+
if v.is_a?(String)
|
35
|
+
v.chars.each_with_index { |c, i| set_cell(y, i, c) }
|
36
|
+
else
|
37
|
+
v.each_with_index { |el, i| set_cell(y, i, el) }
|
38
|
+
end
|
39
|
+
row(y)
|
40
|
+
end
|
41
|
+
|
42
|
+
def row(y = 0)
|
43
|
+
buffer[y]
|
44
|
+
end
|
45
|
+
alias_method :y, :row
|
46
|
+
|
47
|
+
def set_column(x = 0, v = '')
|
48
|
+
if v.is_a?(String)
|
49
|
+
v.chars.each_with_index { |c, i| set_cell(i, x, c) }
|
50
|
+
else
|
51
|
+
v.each_with_index { |el, i| set_cell(i, x, el) }
|
52
|
+
end
|
53
|
+
column(x)
|
54
|
+
end
|
55
|
+
|
56
|
+
def column(x = 0)
|
57
|
+
buffer.inject([]) { |a, e| a << e[x] }
|
58
|
+
end
|
59
|
+
alias_method :x, :column
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def invalid_reference?(y, x)
|
64
|
+
invalid_line?(y) || invalid_column?(x)
|
65
|
+
end
|
66
|
+
|
67
|
+
def invalid_line?(y)
|
68
|
+
y < 0 || y > (height - 1)
|
69
|
+
end
|
70
|
+
|
71
|
+
def invalid_column?(x)
|
72
|
+
x < 0 || x > (width - 1)
|
73
|
+
end
|
74
|
+
|
75
|
+
def width
|
76
|
+
options.fetch(:width)
|
77
|
+
end
|
78
|
+
alias_method :columns, :width
|
79
|
+
|
80
|
+
def height
|
81
|
+
options.fetch(:height)
|
82
|
+
end
|
83
|
+
alias_method :lines, :height
|
84
|
+
|
85
|
+
def options
|
86
|
+
defaults.merge!(@options)
|
87
|
+
end
|
88
|
+
|
89
|
+
def defaults
|
90
|
+
{
|
91
|
+
width: Terminal.width,
|
92
|
+
height: Terminal.height
|
93
|
+
}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -47,6 +47,7 @@ module Vedeu
|
|
47
47
|
end
|
48
48
|
|
49
49
|
container << colour.reset
|
50
|
+
container << cursor
|
50
51
|
|
51
52
|
container
|
52
53
|
end
|
@@ -75,6 +76,10 @@ module Vedeu
|
|
75
76
|
interface.colour
|
76
77
|
end
|
77
78
|
|
79
|
+
def cursor
|
80
|
+
interface.cursor
|
81
|
+
end
|
82
|
+
|
78
83
|
def output
|
79
84
|
return @output.split if @output.is_a?(String)
|
80
85
|
@output
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Vedeu
|
2
|
+
class Cursor
|
3
|
+
class << self
|
4
|
+
def show
|
5
|
+
[esc, '?25h'].join
|
6
|
+
end
|
7
|
+
|
8
|
+
def hide
|
9
|
+
[esc, '?25l'].join
|
10
|
+
end
|
11
|
+
|
12
|
+
def home
|
13
|
+
[esc, 'H'].join
|
14
|
+
end
|
15
|
+
|
16
|
+
def up(count = 1)
|
17
|
+
[esc, "#{count || 1}", 'A'].join
|
18
|
+
end
|
19
|
+
|
20
|
+
def down(count = 1)
|
21
|
+
[esc, "#{count || 1}", 'B'].join
|
22
|
+
end
|
23
|
+
|
24
|
+
def right(count = 1)
|
25
|
+
[esc, "#{count || 1}", 'C'].join
|
26
|
+
end
|
27
|
+
alias_method :forward, :right
|
28
|
+
|
29
|
+
def left(count = 1)
|
30
|
+
[esc, "#{count || 1}", 'D'].join
|
31
|
+
end
|
32
|
+
alias_method :backward, :left
|
33
|
+
|
34
|
+
def save
|
35
|
+
[esc, 's'].join
|
36
|
+
end
|
37
|
+
|
38
|
+
def unsave
|
39
|
+
[esc, 'u'].join
|
40
|
+
end
|
41
|
+
alias_method :restore, :unsave
|
42
|
+
|
43
|
+
def save_all
|
44
|
+
[esc, '7'].join
|
45
|
+
end
|
46
|
+
|
47
|
+
def unsave_all
|
48
|
+
[esc, '8'].join
|
49
|
+
end
|
50
|
+
alias_method :restore_all, :unsave_all
|
51
|
+
|
52
|
+
def esc
|
53
|
+
[27.chr, '['].join
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/vedeu/output/esc.rb
CHANGED
@@ -1,32 +1,39 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class Esc
|
3
3
|
class << self
|
4
|
+
def blink
|
5
|
+
[esc, '5m'].join
|
6
|
+
end
|
7
|
+
|
4
8
|
def bold
|
5
9
|
[esc, '1m'].join
|
6
10
|
end
|
11
|
+
alias_method :bright, :bold
|
7
12
|
|
8
13
|
def clear
|
9
14
|
[esc, '2J'].join
|
10
15
|
end
|
11
16
|
|
12
|
-
def
|
13
|
-
[
|
17
|
+
def clear_line
|
18
|
+
[esc, '2K'].join
|
14
19
|
end
|
15
20
|
|
16
|
-
def
|
17
|
-
[
|
21
|
+
def esc
|
22
|
+
[27.chr, '['].join
|
18
23
|
end
|
19
24
|
|
20
25
|
def inverse
|
21
26
|
[esc, '7m'].join
|
22
27
|
end
|
28
|
+
alias_method :reverse, :inverse
|
23
29
|
|
24
|
-
def
|
25
|
-
[esc, '
|
30
|
+
def normal
|
31
|
+
[esc, '2m'].join
|
26
32
|
end
|
33
|
+
alias_method :dim, :normal
|
27
34
|
|
28
|
-
def
|
29
|
-
[esc, '
|
35
|
+
def reset
|
36
|
+
[esc, '0m'].join
|
30
37
|
end
|
31
38
|
|
32
39
|
def underline
|
data/lib/vedeu/output/style.rb
CHANGED
@@ -14,11 +14,11 @@ module Vedeu
|
|
14
14
|
case style
|
15
15
|
when :bold then Esc.bold
|
16
16
|
when :clear then Esc.clear
|
17
|
-
when :hide_cursor then
|
17
|
+
when :hide_cursor then Cursor.hide
|
18
18
|
when :inverse then Esc.inverse
|
19
19
|
when :reset then Esc.reset
|
20
20
|
when :normal then Esc.reset
|
21
|
-
when :show_cursor then
|
21
|
+
when :show_cursor then Cursor.show
|
22
22
|
when :underline then Esc.underline
|
23
23
|
else
|
24
24
|
''
|
@@ -13,6 +13,7 @@ module Vedeu
|
|
13
13
|
|
14
14
|
@active = false
|
15
15
|
@name = attributes[:name]
|
16
|
+
@cursor = attributes.fetch(:cursor, true)
|
16
17
|
end
|
17
18
|
|
18
19
|
def create
|
@@ -27,6 +28,9 @@ module Vedeu
|
|
27
28
|
Compositor.arrange([Array.new(geometry.height) { '' }], name)
|
28
29
|
end
|
29
30
|
|
31
|
+
def update
|
32
|
+
end
|
33
|
+
|
30
34
|
def geometry
|
31
35
|
@geometry ||= Geometry.new(attributes)
|
32
36
|
end
|
@@ -35,6 +39,10 @@ module Vedeu
|
|
35
39
|
@colour ||= Colour.new([foreground, background])
|
36
40
|
end
|
37
41
|
|
42
|
+
def cursor
|
43
|
+
@cursor ? Cursor.show : Cursor.hide
|
44
|
+
end
|
45
|
+
|
38
46
|
private
|
39
47
|
|
40
48
|
def foreground
|
data/lib/vedeu/version.rb
CHANGED
@@ -35,7 +35,7 @@ module Vedeu
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'returns an escape sequence' do
|
38
|
-
subject.must_equal("\e[48;
|
38
|
+
subject.must_equal("\e[48;2;41m")
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -59,7 +59,7 @@ module Vedeu
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'returns an escape sequence' do
|
62
|
-
subject.must_equal("\e[48;
|
62
|
+
subject.must_equal("\e[48;2;49m")
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Buffer do
|
5
|
+
let(:described_class) { Buffer }
|
6
|
+
let(:described_instance) { described_class.new(options) }
|
7
|
+
let(:options) { { width: 4, height: 3 } }
|
8
|
+
let(:subject) { described_instance }
|
9
|
+
|
10
|
+
it 'returns a Buffer instance' do
|
11
|
+
subject.must_be_instance_of(Buffer)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets an instance variable' do
|
15
|
+
subject.instance_variable_get("@options").must_equal(options)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#to_s' do
|
19
|
+
let(:subject) { capture_io { described_instance.to_s }.join }
|
20
|
+
|
21
|
+
# real method should return NilClass; want to capture io rather
|
22
|
+
# than have it spew into minitest output in terminal; see test
|
23
|
+
# below.
|
24
|
+
# it { subject.must_be_instance_of(NilClass) }
|
25
|
+
|
26
|
+
it "outputs the content of the buffer" do
|
27
|
+
subject.must_equal("[:cell, :cell, :cell, :cell]\n" \
|
28
|
+
"[:cell, :cell, :cell, :cell]\n" \
|
29
|
+
"[:cell, :cell, :cell, :cell]\n")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#each' do
|
34
|
+
let(:subject) { described_instance.each }
|
35
|
+
|
36
|
+
it 'returns an Enumerator' do
|
37
|
+
subject.must_be_instance_of(Enumerator)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#cell' do
|
42
|
+
let(:subject) { described_instance.cell(y, x) }
|
43
|
+
let(:y) { 1 }
|
44
|
+
let(:x) { 2 }
|
45
|
+
|
46
|
+
it 'returns a Symbol' do
|
47
|
+
subject.must_be_instance_of(Symbol)
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when the reference is in range' do
|
51
|
+
it 'returns the value at that location' do
|
52
|
+
subject.must_equal(:cell)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when the reference is out of range' do
|
57
|
+
let(:y) { 4 }
|
58
|
+
|
59
|
+
it 'raises an exception' do
|
60
|
+
proc { subject }.must_raise(OutOfRangeError)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#set_cell' do
|
66
|
+
let(:subject) { described_instance.set_cell(y, x, v) }
|
67
|
+
let(:y) { 1 }
|
68
|
+
let(:x) { 2 }
|
69
|
+
let(:v) { '*' }
|
70
|
+
|
71
|
+
it 'returns a String' do
|
72
|
+
subject.must_be_instance_of(String)
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when the reference is in range' do
|
76
|
+
it 'returns the value at that location' do
|
77
|
+
subject.must_equal('*')
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'when the reference is out of range' do
|
82
|
+
let(:y) { 3 }
|
83
|
+
let(:x) { 4 }
|
84
|
+
|
85
|
+
it 'raises an exception' do
|
86
|
+
proc { subject }.must_raise(OutOfRangeError)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#set_row' do
|
92
|
+
let(:subject) { described_instance.set_row(y, v) }
|
93
|
+
let(:y) { 1 }
|
94
|
+
let(:v) { '****' }
|
95
|
+
|
96
|
+
it 'returns an Array' do
|
97
|
+
subject.must_be_instance_of(Array)
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'when the value is a String' do
|
101
|
+
let(:v) { '****' }
|
102
|
+
|
103
|
+
it 'sets the row' do
|
104
|
+
subject.must_equal(['*', '*', '*', '*'])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when the value is an Array' do
|
109
|
+
let(:v) { ['*','*','*','*'] }
|
110
|
+
|
111
|
+
it 'sets the row' do
|
112
|
+
subject.must_equal(['*', '*', '*', '*'])
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe '#row' do
|
118
|
+
let(:subject) { described_instance.row }
|
119
|
+
|
120
|
+
it 'returns an Array' do
|
121
|
+
subject.must_be_instance_of(Array)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'returns the content of the row at position y' do
|
125
|
+
subject.must_equal([:cell, :cell, :cell, :cell])
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '#set_column' do
|
130
|
+
let(:subject) { described_instance.set_column(x, v) }
|
131
|
+
let(:x) { 2 }
|
132
|
+
let(:v) { '***' }
|
133
|
+
|
134
|
+
it 'returns an Array' do
|
135
|
+
subject.must_be_instance_of(Array)
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'when the value is a String' do
|
139
|
+
let(:v) { '***' }
|
140
|
+
|
141
|
+
it 'sets the row' do
|
142
|
+
subject.must_equal(['*', '*', '*'])
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'when the value is an Array' do
|
147
|
+
let(:v) { ['*', '*', '*'] }
|
148
|
+
|
149
|
+
it 'sets the row' do
|
150
|
+
subject.must_equal(['*', '*', '*'])
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe '#column' do
|
156
|
+
let(:subject) { described_instance.column }
|
157
|
+
|
158
|
+
it 'returns an Array' do
|
159
|
+
subject.must_be_instance_of(Array)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'returns the content of the column at position x' do
|
163
|
+
subject.must_equal([:cell, :cell, :cell])
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -27,7 +27,7 @@ module Vedeu
|
|
27
27
|
let(:pair) { [:red, :yellow] }
|
28
28
|
|
29
29
|
it 'returns the code for red on yellow' do
|
30
|
-
subject.must_equal("\e[38;
|
30
|
+
subject.must_equal("\e[38;2;31m\e[48;2;43m")
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -35,7 +35,7 @@ module Vedeu
|
|
35
35
|
let(:pair) { [:blue] }
|
36
36
|
|
37
37
|
it 'returns the code for blue on default' do
|
38
|
-
subject.must_equal("\e[38;
|
38
|
+
subject.must_equal("\e[38;2;34m\e[48;5;49m")
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -43,7 +43,7 @@ module Vedeu
|
|
43
43
|
let(:pair) { [nil, :cyan] }
|
44
44
|
|
45
45
|
it 'returns the code for default with cyan background' do
|
46
|
-
subject.must_equal("\e[38;5;39m\e[48;
|
46
|
+
subject.must_equal("\e[38;5;39m\e[48;2;46m")
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -51,7 +51,7 @@ module Vedeu
|
|
51
51
|
let(:pair) { [:melon, :raspberry] }
|
52
52
|
|
53
53
|
it 'returns the default code' do
|
54
|
-
subject.must_equal("\e[38;
|
54
|
+
subject.must_equal("\e[38;2;39m\e[48;2;49m")
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -81,7 +81,7 @@ module Vedeu
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'returns an escape sequence' do
|
84
|
-
subject.must_equal("\e[38;
|
84
|
+
subject.must_equal("\e[38;2;39m\e[48;2;49m")
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -0,0 +1,187 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Cursor do
|
5
|
+
let(:described_class) { Cursor }
|
6
|
+
|
7
|
+
describe '.hide' do
|
8
|
+
let(:subject) { described_class.hide }
|
9
|
+
|
10
|
+
it 'returns a String' do
|
11
|
+
subject.must_be_instance_of(String)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns an escape sequence' do
|
15
|
+
subject.must_equal("\e[?25l")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.show' do
|
20
|
+
let(:subject) { described_class.show }
|
21
|
+
|
22
|
+
it 'returns a String' do
|
23
|
+
subject.must_be_instance_of(String)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'returns an escape sequence' do
|
27
|
+
subject.must_equal("\e[?25h")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '.home' do
|
32
|
+
let(:subject) { described_class.home }
|
33
|
+
|
34
|
+
it 'returns a String' do
|
35
|
+
subject.must_be_instance_of(String)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns an escape sequence' do
|
39
|
+
subject.must_equal("\e[H")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '.up' do
|
44
|
+
let(:subject) { described_class.up(count) }
|
45
|
+
let(:count) {}
|
46
|
+
|
47
|
+
it 'returns a String' do
|
48
|
+
subject.must_be_instance_of(String)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns an escape sequence' do
|
52
|
+
subject.must_equal("\e[1A")
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'with a count' do
|
56
|
+
let(:count) { 3 }
|
57
|
+
|
58
|
+
it 'returns an escape sequence' do
|
59
|
+
subject.must_equal("\e[3A")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '.down' do
|
65
|
+
let(:subject) { described_class.down(count) }
|
66
|
+
let(:count) {}
|
67
|
+
|
68
|
+
it 'returns a String' do
|
69
|
+
subject.must_be_instance_of(String)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'returns an escape sequence' do
|
73
|
+
subject.must_equal("\e[1B")
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'with a count' do
|
77
|
+
let(:count) { 3 }
|
78
|
+
|
79
|
+
it 'returns an escape sequence' do
|
80
|
+
subject.must_equal("\e[3B")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '.right' do
|
86
|
+
let(:subject) { described_class.right(count) }
|
87
|
+
let(:count) {}
|
88
|
+
|
89
|
+
it 'returns a String' do
|
90
|
+
subject.must_be_instance_of(String)
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'returns an escape sequence' do
|
94
|
+
subject.must_equal("\e[1C")
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'with a count' do
|
98
|
+
let(:count) { 3 }
|
99
|
+
|
100
|
+
it 'returns an escape sequence' do
|
101
|
+
subject.must_equal("\e[3C")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe '.left' do
|
107
|
+
let(:subject) { described_class.left(count) }
|
108
|
+
let(:count) {}
|
109
|
+
|
110
|
+
it 'returns a String' do
|
111
|
+
subject.must_be_instance_of(String)
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'returns an escape sequence' do
|
115
|
+
subject.must_equal("\e[1D")
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'with a count' do
|
119
|
+
let(:count) { 3 }
|
120
|
+
|
121
|
+
it 'returns an escape sequence' do
|
122
|
+
subject.must_equal("\e[3D")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe '.save' do
|
128
|
+
let(:subject) { described_class.save }
|
129
|
+
|
130
|
+
it 'returns a String' do
|
131
|
+
subject.must_be_instance_of(String)
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'returns an escape sequence' do
|
135
|
+
subject.must_equal("\e[s")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe '.unsave' do
|
140
|
+
let(:subject) { described_class.unsave }
|
141
|
+
|
142
|
+
it 'returns a String' do
|
143
|
+
subject.must_be_instance_of(String)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'returns an escape sequence' do
|
147
|
+
subject.must_equal("\e[u")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '.save_all' do
|
152
|
+
let(:subject) { described_class.save_all }
|
153
|
+
|
154
|
+
it 'returns a String' do
|
155
|
+
subject.must_be_instance_of(String)
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'returns an escape sequence' do
|
159
|
+
subject.must_equal("\e[7")
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '.unsave_all' do
|
164
|
+
let(:subject) { described_class.unsave_all }
|
165
|
+
|
166
|
+
it 'returns a String' do
|
167
|
+
subject.must_be_instance_of(String)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'returns an escape sequence' do
|
171
|
+
subject.must_equal("\e[8")
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe '.esc' do
|
176
|
+
let(:subject) { described_class.esc }
|
177
|
+
|
178
|
+
it 'returns a String' do
|
179
|
+
subject.must_be_instance_of(String)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'returns an escape sequence' do
|
183
|
+
subject.must_equal("\e[")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
@@ -4,6 +4,18 @@ module Vedeu
|
|
4
4
|
describe Esc do
|
5
5
|
let(:described_class) { Esc }
|
6
6
|
|
7
|
+
describe '.blink' do
|
8
|
+
let(:subject) { described_class.blink }
|
9
|
+
|
10
|
+
it 'returns a String' do
|
11
|
+
subject.must_be_instance_of(String)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns an escape sequence' do
|
15
|
+
subject.must_equal("\e[5m")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
7
19
|
describe '.bold' do
|
8
20
|
let(:subject) { described_class.bold }
|
9
21
|
|
@@ -28,27 +40,27 @@ module Vedeu
|
|
28
40
|
end
|
29
41
|
end
|
30
42
|
|
31
|
-
describe '.
|
32
|
-
let(:subject) { described_class.
|
43
|
+
describe '.clear_line' do
|
44
|
+
let(:subject) { described_class.clear_line }
|
33
45
|
|
34
46
|
it 'returns a String' do
|
35
47
|
subject.must_be_instance_of(String)
|
36
48
|
end
|
37
49
|
|
38
50
|
it 'returns an escape sequence' do
|
39
|
-
subject.must_equal("\e[")
|
51
|
+
subject.must_equal("\e[2K")
|
40
52
|
end
|
41
53
|
end
|
42
54
|
|
43
|
-
describe '.
|
44
|
-
let(:subject) { described_class.
|
55
|
+
describe '.esc' do
|
56
|
+
let(:subject) { described_class.esc }
|
45
57
|
|
46
58
|
it 'returns a String' do
|
47
59
|
subject.must_be_instance_of(String)
|
48
60
|
end
|
49
61
|
|
50
62
|
it 'returns an escape sequence' do
|
51
|
-
subject.must_equal("\e[
|
63
|
+
subject.must_equal("\e[")
|
52
64
|
end
|
53
65
|
end
|
54
66
|
|
@@ -64,27 +76,27 @@ module Vedeu
|
|
64
76
|
end
|
65
77
|
end
|
66
78
|
|
67
|
-
describe '.
|
68
|
-
let(:subject) { described_class.
|
79
|
+
describe '.normal' do
|
80
|
+
let(:subject) { described_class.normal }
|
69
81
|
|
70
82
|
it 'returns a String' do
|
71
83
|
subject.must_be_instance_of(String)
|
72
84
|
end
|
73
85
|
|
74
86
|
it 'returns an escape sequence' do
|
75
|
-
subject.must_equal("\e[
|
87
|
+
subject.must_equal("\e[2m")
|
76
88
|
end
|
77
89
|
end
|
78
90
|
|
79
|
-
describe '.
|
80
|
-
let(:subject) { described_class.
|
91
|
+
describe '.reset' do
|
92
|
+
let(:subject) { described_class.reset }
|
81
93
|
|
82
94
|
it 'returns a String' do
|
83
95
|
subject.must_be_instance_of(String)
|
84
96
|
end
|
85
97
|
|
86
98
|
it 'returns an escape sequence' do
|
87
|
-
subject.must_equal("\e[
|
99
|
+
subject.must_equal("\e[0m")
|
88
100
|
end
|
89
101
|
end
|
90
102
|
|
@@ -35,7 +35,7 @@ module Vedeu
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'returns an escape sequence' do
|
38
|
-
subject.must_equal("\e[38;
|
38
|
+
subject.must_equal("\e[38;2;31m")
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -59,7 +59,7 @@ module Vedeu
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'returns an escape sequence' do
|
62
|
-
subject.must_equal("\e[38;
|
62
|
+
subject.must_equal("\e[38;2;39m")
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -50,6 +50,14 @@ module Vedeu
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
describe '.update' do
|
54
|
+
let(:subject) { described_class.update }
|
55
|
+
|
56
|
+
it 'returns an Array' do
|
57
|
+
subject.must_be_instance_of(Array)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
53
61
|
describe '.klass' do
|
54
62
|
let(:subject) { described_class.klass }
|
55
63
|
|
@@ -13,7 +13,8 @@ module Vedeu
|
|
13
13
|
x: 1,
|
14
14
|
y: 1,
|
15
15
|
fg: :red,
|
16
|
-
bg: :blue
|
16
|
+
bg: :blue,
|
17
|
+
cursor: true,
|
17
18
|
}
|
18
19
|
}
|
19
20
|
let(:result) {}
|
@@ -67,5 +68,23 @@ module Vedeu
|
|
67
68
|
subject.must_be_instance_of(Colour)
|
68
69
|
end
|
69
70
|
end
|
71
|
+
|
72
|
+
describe '#cursor' do
|
73
|
+
let(:subject) { described_instance.cursor }
|
74
|
+
|
75
|
+
context 'when the cursor is on' do
|
76
|
+
it 'returns an escape sequence' do
|
77
|
+
subject.must_be_instance_of(String)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'when the cursor is off' do
|
82
|
+
let(:attributes) { { cursor: false } }
|
83
|
+
|
84
|
+
it 'returns an escape sequence' do
|
85
|
+
subject.must_be_instance_of(String)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
70
89
|
end
|
71
90
|
end
|
@@ -77,22 +77,44 @@ module Vedeu
|
|
77
77
|
|
78
78
|
describe '.open' do
|
79
79
|
let(:subject) { described_class.open }
|
80
|
+
|
81
|
+
it 'returns a NilClass' do
|
82
|
+
subject.must_be_instance_of(NilClass)
|
83
|
+
end
|
80
84
|
end
|
81
85
|
|
82
86
|
describe '.close' do
|
83
87
|
let(:subject) { described_class.close }
|
88
|
+
|
89
|
+
it 'returns a NilClass' do
|
90
|
+
subject.must_be_instance_of(NilClass)
|
91
|
+
end
|
84
92
|
end
|
85
93
|
|
86
94
|
describe '.cooked' do
|
87
|
-
let(:subject)
|
95
|
+
let(:subject) { described_class.cooked(instance) }
|
96
|
+
let(:instance) {}
|
97
|
+
|
98
|
+
it 'returns a NilClass' do
|
99
|
+
subject.must_be_instance_of(NilClass)
|
100
|
+
end
|
88
101
|
end
|
89
102
|
|
90
103
|
describe '.raw' do
|
91
|
-
let(:subject)
|
104
|
+
let(:subject) { described_class.raw(instance) }
|
105
|
+
let(:instance) {}
|
106
|
+
|
107
|
+
it 'returns a NilClass' do
|
108
|
+
subject.must_be_instance_of(NilClass)
|
109
|
+
end
|
92
110
|
end
|
93
111
|
|
94
112
|
describe '.console' do
|
95
113
|
let(:subject) { described_class.console }
|
114
|
+
|
115
|
+
it 'returns the console' do
|
116
|
+
subject.must_equal(console)
|
117
|
+
end
|
96
118
|
end
|
97
119
|
|
98
120
|
describe '.clear_screen' do
|
data/test/test_helper.rb
CHANGED
data/vedeu.gemspec
CHANGED
@@ -26,8 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency "minitest", "5.3.4"
|
27
27
|
spec.add_development_dependency "minitest-reporters", "1.0.4"
|
28
28
|
spec.add_development_dependency "mocha", "1.1.0"
|
29
|
-
spec.add_development_dependency "pry", "0.
|
30
|
-
spec.add_development_dependency "pry-nav", "0.2.3"
|
29
|
+
spec.add_development_dependency "pry", "0.10.0"
|
31
30
|
spec.add_development_dependency "rake", "10.3.2"
|
32
31
|
spec.add_development_dependency "simplecov", "0.8.2"
|
33
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vedeu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Laking
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aruba
|
@@ -142,28 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
145
|
+
version: 0.10.0
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: pry-nav
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - '='
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: 0.2.3
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - '='
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 0.2.3
|
152
|
+
version: 0.10.0
|
167
153
|
- !ruby/object:Gem::Dependency
|
168
154
|
name: rake
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -227,8 +213,10 @@ files:
|
|
227
213
|
- lib/vedeu/launcher.rb
|
228
214
|
- lib/vedeu/output/background.rb
|
229
215
|
- lib/vedeu/output/base.rb
|
216
|
+
- lib/vedeu/output/buffer.rb
|
230
217
|
- lib/vedeu/output/colour.rb
|
231
218
|
- lib/vedeu/output/compositor.rb
|
219
|
+
- lib/vedeu/output/cursor.rb
|
232
220
|
- lib/vedeu/output/directive.rb
|
233
221
|
- lib/vedeu/output/esc.rb
|
234
222
|
- lib/vedeu/output/foreground.rb
|
@@ -258,8 +246,10 @@ files:
|
|
258
246
|
- test/lib/vedeu/launcher_test.rb
|
259
247
|
- test/lib/vedeu/output/background_test.rb
|
260
248
|
- test/lib/vedeu/output/base_test.rb
|
249
|
+
- test/lib/vedeu/output/buffer_test.rb
|
261
250
|
- test/lib/vedeu/output/colour_test.rb
|
262
251
|
- test/lib/vedeu/output/compositor_test.rb
|
252
|
+
- test/lib/vedeu/output/cursor_test.rb
|
263
253
|
- test/lib/vedeu/output/directive_test.rb
|
264
254
|
- test/lib/vedeu/output/esc_test.rb
|
265
255
|
- test/lib/vedeu/output/foreground_test.rb
|
@@ -286,6 +276,7 @@ files:
|
|
286
276
|
- test/lib/vedeu/support/terminal_test.rb
|
287
277
|
- test/lib/vedeu/version_test.rb
|
288
278
|
- test/lib/vedeu_test.rb
|
279
|
+
- test/support/colours.rb
|
289
280
|
- test/test_helper.rb
|
290
281
|
- vedeu.gemspec
|
291
282
|
homepage: http://www.gavinlaking.name/
|
@@ -320,8 +311,10 @@ test_files:
|
|
320
311
|
- test/lib/vedeu/launcher_test.rb
|
321
312
|
- test/lib/vedeu/output/background_test.rb
|
322
313
|
- test/lib/vedeu/output/base_test.rb
|
314
|
+
- test/lib/vedeu/output/buffer_test.rb
|
323
315
|
- test/lib/vedeu/output/colour_test.rb
|
324
316
|
- test/lib/vedeu/output/compositor_test.rb
|
317
|
+
- test/lib/vedeu/output/cursor_test.rb
|
325
318
|
- test/lib/vedeu/output/directive_test.rb
|
326
319
|
- test/lib/vedeu/output/esc_test.rb
|
327
320
|
- test/lib/vedeu/output/foreground_test.rb
|
@@ -348,5 +341,6 @@ test_files:
|
|
348
341
|
- test/lib/vedeu/support/terminal_test.rb
|
349
342
|
- test/lib/vedeu/version_test.rb
|
350
343
|
- test/lib/vedeu_test.rb
|
344
|
+
- test/support/colours.rb
|
351
345
|
- test/test_helper.rb
|
352
346
|
has_rdoc:
|