vedeu 0.3.0 → 0.3.1

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/examples/borders_app.rb +60 -56
  3. data/lib/vedeu/buffers/all.rb +1 -0
  4. data/lib/vedeu/configuration/configuration.rb +2 -4
  5. data/lib/vedeu/cursor/all.rb +3 -6
  6. data/lib/vedeu/cursor/cursor.rb +4 -3
  7. data/lib/vedeu/cursor/move_cursor.rb +7 -4
  8. data/lib/vedeu/cursor/toggle_cursor.rb +0 -1
  9. data/lib/vedeu/dsl/components/border.rb +99 -0
  10. data/lib/vedeu/dsl/components/geometry.rb +1 -0
  11. data/lib/vedeu/dsl/components/keymap.rb +1 -1
  12. data/lib/vedeu/dsl/composition.rb +7 -12
  13. data/lib/vedeu/dsl/interface.rb +7 -8
  14. data/lib/vedeu/dsl/line.rb +1 -10
  15. data/lib/vedeu/dsl/stream.rb +0 -2
  16. data/lib/vedeu/input/key.rb +10 -6
  17. data/lib/vedeu/input/keymap.rb +10 -8
  18. data/lib/vedeu/models/menu.rb +0 -2
  19. data/lib/vedeu/models/model.rb +20 -0
  20. data/lib/vedeu/models/view/composition.rb +4 -17
  21. data/lib/vedeu/models/view/interface.rb +9 -21
  22. data/lib/vedeu/models/view/line.rb +4 -17
  23. data/lib/vedeu/models/view/stream.rb +4 -17
  24. data/lib/vedeu/output/all.rb +1 -0
  25. data/lib/vedeu/output/border.rb +2 -2
  26. data/lib/vedeu/output/compositor.rb +0 -4
  27. data/lib/vedeu/output/wordwrap.rb +146 -0
  28. data/lib/vedeu/repositories/repository.rb +3 -2
  29. data/lib/vedeu/support/console.rb +29 -6
  30. data/lib/vedeu/support/content_geometry.rb +2 -0
  31. data/lib/vedeu/support/coordinate.rb +9 -4
  32. data/lib/vedeu/support/position_validator.rb +28 -7
  33. data/lib/vedeu/support/sentence.rb +21 -1
  34. data/lib/vedeu/support/terminal.rb +0 -2
  35. data/lib/vedeu/support/trace.rb +48 -2
  36. data/lib/vedeu/support/visible.rb +2 -0
  37. data/test/lib/vedeu/cursor/all_test.rb +1 -1
  38. data/test/lib/vedeu/events/event_test.rb +7 -29
  39. data/test/lib/vedeu/input/key_test.rb +3 -3
  40. data/test/lib/vedeu/input/keymap_test.rb +3 -3
  41. data/test/lib/vedeu/output/wordwrap_test.rb +266 -0
  42. data/test/lib/vedeu/presentation/colour_test.rb +68 -33
  43. data/test/lib/vedeu/support/common_test.rb +10 -0
  44. data/test/lib/vedeu/support/console_test.rb +82 -0
  45. data/test/lib/vedeu/support/position_validator_test.rb +13 -0
  46. data/test/support/helpers/all.rb +0 -1
  47. data/vedeu.gemspec +8 -8
  48. metadata +19 -18
  49. data/test/support/helpers/misc.rb +0 -15
@@ -1,5 +1,4 @@
1
1
  require 'vedeu/dsl/shared/all'
2
- require 'vedeu/support/common'
3
2
 
4
3
  module Vedeu
5
4
 
@@ -37,7 +36,6 @@ module Vedeu
37
36
  # @api public
38
37
  class Line
39
38
 
40
- include Vedeu::Common
41
39
  include Vedeu::DSL
42
40
  include Vedeu::DSL::Colour
43
41
  include Vedeu::DSL::Style
@@ -105,7 +103,7 @@ module Vedeu
105
103
  def streams(&block)
106
104
  fail InvalidSyntax, 'block not given' unless block_given?
107
105
 
108
- model.add(child.build(attributes, &block))
106
+ model.add(model.member.build(attributes, &block))
109
107
  end
110
108
  alias_method :stream, :streams
111
109
 
@@ -121,13 +119,6 @@ module Vedeu
121
119
  }
122
120
  end
123
121
 
124
- # Return the class name for the children on this model.
125
- #
126
- # @return [Class]
127
- def child
128
- Vedeu::Stream
129
- end
130
-
131
122
  end # Line
132
123
 
133
124
  end # DSL
@@ -1,5 +1,4 @@
1
1
  require 'vedeu/dsl/shared/all'
2
- require 'vedeu/support/common'
3
2
 
4
3
  module Vedeu
5
4
 
@@ -10,7 +9,6 @@ module Vedeu
10
9
  # @api public
11
10
  class Stream
12
11
 
13
- include Vedeu::Common
14
12
  include Vedeu::DSL
15
13
  include Vedeu::DSL::Colour
16
14
  include Vedeu::DSL::Style
@@ -5,13 +5,17 @@ module Vedeu
5
5
  #
6
6
  class Key
7
7
 
8
- # Creates a new instance of Key.
9
- #
10
- # @see Vedeu::Key#initialize
11
- def self.define(input = nil, &block)
12
- fail InvalidSyntax, 'block not given' unless block_given?
8
+ class << self
9
+
10
+ # Creates a new instance of Key.
11
+ #
12
+ # @see Vedeu::Key#initialize
13
+ def build(input = nil, &block)
14
+ fail InvalidSyntax, 'block not given' unless block_given?
15
+
16
+ new(input, &block)
17
+ end
13
18
 
14
- new(input, &block)
15
19
  end
16
20
 
17
21
  # Returns a new instance of Key.
@@ -1,5 +1,4 @@
1
1
  require 'vedeu/exceptions'
2
- require 'vedeu/support/common'
3
2
  require 'vedeu/models/model'
4
3
  require 'vedeu/dsl/components/keymap'
5
4
 
@@ -7,15 +6,16 @@ module Vedeu
7
6
 
8
7
  class Keymap
9
8
 
10
- include Vedeu::Common
11
9
  include Vedeu::Model
12
10
 
11
+ collection Vedeu::Keys
12
+ member Vedeu::Key
13
+
13
14
  attr_accessor :name
14
- attr_reader :keys, :repository
15
+ attr_reader :repository
15
16
 
16
17
  class << self
17
18
 
18
-
19
19
  # @option attributes client []
20
20
  # @option attributes keys []
21
21
  # @option attributes name []
@@ -81,7 +81,7 @@ module Vedeu
81
81
  # @return [Vedeu::Keymap]
82
82
  def initialize(name = '', keys = [], repository = nil)
83
83
  @name = name
84
- @keys = Vedeu::Model::Collection.coerce(keys)
84
+ @keys = keys
85
85
  @repository = repository || Vedeu.keymaps
86
86
  end
87
87
 
@@ -89,10 +89,12 @@ module Vedeu
89
89
  def add(key)
90
90
  return false unless valid?(key)
91
91
 
92
- @keys << key
92
+ @keys = keys.add(key)
93
+ end
93
94
 
94
- # immutable Keymap version:
95
- # self.new(name, @keys += [key]).store if valid?(key)
95
+ # @return [Vedeu::Keys]
96
+ def keys
97
+ collection.coerce(@keys, self)
96
98
  end
97
99
 
98
100
  # @param input [String|Symbol]
@@ -1,5 +1,4 @@
1
1
  require 'vedeu/models/model'
2
- require 'vedeu/support/common'
3
2
 
4
3
  module Vedeu
5
4
 
@@ -9,7 +8,6 @@ module Vedeu
9
8
  # @api private
10
9
  class Menu
11
10
 
12
- include Vedeu::Common
13
11
  include Vedeu::Model
14
12
 
15
13
  attr_accessor :collection
@@ -8,6 +8,25 @@ module Vedeu
8
8
 
9
9
  attr_reader :repository
10
10
 
11
+ module ClassMethods
12
+
13
+ # Provide a convenient way to define the child or children of a model.
14
+ #
15
+ # @param klass [Class] The member (singular) or collection (multiple)
16
+ # class name for the respective model.
17
+ # @return []
18
+ def child(klass)
19
+ send(:define_method, __callee__) { klass }
20
+ end
21
+ alias_method :member, :child
22
+ alias_method :collection, :child
23
+
24
+ end # ClassMethods
25
+
26
+ def self.included(klass)
27
+ klass.send :extend, ClassMethods
28
+ end
29
+
11
30
  # Returns a DSL instance responsible for defining the DSL methods of this
12
31
  # model.
13
32
  #
@@ -20,6 +39,7 @@ module Vedeu
20
39
  Object.const_get(dsl_class).new(self, client)
21
40
  end
22
41
 
42
+ # @todo Perhaps some validation could be added here?
23
43
  # @return [void] The model instance stored in the repository.
24
44
  def store
25
45
  repository.store(self) # if valid?
@@ -16,6 +16,9 @@ module Vedeu
16
16
  include Vedeu::Presentation
17
17
  include Vedeu::Model
18
18
 
19
+ collection Vedeu::Interfaces
20
+ member Vedeu::Interface
21
+
19
22
  attr_reader :interfaces
20
23
  alias_method :value, :interfaces
21
24
 
@@ -77,23 +80,7 @@ module Vedeu
77
80
 
78
81
  # @return [Vedeu::Interfaces]
79
82
  def interfaces
80
- children.coerce(@interfaces, self)
81
- end
82
-
83
- private
84
-
85
- # Return the class name for the children on this model.
86
- #
87
- # @return [Class]
88
- def child
89
- Vedeu::Interface
90
- end
91
-
92
- # Return the class name for the children on this model.
93
- #
94
- # @return [Class]
95
- def children
96
- Vedeu::Interfaces
83
+ collection.coerce(@interfaces, self)
97
84
  end
98
85
 
99
86
  end # Composition
@@ -1,4 +1,3 @@
1
- require 'vedeu/support/common'
2
1
  require 'vedeu/support/content_geometry'
3
2
  require 'vedeu/models/model'
4
3
  require 'vedeu/presentation/presentation'
@@ -6,6 +5,7 @@ require 'vedeu/buffers/display_buffer'
6
5
  require 'vedeu/buffers/buffer'
7
6
 
8
7
  require 'vedeu/models/view/lines'
8
+ require 'vedeu/models/view/line'
9
9
 
10
10
  module Vedeu
11
11
 
@@ -18,11 +18,13 @@ module Vedeu
18
18
 
19
19
  extend Forwardable
20
20
 
21
- include Vedeu::Common
22
21
  include Vedeu::Model
23
22
  include Vedeu::Presentation
24
23
  include Vedeu::DisplayBuffer
25
24
 
25
+ collection Vedeu::Lines
26
+ member Vedeu::Line
27
+
26
28
  attr_accessor :border,
27
29
  :colour,
28
30
  :delay,
@@ -155,7 +157,7 @@ module Vedeu
155
157
 
156
158
  # @return [Vedeu::Lines]
157
159
  def lines
158
- children.coerce(@lines, self)
160
+ collection.coerce(@lines, self)
159
161
  end
160
162
  alias_method :content, :lines
161
163
  alias_method :value, :lines
@@ -167,9 +169,11 @@ module Vedeu
167
169
  lines.any?
168
170
  end
169
171
 
170
- # @return []
172
+ # Renders the interface with a border if one is defined.
173
+ #
174
+ # @return [Array]
171
175
  def render
172
- if border
176
+ if border?
173
177
  border.render
174
178
 
175
179
  else
@@ -194,22 +198,6 @@ module Vedeu
194
198
  Vedeu::Viewport.show(self)
195
199
  end
196
200
 
197
- private
198
-
199
- # Return the class name for the children on this model.
200
- #
201
- # @return [Class]
202
- def child
203
- Vedeu::Line
204
- end
205
-
206
- # Return the class name for the children on this model.
207
- #
208
- # @return [Class]
209
- def children
210
- Vedeu::Lines
211
- end
212
-
213
201
  end # Interface
214
202
 
215
203
  end # Vedeu
@@ -15,6 +15,9 @@ module Vedeu
15
15
  include Vedeu::Model
16
16
  include Vedeu::Presentation
17
17
 
18
+ collection Vedeu::Streams
19
+ member Vedeu::Stream
20
+
18
21
  attr_accessor :parent,
19
22
  :streams
20
23
 
@@ -103,7 +106,7 @@ module Vedeu
103
106
 
104
107
  # @return [Vedeu::Streams]
105
108
  def streams
106
- children.coerce(@streams, self)
109
+ collection.coerce(@streams, self)
107
110
  end
108
111
 
109
112
  # Delegate to Vedeu::Interface#width if available.
@@ -113,22 +116,6 @@ module Vedeu
113
116
  parent.width if parent
114
117
  end
115
118
 
116
- private
117
-
118
- # Return the class name for the children on this model.
119
- #
120
- # @return [Class]
121
- def child
122
- Vedeu::Stream
123
- end
124
-
125
- # Return the class name for the children on this model.
126
- #
127
- # @return [Class]
128
- def children
129
- Vedeu::Streams
130
- end
131
-
132
119
  end # Line
133
120
 
134
121
  end # Vedeu
@@ -13,6 +13,9 @@ module Vedeu
13
13
  include Vedeu::Model
14
14
  include Vedeu::Presentation
15
15
 
16
+ collection Vedeu::Chars
17
+ member Vedeu::Char
18
+
16
19
  attr_accessor :parent,
17
20
  :value
18
21
 
@@ -85,7 +88,7 @@ module Vedeu
85
88
  return [] if value.empty?
86
89
 
87
90
  value.chars.map do |char|
88
- child.new(char, parent, colour, style, nil).to_s
91
+ member.new(char, parent, colour, style, nil).to_s
89
92
  end
90
93
  end
91
94
 
@@ -123,22 +126,6 @@ module Vedeu
123
126
  parent.width if parent
124
127
  end
125
128
 
126
- private
127
-
128
- # Return the class name for the children on this model.
129
- #
130
- # @return [Class]
131
- def child
132
- Vedeu::Char
133
- end
134
-
135
- # Return the class name for the collection of children on this model.
136
- #
137
- # @return [Class]
138
- def children
139
- Vedeu::Chars
140
- end
141
-
142
129
  end # Stream
143
130
 
144
131
  end # Vedeu
@@ -2,6 +2,7 @@ require 'vedeu/output/border'
2
2
  require 'vedeu/output/compositor'
3
3
  require 'vedeu/output/output'
4
4
  require 'vedeu/output/viewport'
5
+ require 'vedeu/output/wordwrap'
5
6
  require 'vedeu/output/writer'
6
7
 
7
8
  module Vedeu
@@ -124,14 +124,14 @@ module Vedeu
124
124
 
125
125
  # Set the border colour.
126
126
  #
127
- # @return []
127
+ # @return [Vedeu::Colour]
128
128
  def colour=(value)
129
129
  @colour = Colour.coerce(value)
130
130
  end
131
131
 
132
132
  # Set the border style.
133
133
  #
134
- # @return []
134
+ # @return [Vedeu::Style]
135
135
  def style=(value)
136
136
  @style = Style.coerce(value)
137
137
  end
@@ -1,5 +1,3 @@
1
- require 'vedeu/support/common'
2
-
3
1
  module Vedeu
4
2
 
5
3
  # Before the content of the buffer can be output to the terminal, if there are
@@ -14,8 +12,6 @@ module Vedeu
14
12
  # @api private
15
13
  class Compositor
16
14
 
17
- include Vedeu::Common
18
-
19
15
  # Convenience method to initialize a new Compositor and call its {#compose}
20
16
  # method.
21
17
  #
@@ -0,0 +1,146 @@
1
+ module Vedeu
2
+
3
+ class Wordwrap
4
+
5
+ # @param text [String]
6
+ # @param options [Hash]
7
+ # @option options ellipsis [String]
8
+ # @option options width [Fixnum]
9
+ # @return [Vedeu::Wordwrap]
10
+ def initialize(text, options = {})
11
+ @text = text
12
+ @options = defaults.merge(options)
13
+ end
14
+
15
+ # @return [Array<String>|String]
16
+ def prune
17
+ return text if text.size <= pruned_width
18
+
19
+ processed = []
20
+
21
+ if split_lines.size > 1
22
+ processed = split_lines.reduce([]) do |acc, line|
23
+ acc << ellipsis_string(line)
24
+ end
25
+
26
+ else
27
+ processed = ellipsis_string(text)
28
+
29
+ end
30
+
31
+ processed
32
+ end
33
+
34
+ # @return [String]
35
+ def wrap
36
+ processed = []
37
+ text.split(/\n/).map do |unprocessed|
38
+ line_length = 0
39
+ reformatted = []
40
+
41
+ unprocessed.split(/\s/).map do |word|
42
+ word_length = word.length + 1
43
+
44
+ if (line_length += word_length) >= width
45
+ line_length = word_length
46
+ processed << reformatted
47
+ reformatted = []
48
+ end
49
+
50
+ reformatted << word
51
+ end
52
+
53
+ processed << reformatted
54
+ end
55
+
56
+ processed.reduce([]) do |output, line|
57
+ output << line.join(' ')
58
+ end
59
+ end
60
+
61
+ def as_lines
62
+ if __callee__ == :prune_as_lines
63
+ to_line_objects(prune)
64
+
65
+ elsif __callee__ == :wrap_as_lines
66
+ to_line_objects(wrap)
67
+
68
+ else
69
+ to_line_objects(split_lines)
70
+
71
+ end
72
+ end
73
+ alias_method :prune_as_lines, :as_lines
74
+ alias_method :wrap_as_lines, :as_lines
75
+
76
+ private
77
+
78
+ attr_reader :text, :options
79
+
80
+ # @param text_as_lines [Array<String>]
81
+ # @return [Vedeu::Lines]
82
+ def to_line_objects(text_as_lines)
83
+ line_objects = Array(text_as_lines).map do |text_line|
84
+ stream = Vedeu::Stream.new(text_line)
85
+ line = Vedeu::Line.new
86
+ stream.parent = line
87
+ line.add(stream)
88
+ line
89
+ end
90
+ Vedeu::Lines.new(line_objects)
91
+ end
92
+
93
+ # @return [Array<String>]
94
+ def split_lines
95
+ text.split(/\n/)
96
+ end
97
+
98
+ # @return [String]
99
+ def output
100
+ processed.reduce([]) do |output, line|
101
+ output << line.join(' ')
102
+ end.join("\n")
103
+ end
104
+
105
+ # @return [String]
106
+ def ellipsis_string(string)
107
+ if string.size < ellipsis.size
108
+ prune_string(string)
109
+
110
+ else
111
+ [prune_string(string), ellipsis].join
112
+
113
+ end
114
+ end
115
+
116
+ # @return [String]
117
+ def prune_string(string)
118
+ string.chomp.slice(0..pruned_width)
119
+ end
120
+
121
+ # @return [Fixnum]
122
+ def pruned_width
123
+ width - ellipsis.size
124
+ end
125
+
126
+ # @return [String]
127
+ def ellipsis
128
+ options.fetch(:ellipsis)
129
+ end
130
+
131
+ # @return [Fixnum]
132
+ def width
133
+ options.fetch(:width)
134
+ end
135
+
136
+ # @return [Hash]
137
+ def defaults
138
+ {
139
+ ellipsis: '...',
140
+ width: 70,
141
+ }
142
+ end
143
+
144
+ end # Wordwrap
145
+
146
+ end # Vedeu
@@ -123,8 +123,9 @@ module Vedeu
123
123
 
124
124
  end
125
125
  end
126
- alias_method :destroy, :remove
127
- alias_method :delete, :remove
126
+ alias_method :destroy, :remove
127
+ alias_method :delete, :remove
128
+ alias_method :deregister, :remove
128
129
 
129
130
  # Reset the repository.
130
131
  #
@@ -5,12 +5,6 @@ module Vedeu
5
5
 
6
6
  class Console
7
7
 
8
- attr_reader :height,
9
- :width
10
-
11
- alias_method :yn, :height
12
- alias_method :xn, :width
13
-
14
8
  # @param height [Fixnum]
15
9
  # @param width [Fixnum]
16
10
  def initialize(height = 25, width = 80)
@@ -56,17 +50,46 @@ module Vedeu
56
50
  centre.last
57
51
  end
58
52
 
53
+ # @param block [Proc]
54
+ # @return [Proc]
55
+ def cooked(&block)
56
+ yield
57
+ end
58
+
59
+ # @return [Fixnum]
60
+ def height
61
+ @height
62
+ end
63
+ alias_method :tyn, :height
64
+ alias_method :yn, :height
65
+
59
66
  # @return [Fixnum]
60
67
  def origin
61
68
  1
62
69
  end
63
70
  alias_method :x, :origin
64
71
  alias_method :y, :origin
72
+ alias_method :tx, :origin
73
+ alias_method :ty, :origin
74
+
75
+ # @param block [Proc]
76
+ # @return [Proc]
77
+ def raw(&block)
78
+ yield
79
+ end
65
80
 
66
81
  # @return [Array]
67
82
  def size
68
83
  [height, width]
69
84
  end
85
+ alias_method :winsize, :size
86
+
87
+ # @return [Fixnum]
88
+ def width
89
+ @width
90
+ end
91
+ alias_method :txn, :width
92
+ alias_method :xn, :width
70
93
 
71
94
  end # Console
72
95
 
@@ -15,6 +15,8 @@ module Vedeu
15
15
  :x,
16
16
  :y
17
17
 
18
+ # @param interface [Vedeu::Interface]
19
+ # @return [Vedeu::ContentGeometry]
18
20
  def initialize(interface)
19
21
  @interface = interface
20
22
  end
@@ -4,10 +4,15 @@ module Vedeu
4
4
  class Coordinate
5
5
 
6
6
  attr_reader :height,
7
- :width,
8
- :x,
9
- :y
10
-
7
+ :width,
8
+ :x,
9
+ :y
10
+
11
+ # @param height [Fixnum]
12
+ # @param width [Fixnum]
13
+ # @param x [Fixnum]
14
+ # @param y [Fixnum]
15
+ # @return [Vedeu::Coordinate]
11
16
  def initialize(height, width, x, y)
12
17
  @height = height
13
18
  @width = width