vedeu 0.0.23 → 0.0.24
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/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
|