vedeu 0.0.23 → 0.0.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -96
- data/lib/vedeu.rb +1 -2
- data/lib/vedeu/launcher.rb +2 -0
- data/lib/vedeu/output/buffer/composition.rb +15 -0
- data/lib/vedeu/output/buffer/formatting.rb +6 -10
- data/lib/vedeu/output/buffer/line.rb +1 -1
- data/lib/vedeu/output/wordwrap.rb +8 -6
- data/lib/vedeu/repository/command.rb +6 -9
- data/lib/vedeu/repository/command_repository.rb +5 -6
- data/lib/vedeu/repository/interface.rb +2 -0
- data/lib/vedeu/support/event_loop.rb +2 -0
- data/lib/vedeu/support/json_parser.rb +25 -0
- data/lib/vedeu/support/terminal.rb +4 -0
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/output/buffer/composition_test.rb +38 -1
- data/test/lib/vedeu/output/buffer/formatting_test.rb +9 -0
- data/test/lib/vedeu/output/buffer/interface_test.rb +14 -0
- data/test/lib/vedeu/output/buffer/line_test.rb +25 -0
- data/test/lib/vedeu/output/buffer/stream_test.rb +22 -0
- data/test/lib/vedeu/output/compositor_test.rb +5 -5
- data/test/lib/vedeu/output/output_test.rb +1 -1
- data/test/lib/vedeu/output/wordwrap_test.rb +5 -1
- data/test/lib/vedeu/repository/command_repository_test.rb +12 -14
- data/test/lib/vedeu/repository/command_test.rb +21 -15
- data/test/lib/vedeu/support/json_parser_test.rb +46 -0
- data/test/support/multi_interface.json +34 -0
- data/test/support/single_interface.json +19 -0
- metadata +11 -8
- data/lib/vedeu/output/buffer/parser.rb +0 -28
- data/lib/vedeu/output/colour_pair.rb +0 -43
- data/test/lib/vedeu/output/buffer/parser_test.rb +0 -58
- data/test/lib/vedeu/output/colour_pair_test.rb +0 -104
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 046d21e705590582e93e96ebd7be2301265256ea
|
4
|
+
data.tar.gz: 0582a4583fb725376874b6b41c1d1508df473a35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd1aba71fdd4b148133c76e5e8e3506ab3a60c98c4e9167e68e8ab47329e641762d34a7f2ec3f1191a28745a37dac5aa21a5e6052de152f186c4053ea10519fd
|
7
|
+
data.tar.gz: bc2fba75fb393c82a0b6ef51d62fd6c3e7614010a432259cd8bc18ba779c464f5341e1c0cc5b540cd052415551ef38547388c2c4c9e4d143104ca54a96fcb165
|
data/README.md
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
Vedeu is my attempt at creating a terminal based application framework without the need for Ncurses.
|
6
6
|
|
7
|
+
|
7
8
|
## Installation
|
8
9
|
|
9
10
|
Add this line to your application's Gemfile:
|
@@ -16,103 +17,8 @@ And then execute:
|
|
16
17
|
|
17
18
|
## Usage
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
## Notes
|
22
|
-
|
23
|
-
Launcher
|
24
|
-
|-- Application
|
25
|
-
|-- EventLoop
|
26
|
-
| |-- Input
|
27
|
-
| | |-- Queue
|
28
|
-
| | |-- Terminal
|
29
|
-
| |
|
30
|
-
| |-- Process
|
31
|
-
| | |-- CommandRepository
|
32
|
-
| | |-- Queue
|
33
|
-
| |
|
34
|
-
| |-- Output
|
35
|
-
| |-- Compositor
|
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
|
-
|-- InterfaceRepository
|
56
|
-
|-- Terminal
|
57
|
-
|
58
|
-
Base
|
59
|
-
|-- Esc
|
60
|
-
|-- Translator
|
61
|
-
|
62
|
-
Command
|
63
|
-
|-- CommandRepository
|
64
|
-
|
65
|
-
Exit
|
66
|
-
|
67
|
-
Interface
|
68
|
-
|-- Colour
|
69
|
-
| |-- Background < Base
|
70
|
-
| |-- Foreground < Base
|
71
|
-
|
|
72
|
-
|-- Geometry
|
73
|
-
| |-- Terminal
|
74
|
-
|
|
75
|
-
|-- InterfaceRepository
|
76
|
-
|
77
|
-
Repository
|
78
|
-
|-- Storage
|
79
|
-
|
80
|
-
Terminal
|
81
|
-
|-- Cursor
|
82
|
-
|-- Esc
|
83
|
-
|-- Position
|
84
|
-
|-- Esc
|
85
|
-
|
86
|
-
### On Interfaces
|
87
|
-
|
88
|
-
When we create the interface we define it's width, height, and origin (y, x).
|
89
|
-
These numbers are based on the area available to the terminal. If the terminal is 80x25, then our interface can use all or some of this area.
|
90
|
-
|
91
|
-
### On Composition
|
92
|
-
|
93
|
-
To compose data suitable for output in Vedeu, you can use this EBNF. Diagrams are available in the `documentation` directory.
|
94
|
-
|
95
|
-
Output ::= (('{' (Interface '=>' Stream) '}' (',' | ))* | ('[' (Stream (',' | ))* ']' (',' | ))* | ('[' (String (',' | ))* ']') (',' | ))*
|
96
|
-
Stream ::= ('[' (Directive (',' | ) | String (',' | ))* ']' (',' | ))*
|
97
|
-
Interface ::= String
|
98
|
-
Directive ::= PositionDirective | ColourDirective | StyleDirective
|
99
|
-
PositionDirective ::= '[' Fixnum ',' Fixnum ']'
|
100
|
-
StyleDirective ::= Symbol
|
101
|
-
ColourDirective ::= '[' Symbol ',' Symbol ']'
|
102
|
-
|
103
|
-
Diagrams were produced using the Railroad Diagram Generator at `http://bottlecaps.de/rr/ui`.
|
104
|
-
|
105
|
-
## Usage
|
106
|
-
|
107
|
-
class MyApp
|
108
|
-
include Vedeu
|
109
|
-
|
110
|
-
interface 'status', { y: 1, x: 1, width: :auto, height: 1 }
|
111
|
-
interface 'main', { y: 2, x: 1, width: :auto, height: :auto, fg: :red, bg: :black }
|
20
|
+
Expect documentation soon!
|
112
21
|
|
113
|
-
command 'exit', Vedeu::Exit.dispatch, { keyword: "exit", keypress: "q" }
|
114
|
-
command 'help', MyApp.help, { keyword: "help", keypress: "h" }
|
115
|
-
end
|
116
22
|
|
117
23
|
## Contributing
|
118
24
|
|
data/lib/vedeu.rb
CHANGED
@@ -8,10 +8,10 @@ require_relative 'vedeu/input/input'
|
|
8
8
|
|
9
9
|
require_relative 'vedeu/support/event_loop'
|
10
10
|
require_relative 'vedeu/support/exit'
|
11
|
+
require_relative 'vedeu/support/json_parser'
|
11
12
|
require_relative 'vedeu/support/queue'
|
12
13
|
require_relative 'vedeu/support/terminal'
|
13
14
|
|
14
|
-
require_relative 'vedeu/output/buffer/parser'
|
15
15
|
require_relative 'vedeu/output/buffer/style'
|
16
16
|
require_relative 'vedeu/output/buffer/formatting'
|
17
17
|
require_relative 'vedeu/output/buffer/stream'
|
@@ -29,7 +29,6 @@ require_relative 'vedeu/output/geometry'
|
|
29
29
|
require_relative 'vedeu/output/layer'
|
30
30
|
require_relative 'vedeu/output/esc'
|
31
31
|
require_relative 'vedeu/output/colour'
|
32
|
-
require_relative 'vedeu/output/colour_pair'
|
33
32
|
require_relative 'vedeu/output/output'
|
34
33
|
require_relative 'vedeu/output/position'
|
35
34
|
require_relative 'vedeu/output/renderer'
|
data/lib/vedeu/launcher.rb
CHANGED
@@ -12,6 +12,7 @@ module Vedeu
|
|
12
12
|
@exit_code = 1
|
13
13
|
end
|
14
14
|
|
15
|
+
# :nocov:
|
15
16
|
def execute!
|
16
17
|
$stdin, $stdout, $stderr = @stdin, @stdout, @stderr
|
17
18
|
|
@@ -22,5 +23,6 @@ module Vedeu
|
|
22
23
|
$stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
|
23
24
|
@kernel.exit(@exit_code)
|
24
25
|
end
|
26
|
+
# :nocov:
|
25
27
|
end
|
26
28
|
end
|
@@ -4,6 +4,21 @@ module Vedeu
|
|
4
4
|
include Virtus.model
|
5
5
|
|
6
6
|
attribute :interface, Array[Buffer::Interface]
|
7
|
+
|
8
|
+
def to_compositor
|
9
|
+
interface.inject({}) do |acc, interface|
|
10
|
+
acc[interface.name] = interface.to_compositor
|
11
|
+
acc
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_hash
|
16
|
+
Oj.load(to_json)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
Oj.dump(attributes, mode: :compat, circular: true)
|
21
|
+
end
|
7
22
|
end
|
8
23
|
end
|
9
24
|
end
|
@@ -10,19 +10,15 @@ module Vedeu
|
|
10
10
|
private
|
11
11
|
|
12
12
|
def colour
|
13
|
-
if foreground
|
14
|
-
|
15
|
-
|
16
|
-
[]
|
17
|
-
end
|
13
|
+
return [] if foreground.nil? || background.nil?
|
14
|
+
|
15
|
+
[foreground, background]
|
18
16
|
end
|
19
17
|
|
20
18
|
def styles
|
21
|
-
if style
|
22
|
-
|
23
|
-
|
24
|
-
[]
|
25
|
-
end
|
19
|
+
return [] if style.nil?
|
20
|
+
|
21
|
+
style
|
26
22
|
end
|
27
23
|
end
|
28
24
|
end
|
@@ -51,12 +51,14 @@ module Vedeu
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def pruned
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
54
|
+
if value.size <= pruned_width
|
55
|
+
value
|
56
|
+
else
|
57
|
+
[
|
58
|
+
value.chomp.slice(0..pruned_width),
|
59
|
+
'...'
|
60
|
+
].join
|
61
|
+
end
|
60
62
|
end
|
61
63
|
|
62
64
|
def pruned_width
|
@@ -1,21 +1,18 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class Command
|
3
|
-
|
3
|
+
include Virtus.model
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@keyword = attributes.fetch(:options, {}).fetch(:keyword, '')
|
10
|
-
@keypress = attributes.fetch(:options, {}).fetch(:keypress, '')
|
11
|
-
end
|
5
|
+
attribute :name, String
|
6
|
+
attribute :entity, Class
|
7
|
+
attribute :keyword, String, default: ''
|
8
|
+
attribute :keypress, String, default: ''
|
12
9
|
|
13
10
|
def execute(args = [])
|
14
11
|
executable.call(*args)
|
15
12
|
end
|
16
13
|
|
17
14
|
def executable
|
18
|
-
proc { |*args|
|
15
|
+
proc { |*args| entity.dispatch(*args) }
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -22,13 +22,12 @@ module Vedeu
|
|
22
22
|
|
23
23
|
# :nocov:
|
24
24
|
module ClassMethods
|
25
|
-
def command(name, entity,
|
26
|
-
command_name = name.is_a?(Symbol) ? name.to_s : name
|
27
|
-
|
25
|
+
def command(name, entity, keypress = '', keyword = '')
|
28
26
|
CommandRepository.create({
|
29
|
-
name:
|
30
|
-
entity:
|
31
|
-
|
27
|
+
name: name,
|
28
|
+
entity: entity,
|
29
|
+
keypress: keypress,
|
30
|
+
keyword: keyword
|
32
31
|
})
|
33
32
|
end
|
34
33
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Vedeu
|
2
|
+
class JSONParser
|
3
|
+
class << self
|
4
|
+
def parse(json = '')
|
5
|
+
new(json).parse
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(json = '')
|
10
|
+
@json = json || ''
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
Buffer::Composition.new(as_hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :json
|
20
|
+
|
21
|
+
def as_hash
|
22
|
+
Oj.load(json)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -35,6 +35,7 @@ module Vedeu
|
|
35
35
|
reset_position
|
36
36
|
end
|
37
37
|
|
38
|
+
# :nocov:
|
38
39
|
def cooked(instance, &block)
|
39
40
|
console.cooked do
|
40
41
|
instance.initial_setup!
|
@@ -52,6 +53,7 @@ module Vedeu
|
|
52
53
|
end if block_given?
|
53
54
|
end
|
54
55
|
alias_method :open_raw, :raw
|
56
|
+
# :nocov:
|
55
57
|
|
56
58
|
def console
|
57
59
|
IO.console
|
@@ -101,6 +103,7 @@ module Vedeu
|
|
101
103
|
|
102
104
|
private
|
103
105
|
|
106
|
+
# :nocov:
|
104
107
|
def terminal_mode(&block)
|
105
108
|
{
|
106
109
|
cooked: proc { Terminal.cooked(self, &block) },
|
@@ -114,6 +117,7 @@ module Vedeu
|
|
114
117
|
hide: proc { Terminal.hide_cursor }
|
115
118
|
}
|
116
119
|
end
|
120
|
+
# :nocov:
|
117
121
|
|
118
122
|
def set_cursor
|
119
123
|
cursor_mode.fetch(cursor).call
|
data/lib/vedeu/version.rb
CHANGED
@@ -6,7 +6,8 @@ module Vedeu
|
|
6
6
|
let(:described_class) { Composition }
|
7
7
|
let(:described_instance) { described_class.new(attributes) }
|
8
8
|
let(:subject) { described_instance }
|
9
|
-
let(:
|
9
|
+
let(:json) { File.read(Vedeu.root_path + '/test/support/single_interface.json') }
|
10
|
+
let(:attributes) { Oj.load(json) }
|
10
11
|
|
11
12
|
it 'returns a Composition instance' do
|
12
13
|
subject.must_be_instance_of(Composition)
|
@@ -15,6 +16,42 @@ module Vedeu
|
|
15
16
|
it 'has an interface attribute' do
|
16
17
|
subject.interface.must_be_instance_of(Array)
|
17
18
|
end
|
19
|
+
|
20
|
+
describe '#to_compositor' do
|
21
|
+
let(:subject) { described_instance.to_compositor }
|
22
|
+
|
23
|
+
it 'returns a Hash' do
|
24
|
+
subject.must_be_instance_of(Hash)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns the composition as a Compositor format' do
|
28
|
+
subject.must_equal({"dummy"=>[[{:style=>[], :colour=>[]}, {:style=>[:normal], :colour=>[:yellow, :black], :text=>"Some text..."}]]})
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#to_hash' do
|
33
|
+
let(:subject) { described_instance.to_hash }
|
34
|
+
|
35
|
+
it 'returns a Hash' do
|
36
|
+
subject.must_be_instance_of(Hash)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the composition as a Hash' do
|
40
|
+
subject.must_equal({"interface"=>[{"name"=>"dummy", "line"=>[{"style"=>nil, "foreground"=>nil, "background"=>nil, "stream"=>[{"style"=>["normal"], "foreground"=>"yellow", "background"=>"black", "text"=>"Some text..."}]}]}]})
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#to_json' do
|
45
|
+
let(:subject) { described_instance.to_json }
|
46
|
+
|
47
|
+
it 'returns a String' do
|
48
|
+
subject.must_be_instance_of(String)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns a String' do
|
52
|
+
subject.must_equal("{\"interface\":[{\"name\":\"dummy\",\"line\":[{\"style\":null,\"foreground\":null,\"background\":null,\"stream\":[{\"style\":[\"normal\"],\"foreground\":\"yellow\",\"background\":\"black\",\"text\":\"Some text...\"}]}]}]}")
|
53
|
+
end
|
54
|
+
end
|
18
55
|
end
|
19
56
|
end
|
20
57
|
end
|
@@ -14,10 +14,24 @@ module Vedeu
|
|
14
14
|
|
15
15
|
it 'has a name attribute' do
|
16
16
|
subject.name.must_be_instance_of(String)
|
17
|
+
|
18
|
+
subject.name.must_equal('dummy')
|
17
19
|
end
|
18
20
|
|
19
21
|
it 'has a line attribute' do
|
20
22
|
subject.line.must_be_instance_of(Array)
|
23
|
+
|
24
|
+
subject.line.must_equal([])
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#to_compositor' do
|
28
|
+
let(:subject) { described_instance.to_compositor }
|
29
|
+
|
30
|
+
it 'returns an Array' do
|
31
|
+
subject.must_be_instance_of(Array)
|
32
|
+
|
33
|
+
subject.must_equal([])
|
34
|
+
end
|
21
35
|
end
|
22
36
|
end
|
23
37
|
end
|
@@ -21,18 +21,43 @@ module Vedeu
|
|
21
21
|
|
22
22
|
it 'has a style attribute' do
|
23
23
|
subject.style.must_be_instance_of(Array)
|
24
|
+
|
25
|
+
subject.style.must_equal([:normal])
|
24
26
|
end
|
25
27
|
|
26
28
|
it 'has a foreground attribute' do
|
27
29
|
subject.foreground.must_be_instance_of(Symbol)
|
30
|
+
|
31
|
+
subject.foreground.must_equal(:red)
|
28
32
|
end
|
29
33
|
|
30
34
|
it 'has a background attribute' do
|
31
35
|
subject.background.must_be_instance_of(Symbol)
|
36
|
+
|
37
|
+
subject.background.must_equal(:black)
|
32
38
|
end
|
33
39
|
|
34
40
|
it 'has a stream attribute' do
|
35
41
|
subject.stream.must_be_instance_of(Array)
|
42
|
+
|
43
|
+
subject.stream.must_equal([])
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#to_compositor' do
|
47
|
+
let(:subject) { described_instance.to_compositor }
|
48
|
+
|
49
|
+
it 'returns an Array' do
|
50
|
+
subject.must_be_instance_of(Array)
|
51
|
+
|
52
|
+
subject.must_equal(
|
53
|
+
[
|
54
|
+
{
|
55
|
+
style: [:normal],
|
56
|
+
colour: [:red, :black]
|
57
|
+
}
|
58
|
+
]
|
59
|
+
)
|
60
|
+
end
|
36
61
|
end
|
37
62
|
end
|
38
63
|
end
|
@@ -21,18 +21,40 @@ module Vedeu
|
|
21
21
|
|
22
22
|
it 'has a foreground attribute' do
|
23
23
|
subject.foreground.must_be_instance_of(Symbol)
|
24
|
+
|
25
|
+
subject.foreground.must_equal(:red)
|
24
26
|
end
|
25
27
|
|
26
28
|
it 'has a background attribute' do
|
27
29
|
subject.background.must_be_instance_of(Symbol)
|
30
|
+
|
31
|
+
subject.background.must_equal(:black)
|
28
32
|
end
|
29
33
|
|
30
34
|
it 'has a text attribute' do
|
31
35
|
subject.text.must_be_instance_of(String)
|
36
|
+
|
37
|
+
subject.text.must_equal('Some text')
|
32
38
|
end
|
33
39
|
|
34
40
|
it 'has a style attribute' do
|
35
41
|
subject.style.must_be_instance_of(Array)
|
42
|
+
|
43
|
+
subject.style.must_equal([:normal])
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#to_compositor' do
|
47
|
+
let(:subject) { described_instance.to_compositor }
|
48
|
+
|
49
|
+
it 'returns a Hash' do
|
50
|
+
subject.must_be_instance_of(Hash)
|
51
|
+
|
52
|
+
subject.must_equal({
|
53
|
+
style: [:normal],
|
54
|
+
colour: [:red, :black],
|
55
|
+
text: "Some text"
|
56
|
+
})
|
57
|
+
end
|
36
58
|
end
|
37
59
|
end
|
38
60
|
end
|
@@ -84,7 +84,7 @@ module Vedeu
|
|
84
84
|
[
|
85
85
|
[
|
86
86
|
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1HSome text...\e[38;2;39m\e[48;2;49m\e[?25h",
|
87
|
-
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1HSome more tex...\e[
|
87
|
+
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1HSome more tex...\e[38;2;39m\e[48;2;49m\e[?25h"
|
88
88
|
]
|
89
89
|
]
|
90
90
|
}
|
@@ -146,7 +146,7 @@ module Vedeu
|
|
146
146
|
[
|
147
147
|
[
|
148
148
|
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1H\e[38;2;31m\e[48;2;47mSome text...\e[38;2;39m\e[48;2;49m\e[?25h",
|
149
|
-
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1H\e[38;2;34m\e[48;2;43mSome more tex...\e[
|
149
|
+
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1H\e[38;2;34m\e[48;2;43mSome more tex...\e[38;2;39m\e[48;2;49m\e[?25h"
|
150
150
|
]
|
151
151
|
]
|
152
152
|
}
|
@@ -189,7 +189,7 @@ module Vedeu
|
|
189
189
|
[
|
190
190
|
[
|
191
191
|
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1H\e[7mSome text...\e[38;2;39m\e[48;2;49m\e[?25h",
|
192
|
-
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1H\e[4mSome more tex...\e[
|
192
|
+
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1H\e[4mSome more tex...\e[38;2;39m\e[48;2;49m\e[?25h"
|
193
193
|
]
|
194
194
|
]
|
195
195
|
}
|
@@ -231,8 +231,8 @@ module Vedeu
|
|
231
231
|
let(:composition) {
|
232
232
|
[
|
233
233
|
[
|
234
|
-
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1H\e[38;2;31m\e[48;2;40m\e[24m\e[21m\e[27m\e[38;2;33m\e[48;2;40m\e[4m\e[7mSome text...\e[38;2;32m\e[48;2;40m\e[24m\e[21m\e[27mSome more tex...\e[
|
235
|
-
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1HEven more tex...\e[
|
234
|
+
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1H\e[38;2;31m\e[48;2;40m\e[24m\e[21m\e[27m\e[38;2;33m\e[48;2;40m\e[4m\e[7mSome text...\e[38;2;32m\e[48;2;40m\e[24m\e[21m\e[27mSome more tex...\e[38;2;39m\e[48;2;49m\e[?25h",
|
235
|
+
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1HEven more tex...\e[38;2;39m\e[48;2;49m\e[?25h"
|
236
236
|
]
|
237
237
|
]
|
238
238
|
}
|
@@ -24,7 +24,7 @@ module Vedeu
|
|
24
24
|
let(:output) {
|
25
25
|
[
|
26
26
|
[
|
27
|
-
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1HTesting Outpu...\e[
|
27
|
+
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1HTesting Outpu...\e[38;2;39m\e[48;2;49m\e[?25h",
|
28
28
|
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1H\e[38;2;39m\e[48;2;49m\e[?25h"
|
29
29
|
]
|
30
30
|
]
|
@@ -39,6 +39,10 @@ module Vedeu
|
|
39
39
|
|
40
40
|
subject { described_class.this(value, options) }
|
41
41
|
|
42
|
+
it 'returns a String' do
|
43
|
+
subject.must_be_instance_of(String)
|
44
|
+
end
|
45
|
+
|
42
46
|
it 'returns formatted text' do
|
43
47
|
subject.must_equal(formatted_value)
|
44
48
|
end
|
@@ -47,7 +51,7 @@ module Vedeu
|
|
47
51
|
let(:options) { { width: 70, prune: true } }
|
48
52
|
let(:formatted_value) {
|
49
53
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' \
|
50
|
-
" Curabitur a
|
54
|
+
" Curabitur a..."
|
51
55
|
}
|
52
56
|
|
53
57
|
it 'returns formatted text' do
|
@@ -6,20 +6,18 @@ module Vedeu
|
|
6
6
|
let(:input) {}
|
7
7
|
|
8
8
|
before do
|
9
|
-
CommandRepository.create({
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}
|
22
|
-
})
|
9
|
+
CommandRepository.create({
|
10
|
+
name: 'apple',
|
11
|
+
entity: DummyCommand,
|
12
|
+
keypress: 'a',
|
13
|
+
keyword: 'apple'
|
14
|
+
})
|
15
|
+
CommandRepository.create({
|
16
|
+
name: 'banana',
|
17
|
+
entity: DummyCommand,
|
18
|
+
keypress: 'b',
|
19
|
+
keyword: 'banana'
|
20
|
+
})
|
23
21
|
end
|
24
22
|
|
25
23
|
after { CommandRepository.reset }
|
@@ -9,10 +9,8 @@ module Vedeu
|
|
9
9
|
{
|
10
10
|
name: 'dummy',
|
11
11
|
entity: DummyCommand,
|
12
|
-
|
13
|
-
|
14
|
-
keypress: "d"
|
15
|
-
}
|
12
|
+
keyword: "dummy",
|
13
|
+
keypress: "d"
|
16
14
|
}
|
17
15
|
}
|
18
16
|
|
@@ -20,24 +18,28 @@ module Vedeu
|
|
20
18
|
subject.must_be_instance_of(Command)
|
21
19
|
end
|
22
20
|
|
23
|
-
it '
|
24
|
-
subject.
|
25
|
-
end
|
21
|
+
it 'has a name attribute' do
|
22
|
+
subject.name.must_be_instance_of(String)
|
26
23
|
|
27
|
-
|
28
|
-
subject.instance_variable_get('@name').must_equal('dummy')
|
24
|
+
subject.name.must_equal('dummy')
|
29
25
|
end
|
30
26
|
|
31
|
-
it '
|
32
|
-
subject.
|
27
|
+
it 'has an entity attribute' do
|
28
|
+
subject.entity.must_be_instance_of(Class)
|
29
|
+
|
30
|
+
subject.entity.must_equal(DummyCommand)
|
33
31
|
end
|
34
32
|
|
35
|
-
it '
|
36
|
-
subject.
|
33
|
+
it 'has a keypress attribute' do
|
34
|
+
subject.keypress.must_be_instance_of(String)
|
35
|
+
|
36
|
+
subject.keypress.must_equal('d')
|
37
37
|
end
|
38
38
|
|
39
|
-
it '
|
40
|
-
subject.
|
39
|
+
it 'has an keyword attribute' do
|
40
|
+
subject.keyword.must_be_instance_of(String)
|
41
|
+
|
42
|
+
subject.keyword.must_equal('dummy')
|
41
43
|
end
|
42
44
|
|
43
45
|
describe '#execute' do
|
@@ -55,6 +57,10 @@ module Vedeu
|
|
55
57
|
|
56
58
|
describe '#executable' do
|
57
59
|
let(:subject) { described_instance.executable }
|
60
|
+
|
61
|
+
it 'returns a proc' do
|
62
|
+
subject.class.to_s.must_equal('Proc')
|
63
|
+
end
|
58
64
|
end
|
59
65
|
end
|
60
66
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe JSONParser do
|
5
|
+
let(:described_class) { JSONParser }
|
6
|
+
let(:described_instance) { described_class.new(json) }
|
7
|
+
let(:subject) { described_instance }
|
8
|
+
let(:json) { "[]" }
|
9
|
+
|
10
|
+
it 'returns a JSONParser instance' do
|
11
|
+
subject.must_be_instance_of(JSONParser)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets an instance variable' do
|
15
|
+
subject.instance_variable_get("@json").must_equal(json)
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when the instance variable is nil' do
|
19
|
+
let(:json) {}
|
20
|
+
|
21
|
+
it 'set the instance variable to empty string' do
|
22
|
+
subject.instance_variable_get("@json").must_equal('')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#parse' do
|
27
|
+
let(:subject) { described_instance.parse }
|
28
|
+
|
29
|
+
context 'when the JSON contains a single interface' do
|
30
|
+
let(:json) { File.read('test/support/single_interface.json') }
|
31
|
+
|
32
|
+
it 'returns a Composition instance' do
|
33
|
+
subject.must_be_instance_of(Buffer::Composition)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when the JSON contains multiple interfaces' do
|
38
|
+
let(:json) { File.read('test/support/multi_interface.json') }
|
39
|
+
|
40
|
+
it 'returns a Composition instance' do
|
41
|
+
subject.must_be_instance_of(Buffer::Composition)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
{
|
2
|
+
"interface":[
|
3
|
+
{
|
4
|
+
"name":"dummy",
|
5
|
+
"line":[
|
6
|
+
{
|
7
|
+
"stream":[
|
8
|
+
{
|
9
|
+
"style":"normal",
|
10
|
+
"foreground":"yellow",
|
11
|
+
"background":"black",
|
12
|
+
"text":"Some text..."
|
13
|
+
}
|
14
|
+
]
|
15
|
+
}
|
16
|
+
]
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"name":"dumber",
|
20
|
+
"line":[
|
21
|
+
{
|
22
|
+
"stream":[
|
23
|
+
{
|
24
|
+
"style":"normal",
|
25
|
+
"foreground":"red",
|
26
|
+
"background":"black",
|
27
|
+
"text":"Some more text..."
|
28
|
+
}
|
29
|
+
]
|
30
|
+
}
|
31
|
+
]
|
32
|
+
}
|
33
|
+
]
|
34
|
+
}
|
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.24
|
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-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aruba
|
@@ -263,11 +263,9 @@ files:
|
|
263
263
|
- lib/vedeu/output/buffer/formatting.rb
|
264
264
|
- lib/vedeu/output/buffer/interface.rb
|
265
265
|
- lib/vedeu/output/buffer/line.rb
|
266
|
-
- lib/vedeu/output/buffer/parser.rb
|
267
266
|
- lib/vedeu/output/buffer/stream.rb
|
268
267
|
- lib/vedeu/output/buffer/style.rb
|
269
268
|
- lib/vedeu/output/colour.rb
|
270
|
-
- lib/vedeu/output/colour_pair.rb
|
271
269
|
- lib/vedeu/output/compositor.rb
|
272
270
|
- lib/vedeu/output/cursor.rb
|
273
271
|
- lib/vedeu/output/directive.rb
|
@@ -292,6 +290,7 @@ files:
|
|
292
290
|
- lib/vedeu/repository/storage.rb
|
293
291
|
- lib/vedeu/support/event_loop.rb
|
294
292
|
- lib/vedeu/support/exit.rb
|
293
|
+
- lib/vedeu/support/json_parser.rb
|
295
294
|
- lib/vedeu/support/queue.rb
|
296
295
|
- lib/vedeu/support/terminal.rb
|
297
296
|
- lib/vedeu/version.rb
|
@@ -301,12 +300,11 @@ files:
|
|
301
300
|
- test/lib/vedeu/output/background_test.rb
|
302
301
|
- test/lib/vedeu/output/base_test.rb
|
303
302
|
- test/lib/vedeu/output/buffer/composition_test.rb
|
303
|
+
- test/lib/vedeu/output/buffer/formatting_test.rb
|
304
304
|
- test/lib/vedeu/output/buffer/interface_test.rb
|
305
305
|
- test/lib/vedeu/output/buffer/line_test.rb
|
306
|
-
- test/lib/vedeu/output/buffer/parser_test.rb
|
307
306
|
- test/lib/vedeu/output/buffer/stream_test.rb
|
308
307
|
- test/lib/vedeu/output/buffer/style_test.rb
|
309
|
-
- test/lib/vedeu/output/colour_pair_test.rb
|
310
308
|
- test/lib/vedeu/output/colour_test.rb
|
311
309
|
- test/lib/vedeu/output/compositor_test.rb
|
312
310
|
- test/lib/vedeu/output/cursor_test.rb
|
@@ -332,6 +330,7 @@ files:
|
|
332
330
|
- test/lib/vedeu/repository/storage_test.rb
|
333
331
|
- test/lib/vedeu/support/event_loop_test.rb
|
334
332
|
- test/lib/vedeu/support/exit_test.rb
|
333
|
+
- test/lib/vedeu/support/json_parser_test.rb
|
335
334
|
- test/lib/vedeu/support/queue_test.rb
|
336
335
|
- test/lib/vedeu/support/terminal_test.rb
|
337
336
|
- test/lib/vedeu/version_test.rb
|
@@ -340,6 +339,8 @@ files:
|
|
340
339
|
- test/support/composition.json
|
341
340
|
- test/support/composition.rb
|
342
341
|
- test/support/composition.xml
|
342
|
+
- test/support/multi_interface.json
|
343
|
+
- test/support/single_interface.json
|
343
344
|
- test/test_helper.rb
|
344
345
|
- vedeu.gemspec
|
345
346
|
homepage: http://www.gavinlaking.name/
|
@@ -376,12 +377,11 @@ test_files:
|
|
376
377
|
- test/lib/vedeu/output/background_test.rb
|
377
378
|
- test/lib/vedeu/output/base_test.rb
|
378
379
|
- test/lib/vedeu/output/buffer/composition_test.rb
|
380
|
+
- test/lib/vedeu/output/buffer/formatting_test.rb
|
379
381
|
- test/lib/vedeu/output/buffer/interface_test.rb
|
380
382
|
- test/lib/vedeu/output/buffer/line_test.rb
|
381
|
-
- test/lib/vedeu/output/buffer/parser_test.rb
|
382
383
|
- test/lib/vedeu/output/buffer/stream_test.rb
|
383
384
|
- test/lib/vedeu/output/buffer/style_test.rb
|
384
|
-
- test/lib/vedeu/output/colour_pair_test.rb
|
385
385
|
- test/lib/vedeu/output/colour_test.rb
|
386
386
|
- test/lib/vedeu/output/compositor_test.rb
|
387
387
|
- test/lib/vedeu/output/cursor_test.rb
|
@@ -407,6 +407,7 @@ test_files:
|
|
407
407
|
- test/lib/vedeu/repository/storage_test.rb
|
408
408
|
- test/lib/vedeu/support/event_loop_test.rb
|
409
409
|
- test/lib/vedeu/support/exit_test.rb
|
410
|
+
- test/lib/vedeu/support/json_parser_test.rb
|
410
411
|
- test/lib/vedeu/support/queue_test.rb
|
411
412
|
- test/lib/vedeu/support/terminal_test.rb
|
412
413
|
- test/lib/vedeu/version_test.rb
|
@@ -415,5 +416,7 @@ test_files:
|
|
415
416
|
- test/support/composition.json
|
416
417
|
- test/support/composition.rb
|
417
418
|
- test/support/composition.xml
|
419
|
+
- test/support/multi_interface.json
|
420
|
+
- test/support/single_interface.json
|
418
421
|
- test/test_helper.rb
|
419
422
|
has_rdoc:
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
module Buffer
|
3
|
-
class Parser
|
4
|
-
def initialize(composition)
|
5
|
-
@composition = composition
|
6
|
-
end
|
7
|
-
|
8
|
-
def to_compositor
|
9
|
-
composition.interface.inject({}) do |acc, interface|
|
10
|
-
acc[interface.name] = interface.to_compositor
|
11
|
-
acc
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_hash
|
16
|
-
Oj.load(to_json)
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_json
|
20
|
-
Oj.dump(composition, mode: :compat, circular: true)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
attr_reader :composition
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
class ColourPair
|
3
|
-
class << self
|
4
|
-
def define(pair = [])
|
5
|
-
return '' if pair.empty?
|
6
|
-
|
7
|
-
new(pair).define
|
8
|
-
end
|
9
|
-
alias_method :set, :define
|
10
|
-
|
11
|
-
def reset
|
12
|
-
new.reset
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize(pair = [])
|
17
|
-
@pair = pair || []
|
18
|
-
end
|
19
|
-
|
20
|
-
def define
|
21
|
-
[foreground, background].join
|
22
|
-
end
|
23
|
-
alias_method :set, :define
|
24
|
-
|
25
|
-
def reset
|
26
|
-
[foreground(:default), background(:default)].join
|
27
|
-
end
|
28
|
-
|
29
|
-
def foreground(value = pair[0])
|
30
|
-
@foreground ||= Foreground.escape_sequence(value)
|
31
|
-
end
|
32
|
-
alias_method :fg, :foreground
|
33
|
-
|
34
|
-
def background(value = pair[1])
|
35
|
-
@background ||= Background.escape_sequence(value)
|
36
|
-
end
|
37
|
-
alias_method :bg, :background
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
attr_reader :pair
|
42
|
-
end
|
43
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require_relative '../../../../test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
module Buffer
|
5
|
-
describe Parser do
|
6
|
-
let(:described_class) { Parser }
|
7
|
-
let(:described_instance) { described_class.new(composition) }
|
8
|
-
let(:subject) { described_instance }
|
9
|
-
let(:json) { File.read(Vedeu.root_path + '/test/support/composition.json') }
|
10
|
-
let(:json_as_hash) { Oj.load(json) }
|
11
|
-
let(:composition) { Vedeu::Buffer::Composition.new(json_as_hash) }
|
12
|
-
|
13
|
-
it 'returns a Parser instance' do
|
14
|
-
subject.must_be_instance_of(Buffer::Parser)
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'sets an instance variable' do
|
18
|
-
subject.instance_variable_get('@composition').must_equal(composition)
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#to_compositor' do
|
22
|
-
let(:subject) { described_instance.to_compositor }
|
23
|
-
|
24
|
-
it 'returns a Hash' do
|
25
|
-
subject.must_be_instance_of(Hash)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'returns the composition as a Compositor format' do
|
29
|
-
subject.must_equal({"dumb"=>[[{:style=>[:normal], :colour=>[:red, :black]}, {:style=>[:underline, :negative], :colour=>[:yellow, :black], :text=>"Some text..."}, {:style=>[:normal], :colour=>[:green, :black], :text=>"Some more text..."}], [{:style=>[], :colour=>[]}, {:style=>[], :colour=>[], :text=>"Even more text..."}]], "dumber"=>[[{:style=>[], :colour=>[]}, {:style=>[], :colour=>[], :text=>"Yet more text..."}]]})
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '#to_hash' do
|
34
|
-
let(:subject) { described_instance.to_hash }
|
35
|
-
|
36
|
-
it 'returns a Hash' do
|
37
|
-
subject.must_be_instance_of(Hash)
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'returns the composition as a Hash' do
|
41
|
-
subject.must_equal({"interface"=>[{"name"=>"dumb", "line"=>[{"style"=>["normal"], "foreground"=>"red", "background"=>"black", "stream"=>[{"style"=>["underline", "negative"], "foreground"=>"yellow", "background"=>"black", "text"=>"Some text..."}, {"style"=>["normal"], "foreground"=>"green", "background"=>"black", "text"=>"Some more text..."}]}, {"style"=>nil, "foreground"=>nil, "background"=>nil, "stream"=>[{"style"=>nil, "foreground"=>nil, "background"=>nil, "text"=>"Even more text..."}]}]}, {"name"=>"dumber", "line"=>[{"style"=>nil, "foreground"=>nil, "background"=>nil, "stream"=>[{"style"=>nil, "foreground"=>nil, "background"=>nil, "text"=>"Yet more text..."}]}]}]})
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '#to_json' do
|
46
|
-
let(:subject) { described_instance.to_json }
|
47
|
-
|
48
|
-
it 'returns a String' do
|
49
|
-
subject.must_be_instance_of(String)
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'returns a String' do
|
53
|
-
subject.must_equal("{\"interface\":[{\"name\":\"dumb\",\"line\":[{\"style\":[\"normal\"],\"foreground\":\"red\",\"background\":\"black\",\"stream\":[{\"style\":[\"underline\",\"negative\"],\"foreground\":\"yellow\",\"background\":\"black\",\"text\":\"Some text...\"},{\"style\":[\"normal\"],\"foreground\":\"green\",\"background\":\"black\",\"text\":\"Some more text...\"}]},{\"style\":null,\"foreground\":null,\"background\":null,\"stream\":[{\"style\":null,\"foreground\":null,\"background\":null,\"text\":\"Even more text...\"}]}]},{\"name\":\"dumber\",\"line\":[{\"style\":null,\"foreground\":null,\"background\":null,\"stream\":[{\"style\":null,\"foreground\":null,\"background\":null,\"text\":\"Yet more text...\"}]}]}]}")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,104 +0,0 @@
|
|
1
|
-
require_relative '../../../test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
describe Colour do
|
5
|
-
let(:described_class) { Colour }
|
6
|
-
let(:described_instance) { described_class.new }
|
7
|
-
let(:subject) { described_instance }
|
8
|
-
let(:pair) { [] }
|
9
|
-
|
10
|
-
it 'returns a Colour instance' do
|
11
|
-
subject.must_be_instance_of(Colour)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'sets an instance variable' do
|
15
|
-
subject.instance_variable_get('@pair').must_equal([])
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '.set' do
|
19
|
-
let(:subject) { described_class.set(pair) }
|
20
|
-
|
21
|
-
it 'returns a String' do
|
22
|
-
subject.must_be_instance_of(String)
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'when the foreground and background are specified as symbols' do
|
26
|
-
context 'when both the foreground and background is specified' do
|
27
|
-
let(:pair) { [:red, :yellow] }
|
28
|
-
|
29
|
-
it 'returns the code for red on yellow' do
|
30
|
-
subject.must_equal("\e[38;2;31m\e[48;2;43m")
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'when a foreground is specified' do
|
35
|
-
let(:pair) { [:blue] }
|
36
|
-
|
37
|
-
it 'returns the code for blue on default' do
|
38
|
-
subject.must_equal("\e[38;2;34m\e[48;2;49m")
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'when a background is specified' do
|
43
|
-
let(:pair) { [nil, :cyan] }
|
44
|
-
|
45
|
-
it 'returns the code for default with cyan background' do
|
46
|
-
subject.must_equal("\e[38;2;39m\e[48;2;46m")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context 'when an invalid foreground/background is specified' do
|
51
|
-
let(:pair) { [:melon, :raspberry] }
|
52
|
-
|
53
|
-
it 'returns the default code' do
|
54
|
-
subject.must_equal("\e[38;2;39m\e[48;2;49m")
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'when no foreground/background is specified' do
|
59
|
-
let(:pair) { [] }
|
60
|
-
|
61
|
-
it 'return an empty string' do
|
62
|
-
subject.must_equal('')
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'when the foreground and background are specified as strings' do
|
68
|
-
let(:pair) { ['#ff0000', '#0000ff'] }
|
69
|
-
|
70
|
-
it 'returns the default code' do
|
71
|
-
subject.must_equal("\e[38;5;196m\e[48;5;21m")
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe '.reset' do
|
77
|
-
let(:subject) { described_class.reset }
|
78
|
-
|
79
|
-
it 'returns a String' do
|
80
|
-
subject.must_be_instance_of(String)
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'returns an escape sequence' do
|
84
|
-
subject.must_equal("\e[38;2;39m\e[48;2;49m")
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
describe '#foreground' do
|
89
|
-
let(:subject) { described_instance.foreground }
|
90
|
-
|
91
|
-
it 'returns a String' do
|
92
|
-
subject.must_be_instance_of(String)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe '#background' do
|
97
|
-
let(:subject) { described_instance.background }
|
98
|
-
|
99
|
-
it 'returns a String' do
|
100
|
-
subject.must_be_instance_of(String)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|