vedeu 0.0.22 → 0.0.23
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/bin/composition +12 -0
- data/lib/vedeu/output/buffer/composition.rb +9 -0
- data/lib/vedeu/output/buffer/formatting.rb +29 -0
- data/lib/vedeu/output/buffer/interface.rb +14 -0
- data/lib/vedeu/output/buffer/line.rb +14 -0
- data/lib/vedeu/output/buffer/parser.rb +28 -0
- data/lib/vedeu/output/buffer/stream.rb +14 -0
- data/lib/vedeu/output/buffer/style.rb +11 -0
- data/lib/vedeu/output/colour_pair.rb +43 -0
- data/lib/vedeu/output/compositor.rb +1 -9
- data/lib/vedeu/output/directive.rb +10 -11
- data/lib/vedeu/output/esc.rb +4 -3
- data/lib/vedeu/output/renderer.rb +6 -0
- data/lib/vedeu/output/style.rb +2 -2
- data/lib/vedeu/repository/interface.rb +1 -1
- data/lib/vedeu/version.rb +1 -1
- data/lib/vedeu.rb +11 -1
- data/test/lib/vedeu/output/buffer/composition_test.rb +20 -0
- data/test/lib/vedeu/output/buffer/interface_test.rb +24 -0
- data/test/lib/vedeu/output/buffer/line_test.rb +39 -0
- data/test/lib/vedeu/output/buffer/parser_test.rb +58 -0
- data/test/lib/vedeu/output/buffer/stream_test.rb +39 -0
- data/test/lib/vedeu/output/buffer/style_test.rb +8 -0
- data/test/lib/vedeu/output/colour_pair_test.rb +104 -0
- data/test/lib/vedeu/output/compositor_test.rb +45 -13
- data/test/lib/vedeu/output/directive_test.rb +1 -1
- data/test/lib/vedeu/output/esc_test.rb +14 -2
- data/test/lib/vedeu/output/output_test.rb +1 -1
- data/test/lib/vedeu/output/renderer_test.rb +13 -0
- data/test/lib/vedeu/output/style_test.rb +9 -9
- data/test/support/composition.json +47 -0
- data/test/support/composition.rb +5 -0
- data/test/support/composition.xml +36 -0
- data/test/test_helper.rb +1 -1
- data/vedeu.gemspec +1 -1
- metadata +37 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce06977605476701c2ac6f998a0af92fd38d5206
|
4
|
+
data.tar.gz: 5a72b5086a86d4af8871d7318e07bce64fca2af7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8363bd8ce4582edc87027a0ab688d1f8b97f50e0e25f328f59f6ceebe7ef016022fc9893bfd091652252615f1da1a7daecaa9c373a094b0c1f12296220ab8552
|
7
|
+
data.tar.gz: 1d1f967155fa6c2f747203703a2cb4aaa48934ad4926a6a6f5b2b27b89321b2b3b7776e6a16e92ea59fe09f5644728736d02450ca72da58a54f8c4b6d07185ef
|
data/bin/composition
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
|
3
|
+
|
4
|
+
-> { its -> { a } }
|
5
|
+
trap('INT') { exit! }
|
6
|
+
|
7
|
+
require 'vedeu'
|
8
|
+
require 'pry'
|
9
|
+
|
10
|
+
json = File.read('../test/support/composition.json')
|
11
|
+
hash = Yajl::Parser.parse(json)
|
12
|
+
comp = Vedeu::Buffer::Composition.new(hash)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Vedeu
|
2
|
+
module Buffer
|
3
|
+
module Formatting
|
4
|
+
include Virtus.module
|
5
|
+
|
6
|
+
attribute :style, Vedeu::Buffer::Style
|
7
|
+
attribute :foreground, Symbol
|
8
|
+
attribute :background, Symbol
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def colour
|
13
|
+
if foreground && background
|
14
|
+
[foreground, background]
|
15
|
+
elsif foreground.nil? || background.nil?
|
16
|
+
[]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def styles
|
21
|
+
if style
|
22
|
+
style
|
23
|
+
elsif style.nil?
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
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
|
@@ -0,0 +1,43 @@
|
|
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
|
@@ -45,7 +45,7 @@ module Vedeu
|
|
45
45
|
def pad_stream
|
46
46
|
if stream.size < height
|
47
47
|
remaining = height - stream.size
|
48
|
-
remaining.times { |i| stream << [''] }
|
48
|
+
remaining.times { |i| stream << [{ text: '' }] }
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -65,14 +65,6 @@ module Vedeu
|
|
65
65
|
interface.geometry.width
|
66
66
|
end
|
67
67
|
|
68
|
-
def stream
|
69
|
-
@_stream ||= if @stream.is_a?(String)
|
70
|
-
[@stream.split("\n")]
|
71
|
-
else
|
72
|
-
@stream
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
68
|
def interface
|
77
69
|
@_interface ||= InterfaceRepository.find(@interface)
|
78
70
|
end
|
@@ -14,34 +14,29 @@ module Vedeu
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def enact
|
17
|
-
|
18
|
-
[set_position, set_colour, set_style].join
|
17
|
+
[set_position, set_colour, set_style, set_text].join
|
19
18
|
end
|
20
19
|
|
21
20
|
private
|
22
21
|
|
23
22
|
attr_reader :interface, :directives
|
24
23
|
|
25
|
-
def wordwrap
|
26
|
-
Wordwrap.this(directives, options)
|
27
|
-
end
|
28
|
-
|
29
|
-
def string?
|
30
|
-
directives.is_a?(String)
|
31
|
-
end
|
32
|
-
|
33
24
|
def set_position
|
34
25
|
Position.set(*position)
|
35
26
|
end
|
36
27
|
|
37
28
|
def set_colour
|
38
|
-
Colour.set(colour)
|
29
|
+
Colour.set(colour) unless colour.empty?
|
39
30
|
end
|
40
31
|
|
41
32
|
def set_style
|
42
33
|
Array(style).map { |s| Style.set(s) }.join
|
43
34
|
end
|
44
35
|
|
36
|
+
def set_text
|
37
|
+
Wordwrap.this(text, options)
|
38
|
+
end
|
39
|
+
|
45
40
|
def position
|
46
41
|
directives.fetch(:position, [])
|
47
42
|
end
|
@@ -54,6 +49,10 @@ module Vedeu
|
|
54
49
|
directives.fetch(:style, [])
|
55
50
|
end
|
56
51
|
|
52
|
+
def text
|
53
|
+
directives.fetch(:text, '')
|
54
|
+
end
|
55
|
+
|
57
56
|
def options
|
58
57
|
{
|
59
58
|
width: interface.geometry.width,
|
data/lib/vedeu/output/esc.rb
CHANGED
@@ -34,17 +34,18 @@ module Vedeu
|
|
34
34
|
def negative
|
35
35
|
[esc, '7m'].join
|
36
36
|
end
|
37
|
-
alias_method :reverse, :negative
|
38
|
-
alias_method :inverse, :negative
|
39
37
|
|
40
38
|
def positive
|
41
39
|
[esc, '27m'].join
|
42
40
|
end
|
43
41
|
|
44
42
|
def normal
|
43
|
+
[underline_off, bold_off, positive].join
|
44
|
+
end
|
45
|
+
|
46
|
+
def dim
|
45
47
|
[esc, '2m'].join
|
46
48
|
end
|
47
|
-
alias_method :dim, :normal
|
48
49
|
|
49
50
|
def reset
|
50
51
|
[esc, '0m'].join
|
data/lib/vedeu/output/style.rb
CHANGED
@@ -18,11 +18,11 @@ module Vedeu
|
|
18
18
|
when :bold_off then Esc.bold_off
|
19
19
|
when :clear then Esc.clear
|
20
20
|
when :hide_cursor then Cursor.hide
|
21
|
-
when :inverse then Esc.inverse
|
22
21
|
when :negative then Esc.negative
|
23
22
|
when :positive then Esc.positive
|
24
23
|
when :reset then Esc.reset
|
25
|
-
when :normal then Esc.
|
24
|
+
when :normal then Esc.normal
|
25
|
+
when :dim then Esc.dim
|
26
26
|
when :show_cursor then Cursor.show
|
27
27
|
when :underline then Esc.underline
|
28
28
|
when :underline_off then Esc.underline_off
|
data/lib/vedeu/version.rb
CHANGED
data/lib/vedeu.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'logger'
|
3
3
|
require 'io/console'
|
4
|
+
require 'oj'
|
4
5
|
require 'virtus'
|
5
|
-
require 'yajl'
|
6
6
|
|
7
7
|
require_relative 'vedeu/input/input'
|
8
8
|
|
@@ -11,6 +11,14 @@ require_relative 'vedeu/support/exit'
|
|
11
11
|
require_relative 'vedeu/support/queue'
|
12
12
|
require_relative 'vedeu/support/terminal'
|
13
13
|
|
14
|
+
require_relative 'vedeu/output/buffer/parser'
|
15
|
+
require_relative 'vedeu/output/buffer/style'
|
16
|
+
require_relative 'vedeu/output/buffer/formatting'
|
17
|
+
require_relative 'vedeu/output/buffer/stream'
|
18
|
+
require_relative 'vedeu/output/buffer/line'
|
19
|
+
require_relative 'vedeu/output/buffer/interface'
|
20
|
+
require_relative 'vedeu/output/buffer/composition'
|
21
|
+
|
14
22
|
require_relative 'vedeu/output/base'
|
15
23
|
require_relative 'vedeu/output/background'
|
16
24
|
require_relative 'vedeu/output/compositor'
|
@@ -21,8 +29,10 @@ require_relative 'vedeu/output/geometry'
|
|
21
29
|
require_relative 'vedeu/output/layer'
|
22
30
|
require_relative 'vedeu/output/esc'
|
23
31
|
require_relative 'vedeu/output/colour'
|
32
|
+
require_relative 'vedeu/output/colour_pair'
|
24
33
|
require_relative 'vedeu/output/output'
|
25
34
|
require_relative 'vedeu/output/position'
|
35
|
+
require_relative 'vedeu/output/renderer'
|
26
36
|
require_relative 'vedeu/output/style'
|
27
37
|
require_relative 'vedeu/output/translator'
|
28
38
|
require_relative 'vedeu/output/wordwrap'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative '../../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
module Buffer
|
5
|
+
describe Composition do
|
6
|
+
let(:described_class) { Composition }
|
7
|
+
let(:described_instance) { described_class.new(attributes) }
|
8
|
+
let(:subject) { described_instance }
|
9
|
+
let(:attributes) { { interface: [] } }
|
10
|
+
|
11
|
+
it 'returns a Composition instance' do
|
12
|
+
subject.must_be_instance_of(Composition)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'has an interface attribute' do
|
16
|
+
subject.interface.must_be_instance_of(Array)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
module Buffer
|
5
|
+
describe Interface do
|
6
|
+
let(:described_class) { Interface }
|
7
|
+
let(:described_instance) { described_class.new(attributes) }
|
8
|
+
let(:subject) { described_instance }
|
9
|
+
let(:attributes) { { name: 'dummy', line: [] } }
|
10
|
+
|
11
|
+
it 'returns a Interface instance' do
|
12
|
+
subject.must_be_instance_of(Interface)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'has a name attribute' do
|
16
|
+
subject.name.must_be_instance_of(String)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'has a line attribute' do
|
20
|
+
subject.line.must_be_instance_of(Array)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative '../../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
module Buffer
|
5
|
+
describe Line do
|
6
|
+
let(:described_class) { Line }
|
7
|
+
let(:described_instance) { described_class.new(attributes) }
|
8
|
+
let(:subject) { described_instance }
|
9
|
+
let(:attributes) {
|
10
|
+
{
|
11
|
+
style: 'normal',
|
12
|
+
foreground: :red,
|
13
|
+
background: :black,
|
14
|
+
stream: []
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
it 'returns a Line instance' do
|
19
|
+
subject.must_be_instance_of(Line)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'has a style attribute' do
|
23
|
+
subject.style.must_be_instance_of(Array)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'has a foreground attribute' do
|
27
|
+
subject.foreground.must_be_instance_of(Symbol)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'has a background attribute' do
|
31
|
+
subject.background.must_be_instance_of(Symbol)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'has a stream attribute' do
|
35
|
+
subject.stream.must_be_instance_of(Array)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,58 @@
|
|
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
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative '../../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
module Buffer
|
5
|
+
describe Stream do
|
6
|
+
let(:described_class) { Stream }
|
7
|
+
let(:described_instance) { described_class.new(attributes) }
|
8
|
+
let(:subject) { described_instance }
|
9
|
+
let(:attributes) {
|
10
|
+
{
|
11
|
+
style: 'normal',
|
12
|
+
foreground: :red,
|
13
|
+
background: :black,
|
14
|
+
text: 'Some text'
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
it 'returns a Stream instance' do
|
19
|
+
subject.must_be_instance_of(Stream)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'has a foreground attribute' do
|
23
|
+
subject.foreground.must_be_instance_of(Symbol)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'has a background attribute' do
|
27
|
+
subject.background.must_be_instance_of(Symbol)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'has a text attribute' do
|
31
|
+
subject.text.must_be_instance_of(String)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'has a style attribute' do
|
35
|
+
subject.style.must_be_instance_of(Array)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,104 @@
|
|
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
|
@@ -34,7 +34,7 @@ module Vedeu
|
|
34
34
|
end
|
35
35
|
|
36
36
|
describe '#arrange' do
|
37
|
-
let(:subject)
|
37
|
+
let(:subject) { described_class.new(attributes).arrange }
|
38
38
|
|
39
39
|
context 'when empty' do
|
40
40
|
let(:stream) { [[]] }
|
@@ -58,7 +58,7 @@ module Vedeu
|
|
58
58
|
|
59
59
|
context 'when unstyled' do
|
60
60
|
context 'and a single line' do
|
61
|
-
let(:stream) { [['Some text...']] }
|
61
|
+
let(:stream) { [[{ text: 'Some text...' }]] }
|
62
62
|
let(:composition) {
|
63
63
|
[
|
64
64
|
[
|
@@ -76,8 +76,8 @@ module Vedeu
|
|
76
76
|
context 'and multi-line' do
|
77
77
|
let(:stream) {
|
78
78
|
[
|
79
|
-
['Some text...'],
|
80
|
-
['Some more text...']
|
79
|
+
[{ text: 'Some text...' }],
|
80
|
+
[{ text: 'Some more text...' }]
|
81
81
|
]
|
82
82
|
}
|
83
83
|
let(:composition) {
|
@@ -95,17 +95,19 @@ module Vedeu
|
|
95
95
|
end
|
96
96
|
|
97
97
|
context 'but is a string containing new-lines' do
|
98
|
-
let(:stream) { "Some text...\nSome more text..." }
|
98
|
+
let(:stream) { [[{ text: "Some text...\nSome more text..." }]] }
|
99
99
|
let(:composition) {
|
100
100
|
[
|
101
101
|
[
|
102
|
-
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1HSome text...
|
102
|
+
"\e[38;2;39m\e[48;2;49m\e[1;1H \e[1;1HSome text...
|
103
|
+
...\e[0m\e[38;2;39m\e[48;2;49m\e[?25h",
|
103
104
|
"\e[38;2;39m\e[48;2;49m\e[2;1H \e[2;1H\e[38;2;39m\e[48;2;49m\e[?25h"
|
104
105
|
]
|
105
106
|
]
|
106
107
|
}
|
107
108
|
|
108
109
|
it 'returns the enqueued composition' do
|
110
|
+
skip # The newline in the composition is not the desired behaviour. Wordwrap is the culprit.
|
109
111
|
subject.must_equal(composition)
|
110
112
|
end
|
111
113
|
end
|
@@ -116,7 +118,7 @@ module Vedeu
|
|
116
118
|
context 'and a single line' do
|
117
119
|
let(:stream) {
|
118
120
|
[
|
119
|
-
[{ colour: [:red, :white]
|
121
|
+
[{ colour: [:red, :white], text: 'Some text...' }, { colour: :default }]
|
120
122
|
]
|
121
123
|
}
|
122
124
|
let(:composition) {
|
@@ -136,8 +138,8 @@ module Vedeu
|
|
136
138
|
context 'and multi-line' do
|
137
139
|
let(:stream) {
|
138
140
|
[
|
139
|
-
[{ colour: [:red, :white]
|
140
|
-
[{ colour: [:blue, :yellow]
|
141
|
+
[{ colour: [:red, :white], text: 'Some text...' }],
|
142
|
+
[{ colour: [:blue, :yellow], text: 'Some more text...' }]
|
141
143
|
]
|
142
144
|
}
|
143
145
|
let(:composition) {
|
@@ -157,7 +159,11 @@ module Vedeu
|
|
157
159
|
|
158
160
|
context 'with a style' do
|
159
161
|
context 'and a single line' do
|
160
|
-
let(:stream) {
|
162
|
+
let(:stream) {
|
163
|
+
[
|
164
|
+
[{ style: :bold, text: 'Some text...' }, { style: :bold_off }]
|
165
|
+
]
|
166
|
+
}
|
161
167
|
let(:composition) {
|
162
168
|
[
|
163
169
|
[
|
@@ -175,8 +181,8 @@ module Vedeu
|
|
175
181
|
context 'and multi-line' do
|
176
182
|
let(:stream) {
|
177
183
|
[
|
178
|
-
[{ style: :
|
179
|
-
[{ style: :underline
|
184
|
+
[{ style: :negative, text: 'Some text...' }],
|
185
|
+
[{ style: :underline, text: 'Some more text...' }]
|
180
186
|
]
|
181
187
|
}
|
182
188
|
let(:composition) {
|
@@ -195,7 +201,11 @@ module Vedeu
|
|
195
201
|
end
|
196
202
|
|
197
203
|
context 'with an unknown style' do
|
198
|
-
let(:stream) {
|
204
|
+
let(:stream) {
|
205
|
+
[
|
206
|
+
[{ style: :unknown, text: 'Some text...' }]
|
207
|
+
]
|
208
|
+
}
|
199
209
|
let(:composition) {
|
200
210
|
[
|
201
211
|
[
|
@@ -209,6 +219,28 @@ module Vedeu
|
|
209
219
|
subject.must_equal(composition)
|
210
220
|
end
|
211
221
|
end
|
222
|
+
|
223
|
+
context 'with a complicated stream' do
|
224
|
+
let(:stream) {
|
225
|
+
[
|
226
|
+
[{:style=>[:normal], :colour=>[:red, :black]}, {:style=>[:underline, :negative], :colour=>[:yellow, :black], :text=>"Some text..."}, {:style=>[:normal], :colour=>[:green, :black], :text=>"Some more text..."}],
|
227
|
+
[{:style=>[], :colour=>[]}, {:style=>[], :colour=>[], :text=>"Even more text..."}]
|
228
|
+
]
|
229
|
+
}
|
230
|
+
|
231
|
+
let(:composition) {
|
232
|
+
[
|
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[0m\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[0m\e[38;2;39m\e[48;2;49m\e[?25h"
|
236
|
+
]
|
237
|
+
]
|
238
|
+
}
|
239
|
+
|
240
|
+
it 'returns the enqueued composition' do
|
241
|
+
subject.must_equal(composition)
|
242
|
+
end
|
243
|
+
end
|
212
244
|
end
|
213
245
|
end
|
214
246
|
end
|
@@ -88,8 +88,8 @@ module Vedeu
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
describe '.
|
92
|
-
let(:subject) { described_class.
|
91
|
+
describe '.negative' do
|
92
|
+
let(:subject) { described_class.negative }
|
93
93
|
|
94
94
|
it 'returns a String' do
|
95
95
|
subject.must_be_instance_of(String)
|
@@ -119,6 +119,18 @@ module Vedeu
|
|
119
119
|
subject.must_be_instance_of(String)
|
120
120
|
end
|
121
121
|
|
122
|
+
it 'returns an escape sequence' do
|
123
|
+
subject.must_equal("\e[24m\e[21m\e[27m")
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe '.dim' do
|
128
|
+
let(:subject) { described_class.dim }
|
129
|
+
|
130
|
+
it 'returns a String' do
|
131
|
+
subject.must_be_instance_of(String)
|
132
|
+
end
|
133
|
+
|
122
134
|
it 'returns an escape sequence' do
|
123
135
|
subject.must_equal("\e[2m")
|
124
136
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative '../../../test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
describe Renderer do
|
5
|
+
let(:described_class) { Renderer }
|
6
|
+
let(:described_instance) { described_class.new }
|
7
|
+
let(:subject) { described_instance }
|
8
|
+
|
9
|
+
it 'returns a Renderer instance' do
|
10
|
+
subject.must_be_instance_of(Renderer)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -72,14 +72,6 @@ module Vedeu
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
context 'when the style is inverse' do
|
76
|
-
let(:style) { :inverse }
|
77
|
-
|
78
|
-
it 'returns an escape sequence' do
|
79
|
-
subject.must_equal("\e[7m")
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
75
|
context 'when the style is positive' do
|
84
76
|
let(:style) { :positive }
|
85
77
|
|
@@ -100,7 +92,15 @@ module Vedeu
|
|
100
92
|
let(:style) { :normal }
|
101
93
|
|
102
94
|
it 'returns an escape sequence' do
|
103
|
-
subject.must_equal("\e[
|
95
|
+
subject.must_equal("\e[24m\e[21m\e[27m")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when the style is dim' do
|
100
|
+
let(:style) { :dim }
|
101
|
+
|
102
|
+
it 'returns an escape sequence' do
|
103
|
+
subject.must_equal("\e[2m")
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
{
|
2
|
+
"interface":[
|
3
|
+
{
|
4
|
+
"name":"dumb",
|
5
|
+
"line":[
|
6
|
+
{
|
7
|
+
"style":"normal",
|
8
|
+
"foreground":"red",
|
9
|
+
"background":"black",
|
10
|
+
"stream":[
|
11
|
+
{
|
12
|
+
"style":"underline negative",
|
13
|
+
"foreground":"yellow",
|
14
|
+
"background":"black",
|
15
|
+
"text":"Some text..."
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"style":"normal",
|
19
|
+
"foreground":"green",
|
20
|
+
"background":"black",
|
21
|
+
"text":"Some more text..."
|
22
|
+
}
|
23
|
+
]
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"stream":[
|
27
|
+
{
|
28
|
+
"text":"Even more text..."
|
29
|
+
}
|
30
|
+
]
|
31
|
+
}
|
32
|
+
]
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"name":"dumber",
|
36
|
+
"line":[
|
37
|
+
{
|
38
|
+
"stream":[
|
39
|
+
{
|
40
|
+
"text":"Yet more text..."
|
41
|
+
}
|
42
|
+
]
|
43
|
+
}
|
44
|
+
]
|
45
|
+
}
|
46
|
+
]
|
47
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2
|
+
|
3
|
+
<interface>
|
4
|
+
<name>dumb</name>
|
5
|
+
<line>
|
6
|
+
<style>normal</style>
|
7
|
+
<foreground>red</foreground>
|
8
|
+
<background>black</background>
|
9
|
+
<stream>
|
10
|
+
<style>underline negative</style>
|
11
|
+
<foreground>yellow</foreground>
|
12
|
+
<background>black</background>
|
13
|
+
<text>Some text...</text>
|
14
|
+
</stream>
|
15
|
+
<stream>
|
16
|
+
<style>normal</style>
|
17
|
+
<foreground>green</foreground>
|
18
|
+
<background>black</background>
|
19
|
+
<text>Some more text...</text>
|
20
|
+
</stream>
|
21
|
+
</line>
|
22
|
+
<line>
|
23
|
+
<stream>
|
24
|
+
<text>Even more text...</text>
|
25
|
+
</stream>
|
26
|
+
</line>
|
27
|
+
</interface>
|
28
|
+
|
29
|
+
<interface>
|
30
|
+
<name>dumber</name>
|
31
|
+
<line>
|
32
|
+
<stream>
|
33
|
+
<text>Yet more text...</text>
|
34
|
+
</stream>
|
35
|
+
</line>
|
36
|
+
</interface>
|
data/test/test_helper.rb
CHANGED
@@ -23,7 +23,7 @@ end
|
|
23
23
|
# commented out by default (makes tests slower)
|
24
24
|
# require 'minitest/reporters'
|
25
25
|
# Minitest::Reporters.use!(
|
26
|
-
# Minitest::Reporters::DefaultReporter.new({ color: true, slow_count: 5 })
|
26
|
+
# Minitest::Reporters::DefaultReporter.new({ color: true, slow_count: 5 }),
|
27
27
|
# Minitest::Reporters::SpecReporter.new
|
28
28
|
# )
|
29
29
|
|
data/vedeu.gemspec
CHANGED
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.23
|
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-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aruba
|
@@ -193,7 +193,7 @@ dependencies:
|
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: 0.8.2
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
196
|
+
name: oj
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
199
|
- - ">="
|
@@ -207,7 +207,7 @@ dependencies:
|
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: '0'
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
|
-
name:
|
210
|
+
name: virtus
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
213
|
- - ">="
|
@@ -224,6 +224,7 @@ description:
|
|
224
224
|
email:
|
225
225
|
- gavinlaking@gmail.com
|
226
226
|
executables:
|
227
|
+
- composition
|
227
228
|
- vedeu
|
228
229
|
extensions: []
|
229
230
|
extra_rdoc_files: []
|
@@ -236,6 +237,7 @@ files:
|
|
236
237
|
- LICENSE.txt
|
237
238
|
- README.md
|
238
239
|
- Rakefile
|
240
|
+
- bin/composition
|
239
241
|
- bin/vedeu
|
240
242
|
- config/cucumber.yml
|
241
243
|
- documentation/composition.ebnf
|
@@ -257,7 +259,15 @@ files:
|
|
257
259
|
- lib/vedeu/launcher.rb
|
258
260
|
- lib/vedeu/output/background.rb
|
259
261
|
- lib/vedeu/output/base.rb
|
262
|
+
- lib/vedeu/output/buffer/composition.rb
|
263
|
+
- lib/vedeu/output/buffer/formatting.rb
|
264
|
+
- lib/vedeu/output/buffer/interface.rb
|
265
|
+
- lib/vedeu/output/buffer/line.rb
|
266
|
+
- lib/vedeu/output/buffer/parser.rb
|
267
|
+
- lib/vedeu/output/buffer/stream.rb
|
268
|
+
- lib/vedeu/output/buffer/style.rb
|
260
269
|
- lib/vedeu/output/colour.rb
|
270
|
+
- lib/vedeu/output/colour_pair.rb
|
261
271
|
- lib/vedeu/output/compositor.rb
|
262
272
|
- lib/vedeu/output/cursor.rb
|
263
273
|
- lib/vedeu/output/directive.rb
|
@@ -267,6 +277,7 @@ files:
|
|
267
277
|
- lib/vedeu/output/layer.rb
|
268
278
|
- lib/vedeu/output/output.rb
|
269
279
|
- lib/vedeu/output/position.rb
|
280
|
+
- lib/vedeu/output/renderer.rb
|
270
281
|
- lib/vedeu/output/style.rb
|
271
282
|
- lib/vedeu/output/translator.rb
|
272
283
|
- lib/vedeu/output/wordwrap.rb
|
@@ -289,6 +300,13 @@ files:
|
|
289
300
|
- test/lib/vedeu/launcher_test.rb
|
290
301
|
- test/lib/vedeu/output/background_test.rb
|
291
302
|
- test/lib/vedeu/output/base_test.rb
|
303
|
+
- test/lib/vedeu/output/buffer/composition_test.rb
|
304
|
+
- test/lib/vedeu/output/buffer/interface_test.rb
|
305
|
+
- test/lib/vedeu/output/buffer/line_test.rb
|
306
|
+
- test/lib/vedeu/output/buffer/parser_test.rb
|
307
|
+
- test/lib/vedeu/output/buffer/stream_test.rb
|
308
|
+
- test/lib/vedeu/output/buffer/style_test.rb
|
309
|
+
- test/lib/vedeu/output/colour_pair_test.rb
|
292
310
|
- test/lib/vedeu/output/colour_test.rb
|
293
311
|
- test/lib/vedeu/output/compositor_test.rb
|
294
312
|
- test/lib/vedeu/output/cursor_test.rb
|
@@ -299,6 +317,7 @@ files:
|
|
299
317
|
- test/lib/vedeu/output/layer_test.rb
|
300
318
|
- test/lib/vedeu/output/output_test.rb
|
301
319
|
- test/lib/vedeu/output/position_test.rb
|
320
|
+
- test/lib/vedeu/output/renderer_test.rb
|
302
321
|
- test/lib/vedeu/output/style_test.rb
|
303
322
|
- test/lib/vedeu/output/translator_test.rb
|
304
323
|
- test/lib/vedeu/output/wordwrap_test.rb
|
@@ -318,6 +337,9 @@ files:
|
|
318
337
|
- test/lib/vedeu/version_test.rb
|
319
338
|
- test/lib/vedeu_test.rb
|
320
339
|
- test/support/colours.rb
|
340
|
+
- test/support/composition.json
|
341
|
+
- test/support/composition.rb
|
342
|
+
- test/support/composition.xml
|
321
343
|
- test/test_helper.rb
|
322
344
|
- vedeu.gemspec
|
323
345
|
homepage: http://www.gavinlaking.name/
|
@@ -353,6 +375,13 @@ test_files:
|
|
353
375
|
- test/lib/vedeu/launcher_test.rb
|
354
376
|
- test/lib/vedeu/output/background_test.rb
|
355
377
|
- test/lib/vedeu/output/base_test.rb
|
378
|
+
- test/lib/vedeu/output/buffer/composition_test.rb
|
379
|
+
- test/lib/vedeu/output/buffer/interface_test.rb
|
380
|
+
- test/lib/vedeu/output/buffer/line_test.rb
|
381
|
+
- test/lib/vedeu/output/buffer/parser_test.rb
|
382
|
+
- test/lib/vedeu/output/buffer/stream_test.rb
|
383
|
+
- test/lib/vedeu/output/buffer/style_test.rb
|
384
|
+
- test/lib/vedeu/output/colour_pair_test.rb
|
356
385
|
- test/lib/vedeu/output/colour_test.rb
|
357
386
|
- test/lib/vedeu/output/compositor_test.rb
|
358
387
|
- test/lib/vedeu/output/cursor_test.rb
|
@@ -363,6 +392,7 @@ test_files:
|
|
363
392
|
- test/lib/vedeu/output/layer_test.rb
|
364
393
|
- test/lib/vedeu/output/output_test.rb
|
365
394
|
- test/lib/vedeu/output/position_test.rb
|
395
|
+
- test/lib/vedeu/output/renderer_test.rb
|
366
396
|
- test/lib/vedeu/output/style_test.rb
|
367
397
|
- test/lib/vedeu/output/translator_test.rb
|
368
398
|
- test/lib/vedeu/output/wordwrap_test.rb
|
@@ -382,5 +412,8 @@ test_files:
|
|
382
412
|
- test/lib/vedeu/version_test.rb
|
383
413
|
- test/lib/vedeu_test.rb
|
384
414
|
- test/support/colours.rb
|
415
|
+
- test/support/composition.json
|
416
|
+
- test/support/composition.rb
|
417
|
+
- test/support/composition.xml
|
385
418
|
- test/test_helper.rb
|
386
419
|
has_rdoc:
|