vedeu 0.8.4 → 0.8.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.
- checksums.yaml +4 -4
- data/TODO.md +4 -0
- data/docs/dsl.md +1 -11
- data/docs/dsl/by_method/geometry/align.md +1 -0
- data/docs/dsl/by_method/geometry/align_bottom.md +40 -0
- data/docs/dsl/by_method/geometry/align_centre.md +40 -0
- data/docs/dsl/by_method/geometry/align_left.md +40 -0
- data/docs/dsl/by_method/geometry/align_middle.md +40 -0
- data/docs/dsl/by_method/geometry/align_right.md +40 -0
- data/docs/dsl/by_method/geometry/align_top.md +40 -0
- data/docs/dsl/by_method/geometry/columns.md +1 -0
- data/docs/dsl/by_method/geometry/height.md +0 -0
- data/docs/dsl/by_method/geometry/horizontal_alignment.md +1 -0
- data/docs/dsl/by_method/geometry/rows.md +1 -0
- data/docs/dsl/by_method/geometry/vertical_alignment.md +1 -0
- data/docs/dsl/by_method/geometry/width.md +0 -0
- data/docs/dsl/by_method/geometry/x.md +1 -0
- data/docs/dsl/by_method/geometry/xn.md +1 -0
- data/docs/dsl/by_method/geometry/y.md +1 -0
- data/docs/dsl/by_method/geometry/yn.md +1 -0
- data/docs/dsl/by_method/render.md +5 -1
- data/docs/dsl/by_method/renders.md +31 -1
- data/docs/dsl/by_method/view.md +26 -0
- data/docs/dsl/by_method/view/stream.md +18 -0
- data/docs/dsl/by_method/views.md +32 -1
- data/docs/events/by_name/set_border_caption.md +2 -4
- data/docs/events/by_name/set_border_title.md +2 -4
- data/examples/views/empty_template.rb +0 -4
- data/examples/views/full_screen.rb +30 -5
- data/examples/views/misc_view.rb +464 -0
- data/examples/views/wordwrap.rb +72 -0
- data/examples/views/wordwrap.txt +8 -0
- data/integrations/dsl_app_021.rb +127 -0
- data/integrations/dsl_app_022.rb +133 -0
- data/integrations/expected/342_streams.out +1 -1
- data/integrations/expected/dsl_app_001.out +1 -1
- data/integrations/expected/dsl_app_002.out +1 -1
- data/integrations/expected/dsl_app_003.out +1 -1
- data/integrations/expected/dsl_app_004.out +1 -1
- data/integrations/expected/dsl_app_005.out +1 -1
- data/integrations/expected/dsl_app_006.out +1 -1
- data/integrations/expected/dsl_app_007.out +1 -1
- data/integrations/expected/dsl_app_008.out +1 -1
- data/integrations/expected/dsl_app_009.out +1 -1
- data/integrations/expected/dsl_app_010.out +1 -1
- data/integrations/expected/dsl_app_011.out +1 -1
- data/integrations/expected/dsl_app_012.out +1 -1
- data/integrations/expected/dsl_app_013.out +1 -1
- data/integrations/expected/dsl_app_014.out +1 -1
- data/integrations/expected/dsl_app_015.out +1 -1
- data/integrations/expected/dsl_app_016.out +1 -1
- data/integrations/expected/dsl_app_021.out +1 -0
- data/integrations/expected/dsl_app_022.out +1 -0
- data/integrations/support/test_interface_021.rb +7 -0
- data/integrations/support/test_interface_022.rb +15 -0
- data/lib/vedeu/all.rb +4 -2
- data/lib/vedeu/borders/border.rb +22 -6
- data/lib/vedeu/borders/repository.rb +4 -8
- data/lib/vedeu/buffers/buffer.rb +9 -6
- data/lib/vedeu/buffers/empty.rb +26 -23
- data/lib/vedeu/buffers/view.rb +44 -41
- data/lib/vedeu/cells/cursor.rb +0 -2
- data/lib/vedeu/cells/empty.rb +0 -1
- data/lib/vedeu/cells/escape.rb +0 -2
- data/lib/vedeu/coercers/alignment.rb +58 -8
- data/lib/vedeu/coercers/horizontal_alignment.rb +13 -9
- data/lib/vedeu/coercers/vertical_alignment.rb +13 -8
- data/lib/vedeu/common.rb +1 -1
- data/lib/vedeu/configuration/configuration.rb +41 -3
- data/lib/vedeu/cursors/coordinate.rb +1 -3
- data/lib/vedeu/cursors/cursor.rb +2 -6
- data/lib/vedeu/dsl/all.rb +1 -2
- data/lib/vedeu/dsl/border.rb +6 -6
- data/lib/vedeu/dsl/elements.rb +2 -2
- data/lib/vedeu/dsl/geometry.rb +7 -7
- data/lib/vedeu/dsl/{string → helpers}/align.rb +0 -0
- data/lib/vedeu/dsl/helpers/all.rb +17 -0
- data/lib/vedeu/dsl/{attributes.rb → helpers/attributes.rb} +0 -0
- data/lib/vedeu/dsl/{string → helpers}/text.rb +0 -0
- data/lib/vedeu/dsl/{string → helpers}/truncate.rb +0 -0
- data/lib/vedeu/dsl/{string → helpers}/wordwrap.rb +0 -0
- data/lib/vedeu/dsl/view.rb +11 -19
- data/lib/vedeu/dsl/views.rb +16 -106
- data/lib/vedeu/geometries/all.rb +0 -1
- data/lib/vedeu/geometries/area/area.rb +6 -12
- data/lib/vedeu/geometries/area/dimension.rb +21 -44
- data/lib/vedeu/geometries/dsl/all.rb +0 -1
- data/lib/vedeu/geometries/dsl/dsl.rb +22 -31
- data/lib/vedeu/geometries/geometry.rb +6 -0
- data/lib/vedeu/geometries/position.rb +6 -3
- data/lib/vedeu/geometries/repository.rb +1 -1
- data/lib/vedeu/input/mouse.rb +1 -0
- data/lib/vedeu/logging/log.rb +3 -6
- data/lib/vedeu/menus/dsl.rb +4 -5
- data/lib/vedeu/output/compressor.rb +11 -1
- data/lib/vedeu/output/viewport.rb +59 -59
- data/lib/vedeu/presentation/all.rb +1 -2
- data/lib/vedeu/presentation/colour.rb +75 -3
- data/lib/vedeu/{geometries/positionable.rb → presentation/position.rb} +4 -4
- data/lib/vedeu/presentation/presentation.rb +1 -3
- data/lib/vedeu/presentation/styles.rb +16 -1
- data/lib/vedeu/repositories/all.rb +0 -1
- data/lib/vedeu/sentence.rb +91 -0
- data/lib/vedeu/support/point.rb +72 -0
- data/lib/vedeu/terminal/terminal.rb +11 -53
- data/lib/vedeu/version.rb +1 -1
- data/lib/vedeu/views/composition.rb +11 -1
- data/lib/vedeu/views/default_attributes.rb +2 -0
- data/lib/vedeu/views/line.rb +16 -1
- data/lib/vedeu/views/stream.rb +16 -1
- data/lib/vedeu/views/view.rb +25 -17
- data/test/lib/vedeu/borders/border_test.rb +20 -2
- data/test/lib/vedeu/buffers/buffer_test.rb +15 -2
- data/test/lib/vedeu/buffers/empty_test.rb +51 -18
- data/test/lib/vedeu/buffers/view_test.rb +2 -2
- data/test/lib/vedeu/coercers/alignment_test.rb +32 -0
- data/test/lib/vedeu/coercers/horizontal_alignment_test.rb +16 -0
- data/test/lib/vedeu/coercers/vertical_alignment_test.rb +16 -0
- data/test/lib/vedeu/cursors/cursor_test.rb +4 -4
- data/test/lib/vedeu/cursors/dsl_test.rb +35 -21
- data/test/lib/vedeu/dsl/elements_test.rb +94 -2
- data/test/lib/vedeu/dsl/{string → helpers}/align_test.rb +0 -0
- data/test/lib/vedeu/dsl/{attributes_test.rb → helpers/attributes_test.rb} +0 -0
- data/test/lib/vedeu/dsl/{string → helpers}/text_test.rb +0 -0
- data/test/lib/vedeu/dsl/{string → helpers}/truncate_test.rb +0 -0
- data/test/lib/vedeu/dsl/{string → helpers}/wordwrap_test.rb +0 -0
- data/test/lib/vedeu/dsl/view_test.rb +22 -4
- data/test/lib/vedeu/dsl/views_test.rb +8 -5
- data/test/lib/vedeu/geometries/dsl/dsl_test.rb +2 -159
- data/test/lib/vedeu/geometries/position_test.rb +118 -60
- data/test/lib/vedeu/input/mouse_test.rb +1 -6
- data/test/lib/vedeu/logging/log_test.rb +14 -3
- data/test/lib/vedeu/presentation/colour_test.rb +77 -0
- data/test/lib/vedeu/{geometries/positionable_test.rb → presentation/position_test.rb} +4 -4
- data/test/lib/vedeu/sentence_test.rb +49 -0
- data/test/lib/vedeu/support/point_test.rb +139 -0
- data/test/lib/vedeu/terminal/terminal_test.rb +3 -44
- data/test/lib/vedeu/views/composition_test.rb +24 -4
- data/test/lib/vedeu/views/default_attributes_test.rb +10 -2
- data/test/lib/vedeu/views/view_test.rb +8 -15
- data/test/support/examples/material_colours_app.rb +0 -6
- data/vedeu.gemspec +1 -1
- metadata +58 -38
- data/examples/views/lines_line_stream.rb +0 -95
- data/examples/views/lines_line_streams.rb +0 -75
- data/examples/views/lines_line_streams_stream.rb +0 -78
- data/examples/views/lines_line_streams_stream_stream.rb +0 -50
- data/examples/views/lines_streams.rb +0 -93
- data/lib/vedeu/dsl/string/all.rb +0 -16
- data/lib/vedeu/geometries/dsl/validator.rb +0 -62
- data/lib/vedeu/presentation/background.rb +0 -54
- data/lib/vedeu/presentation/foreground.rb +0 -54
- data/lib/vedeu/repositories/parent.rb +0 -34
- data/test/lib/vedeu/geometries/dsl/validator_test.rb +0 -85
- data/test/lib/vedeu/presentation/background_test.rb +0 -74
- data/test/lib/vedeu/presentation/foreground_test.rb +0 -75
@@ -67,48 +67,14 @@ module Vedeu
|
|
67
67
|
|
68
68
|
private
|
69
69
|
|
70
|
-
# @return [
|
71
|
-
def
|
72
|
-
|
73
|
-
out = []
|
74
|
-
|
75
|
-
show.each_with_index do |line, iy|
|
76
|
-
line.each_with_index do |column, ix|
|
77
|
-
column.position = [by + iy, bx + ix]
|
78
|
-
out << column
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
out
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Returns the visible content for the view.
|
87
|
-
#
|
88
|
-
# @note If there are no lines of content, we return an empty
|
89
|
-
# array. If there are no more columns of content we return a
|
90
|
-
# space enclosed in an array; this prevents a weird line
|
91
|
-
# hopping bug which occurs when the current line has no more
|
92
|
-
# content, but subsequent lines do.
|
93
|
-
#
|
94
|
-
# @return [Array]
|
95
|
-
def show
|
96
|
-
(lines[rows] || []).map { |line| (line.chars[columns] || []) }
|
70
|
+
# @return [Fixnum]
|
71
|
+
def bx
|
72
|
+
@bx ||= geometry.bx
|
97
73
|
end
|
98
74
|
|
99
|
-
#
|
100
|
-
|
101
|
-
|
102
|
-
# Scrolls the content vertically when the stored cursor's y
|
103
|
-
# position for the interface is outside of the visible area.
|
104
|
-
#
|
105
|
-
# @note
|
106
|
-
# The height is reduced by one as #rows is a range of Array
|
107
|
-
# elements.
|
108
|
-
#
|
109
|
-
# @return [Range]
|
110
|
-
def rows
|
111
|
-
top...(top + bordered_height)
|
75
|
+
# @return [Fixnum]
|
76
|
+
def by
|
77
|
+
@by ||= geometry.by
|
112
78
|
end
|
113
79
|
|
114
80
|
# Using the current cursor's x position, return a range of
|
@@ -126,16 +92,6 @@ module Vedeu
|
|
126
92
|
left...(left + bordered_width)
|
127
93
|
end
|
128
94
|
|
129
|
-
# @return [Fixnum]
|
130
|
-
def left
|
131
|
-
@left ||= content_offset(ox, bordered_width)
|
132
|
-
end
|
133
|
-
|
134
|
-
# @return [Fixnum]
|
135
|
-
def top
|
136
|
-
@top ||= content_offset(oy, bordered_height)
|
137
|
-
end
|
138
|
-
|
139
95
|
# Returns the offset for the content (the number of rows or
|
140
96
|
# columns to change the viewport by on either the y or x axis)
|
141
97
|
# determined by the offset (the cursor's y or x offset position.
|
@@ -149,6 +105,12 @@ module Vedeu
|
|
149
105
|
offset - dimension
|
150
106
|
end
|
151
107
|
|
108
|
+
# @return [Vedeu::Cursors::Cursor]
|
109
|
+
# @see Vedeu::Cursors::Repository#by_name
|
110
|
+
def cursor
|
111
|
+
@cursor ||= Vedeu.cursors.by_name(name)
|
112
|
+
end
|
113
|
+
|
152
114
|
# Returns the geometry for the interface.
|
153
115
|
#
|
154
116
|
# @return (see Vedeu::Geometries::Repository#by_name)
|
@@ -157,19 +119,57 @@ module Vedeu
|
|
157
119
|
end
|
158
120
|
|
159
121
|
# @return [Fixnum]
|
160
|
-
def
|
161
|
-
@
|
122
|
+
def left
|
123
|
+
@left ||= content_offset(ox, bordered_width)
|
162
124
|
end
|
163
125
|
|
164
|
-
# @return [
|
165
|
-
def
|
166
|
-
|
126
|
+
# @return [Array<Array<Vedeu::Cells::Char>>]
|
127
|
+
def output
|
128
|
+
Vedeu.timer("Rendering content: '#{name}'") do
|
129
|
+
out = []
|
130
|
+
|
131
|
+
show.each_with_index do |line, iy|
|
132
|
+
line.each_with_index do |column, ix|
|
133
|
+
column.position = [by + iy, bx + ix]
|
134
|
+
out << column
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
out
|
139
|
+
end
|
167
140
|
end
|
168
141
|
|
169
|
-
#
|
170
|
-
#
|
171
|
-
|
172
|
-
|
142
|
+
# Using the current cursor's y position, return a range of
|
143
|
+
# visible lines.
|
144
|
+
#
|
145
|
+
# Scrolls the content vertically when the stored cursor's y
|
146
|
+
# position for the interface is outside of the visible area.
|
147
|
+
#
|
148
|
+
# @note
|
149
|
+
# The height is reduced by one as #rows is a range of Array
|
150
|
+
# elements.
|
151
|
+
#
|
152
|
+
# @return [Range]
|
153
|
+
def rows
|
154
|
+
top...(top + bordered_height)
|
155
|
+
end
|
156
|
+
|
157
|
+
# Returns the visible content for the view.
|
158
|
+
#
|
159
|
+
# @note If there are no lines of content, we return an empty
|
160
|
+
# array. If there are no more columns of content we return a
|
161
|
+
# space enclosed in an array; this prevents a weird line
|
162
|
+
# hopping bug which occurs when the current line has no more
|
163
|
+
# content, but subsequent lines do.
|
164
|
+
#
|
165
|
+
# @return [Array]
|
166
|
+
def show
|
167
|
+
(lines[rows] || []).map { |line| (line.chars[columns] || []) }
|
168
|
+
end
|
169
|
+
|
170
|
+
# @return [Fixnum]
|
171
|
+
def top
|
172
|
+
@top ||= content_offset(oy, bordered_height)
|
173
173
|
end
|
174
174
|
|
175
175
|
end # Viewport
|
@@ -11,9 +11,8 @@ module Vedeu
|
|
11
11
|
|
12
12
|
end # Vedeu
|
13
13
|
|
14
|
-
require 'vedeu/presentation/background'
|
15
|
-
require 'vedeu/presentation/foreground'
|
16
14
|
require 'vedeu/presentation/colour'
|
15
|
+
require 'vedeu/presentation/position'
|
17
16
|
require 'vedeu/presentation/styles'
|
18
17
|
require 'vedeu/presentation/style'
|
19
18
|
require 'vedeu/presentation/presentation'
|
@@ -10,9 +10,35 @@ module Vedeu
|
|
10
10
|
#
|
11
11
|
module Colour
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
# When the background colour for the model exists, return it,
|
14
|
+
# otherwise returns the parent background colour, or an empty
|
15
|
+
# Vedeu::Colours::Background.
|
16
|
+
#
|
17
|
+
# @return [Vedeu::Colours::Background]
|
18
|
+
def background
|
19
|
+
@background ||= if colour && present?(colour.background)
|
20
|
+
colour.background
|
21
|
+
|
22
|
+
elsif named_colour?
|
23
|
+
named_colour.background
|
24
|
+
|
25
|
+
elsif parent && present?(parent.background)
|
26
|
+
parent.background
|
27
|
+
|
28
|
+
else
|
29
|
+
Vedeu::Colours::Background.new
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Allows the setting of the background colour by coercing the
|
35
|
+
# given value into a Vedeu::Colours::Background colour.
|
36
|
+
#
|
37
|
+
# @return [Vedeu::Colours::Background]
|
38
|
+
def background=(value)
|
39
|
+
@background = colour.background = value
|
40
|
+
@_colour = @colour = colour
|
41
|
+
end
|
16
42
|
|
17
43
|
# @return [Vedeu::Colours::Colour]
|
18
44
|
def colour
|
@@ -44,6 +70,52 @@ module Vedeu
|
|
44
70
|
present?(@colour)
|
45
71
|
end
|
46
72
|
|
73
|
+
# When the foreground colour for the model exists, return it,
|
74
|
+
# otherwise returns the parent foreground colour, or an empty
|
75
|
+
# Vedeu::Colours::Foreground.
|
76
|
+
#
|
77
|
+
# @return [Vedeu::Colours::Foreground]
|
78
|
+
def foreground
|
79
|
+
@foreground ||= if colour && present?(colour.foreground)
|
80
|
+
colour.foreground
|
81
|
+
|
82
|
+
elsif named_colour?
|
83
|
+
named_colour.foreground
|
84
|
+
|
85
|
+
elsif parent && present?(parent.foreground)
|
86
|
+
parent.foreground
|
87
|
+
|
88
|
+
else
|
89
|
+
Vedeu::Colours::Foreground.new
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Allows the setting of the foreground colour by coercing the
|
95
|
+
# given value into a Vedeu::Colours::Foreground colour.
|
96
|
+
#
|
97
|
+
# @return [Vedeu::Colours::Foreground]
|
98
|
+
def foreground=(value)
|
99
|
+
@foreground = colour.foreground = value
|
100
|
+
@_colour = @colour = colour
|
101
|
+
end
|
102
|
+
|
103
|
+
# @return [NilClass|void]
|
104
|
+
def parent
|
105
|
+
present?(@parent) ? @parent : nil
|
106
|
+
end
|
107
|
+
|
108
|
+
# @return [NilClass|String|Symbol]
|
109
|
+
def name
|
110
|
+
if present?(@name)
|
111
|
+
@name
|
112
|
+
|
113
|
+
elsif parent && present?(parent.name)
|
114
|
+
parent.name
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
47
119
|
private
|
48
120
|
|
49
121
|
# @return [Vedeu::Colours::Colour]
|
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
module Vedeu
|
4
4
|
|
5
|
-
module
|
5
|
+
module Presentation
|
6
6
|
|
7
7
|
# Provide position functionality to the including model.
|
8
8
|
#
|
9
9
|
# @api private
|
10
10
|
#
|
11
|
-
module
|
11
|
+
module Position
|
12
12
|
|
13
13
|
# Gets the position.
|
14
14
|
#
|
@@ -50,8 +50,8 @@ module Vedeu
|
|
50
50
|
position.y if position?
|
51
51
|
end
|
52
52
|
|
53
|
-
end #
|
53
|
+
end # Position
|
54
54
|
|
55
|
-
end #
|
55
|
+
end # Presentation
|
56
56
|
|
57
57
|
end # Vedeu
|
@@ -1,13 +1,11 @@
|
|
1
|
-
require 'vedeu/geometries/positionable'
|
2
|
-
|
3
1
|
# frozen_string_literal: true
|
4
2
|
|
5
3
|
module Vedeu
|
6
4
|
|
7
5
|
module Presentation
|
8
6
|
|
9
|
-
include Vedeu::Geometries::Positionable
|
10
7
|
include Vedeu::Presentation::Colour
|
8
|
+
include Vedeu::Presentation::Position
|
11
9
|
include Vedeu::Presentation::Styles
|
12
10
|
|
13
11
|
# Converts the colours and styles to escape sequences, and when
|
@@ -9,7 +9,22 @@ module Vedeu
|
|
9
9
|
module Styles
|
10
10
|
|
11
11
|
include Vedeu::Common
|
12
|
-
|
12
|
+
|
13
|
+
# @return [NilClass|String|Symbol]
|
14
|
+
def name
|
15
|
+
if present?(@name)
|
16
|
+
@name
|
17
|
+
|
18
|
+
elsif parent && present?(parent.name)
|
19
|
+
parent.name
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [NilClass|void]
|
25
|
+
def parent
|
26
|
+
present?(@parent) ? @parent : nil
|
27
|
+
end
|
13
28
|
|
14
29
|
# When the style for the model exists, return it, otherwise
|
15
30
|
# returns the parent style, or an empty
|
@@ -15,7 +15,6 @@ require 'vedeu/repositories/collection'
|
|
15
15
|
require 'vedeu/repositories/defaults'
|
16
16
|
require 'vedeu/repositories/repositories'
|
17
17
|
require 'vedeu/repositories/model'
|
18
|
-
require 'vedeu/repositories/parent'
|
19
18
|
require 'vedeu/repositories/store'
|
20
19
|
require 'vedeu/repositories/registerable'
|
21
20
|
require 'vedeu/repositories/repository'
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
# Converts the array of elements provided into a comma separated
|
6
|
+
# sentence with the penultimate and ultimate elements separated with
|
7
|
+
# the word 'and'.
|
8
|
+
#
|
9
|
+
class Sentence
|
10
|
+
|
11
|
+
# @param (see #initialize)
|
12
|
+
# @return (see #construct)
|
13
|
+
def self.construct(elements, label = 'elements')
|
14
|
+
new(elements, label).construct
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param elements [Array]
|
18
|
+
# @param label [String]
|
19
|
+
# @return [Vedeu::Sentence]
|
20
|
+
def initialize(elements, label = 'elements')
|
21
|
+
@elements = elements
|
22
|
+
@label = label
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [String]
|
26
|
+
def construct
|
27
|
+
if one?
|
28
|
+
first
|
29
|
+
|
30
|
+
elsif two?
|
31
|
+
elements.join(' and ')
|
32
|
+
|
33
|
+
elsif many?
|
34
|
+
[but_last, last].join(' and ')
|
35
|
+
|
36
|
+
else
|
37
|
+
"No #{label} have been assigned."
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
# @!attribute [r] elements
|
45
|
+
# @return [Array]
|
46
|
+
attr_reader :elements
|
47
|
+
|
48
|
+
# @!attribute [r] label
|
49
|
+
# @return [String]
|
50
|
+
attr_reader :label
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# @return [Boolean]
|
55
|
+
def one?
|
56
|
+
count == 1
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [Boolean]
|
60
|
+
def two?
|
61
|
+
count == 2
|
62
|
+
end
|
63
|
+
|
64
|
+
# @return [Boolean]
|
65
|
+
def many?
|
66
|
+
count > 2
|
67
|
+
end
|
68
|
+
|
69
|
+
# @return [Array]
|
70
|
+
def but_last
|
71
|
+
elements[0...-1].join(', ')
|
72
|
+
end
|
73
|
+
|
74
|
+
# @return [void]
|
75
|
+
def first
|
76
|
+
elements.first
|
77
|
+
end
|
78
|
+
|
79
|
+
# @return [void]
|
80
|
+
def last
|
81
|
+
elements[-1]
|
82
|
+
end
|
83
|
+
|
84
|
+
# @return [Fixnum]
|
85
|
+
def count
|
86
|
+
elements.size
|
87
|
+
end
|
88
|
+
|
89
|
+
end # Sentence
|
90
|
+
|
91
|
+
end # Vedeu
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
class Point
|
4
|
+
|
5
|
+
# @param (see #initialize)
|
6
|
+
# @return (see #initialize)
|
7
|
+
def self.coerce(value: nil, min: 1, max: nil)
|
8
|
+
new(value: value, min: min, max: max).coerce
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param (see #initialize)
|
12
|
+
# @return (see #initialize)
|
13
|
+
def self.valid?(value: nil, min: 1, max: nil)
|
14
|
+
new(value: value, min: min, max: max).valid?
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param value [Fixnum|NilClass]
|
18
|
+
# @param min [Fixnum]
|
19
|
+
# @param max [Fixnum]
|
20
|
+
# @return [Vedeu::Point]
|
21
|
+
def initialize(value: nil, min: 1, max: nil)
|
22
|
+
@min = min
|
23
|
+
@max = max
|
24
|
+
@value = value
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Vedeu::Point]
|
28
|
+
def coerce
|
29
|
+
fail Vedeu::Error::InvalidSyntax,
|
30
|
+
"Expecting 'min' to be less than 'max'." if min > max
|
31
|
+
|
32
|
+
if value < min
|
33
|
+
Vedeu::Point.coerce(value: min, min: min, max: max)
|
34
|
+
|
35
|
+
elsif value > max
|
36
|
+
Vedeu::Point.coerce(value: max, min: min, max: max)
|
37
|
+
|
38
|
+
else
|
39
|
+
self
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Boolean]
|
45
|
+
def valid?
|
46
|
+
@value.is_a?(Fixnum) && @value >= min && @value <= max
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Fixnum]
|
50
|
+
def value
|
51
|
+
@value ||= min
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# @return [Fixnum]
|
57
|
+
def min
|
58
|
+
return @min if @min.is_a?(Fixnum)
|
59
|
+
|
60
|
+
fail Vedeu::Error::InvalidSyntax, "Expecting 'min' to be a Fixnum."
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Fixnum]
|
64
|
+
def max
|
65
|
+
return @max if @max.is_a?(Fixnum)
|
66
|
+
|
67
|
+
fail Vedeu::Error::InvalidSyntax, "Expecting 'max' to be a Fixnum."
|
68
|
+
end
|
69
|
+
|
70
|
+
end # Point
|
71
|
+
|
72
|
+
end # Vedeu
|