vedeu 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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