vedeu 0.5.4 → 0.5.5

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.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/docs/dsl.md +3 -3
  3. data/examples/borders_app.rb +2 -0
  4. data/examples/colours_app.rb +2 -0
  5. data/examples/configuration_app.rb +2 -0
  6. data/examples/drb_app.rb +2 -0
  7. data/examples/focus_app.rb +2 -0
  8. data/examples/hello_world.rb +2 -0
  9. data/examples/material_colours_app.rb +2 -0
  10. data/lib/vedeu.rb +2 -0
  11. data/lib/vedeu/all.rb +4 -13
  12. data/lib/vedeu/api.rb +7 -6
  13. data/lib/vedeu/borders/border.rb +1 -1
  14. data/lib/vedeu/borders/render_border.rb +18 -18
  15. data/lib/vedeu/buffers/buffer.rb +18 -28
  16. data/lib/vedeu/colours/colour.rb +1 -1
  17. data/lib/vedeu/colours/colour_translator.rb +1 -1
  18. data/lib/vedeu/cursor/cursor.rb +9 -6
  19. data/lib/vedeu/dsl/border.rb +1 -1
  20. data/lib/vedeu/dsl/composition.rb +5 -5
  21. data/lib/vedeu/dsl/geometry.rb +1 -1
  22. data/lib/vedeu/dsl/group.rb +1 -1
  23. data/lib/vedeu/dsl/interface.rb +69 -93
  24. data/lib/vedeu/dsl/keymap.rb +1 -1
  25. data/lib/vedeu/dsl/line.rb +11 -11
  26. data/lib/vedeu/dsl/shared.rb +81 -0
  27. data/lib/vedeu/dsl/stream.rb +3 -3
  28. data/lib/vedeu/dsl/view.rb +76 -64
  29. data/lib/vedeu/models/escape.rb +1 -1
  30. data/lib/vedeu/models/interface.rb +3 -57
  31. data/lib/vedeu/models/menu.rb +1 -1
  32. data/lib/vedeu/models/views/all.rb +22 -0
  33. data/lib/vedeu/models/views/char.rb +175 -0
  34. data/lib/vedeu/models/views/chars.rb +13 -0
  35. data/lib/vedeu/models/views/composition.rb +73 -0
  36. data/lib/vedeu/models/views/line.rb +111 -0
  37. data/lib/vedeu/models/views/lines.rb +13 -0
  38. data/lib/vedeu/models/views/stream.rb +122 -0
  39. data/lib/vedeu/models/views/streams.rb +13 -0
  40. data/lib/vedeu/models/views/view.rb +157 -0
  41. data/lib/vedeu/models/views/view_collection.rb +13 -0
  42. data/lib/vedeu/null/view.rb +67 -0
  43. data/lib/vedeu/output/clear/named_interface.rb +4 -4
  44. data/lib/vedeu/output/compressor.rb +6 -6
  45. data/lib/vedeu/output/html_char.rb +6 -6
  46. data/lib/vedeu/output/output.rb +3 -3
  47. data/lib/vedeu/output/presentation.rb +1 -1
  48. data/lib/vedeu/output/renderers/escape_sequence.rb +1 -1
  49. data/lib/vedeu/output/renderers/file.rb +1 -1
  50. data/lib/vedeu/output/renderers/html.rb +3 -3
  51. data/lib/vedeu/output/renderers/json.rb +4 -4
  52. data/lib/vedeu/output/renderers/null.rb +1 -1
  53. data/lib/vedeu/output/renderers/terminal.rb +5 -5
  54. data/lib/vedeu/output/renderers/text.rb +3 -3
  55. data/lib/vedeu/output/style.rb +1 -1
  56. data/lib/vedeu/output/text.rb +20 -15
  57. data/lib/vedeu/output/viewport.rb +16 -23
  58. data/lib/vedeu/output/virtual_buffer.rb +9 -8
  59. data/lib/vedeu/output/virtual_terminal.rb +11 -11
  60. data/lib/vedeu/output/wordwrap.rb +5 -5
  61. data/lib/vedeu/runtime/application.rb +1 -1
  62. data/lib/vedeu/runtime/main_loop.rb +1 -1
  63. data/lib/vedeu/templating/helpers.rb +11 -10
  64. data/lib/vedeu/templating/template.rb +1 -1
  65. data/lib/vedeu/templating/view_template.rb +6 -6
  66. data/lib/vedeu/version.rb +1 -2
  67. data/test/lib/vedeu/api_test.rb +30 -30
  68. data/test/lib/vedeu/buffers/buffer_test.rb +5 -139
  69. data/test/lib/vedeu/colours/colour_translator_test.rb +3 -3
  70. data/test/lib/vedeu/configuration/api_test.rb +3 -3
  71. data/test/lib/vedeu/cursor/refresh_cursor_test.rb +1 -1
  72. data/test/lib/vedeu/dsl/composition_test.rb +7 -7
  73. data/test/lib/vedeu/dsl/group_test.rb +2 -2
  74. data/test/lib/vedeu/dsl/interface_test.rb +31 -21
  75. data/test/lib/vedeu/dsl/keymap_test.rb +4 -4
  76. data/test/lib/vedeu/dsl/line_test.rb +8 -8
  77. data/test/lib/vedeu/dsl/stream_test.rb +4 -4
  78. data/test/lib/vedeu/dsl/text_test.rb +11 -11
  79. data/test/lib/vedeu/dsl/view_test.rb +24 -29
  80. data/test/lib/vedeu/geometry/grid_test.rb +4 -4
  81. data/test/lib/vedeu/input/key_test.rb +1 -1
  82. data/test/lib/vedeu/internal_api_test.rb +18 -18
  83. data/test/lib/vedeu/models/focus_test.rb +54 -54
  84. data/test/lib/vedeu/models/interface_test.rb +11 -105
  85. data/test/lib/vedeu/models/menu_test.rb +1 -1
  86. data/test/lib/vedeu/models/views/char_test.rb +257 -0
  87. data/test/lib/vedeu/models/views/chars_test.rb +22 -0
  88. data/test/lib/vedeu/models/views/composition_test.rb +61 -0
  89. data/test/lib/vedeu/models/views/line_test.rb +189 -0
  90. data/test/lib/vedeu/models/views/lines_test.rb +22 -0
  91. data/test/lib/vedeu/models/views/stream_test.rb +138 -0
  92. data/test/lib/vedeu/models/views/streams_test.rb +22 -0
  93. data/test/lib/vedeu/models/views/view_test.rb +40 -0
  94. data/test/lib/vedeu/null/view_test.rb +12 -0
  95. data/test/lib/vedeu/output/clear/named_interface_test.rb +4 -4
  96. data/test/lib/vedeu/output/compressor_test.rb +28 -28
  97. data/test/lib/vedeu/output/html_char_test.rb +2 -2
  98. data/test/lib/vedeu/output/presentation_test.rb +10 -14
  99. data/test/lib/vedeu/output/renderers/escape_sequence_test.rb +20 -4
  100. data/test/lib/vedeu/output/renderers/html_test.rb +4 -4
  101. data/test/lib/vedeu/output/renderers/json_test.rb +3 -3
  102. data/test/lib/vedeu/output/text_test.rb +10 -10
  103. data/test/lib/vedeu/output/viewport_test.rb +21 -23
  104. data/test/lib/vedeu/output/virtual_buffer_test.rb +1 -1
  105. data/test/lib/vedeu/output/virtual_terminal_test.rb +1 -1
  106. data/test/lib/vedeu/output/wordwrap_test.rb +9 -9
  107. data/test/lib/vedeu/repositories/repository_test.rb +2 -2
  108. data/test/lib/vedeu/templating/helpers_test.rb +6 -39
  109. data/test/lib/vedeu/templating/template_test.rb +2 -2
  110. data/test/lib/vedeu/templating/view_template_test.rb +91 -91
  111. data/test/lib/vedeu/terminal_test.rb +1 -1
  112. metadata +33 -27
  113. data/lib/vedeu/buffers/display_buffer.rb +0 -39
  114. data/lib/vedeu/models/char.rb +0 -170
  115. data/lib/vedeu/models/chars.rb +0 -9
  116. data/lib/vedeu/models/composition.rb +0 -66
  117. data/lib/vedeu/models/line.rb +0 -112
  118. data/lib/vedeu/models/lines.rb +0 -9
  119. data/lib/vedeu/models/stream.rb +0 -122
  120. data/lib/vedeu/models/streams.rb +0 -9
  121. data/test/lib/vedeu/buffers/display_buffer_test.rb +0 -61
  122. data/test/lib/vedeu/models/char_test.rb +0 -253
  123. data/test/lib/vedeu/models/chars_test.rb +0 -18
  124. data/test/lib/vedeu/models/composition_test.rb +0 -57
  125. data/test/lib/vedeu/models/line_test.rb +0 -189
  126. data/test/lib/vedeu/models/lines_test.rb +0 -18
  127. data/test/lib/vedeu/models/stream_test.rb +0 -141
  128. data/test/lib/vedeu/models/streams_test.rb +0 -18
@@ -1,112 +0,0 @@
1
- module Vedeu
2
-
3
- # A Line represents a single row of the terminal. It is a container for
4
- # {Vedeu::Stream} objects. A line's width is determined by the
5
- # {Vedeu::Interface} it belongs to.
6
- #
7
- class Line
8
-
9
- include Vedeu::Model
10
- include Vedeu::Presentation
11
-
12
- collection Vedeu::Streams
13
- member Vedeu::Stream
14
-
15
- # @!attribute [rw] parent
16
- # @return [Vedeu::Interface]
17
- attr_accessor :parent
18
-
19
- # @!attribute [r] attributes
20
- # @return [Hash]
21
- attr_reader :attributes
22
-
23
- # Returns a new instance of Vedeu::Line.
24
- #
25
- # @param attributes [Hash]
26
- # @option attributes streams [Vedeu::Streams]
27
- # @option attributes parent [Vedeu::Interface]
28
- # @option attributes colour [Vedeu::Colour]
29
- # @option attributes style [Vedeu::Style]
30
- # @return [Vedeu::Line]
31
- def initialize(attributes = {})
32
- @attributes = defaults.merge!(attributes)
33
-
34
- @attributes.each { |key, value| instance_variable_set("@#{key}", value) }
35
- end
36
-
37
- # @param child [void]
38
- # @return [void]
39
- def add(child)
40
- @_streams = @streams = collection.coerce(streams, self).add(child)
41
- end
42
- alias_method :<<, :add
43
-
44
- # Returns an array of all the characters with formatting for this line.
45
- #
46
- # @return [Array]
47
- # @see Vedeu::Stream
48
- def chars
49
- return [] if empty?
50
-
51
- @chars ||= streams.flat_map(&:chars)
52
- end
53
-
54
- # Returns a boolean indicating whether the line has content.
55
- #
56
- # @return [Boolean]
57
- def empty?
58
- streams.empty?
59
- end
60
-
61
- # An object is equal when its values are the same.
62
- #
63
- # @param other [Vedeu::Collection]
64
- # @return [Boolean]
65
- def eql?(other)
66
- self.class == other.class && streams == other.streams
67
- end
68
- alias_method :==, :eql?
69
-
70
- # @return [NilClass|String]
71
- def name
72
- parent.name if parent
73
- end
74
-
75
- # Returns the size of the content in characters without formatting.
76
- #
77
- # @return [Fixnum]
78
- def size
79
- streams.map(&:size).inject(0, :+)
80
- end
81
-
82
- # @return [Vedeu::Streams]
83
- def streams
84
- @_streams ||= collection.coerce(@streams, self)
85
- end
86
- alias_method :value, :streams
87
-
88
- # Delegate to Vedeu::Interface#width when available.
89
- #
90
- # @return [Fixnum]
91
- def width
92
- parent.width if parent
93
- end
94
-
95
- private
96
-
97
- # The default values for a new instance of this class.
98
- #
99
- # @return [Hash]
100
- def defaults
101
- {
102
- client: nil,
103
- colour: nil,
104
- parent: nil,
105
- streams: [],
106
- style: nil,
107
- }
108
- end
109
-
110
- end # Line
111
-
112
- end # Vedeu
@@ -1,9 +0,0 @@
1
- module Vedeu
2
-
3
- # A collection of {Vedeu::Line} instances.
4
- #
5
- class Lines < Vedeu::Collection
6
-
7
- end # Lines
8
-
9
- end # Vedeu
@@ -1,122 +0,0 @@
1
- module Vedeu
2
-
3
- # A Stream can represent a character or collection of characters as part of a
4
- # {Vedeu::Line} which you wish to colour and style independently of the other
5
- # characters in that line.
6
- #
7
- class Stream
8
-
9
- include Vedeu::Model
10
- include Vedeu::Presentation
11
-
12
- collection Vedeu::Chars
13
- member Vedeu::Char
14
-
15
- # @!attribute [rw] parent
16
- # @return [Vedeu::Line]
17
- attr_accessor :parent
18
-
19
- # @!attribute [rw] value
20
- # @return [String]
21
- attr_accessor :value
22
- alias_method :content, :value
23
- alias_method :data, :value
24
- alias_method :text, :value
25
-
26
- # @!attribute [r] attributes
27
- # @return [Hash]
28
- attr_reader :attributes
29
-
30
- # Returns a new instance of Vedeu::Stream.
31
- #
32
- # @param attributes [Hash]
33
- # @option attributes value [String]
34
- # @option attributes parent [Vedeu::Line]
35
- # @option attributes colour [Vedeu::Colour]
36
- # @option attributes style [Vedeu::Style]
37
- # @return [Vedeu::Stream]
38
- def initialize(attributes = {})
39
- @attributes = defaults.merge!(attributes)
40
-
41
- @attributes.each { |key, value| instance_variable_set("@#{key}", value) }
42
- end
43
-
44
- # @param child [Vedeu::Stream]
45
- # @return [Vedeu::Streams]
46
- def add(child)
47
- parent.add(child)
48
- end
49
- alias_method :<<, :add
50
-
51
- # Returns an array of characters, each element is the escape sequences of
52
- # colours and styles for this stream, the character itself, and the escape
53
- # sequences of colours and styles for the parent of the stream
54
- # ({Vedeu::Line}).
55
- #
56
- # @return [Array]
57
- def chars
58
- return [] if empty?
59
-
60
- @chars ||= value.chars.map do |char|
61
- member.new(value: char,
62
- parent: parent,
63
- colour: colour,
64
- style: style,
65
- position: nil)
66
- end
67
- end
68
-
69
- # Returns a boolean indicating whether the stream has content.
70
- #
71
- # @return [Boolean]
72
- def empty?
73
- value.empty?
74
- end
75
-
76
- # An object is equal when its values are the same.
77
- #
78
- # @param other [Vedeu::Char]
79
- # @return [Boolean]
80
- def eql?(other)
81
- self.class == other.class && value == other.value &&
82
- colour == other.colour && style == other.style && parent == other.parent
83
- end
84
- alias_method :==, :eql?
85
-
86
- # @return [NilClass|String]
87
- def name
88
- parent.name if parent
89
- end
90
-
91
- # Returns the size of the content in characters without formatting.
92
- #
93
- # @return [Fixnum]
94
- def size
95
- value.size
96
- end
97
-
98
- # Delegate to Vedeu::Line#width when available.
99
- #
100
- # @return [Fixnum]
101
- def width
102
- parent.width if parent
103
- end
104
-
105
- private
106
-
107
- # The default values for a new instance of this class.
108
- #
109
- # @return [Hash]
110
- def defaults
111
- {
112
- client: nil,
113
- colour: nil,
114
- parent: nil,
115
- style: nil,
116
- value: '',
117
- }
118
- end
119
-
120
- end # Stream
121
-
122
- end # Vedeu
@@ -1,9 +0,0 @@
1
- module Vedeu
2
-
3
- # A collection of {Vedeu::Stream} instances.
4
- #
5
- class Streams < Vedeu::Collection
6
-
7
- end # Streams
8
-
9
- end # Vedeu
@@ -1,61 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- class TestInterfaceModel
6
- include Vedeu::Model
7
- include Vedeu::DisplayBuffer
8
-
9
- def colour
10
- Vedeu::Colour.new(background: '#000000', foreground: '#ffffff')
11
- end
12
-
13
- def name
14
- 'test_interface_model'
15
- end
16
-
17
- def style
18
- Vedeu::Style.new(:normal)
19
- end
20
-
21
- private
22
-
23
- def repository
24
- Vedeu.interfaces
25
- end
26
- end
27
-
28
- describe DisplayBuffer do
29
-
30
- let(:described) { Vedeu::DisplayBuffer }
31
- let(:example_model) { Vedeu::TestInterfaceModel }
32
- let(:example_instance) { example_model.new }
33
-
34
- before {
35
- example_instance.store
36
-
37
- Vedeu::Refresh.stubs(:by_name)
38
- }
39
- after { Vedeu.interfaces.reset }
40
-
41
- describe '#store_immediate' do
42
- subject { example_instance.store_immediate }
43
-
44
- it { subject.must_be_instance_of(example_model) }
45
- end
46
-
47
- describe '#store_deferred' do
48
- subject { example_instance.store_deferred }
49
-
50
- it { subject.must_be_instance_of(example_model) }
51
-
52
- context 'when the name is not defined' do
53
- before { example_instance.stubs(:name) }
54
-
55
- it { proc { subject }.must_raise(InvalidSyntax) }
56
- end
57
- end
58
-
59
- end # DisplayBuffer
60
-
61
- end # Vedeu
@@ -1,253 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Vedeu
4
-
5
- describe Char do
6
-
7
- let(:described) { Vedeu::Char }
8
- let(:instance) { described.new(attributes) }
9
- let(:attributes) {
10
- {
11
- border: border,
12
- colour: colour,
13
- parent: parent,
14
- position: position,
15
- style: style,
16
- value: _value,
17
- }
18
- }
19
- let(:_value) { 'a' }
20
- let(:parent) { Vedeu::Line.new(parent_attributes) }
21
- let(:parent_attributes) {
22
- {
23
- streams: [],
24
- parent: nil,
25
- colour: parent_colour,
26
- style: parent_style,
27
- }
28
- }
29
- let(:border) { nil }
30
- let(:colour) { nil }
31
- let(:style) { nil }
32
- let(:position) { nil }
33
- let(:parent_colour) { nil }
34
- let(:parent_style) { nil }
35
-
36
- describe '#initialize' do
37
- it { instance.must_be_instance_of(described) }
38
- it { instance.instance_variable_get('@border').must_equal(border) }
39
- it { instance.instance_variable_get('@parent').must_equal(parent) }
40
- it { instance.instance_variable_get('@value').must_equal(_value) }
41
-
42
- it { instance.must_respond_to(:value) }
43
- end
44
-
45
- describe 'accessors' do
46
- it { instance.must_respond_to(:border) }
47
- it { instance.must_respond_to(:border=) }
48
- it { instance.must_respond_to(:parent) }
49
- it { instance.must_respond_to(:parent=) }
50
- it { instance.must_respond_to(:attributes) }
51
- it { instance.must_respond_to(:value=) }
52
- end
53
-
54
- describe '#chars' do
55
- subject { instance.chars }
56
-
57
- it { subject.must_be_instance_of(Array) }
58
- end
59
-
60
- describe '#eql?' do
61
- let(:other) { instance }
62
-
63
- subject { instance.eql?(other) }
64
-
65
- it { subject.must_equal(true) }
66
-
67
- context 'when different to other' do
68
- let(:other) { described.new(value: 'b') }
69
-
70
- it { subject.must_equal(false) }
71
- end
72
- end
73
-
74
- describe '#inspect' do
75
- let(:colour) { Vedeu::Colour.new(foreground: '#00ff00',
76
- background: '#005500') }
77
- let(:position) { Vedeu::Position[17, 2] }
78
- let(:style) { Vedeu::Style.new('underline') }
79
-
80
-
81
- subject { instance.inspect }
82
-
83
- it { subject.must_equal(
84
- "<Vedeu::Char '" \
85
- "\\e[17;2H" \
86
- "\\e[38;2;0;255;0m" \
87
- "\\e[48;2;0;85;0m" \
88
- "\\e[4ma" \
89
- "'>"
90
- ) }
91
- end
92
-
93
- describe '#position' do
94
- subject { instance.position }
95
- end
96
-
97
- describe '#position=' do
98
- subject { instance.position=(value) }
99
- end
100
-
101
- describe '#to_hash' do
102
- subject { instance.to_hash }
103
-
104
- it { subject.must_be_instance_of(Hash) }
105
-
106
- it { subject.must_equal(
107
- border: '',
108
- colour: {
109
- background: '',
110
- foreground: '',
111
- },
112
- parent: {
113
- background: '',
114
- foreground: '',
115
- style: '',
116
- },
117
- position: {
118
- y: nil,
119
- x: nil
120
- },
121
- style: '',
122
- value: 'a')
123
- }
124
- end
125
-
126
- describe '#to_html' do
127
- subject { instance.to_html }
128
-
129
- it { subject.must_be_instance_of(String) }
130
- end
131
-
132
- describe '#to_s' do
133
- subject { instance.to_s }
134
-
135
- it { subject.must_be_instance_of(String) }
136
-
137
- context 'when a position is specified' do
138
- let(:position) { Vedeu::Position[17, 2] }
139
-
140
- it { subject.must_equal("\e[17;2Ha") }
141
- end
142
-
143
- context 'when a position is not specified' do
144
- let(:position) {}
145
-
146
- it { subject.must_equal('a') }
147
- end
148
-
149
- context 'when a colour is specified' do
150
- let(:colour) { Vedeu::Colour.new(foreground: '#00ff00',
151
- background: '#005500') }
152
-
153
- context 'and a parent colour is specified' do
154
- let(:parent_colour) { Vedeu::Colour.new(foreground: '#ff0000',
155
- background: '#550000') }
156
-
157
- it { subject.must_equal("\e[38;2;0;255;0m\e[48;2;0;85;0ma") }
158
- end
159
-
160
- context 'and a parent colour is not specified' do
161
- let(:parent_colour) {}
162
-
163
- it { subject.must_equal("\e[38;2;0;255;0m\e[48;2;0;85;0ma") }
164
- end
165
- end
166
-
167
- context 'when a colour is not specified' do
168
- let(:colour) {}
169
-
170
- it { subject.must_equal('a') }
171
- end
172
-
173
- context 'when a style is specified' do
174
- let(:style) { Vedeu::Style.new('underline') }
175
-
176
- context 'when a parent style is specified' do
177
- let(:parent_style) { Vedeu::Style.new('bold') }
178
-
179
- it { subject.must_equal("\e[4ma") }
180
- end
181
-
182
- context 'when a parent style is not specified' do
183
- let(:parent_style) {}
184
-
185
- it { subject.must_equal("\e[4ma") }
186
- end
187
- end
188
-
189
- context 'when a style is not specified' do
190
- let(:style) {}
191
-
192
- it { subject.must_equal('a') }
193
- end
194
-
195
- context 'when the value is nil' do
196
- let(:_value) {}
197
-
198
- it { subject.must_equal('') }
199
- end
200
- end
201
-
202
- describe '#value' do
203
- subject { instance.value }
204
-
205
- it { subject.must_be_instance_of(String) }
206
-
207
- context 'when the border attribute is defined' do
208
- let(:border) { :top_left }
209
- let(:_value) { "\x6C" }
210
-
211
- it { subject.must_equal("\e(0l\e(B") }
212
- end
213
-
214
- context 'when the border attributes is not defined' do
215
- it { subject.must_equal('a') }
216
- end
217
- end
218
-
219
- describe '#x' do
220
- let(:position) { Vedeu::Position[17, 2] }
221
-
222
- subject { instance.x }
223
-
224
- context 'when a position is set' do
225
- it { subject.must_equal(2) }
226
- end
227
-
228
- context 'when a position is not set' do
229
- let(:position) {}
230
-
231
- it { subject.must_equal(nil) }
232
- end
233
- end
234
-
235
- describe '#y' do
236
- let(:position) { Vedeu::Position[17, 2] }
237
-
238
- subject { instance.y }
239
-
240
- context 'when a position is set' do
241
- it { subject.must_equal(17) }
242
- end
243
-
244
- context 'when a position is not set' do
245
- let(:position) {}
246
-
247
- it { subject.must_equal(nil) }
248
- end
249
- end
250
-
251
- end # Char
252
-
253
- end # Vedeu