vedeu 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/docs/api.md +1 -1
- data/docs/events.md +11 -8
- data/lib/vedeu/api/api.rb +19 -43
- data/lib/vedeu/api/composition.rb +13 -8
- data/lib/vedeu/api/defined.rb +14 -4
- data/lib/vedeu/api/helpers.rb +8 -5
- data/lib/vedeu/api/interface.rb +15 -21
- data/lib/vedeu/api/keymap.rb +11 -5
- data/lib/vedeu/api/line.rb +6 -7
- data/lib/vedeu/api/menu.rb +9 -17
- data/lib/vedeu/api/stream.rb +8 -6
- data/lib/vedeu/application.rb +14 -12
- data/lib/vedeu/configuration/api.rb +33 -3
- data/lib/vedeu/configuration/cli.rb +23 -3
- data/lib/vedeu/configuration/configuration.rb +3 -2
- data/lib/vedeu/input/input.rb +6 -2
- data/lib/vedeu/launcher.rb +5 -2
- data/lib/vedeu/models/attributes/background.rb +3 -2
- data/lib/vedeu/models/attributes/coercions.rb +3 -2
- data/lib/vedeu/models/attributes/colour_translator.rb +11 -4
- data/lib/vedeu/models/attributes/foreground.rb +3 -2
- data/lib/vedeu/models/attributes/presentation.rb +3 -2
- data/lib/vedeu/models/colour.rb +3 -2
- data/lib/vedeu/models/composition.rb +5 -2
- data/lib/vedeu/models/cursor.rb +3 -2
- data/lib/vedeu/models/geometry.rb +48 -6
- data/lib/vedeu/models/interface.rb +12 -2
- data/lib/vedeu/models/keymap.rb +4 -2
- data/lib/vedeu/models/line.rb +5 -2
- data/lib/vedeu/models/stream.rb +12 -2
- data/lib/vedeu/models/style.rb +3 -2
- data/lib/vedeu/output/clear.rb +5 -2
- data/lib/vedeu/output/compositor.rb +4 -2
- data/lib/vedeu/output/refresh.rb +4 -6
- data/lib/vedeu/output/render.rb +17 -14
- data/lib/vedeu/output/view.rb +5 -2
- data/lib/vedeu/repositories/buffers.rb +16 -47
- data/lib/vedeu/repositories/cursors.rb +26 -28
- data/lib/vedeu/repositories/events.rb +33 -48
- data/lib/vedeu/repositories/focus.rb +24 -20
- data/lib/vedeu/repositories/groups.rb +17 -52
- data/lib/vedeu/repositories/interfaces.rb +21 -42
- data/lib/vedeu/repositories/keymaps.rb +9 -57
- data/lib/vedeu/repositories/menus.rb +15 -55
- data/lib/vedeu/support/common.rb +2 -2
- data/lib/vedeu/support/esc.rb +35 -2
- data/lib/vedeu/support/event.rb +7 -8
- data/lib/vedeu/support/exceptions.rb +47 -0
- data/lib/vedeu/support/grid.rb +11 -4
- data/lib/vedeu/support/keymap_validator.rb +9 -14
- data/lib/vedeu/support/log.rb +13 -3
- data/lib/vedeu/support/menu.rb +3 -2
- data/lib/vedeu/support/position.rb +3 -2
- data/lib/vedeu/support/registrar.rb +2 -23
- data/lib/vedeu/support/repository.rb +77 -0
- data/lib/vedeu/support/terminal.rb +12 -2
- data/lib/vedeu/support/trace.rb +127 -20
- data/lib/vedeu.rb +11 -46
- data/test/lib/vedeu/api/api_test.rb +14 -18
- data/test/lib/vedeu/api/defined_test.rb +16 -6
- data/test/lib/vedeu/api/interface_test.rb +5 -20
- data/test/lib/vedeu/api/menu_test.rb +1 -1
- data/test/lib/vedeu/models/geometry_test.rb +41 -0
- data/test/lib/vedeu/models/interface_test.rb +14 -0
- data/test/lib/vedeu/repositories/buffers_test.rb +6 -32
- data/test/lib/vedeu/repositories/cursors_test.rb +14 -0
- data/test/lib/vedeu/repositories/events_test.rb +18 -47
- data/test/lib/vedeu/repositories/focus_test.rb +18 -5
- data/test/lib/vedeu/repositories/groups_test.rb +3 -62
- data/test/lib/vedeu/repositories/interfaces_test.rb +13 -49
- data/test/lib/vedeu/repositories/keymaps_test.rb +0 -23
- data/test/lib/vedeu/repositories/menus_test.rb +3 -62
- data/test/lib/vedeu/support/esc_test.rb +24 -0
- data/test/lib/vedeu/support/keymap_validator_test.rb +19 -38
- data/test/lib/vedeu/support/repository_test.rb +70 -0
- data/test/test_helper.rb +2 -0
- data/vedeu.gemspec +3 -3
- metadata +10 -6
data/lib/vedeu/output/refresh.rb
CHANGED
@@ -60,15 +60,13 @@ module Vedeu
|
|
60
60
|
|
61
61
|
end
|
62
62
|
|
63
|
-
return false if
|
63
|
+
return false if Events.registered?(event)
|
64
64
|
|
65
|
-
|
66
|
-
Vedeu::Refresh.send(type, name)
|
67
|
-
end
|
65
|
+
Events.add(event, { delay: delay }) { Vedeu::Refresh.send(type, name) }
|
68
66
|
|
69
67
|
true
|
70
68
|
end
|
71
69
|
|
72
|
-
end
|
70
|
+
end # Refresh
|
73
71
|
|
74
|
-
end
|
72
|
+
end # Vedeu
|
data/lib/vedeu/output/render.rb
CHANGED
@@ -34,6 +34,8 @@ module Vedeu
|
|
34
34
|
#
|
35
35
|
# @return [String]
|
36
36
|
def render
|
37
|
+
Vedeu.log("Rendering view: '#{interface.name}'")
|
38
|
+
|
37
39
|
out = [ Clear.call(interface) ]
|
38
40
|
processed_lines.each_with_index do |line, index|
|
39
41
|
out << interface.origin(index)
|
@@ -64,11 +66,11 @@ module Vedeu
|
|
64
66
|
new_streams = []
|
65
67
|
|
66
68
|
new_streams = line.streams.map do |stream|
|
67
|
-
next if stream.
|
69
|
+
next if stream.content.empty?
|
68
70
|
|
69
|
-
if (line_length += stream.
|
71
|
+
if (line_length += stream.content.size) >= width
|
70
72
|
remainder = width - line_length
|
71
|
-
truncated = truncate(stream.
|
73
|
+
truncated = truncate(stream.content, remainder)
|
72
74
|
|
73
75
|
build_stream(line, stream, truncated)
|
74
76
|
|
@@ -93,12 +95,12 @@ module Vedeu
|
|
93
95
|
# @api private
|
94
96
|
# @param line [Line]
|
95
97
|
# @param stream [Stream]
|
96
|
-
# @param
|
98
|
+
# @param content [String]
|
97
99
|
# @return [Stream]
|
98
|
-
def build_stream(line, stream,
|
100
|
+
def build_stream(line, stream, content)
|
99
101
|
attributes = stream.view_attributes.merge!({
|
100
102
|
parent: line.view_attributes,
|
101
|
-
text:
|
103
|
+
text: content,
|
102
104
|
})
|
103
105
|
|
104
106
|
Stream.new(attributes)
|
@@ -127,17 +129,17 @@ module Vedeu
|
|
127
129
|
# @param line [Line]
|
128
130
|
# @return [Boolean]
|
129
131
|
def exceeds_width?(line)
|
130
|
-
line.streams.map(&:
|
132
|
+
line.streams.map(&:content).join.size > width
|
131
133
|
end
|
132
134
|
|
133
|
-
# Truncates the provided
|
135
|
+
# Truncates the provided string.
|
134
136
|
#
|
135
137
|
# @api private
|
136
|
-
# @param
|
137
|
-
# @param value [Fixnum] The total length of the
|
138
|
+
# @param string [String] The string to be truncated.
|
139
|
+
# @param value [Fixnum] The total length of the string after truncation.
|
138
140
|
# @return [String]
|
139
|
-
def truncate(
|
140
|
-
|
141
|
+
def truncate(string, value)
|
142
|
+
string.chomp.slice(0...value)
|
141
143
|
end
|
142
144
|
|
143
145
|
# Provides the collection of visible lines associated with the interface.
|
@@ -199,5 +201,6 @@ module Vedeu
|
|
199
201
|
}
|
200
202
|
end
|
201
203
|
|
202
|
-
end
|
203
|
-
|
204
|
+
end # Render
|
205
|
+
|
206
|
+
end # Vedeu
|
data/lib/vedeu/output/view.rb
CHANGED
@@ -33,6 +33,8 @@ module Vedeu
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
# @raise [NotImplemented] Subclasses of this class must implement this
|
37
|
+
# method.
|
36
38
|
# @return [Exception]
|
37
39
|
def render
|
38
40
|
fail NotImplemented, 'Implement #render on your subclass of Vedeu::View.'
|
@@ -59,5 +61,6 @@ module Vedeu
|
|
59
61
|
render
|
60
62
|
end
|
61
63
|
|
62
|
-
end
|
63
|
-
|
64
|
+
end # View
|
65
|
+
|
66
|
+
end # Vedeu
|
@@ -6,7 +6,8 @@ module Vedeu
|
|
6
6
|
# @api private
|
7
7
|
module Buffers
|
8
8
|
|
9
|
-
include
|
9
|
+
include Common
|
10
|
+
include Repository
|
10
11
|
extend self
|
11
12
|
|
12
13
|
# Add an interface view into the back buffer. If the buffer is already
|
@@ -16,6 +17,8 @@ module Vedeu
|
|
16
17
|
# @param attributes [Hash]
|
17
18
|
# @return [String]
|
18
19
|
def add(attributes)
|
20
|
+
validate_attributes!(attributes)
|
21
|
+
|
19
22
|
if registered?(attributes[:name])
|
20
23
|
buffer = find(attributes[:name])
|
21
24
|
|
@@ -32,16 +35,6 @@ module Vedeu
|
|
32
35
|
attributes[:name]
|
33
36
|
end
|
34
37
|
|
35
|
-
# Find the buffer by name.
|
36
|
-
#
|
37
|
-
# @param name [String]
|
38
|
-
# @return [Hash]
|
39
|
-
def find(name)
|
40
|
-
storage.fetch(name) do
|
41
|
-
fail BufferNotFound, "Cannot find buffer with this name: #{name.to_s}."
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
38
|
# Returns the latest content for the named buffer. The latest content always
|
46
39
|
# goes on to the back buffer. The content which was last output is on the
|
47
40
|
# front buffer.
|
@@ -71,30 +64,6 @@ module Vedeu
|
|
71
64
|
end
|
72
65
|
end
|
73
66
|
|
74
|
-
# Returns a collection of the names of all registered buffers.
|
75
|
-
#
|
76
|
-
# @return [Array]
|
77
|
-
def registered
|
78
|
-
storage.keys
|
79
|
-
end
|
80
|
-
|
81
|
-
# Returns a boolean indicating whether the named buffer is registered.
|
82
|
-
#
|
83
|
-
# @api private
|
84
|
-
# @param name [String]
|
85
|
-
# @return [Boolean]
|
86
|
-
def registered?(name)
|
87
|
-
storage.key?(name)
|
88
|
-
end
|
89
|
-
|
90
|
-
# Reset the buffers repository; removing all buffers. This does not delete
|
91
|
-
# the interfaces themselves.
|
92
|
-
#
|
93
|
-
# @return [Hash]
|
94
|
-
def reset
|
95
|
-
@_storage = in_memory
|
96
|
-
end
|
97
|
-
|
98
67
|
private
|
99
68
|
|
100
69
|
# Swap the named back buffer into the front buffer of the same name.
|
@@ -135,7 +104,7 @@ module Vedeu
|
|
135
104
|
# @param name [String]
|
136
105
|
# @return [Hash|Nil]
|
137
106
|
def back_buffer(name)
|
138
|
-
find(name)
|
107
|
+
find(name)[:back_buffer]
|
139
108
|
end
|
140
109
|
|
141
110
|
# Return the named front buffer.
|
@@ -144,15 +113,7 @@ module Vedeu
|
|
144
113
|
# @param name [String]
|
145
114
|
# @return [Hash|Nil]
|
146
115
|
def front_buffer(name)
|
147
|
-
find(name)
|
148
|
-
end
|
149
|
-
|
150
|
-
# Access to the storage for this repository.
|
151
|
-
#
|
152
|
-
# @api private
|
153
|
-
# @return [Hash]
|
154
|
-
def storage
|
155
|
-
@_storage ||= in_memory
|
116
|
+
find(name)[:front_buffer]
|
156
117
|
end
|
157
118
|
|
158
119
|
# @api private
|
@@ -166,6 +127,14 @@ module Vedeu
|
|
166
127
|
end
|
167
128
|
end
|
168
129
|
|
169
|
-
|
130
|
+
# @api private
|
131
|
+
# @param name [String]
|
132
|
+
# @raise [BufferNotFound] When the entity cannot be found with this name.
|
133
|
+
# @return [BufferNotFound]
|
134
|
+
def not_found(name)
|
135
|
+
fail BufferNotFound, "Cannot find buffer with this name: #{name.to_s}."
|
136
|
+
end
|
137
|
+
|
138
|
+
end # Buffers
|
170
139
|
|
171
|
-
end
|
140
|
+
end # Vedeu
|
@@ -7,6 +7,7 @@ module Vedeu
|
|
7
7
|
module Cursors
|
8
8
|
|
9
9
|
include Common
|
10
|
+
include Repository
|
10
11
|
extend self
|
11
12
|
|
12
13
|
# System events which when called will update the cursor position or
|
@@ -24,7 +25,9 @@ module Vedeu
|
|
24
25
|
# @param attributes [Hash]
|
25
26
|
# @return [Hash]
|
26
27
|
def add(attributes)
|
27
|
-
|
28
|
+
validate_attributes!(attributes)
|
29
|
+
|
30
|
+
Vedeu.log("Registering cursor: '#{attributes[:name]}'")
|
28
31
|
|
29
32
|
storage.store(attributes[:name], {
|
30
33
|
name: attributes[:name],
|
@@ -34,25 +37,16 @@ module Vedeu
|
|
34
37
|
})
|
35
38
|
end
|
36
39
|
|
37
|
-
#
|
40
|
+
# Saves the attributes in the repository for future use.
|
38
41
|
#
|
39
|
-
# @param
|
42
|
+
# @param attributes [Hash]
|
40
43
|
# @return [Hash]
|
41
|
-
def
|
42
|
-
|
43
|
-
fail CursorNotFound,
|
44
|
-
"Cursor was not found with this name: #{name.to_s}."
|
45
|
-
end
|
46
|
-
end
|
44
|
+
def update(attributes)
|
45
|
+
return false unless defined_value?(attributes[:name])
|
47
46
|
|
48
|
-
|
49
|
-
#
|
50
|
-
# @api private
|
51
|
-
# @return [Boolean]
|
52
|
-
def registered?(name)
|
53
|
-
return false if storage.empty?
|
47
|
+
Vedeu.log("Updating cursor: '#{attributes[:name]}'")
|
54
48
|
|
55
|
-
storage.
|
49
|
+
storage.store(attributes[:name], attributes)
|
56
50
|
end
|
57
51
|
|
58
52
|
# Perform an action (moving, showing or hiding) and save the new cursor
|
@@ -73,26 +67,30 @@ module Vedeu
|
|
73
67
|
|
74
68
|
private
|
75
69
|
|
76
|
-
#
|
70
|
+
# Returns an empty collection ready for the storing of cursors by name with
|
71
|
+
# current attributes.
|
77
72
|
#
|
78
73
|
# @api private
|
79
74
|
# @example
|
80
|
-
# { 'holmium' => {
|
75
|
+
# { 'holmium' => {
|
76
|
+
# name: 'holmium',
|
77
|
+
# state: :show,
|
78
|
+
# x: 1,
|
79
|
+
# y: 1 } }
|
81
80
|
#
|
82
81
|
# @return [Hash]
|
83
|
-
def
|
84
|
-
|
82
|
+
def in_memory
|
83
|
+
{}
|
85
84
|
end
|
86
85
|
|
87
|
-
# Returns an empty collection ready for the storing of cursors by name with
|
88
|
-
# current attributes.
|
89
|
-
#
|
90
86
|
# @api private
|
91
|
-
# @
|
92
|
-
|
93
|
-
|
87
|
+
# @param name [String]
|
88
|
+
# @raise [CursorNotFound] When the entity cannot be found with this name.
|
89
|
+
# @return [CursorNotFound]
|
90
|
+
def not_found(name)
|
91
|
+
fail CursorNotFound, "Cursor was not found with this name: #{name.to_s}."
|
94
92
|
end
|
95
93
|
|
96
|
-
end
|
94
|
+
end # Cursors
|
97
95
|
|
98
|
-
end
|
96
|
+
end # Vedeu
|
@@ -1,55 +1,36 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
3
|
# Provides a mechanism for storing and retrieving events by name. A single
|
4
|
-
# name can contain many events. Also an event can trigger other events.
|
5
|
-
|
6
|
-
# @api private
|
7
|
-
class Events
|
4
|
+
# name can contain many events. Also, an event can trigger other events.
|
5
|
+
module Events
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
# @param block [Proc]
|
12
|
-
# @return [Events]
|
13
|
-
def initialize(&block)
|
14
|
-
@handlers = Hash.new { |hash, key| hash[key] = { events: [] } }
|
15
|
-
|
16
|
-
instance_eval(&block) if block_given?
|
17
|
-
end
|
7
|
+
include Repository
|
8
|
+
extend self
|
18
9
|
|
19
10
|
# @see Vedeu::API#event
|
20
|
-
def
|
21
|
-
Vedeu.log("Registering event '#{name}'")
|
11
|
+
def add(name, opts = {}, &block)
|
12
|
+
Vedeu.log("Registering event: '#{name}'")
|
22
13
|
|
23
14
|
options = opts.merge!({ event_name: name })
|
24
15
|
|
25
|
-
|
26
|
-
|
16
|
+
storage[name][:events] << Event.new(block, options)
|
17
|
+
storage[name]
|
27
18
|
end
|
19
|
+
alias_method :event, :add
|
28
20
|
|
29
21
|
# @see Vedeu::API#unevent
|
30
|
-
def
|
31
|
-
|
32
|
-
end
|
22
|
+
def remove(name)
|
23
|
+
return false unless registered?(name)
|
33
24
|
|
34
|
-
|
35
|
-
#
|
36
|
-
# @return [Array]
|
37
|
-
def registered
|
38
|
-
handlers.keys
|
39
|
-
end
|
25
|
+
storage.delete(name) { false }
|
40
26
|
|
41
|
-
|
42
|
-
#
|
43
|
-
# @api private
|
44
|
-
# @param name [Symbol] The name of the event to check.
|
45
|
-
# @return [Boolean]
|
46
|
-
def registered?(name)
|
47
|
-
handlers.key?(name)
|
27
|
+
true
|
48
28
|
end
|
29
|
+
alias_method :unevent, :remove
|
49
30
|
|
50
31
|
# @see Vedeu::API#trigger
|
51
|
-
def
|
52
|
-
results =
|
32
|
+
def use(name, *args)
|
33
|
+
results = storage[name][:events].map { |event| event.trigger(*args) }
|
53
34
|
|
54
35
|
if results.one?
|
55
36
|
results.first
|
@@ -59,23 +40,27 @@ module Vedeu
|
|
59
40
|
|
60
41
|
end
|
61
42
|
end
|
43
|
+
alias_method :trigger, :use
|
62
44
|
|
63
|
-
|
45
|
+
private
|
46
|
+
|
47
|
+
# Returns an empty collection ready for the storing of events by name with
|
48
|
+
# associated event instance.
|
64
49
|
#
|
50
|
+
# @api private
|
65
51
|
# @return [Hash]
|
66
|
-
def
|
67
|
-
|
52
|
+
def in_memory
|
53
|
+
Hash.new { |hash, key| hash[key] = { events: [] } }
|
68
54
|
end
|
69
55
|
|
70
|
-
|
56
|
+
# System events needed by Vedeu to run.
|
57
|
+
add(:_clear_) { Terminal.clear_screen }
|
58
|
+
add(:_exit_) { Vedeu::Application.stop }
|
59
|
+
add(:_keypress_) { |key| Vedeu.keypress(key) }
|
60
|
+
add(:_log_) { |msg| Vedeu.log(msg) }
|
61
|
+
add(:_mode_switch_) { fail ModeSwitch }
|
62
|
+
add(:_resize_, { delay: 0.25 }) { Vedeu.resize }
|
71
63
|
|
72
|
-
|
73
|
-
|
74
|
-
# @api private
|
75
|
-
# @return []
|
76
|
-
def method_missing(method, *args, &block)
|
77
|
-
@self_before_instance_eval.send(method, *args, &block)
|
78
|
-
end
|
64
|
+
end # Events
|
79
65
|
|
80
|
-
|
81
|
-
end
|
66
|
+
end # Vedeu
|
@@ -7,6 +7,8 @@ module Vedeu
|
|
7
7
|
# @api private
|
8
8
|
module Focus
|
9
9
|
|
10
|
+
include Common
|
11
|
+
include Repository
|
10
12
|
extend self
|
11
13
|
|
12
14
|
# System events which when called will change which interface is currently
|
@@ -32,6 +34,8 @@ module Vedeu
|
|
32
34
|
# @param attributes [String]
|
33
35
|
# @return [Array]
|
34
36
|
def add(attributes)
|
37
|
+
validate_attributes!(attributes)
|
38
|
+
|
35
39
|
if registered?(attributes[:name])
|
36
40
|
storage
|
37
41
|
|
@@ -44,32 +48,45 @@ module Vedeu
|
|
44
48
|
# Focus an interface by name.
|
45
49
|
#
|
46
50
|
# @param name [String]
|
51
|
+
# @raise [InterfaceNotFound] When the interface cannot be found.
|
47
52
|
# @return [String]
|
48
53
|
def by_name(name)
|
49
54
|
fail InterfaceNotFound unless storage.include?(name)
|
50
55
|
|
51
56
|
storage.rotate!(storage.index(name))
|
52
57
|
|
58
|
+
Vedeu.log("Interface in focus: '#{current}'")
|
59
|
+
|
53
60
|
current
|
54
61
|
end
|
55
62
|
|
56
63
|
# Return the interface currently focussed.
|
57
64
|
#
|
65
|
+
# @raise [NoInterfacesDefined] When no interfaces are defined, we cannot
|
66
|
+
# make one focussed.
|
58
67
|
# @return [String]
|
59
68
|
def current
|
60
69
|
fail NoInterfacesDefined if storage.empty?
|
61
70
|
|
62
|
-
Vedeu.log("Interface in focus: '#{storage.first}'")
|
63
|
-
|
64
71
|
storage.first
|
65
72
|
end
|
66
73
|
|
74
|
+
# Returns a boolean indicating whether the named interface is focussed.
|
75
|
+
#
|
76
|
+
# @param name [String]
|
77
|
+
# @return [Boolean]
|
78
|
+
def current?(name)
|
79
|
+
current == name
|
80
|
+
end
|
81
|
+
|
67
82
|
# Put the next interface relative to the current interfaces in focus.
|
68
83
|
#
|
69
84
|
# @return [String]
|
70
85
|
def next_item
|
71
86
|
storage.rotate!
|
72
87
|
|
88
|
+
Vedeu.log("Interface in focus: '#{current}'")
|
89
|
+
|
73
90
|
current
|
74
91
|
end
|
75
92
|
|
@@ -79,6 +96,8 @@ module Vedeu
|
|
79
96
|
def prev_item
|
80
97
|
storage.rotate!(-1)
|
81
98
|
|
99
|
+
Vedeu.log("Interface in focus: '#{current}'")
|
100
|
+
|
82
101
|
current
|
83
102
|
end
|
84
103
|
|
@@ -99,24 +118,8 @@ module Vedeu
|
|
99
118
|
storage.include?(name)
|
100
119
|
end
|
101
120
|
|
102
|
-
# Reset the focus repository; removing all items. This does not delete
|
103
|
-
# the interfaces themselves.
|
104
|
-
#
|
105
|
-
# @return [Hash]
|
106
|
-
def reset
|
107
|
-
@_storage = in_memory
|
108
|
-
end
|
109
|
-
|
110
121
|
private
|
111
122
|
|
112
|
-
# Access to the storage for this repository.
|
113
|
-
#
|
114
|
-
# @api private
|
115
|
-
# @return [Array]
|
116
|
-
def storage
|
117
|
-
@_storage ||= in_memory
|
118
|
-
end
|
119
|
-
|
120
123
|
# Returns an empty collection ready for the storing of interface names.
|
121
124
|
#
|
122
125
|
# @api private
|
@@ -125,5 +128,6 @@ module Vedeu
|
|
125
128
|
[]
|
126
129
|
end
|
127
130
|
|
128
|
-
end
|
129
|
-
|
131
|
+
end # Focus
|
132
|
+
|
133
|
+
end # Vedeu
|
@@ -5,7 +5,8 @@ module Vedeu
|
|
5
5
|
# @api private
|
6
6
|
module Groups
|
7
7
|
|
8
|
-
include
|
8
|
+
include Common
|
9
|
+
include Repository
|
9
10
|
extend self
|
10
11
|
|
11
12
|
# Add an interface name to a group, creating the group if it doesn't already
|
@@ -14,6 +15,8 @@ module Vedeu
|
|
14
15
|
# @param attributes [Hash]
|
15
16
|
# @return [Groups|FalseClass]
|
16
17
|
def add(attributes)
|
18
|
+
validate_attributes!(attributes)
|
19
|
+
|
17
20
|
return false unless defined_value?(attributes[:group])
|
18
21
|
|
19
22
|
storage[attributes[:group]] << attributes[:name]
|
@@ -23,46 +26,6 @@ module Vedeu
|
|
23
26
|
true
|
24
27
|
end
|
25
28
|
|
26
|
-
# Return the whole repository.
|
27
|
-
#
|
28
|
-
# @return [Set]
|
29
|
-
def all
|
30
|
-
storage
|
31
|
-
end
|
32
|
-
|
33
|
-
# Find a group by name and return all of its associated interfaces.
|
34
|
-
#
|
35
|
-
# @param name [String]
|
36
|
-
# @return [Set]
|
37
|
-
def find(name)
|
38
|
-
storage.fetch(name) do
|
39
|
-
fail GroupNotFound,
|
40
|
-
"Cannot find interface group with this name: #{name.to_s}."
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Returns a collection of the names of all registered groups.
|
45
|
-
#
|
46
|
-
# @return [Array]
|
47
|
-
def registered
|
48
|
-
storage.keys
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns a Boolean indicating whether the named group is registered.
|
52
|
-
#
|
53
|
-
# @return [Boolean]
|
54
|
-
def registered?(name)
|
55
|
-
storage.key?(name)
|
56
|
-
end
|
57
|
-
|
58
|
-
# Reset the groups repository; removing all groups. This does not delete
|
59
|
-
# the interfaces themselves.
|
60
|
-
#
|
61
|
-
# @return [Hash]
|
62
|
-
def reset
|
63
|
-
@_storage = in_memory
|
64
|
-
end
|
65
|
-
|
66
29
|
private
|
67
30
|
|
68
31
|
# @see Vedeu::Refresh.register_event
|
@@ -70,25 +33,27 @@ module Vedeu
|
|
70
33
|
# @param attributes [Hash]
|
71
34
|
# @return [Boolean]
|
72
35
|
def register_event(attributes)
|
73
|
-
name
|
74
|
-
delay
|
36
|
+
name = attributes[:group]
|
37
|
+
delay = attributes[:delay] || 0.0
|
75
38
|
|
76
39
|
Vedeu::Refresh.register_event(:by_group, name, delay)
|
77
40
|
end
|
78
41
|
|
79
|
-
# Access to the storage for this repository.
|
80
|
-
#
|
81
42
|
# @api private
|
82
43
|
# @return [Hash]
|
83
|
-
def
|
84
|
-
|
44
|
+
def in_memory
|
45
|
+
Hash.new { |hash, key| hash[key] = Set.new }
|
85
46
|
end
|
86
47
|
|
87
48
|
# @api private
|
88
|
-
# @
|
89
|
-
|
90
|
-
|
49
|
+
# @param name [String]
|
50
|
+
# @raise [GroupNotFound] When the entity cannot be found with this name.
|
51
|
+
# @return [GroupNotFound]
|
52
|
+
def not_found(name)
|
53
|
+
fail GroupNotFound,
|
54
|
+
"Cannot find interface group with this name: #{name.to_s}."
|
91
55
|
end
|
92
56
|
|
93
|
-
end
|
94
|
-
|
57
|
+
end # Groups
|
58
|
+
|
59
|
+
end # Vedeu
|