vedeu 0.0.22 → 0.0.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/bin/composition +12 -0
  3. data/lib/vedeu/output/buffer/composition.rb +9 -0
  4. data/lib/vedeu/output/buffer/formatting.rb +29 -0
  5. data/lib/vedeu/output/buffer/interface.rb +14 -0
  6. data/lib/vedeu/output/buffer/line.rb +14 -0
  7. data/lib/vedeu/output/buffer/parser.rb +28 -0
  8. data/lib/vedeu/output/buffer/stream.rb +14 -0
  9. data/lib/vedeu/output/buffer/style.rb +11 -0
  10. data/lib/vedeu/output/colour_pair.rb +43 -0
  11. data/lib/vedeu/output/compositor.rb +1 -9
  12. data/lib/vedeu/output/directive.rb +10 -11
  13. data/lib/vedeu/output/esc.rb +4 -3
  14. data/lib/vedeu/output/renderer.rb +6 -0
  15. data/lib/vedeu/output/style.rb +2 -2
  16. data/lib/vedeu/repository/interface.rb +1 -1
  17. data/lib/vedeu/version.rb +1 -1
  18. data/lib/vedeu.rb +11 -1
  19. data/test/lib/vedeu/output/buffer/composition_test.rb +20 -0
  20. data/test/lib/vedeu/output/buffer/interface_test.rb +24 -0
  21. data/test/lib/vedeu/output/buffer/line_test.rb +39 -0
  22. data/test/lib/vedeu/output/buffer/parser_test.rb +58 -0
  23. data/test/lib/vedeu/output/buffer/stream_test.rb +39 -0
  24. data/test/lib/vedeu/output/buffer/style_test.rb +8 -0
  25. data/test/lib/vedeu/output/colour_pair_test.rb +104 -0
  26. data/test/lib/vedeu/output/compositor_test.rb +45 -13
  27. data/test/lib/vedeu/output/directive_test.rb +1 -1
  28. data/test/lib/vedeu/output/esc_test.rb +14 -2
  29. data/test/lib/vedeu/output/output_test.rb +1 -1
  30. data/test/lib/vedeu/output/renderer_test.rb +13 -0
  31. data/test/lib/vedeu/output/style_test.rb +9 -9
  32. data/test/support/composition.json +47 -0
  33. data/test/support/composition.rb +5 -0
  34. data/test/support/composition.xml +36 -0
  35. data/test/test_helper.rb +1 -1
  36. data/vedeu.gemspec +1 -1
  37. metadata +37 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e848f5366e26266f101ad5e5fb0c3e0e724fc7f
4
- data.tar.gz: e611d426fecc958f335acb8fc54c5a4d697e6638
3
+ metadata.gz: ce06977605476701c2ac6f998a0af92fd38d5206
4
+ data.tar.gz: 5a72b5086a86d4af8871d7318e07bce64fca2af7
5
5
  SHA512:
6
- metadata.gz: 165c47a59cfb6f52a3237c00b459c0aa0d38b8e797a3e8665c4686418da37aac4fc035f51aaee6e12e0c269fa04e276be15187acfa6b2546e692643726b0136c
7
- data.tar.gz: 8e8e62514882dcfc5e71a6a4e425e3ac7633adc66ffae289e131535959751ac01a6a80a73712c399ed2c556e6441f510805f72cbf1ed1441f84df89173b83102
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,9 @@
1
+ module Vedeu
2
+ module Buffer
3
+ class Composition
4
+ include Virtus.model
5
+
6
+ attribute :interface, Array[Buffer::Interface]
7
+ end
8
+ end
9
+ end
@@ -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,14 @@
1
+ module Vedeu
2
+ module Buffer
3
+ class Interface
4
+ include Virtus.model
5
+
6
+ attribute :name, String
7
+ attribute :line, Array[Buffer::Line]
8
+
9
+ def to_compositor
10
+ line.map(&:to_compositor)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Vedeu
2
+ module Buffer
3
+ class Line
4
+ include Virtus.model
5
+ include Formatting
6
+
7
+ attribute :stream, Array[Buffer::Stream]
8
+
9
+ def to_compositor
10
+ [{ style: styles, colour: colour }, *stream.map(&:to_compositor)]
11
+ end
12
+ end
13
+ end
14
+ 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,14 @@
1
+ module Vedeu
2
+ module Buffer
3
+ class Stream
4
+ include Virtus.model
5
+ include Formatting
6
+
7
+ attribute :text, String, default: ''
8
+
9
+ def to_compositor
10
+ { style: styles, colour: colour, text: text }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Vedeu
2
+ module Buffer
3
+ class Style < Virtus::Attribute
4
+ def coerce(value)
5
+ if value.is_a?(::String) && !value.empty?
6
+ value.split(/ /).map(&:to_sym)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ 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
- return wordwrap if string?
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,
@@ -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
@@ -0,0 +1,6 @@
1
+ module Vedeu
2
+ class Renderer
3
+ def initialize
4
+ end
5
+ end
6
+ end
@@ -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.reset
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
@@ -42,7 +42,7 @@ module Vedeu
42
42
  private
43
43
 
44
44
  def initial_state
45
- { name => Array.new(geometry.height) { [''] } }
45
+ { name => Array.new(geometry.height) { [{ text: '' }] } }
46
46
  end
47
47
 
48
48
  def layer_attr
data/lib/vedeu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Vedeu
2
- VERSION = '0.0.22'
2
+ VERSION = '0.0.23'
3
3
  end
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,8 @@
1
+ require_relative '../../../../test_helper'
2
+
3
+ module Vedeu
4
+ module Buffer
5
+ describe Style do
6
+ end
7
+ end
8
+ 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) { described_class.new(attributes).arrange }
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...Some more tex...\e[0m\e[38;2;39m\e[48;2;49m\e[?25h",
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] }, 'Some text...', { colour: :default }]
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] }, 'Some text...'],
140
- [{ colour: [:blue, :yellow] }, 'Some more text...']
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) { [[{ style: :bold }, 'Some text...', { style: :bold_off }]] }
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: :inverse }, 'Some text...'],
179
- [{ style: :underline }, 'Some more text...']
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) { [[{ style: :unknown }, 'Some text...']] }
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
@@ -74,7 +74,7 @@ module Vedeu
74
74
  let(:style) { [:normal, :underline, :normal] }
75
75
 
76
76
  it 'returns an escape sequence' do
77
- subject.must_equal("\e[0m\e[4m\e[0m")
77
+ subject.must_equal("\e[24m\e[21m\e[27m\e[4m\e[24m\e[21m\e[27m")
78
78
  end
79
79
  end
80
80
  end
@@ -88,8 +88,8 @@ module Vedeu
88
88
  end
89
89
  end
90
90
 
91
- describe '.inverse' do
92
- let(:subject) { described_class.inverse }
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
@@ -30,7 +30,7 @@ module Vedeu
30
30
  ]
31
31
  }
32
32
 
33
- before { Compositor.arrange({ 'dummy' => 'Testing Output.render' }) }
33
+ before { Compositor.arrange({ 'dummy' => [[{ text: 'Testing Output.render' }]] }) }
34
34
 
35
35
  it { subject.must_equal(output) }
36
36
  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[0m")
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,5 @@
1
+ require 'pry'
2
+
3
+ json = File.read('./composition.json')
4
+ hash = Yajl::Parser.parse(json)
5
+ comp = Vedeu::Composition.new(hash)
@@ -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
@@ -31,6 +31,6 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'rubocop'
32
32
  spec.add_development_dependency 'simplecov', '0.8.2'
33
33
 
34
+ spec.add_dependency "oj"
34
35
  spec.add_dependency "virtus"
35
- spec.add_dependency "yajl-ruby"
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vedeu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.22
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-21 00:00:00.000000000 Z
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: virtus
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: yajl-ruby
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: