vedeu 0.2.10 → 0.2.11

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/docs/events.md +6 -0
  3. data/examples/{cursor_app/cursor_app.rb → cursor_app.rb} +1 -1
  4. data/examples/{lines_app/lines_app.rb → lines_app.rb} +1 -1
  5. data/lib/vedeu.rb +48 -28
  6. data/lib/vedeu/api/api.rb +8 -95
  7. data/lib/vedeu/application.rb +6 -2
  8. data/lib/vedeu/{models → colours}/background.rb +1 -1
  9. data/lib/vedeu/{models → colours}/colour.rb +0 -0
  10. data/lib/vedeu/{models → colours}/foreground.rb +2 -2
  11. data/lib/vedeu/{support/colour_translator.rb → colours/translator.rb} +7 -7
  12. data/lib/vedeu/input/input.rb +13 -5
  13. data/lib/vedeu/models/geometry.rb +30 -2
  14. data/lib/vedeu/models/key.rb +39 -0
  15. data/lib/vedeu/output/compositor.rb +30 -76
  16. data/lib/vedeu/output/output.rb +74 -0
  17. data/lib/vedeu/output/viewport.rb +36 -44
  18. data/lib/vedeu/repositories/buffers.rb +5 -18
  19. data/lib/vedeu/repositories/cursors.rb +16 -8
  20. data/lib/vedeu/repositories/events.rb +96 -9
  21. data/lib/vedeu/repositories/focus.rb +21 -20
  22. data/lib/vedeu/repositories/groups.rb +3 -11
  23. data/lib/vedeu/repositories/interfaces.rb +6 -9
  24. data/lib/vedeu/repositories/keymaps.rb +8 -3
  25. data/lib/vedeu/repositories/menus.rb +6 -21
  26. data/lib/vedeu/{models → repositories/models}/buffer.rb +62 -28
  27. data/lib/vedeu/{models → repositories/models}/cursor.rb +8 -2
  28. data/lib/vedeu/{models → repositories/models}/event.rb +7 -0
  29. data/lib/vedeu/repositories/models/group.rb +56 -0
  30. data/lib/vedeu/{models → repositories/models}/interface.rb +6 -0
  31. data/lib/vedeu/{models → repositories/models}/keymap.rb +7 -1
  32. data/lib/vedeu/{models → repositories/models}/menu.rb +9 -0
  33. data/lib/vedeu/{models → repositories/models}/offset.rb +8 -1
  34. data/lib/vedeu/repositories/offsets.rb +17 -12
  35. data/lib/vedeu/support/bounding_area.rb +127 -0
  36. data/lib/vedeu/support/common.rb +8 -0
  37. data/lib/vedeu/support/exceptions.rb +2 -12
  38. data/lib/vedeu/support/model.rb +14 -0
  39. data/lib/vedeu/support/refresh.rb +8 -7
  40. data/lib/vedeu/support/registrar.rb +7 -1
  41. data/lib/vedeu/support/repository.rb +31 -10
  42. data/lib/vedeu/support/sentence.rb +67 -0
  43. data/lib/vedeu/support/terminal.rb +19 -0
  44. data/lib/vedeu/support/trace.rb +2 -5
  45. data/test/integration/api/api_test.rb +97 -0
  46. data/test/integration/api_dsl/dsl_api_test.rb +4 -0
  47. data/test/integration/api_dsl/dsl_composition_test.rb +4 -0
  48. data/test/integration/api_dsl/dsl_defined_test.rb +4 -0
  49. data/test/integration/api_dsl/dsl_helpers_test.rb +4 -0
  50. data/test/integration/api_dsl/dsl_interface_test.rb +4 -0
  51. data/test/integration/api_dsl/dsl_keymap.rb +4 -0
  52. data/test/integration/api_dsl/dsl_line_test.rb +4 -0
  53. data/test/integration/api_dsl/dsl_menu_test.rb +4 -0
  54. data/test/integration/api_dsl/dsl_stream_test.rb +138 -0
  55. data/test/lib/vedeu/api/api_test.rb +1 -25
  56. data/test/lib/vedeu/api/helpers_test.rb +0 -10
  57. data/test/lib/vedeu/{models → colours}/background_test.rb +0 -0
  58. data/test/lib/vedeu/{models → colours}/colour_test.rb +0 -0
  59. data/test/lib/vedeu/{models → colours}/foreground_test.rb +0 -0
  60. data/test/lib/vedeu/{support/colour_translator_test.rb → colours/translator_test.rb} +3 -3
  61. data/test/lib/vedeu/input/input_test.rb +16 -47
  62. data/test/lib/vedeu/models/geometry_test.rb +46 -0
  63. data/test/lib/vedeu/models/group_test.rb +99 -0
  64. data/test/lib/vedeu/models/key_test.rb +41 -0
  65. data/test/lib/vedeu/output/compositor_test.rb +25 -101
  66. data/test/lib/vedeu/output/output_test.rb +108 -0
  67. data/test/lib/vedeu/repositories/buffers_test.rb +0 -8
  68. data/test/lib/vedeu/repositories/cursors_test.rb +34 -0
  69. data/test/lib/vedeu/repositories/focus_test.rb +37 -28
  70. data/test/lib/vedeu/repositories/interfaces_test.rb +1 -1
  71. data/test/lib/vedeu/repositories/keymaps_test.rb +6 -20
  72. data/test/lib/vedeu/repositories/menus_test.rb +0 -6
  73. data/test/lib/vedeu/{models → repositories/models}/buffer_test.rb +24 -27
  74. data/test/lib/vedeu/{models → repositories/models}/cursor_test.rb +0 -0
  75. data/test/lib/vedeu/{models → repositories/models}/event_test.rb +0 -0
  76. data/test/lib/vedeu/{models → repositories/models}/interface_test.rb +0 -0
  77. data/test/lib/vedeu/{models → repositories/models}/keymap_test.rb +0 -0
  78. data/test/lib/vedeu/{models → repositories/models}/menu_test.rb +0 -0
  79. data/test/lib/vedeu/{models → repositories/models}/offset_test.rb +0 -0
  80. data/test/lib/vedeu/support/bounding_area_test.rb +139 -0
  81. data/test/lib/vedeu/support/coercions_test.rb +6 -17
  82. data/test/lib/vedeu/support/grid_test.rb +1 -1
  83. data/test/lib/vedeu/support/model_test.rb +23 -0
  84. data/test/lib/vedeu/support/presentation_test.rb +0 -10
  85. data/test/lib/vedeu/support/refresh_test.rb +2 -2
  86. data/test/lib/vedeu/support/repository_test.rb +63 -64
  87. data/test/lib/vedeu/support/sentence_test.rb +48 -0
  88. data/test/lib/vedeu/support/terminal_test.rb +86 -6
  89. data/test/support/test_classes/all.rb +5 -0
  90. data/test/support/test_classes/coercions.rb +16 -0
  91. data/test/support/test_classes/helpers.rb +19 -0
  92. data/test/support/test_classes/model.rb +23 -0
  93. data/test/support/test_classes/presentation.rb +16 -0
  94. data/test/support/test_classes/repositories.rb +26 -0
  95. data/test/support/test_modules/all.rb +1 -0
  96. data/test/support/test_modules/repository.rb +16 -0
  97. data/test/test_helper.rb +4 -0
  98. data/vedeu.gemspec +3 -3
  99. metadata +95 -50
  100. data/lib/vedeu/output/clear.rb +0 -88
  101. data/lib/vedeu/output/render.rb +0 -50
  102. data/lib/vedeu/repositories/positional.rb +0 -23
  103. data/test/lib/vedeu/output/clear_test.rb +0 -56
  104. data/test/lib/vedeu/output/render_test.rb +0 -100
  105. data/test/lib/vedeu/repositories/positional_test.rb +0 -50
@@ -8,9 +8,6 @@ module Vedeu
8
8
  include Common
9
9
  extend self
10
10
 
11
- # System event to refresh all registered interfaces.
12
- Vedeu.event(:_refresh_) { Vedeu::Refresh.all }
13
-
14
11
  # Refresh all registered interfaces.
15
12
  #
16
13
  # @return [Array]
@@ -28,7 +25,7 @@ module Vedeu
28
25
  # Refresh an interface, or collection of interfaces belonging to a group.
29
26
  #
30
27
  # @param group_name [String] The name of the group to be refreshed.
31
- # @return [Array|GroupNotFound] A collection of the names of interfaces
28
+ # @return [Array|ModelNotFound] A collection of the names of interfaces
32
29
  # refreshed, or an exception if the group was not found.
33
30
  def by_group(group_name)
34
31
  Groups.find(group_name).each { |name| by_name(name) }
@@ -36,10 +33,14 @@ module Vedeu
36
33
 
37
34
  # Refresh an interface by name.
38
35
  #
39
- # @param name [String] The name of the interface to be refreshed.
40
- # @return [Array|BufferNotFound]
36
+ # @param name [String] The name of the interface to be refreshed using the
37
+ # named buffer.
38
+ # @return [Array|ModelNotFound]
41
39
  def by_name(name)
42
- Compositor.render(name)
40
+ interface = Interfaces.find(name)
41
+ buffer = Buffers.find(name)
42
+
43
+ Compositor.compose(interface, buffer)
43
44
  end
44
45
 
45
46
  # Register a refresh event for an interface or group of interfaces by name.
@@ -6,7 +6,7 @@ module Vedeu
6
6
  # @api private
7
7
  class Registrar
8
8
 
9
- REPOSITORIES = [Buffers, Cursors, Focus, Groups, Interfaces, Offsets]
9
+ REPOSITORIES = [Buffers, Cursors, Groups, Interfaces, Offsets]
10
10
 
11
11
  # @param attributes [Hash]
12
12
  # @return [TrueClass|MissingRequired]
@@ -33,6 +33,8 @@ module Vedeu
33
33
  #
34
34
  # @return [TrueClass|MissingRequired]
35
35
  def record
36
+ focus
37
+
36
38
  REPOSITORIES.each { |repository| repository.add(attributes) }
37
39
 
38
40
  true
@@ -42,6 +44,10 @@ module Vedeu
42
44
 
43
45
  attr_reader :attributes
44
46
 
47
+ def focus
48
+ Focus.add(attributes[:name], attributes[:focus])
49
+ end
50
+
45
51
  end # Registrar
46
52
 
47
53
  end # Vedeu
@@ -14,7 +14,14 @@ module Vedeu
14
14
  storage
15
15
  end
16
16
 
17
- # Find the entity attributes by name.
17
+ # Return a boolean indicating whether the storage is empty.
18
+ #
19
+ # @return [Boolean]
20
+ def empty?
21
+ storage.empty?
22
+ end
23
+
24
+ # Find the model attributes by name.
18
25
  #
19
26
  # @param name [String]
20
27
  # @return [Hash]
@@ -22,16 +29,15 @@ module Vedeu
22
29
  storage.fetch(name) { not_found(name) }
23
30
  end
24
31
 
25
- # Find entity by named interface, registers an entity by interface name if
26
- # not found.
32
+ # Find a model by name, registers the model by name if not found.
27
33
  #
28
34
  # @param name [String]
29
35
  # @return [Cursor|Offset]
30
36
  def find_or_create(name)
31
37
  storage.fetch(name) do
32
- Vedeu.log("Entity (#{entity}) not found, registering: '#{name}'")
38
+ Vedeu.log("Model (#{model}) not found, registering: '#{name}'")
33
39
 
34
- storage.store(name, entity.new({ name: name }))
40
+ model.new({ name: name }).store
35
41
  end
36
42
  end
37
43
 
@@ -39,7 +45,7 @@ module Vedeu
39
45
  #
40
46
  # @return [Array]
41
47
  def registered
42
- return [] if storage.empty?
48
+ return [] if empty?
43
49
 
44
50
  return storage.keys if storage.is_a?(Hash)
45
51
  return storage.to_a if storage.is_a?(Set)
@@ -47,23 +53,23 @@ module Vedeu
47
53
  storage
48
54
  end
49
55
 
50
- # Returns a boolean indicating whether the named entity is registered.
56
+ # Returns a boolean indicating whether the named model is registered.
51
57
  #
52
58
  # @param name [String]
53
59
  # @return [Boolean]
54
60
  def registered?(name)
55
- return false if storage.empty?
61
+ return false if empty?
56
62
 
57
63
  storage.include?(name)
58
64
  end
59
65
 
60
- # Returns the storage with the named entity removed, or false if the entity
66
+ # Returns the storage with the named model removed, or false if the model
61
67
  # does not exist.
62
68
  #
63
69
  # @param name [String]
64
70
  # @return [Hash|FalseClass]
65
71
  def remove(name)
66
- return false if storage.empty?
72
+ return false if empty?
67
73
 
68
74
  if registered?(name)
69
75
  storage.delete(name)
@@ -84,6 +90,14 @@ module Vedeu
84
90
  @_storage = in_memory
85
91
  end
86
92
 
93
+ # Stores the model instance by name in the repository of the model.
94
+ #
95
+ # @param model [void] A model instance.
96
+ # @return [void] The model instance which was stored.
97
+ def store(model)
98
+ storage[model.name] = model
99
+ end
100
+
87
101
  private
88
102
 
89
103
  # @param method [Symbol]
@@ -94,6 +108,13 @@ module Vedeu
94
108
  'Updating'
95
109
  end
96
110
 
111
+ # @param name [String]
112
+ # @raise [ModelNotFound] When the model cannot be found with this name.
113
+ # @return [ModelNotFound]
114
+ def not_found(name)
115
+ fail ModelNotFound, "Cannot find model by name: '#{name}'"
116
+ end
117
+
97
118
  # Access to the storage for this repository.
98
119
  #
99
120
  # @return [Hash]
@@ -0,0 +1,67 @@
1
+ module Vedeu
2
+
3
+ class Sentence
4
+
5
+ class << self
6
+
7
+ def construct(elements, label = 'elements')
8
+ new(elements, label).construct
9
+ end
10
+
11
+ end # Sentence eigenclass
12
+
13
+ def initialize(elements, label)
14
+ @elements, @label = elements, label
15
+ end
16
+
17
+ def construct
18
+ if one?
19
+ first
20
+
21
+ elsif two?
22
+ elements.join(' and ')
23
+
24
+ elsif many?
25
+ [but_last, last].join(' and ')
26
+
27
+ else
28
+ "No #{label} have been assigned."
29
+
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :elements, :label
36
+
37
+ def one?
38
+ count == 1
39
+ end
40
+
41
+ def two?
42
+ count == 2
43
+ end
44
+
45
+ def many?
46
+ count > 2
47
+ end
48
+
49
+ def but_last
50
+ elements[0...-1].join(', ')
51
+ end
52
+
53
+ def first
54
+ elements.first
55
+ end
56
+
57
+ def last
58
+ elements[-1]
59
+ end
60
+
61
+ def count
62
+ elements.size
63
+ end
64
+
65
+ end # Sentence
66
+
67
+ end # Vedeu
@@ -51,6 +51,7 @@ module Vedeu
51
51
 
52
52
  end
53
53
  end
54
+ alias_method :read, :input
54
55
 
55
56
  # Prints the streams to the screen and returns the streams.
56
57
  #
@@ -170,20 +171,38 @@ module Vedeu
170
171
  centre.last
171
172
  end
172
173
 
174
+ # Returns 1. This 1 is either the top-most or left-most coordinate of the
175
+ # terminal.
176
+ #
177
+ # @return [Fixnum]
178
+ def origin
179
+ 1
180
+ end
181
+ alias_method :x, :origin
182
+ alias_method :y, :origin
183
+
173
184
  # Returns the total width (number of columns/characters) of the current
174
185
  # terminal.
175
186
  #
187
+ # @example
188
+ # Vedeu.width # => provides the width via the Vedeu API.
189
+ #
176
190
  # @return [Fixnum]
177
191
  def width
178
192
  size.last
179
193
  end
194
+ alias_method :xn, :width
180
195
 
181
196
  # Returns the total height (number of rows/lines) of the current terminal.
182
197
  #
198
+ # @example
199
+ # Vedeu.height # => provides the height via the Vedeu API.
200
+ #
183
201
  # @return [Fixnum]
184
202
  def height
185
203
  size.first
186
204
  end
205
+ alias_method :yn, :height
187
206
 
188
207
  # Returns a tuple containing the height and width of the current terminal.
189
208
  #
@@ -146,12 +146,9 @@ module Vedeu
146
146
  # @return [Set]
147
147
  def vedeu_exceptions
148
148
  Set.new [
149
- 'Vedeu::BufferNotFound',
150
- 'Vedeu::GroupNotFound',
151
- 'Vedeu::InterfaceNotFound',
149
+ 'Vedeu::ModelNotFound',
152
150
  'Vedeu::InvalidSyntax',
153
151
  'Vedeu::KeyInUse',
154
- 'Vedeu::MenuNotFound',
155
152
  'Vedeu::MissingRequired',
156
153
  'Vedeu::ModeSwitch',
157
154
  'Vedeu::NoInterfacesDefined',
@@ -174,7 +171,7 @@ module Vedeu
174
171
  # 'Vedeu::Clear',
175
172
  'Vedeu::Coercions',
176
173
  'Vedeu::Colour',
177
- 'Vedeu::ColourTranslator',
174
+ 'Vedeu::Translator',
178
175
  'Vedeu::Common',
179
176
  # 'Vedeu::Composition',
180
177
  # 'Vedeu::Compositor',
@@ -0,0 +1,97 @@
1
+ require 'test_helper'
2
+
3
+ describe 'Testing Vedeu::API methods' do
4
+
5
+ describe '.configure' do
6
+ it 'raises an exception when the required block is not given' do
7
+ proc { Vedeu.configure }.must_raise(Vedeu::InvalidSyntax)
8
+ end
9
+ end
10
+
11
+ describe '.defined' do
12
+ it 'returns the Vedeu::API::Defined module name' do
13
+ Vedeu.defined.must_equal(Vedeu::API::Defined)
14
+ end
15
+ end
16
+
17
+ describe '.event' do
18
+ it 'returns a list of event associated with the provided event name ' \
19
+ 'after adding the event' do
20
+ skip 'Need to mock an event'
21
+ Vedeu.event(:_hydrogen_event_).must_equal('')
22
+ end
23
+
24
+ it 'should raise an exception when the event name is nil or empty' do
25
+ skip 'Need to raise an exception'
26
+ Vedeu.event(nil).must_equal('')
27
+ end
28
+ end
29
+
30
+ describe '.focus' do
31
+ it 'raises an exception when the interface does not exist' do
32
+ proc { Vedeu.focus(nil) }.must_raise(Vedeu::ModelNotFound)
33
+ end
34
+
35
+ it 'raises an exception when the interface does not exist' do
36
+ proc { Vedeu.focus('not_defined') }.must_raise(Vedeu::ModelNotFound)
37
+ end
38
+
39
+ it 'sets the specified interface as in focus' do
40
+ skip 'Finish this test off'
41
+ Vedeu.focus('hydrogen')
42
+ end
43
+ end
44
+
45
+ describe '.height' do
46
+ before { Vedeu::Terminal.console.stubs(:winsize).returns([25, 80]) }
47
+
48
+ it 'returns the height of the terminal' do
49
+ Vedeu.height.must_equal(25)
50
+ end
51
+ end
52
+
53
+ describe '.interface' do
54
+ end
55
+
56
+ describe '.keypress' do
57
+ end
58
+
59
+ describe '.keys' do
60
+ end
61
+
62
+ describe '.log' do
63
+ end
64
+
65
+ describe '.menu' do
66
+ end
67
+
68
+ describe '.render' do
69
+ end
70
+
71
+ describe '.resize' do
72
+ end
73
+
74
+ describe '.trigger' do
75
+ end
76
+
77
+ describe '.unevent' do
78
+ end
79
+
80
+ describe '.use' do
81
+ end
82
+
83
+ describe '.view' do
84
+ end
85
+
86
+ describe '.views' do
87
+ end
88
+
89
+ describe '.width' do
90
+ before { Vedeu::Terminal.console.stubs(:winsize).returns([25, 80]) }
91
+
92
+ it 'returns the width of the terminal' do
93
+ Vedeu.width.must_equal(80)
94
+ end
95
+ end
96
+
97
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL API tests' do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Composition tests' do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Defined tests' do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Helpers tests' do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Interface tests' do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Keymap tests' do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Line tests' do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ describe 'DSL Menu tests' do
4
+ end