vigilem-core 0.0.9

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 (61) hide show
  1. checksums.yaml +7 -0
  2. data/lib/vigilem/core.rb +9 -0
  3. data/lib/vigilem/core/abstract_device.rb +97 -0
  4. data/lib/vigilem/core/adapters.rb +2 -0
  5. data/lib/vigilem/core/adapters/adapter.rb +57 -0
  6. data/lib/vigilem/core/adapters/basic_adapter.rb +43 -0
  7. data/lib/vigilem/core/adapters/buffered_adapter.rb +28 -0
  8. data/lib/vigilem/core/buffer.rb +151 -0
  9. data/lib/vigilem/core/buffer_handler.rb +95 -0
  10. data/lib/vigilem/core/default_buffer.rb +45 -0
  11. data/lib/vigilem/core/demultiplexer.rb +225 -0
  12. data/lib/vigilem/core/device.rb +43 -0
  13. data/lib/vigilem/core/event_handler.rb +156 -0
  14. data/lib/vigilem/core/eventable.rb +80 -0
  15. data/lib/vigilem/core/hooks.rb +36 -0
  16. data/lib/vigilem/core/hooks/callback.rb +66 -0
  17. data/lib/vigilem/core/hooks/callback_proc.rb +25 -0
  18. data/lib/vigilem/core/hooks/conditional_hook.rb +62 -0
  19. data/lib/vigilem/core/hooks/hook.rb +193 -0
  20. data/lib/vigilem/core/hooks/inheritable.rb +24 -0
  21. data/lib/vigilem/core/hooks/meta_callback.rb +53 -0
  22. data/lib/vigilem/core/hooks/utils.rb +23 -0
  23. data/lib/vigilem/core/hub.rb +50 -0
  24. data/lib/vigilem/core/input_system_handler.rb +55 -0
  25. data/lib/vigilem/core/lockable_pipeline_component.rb +30 -0
  26. data/lib/vigilem/core/multiplexer.rb +168 -0
  27. data/lib/vigilem/core/pipeline.rb +68 -0
  28. data/lib/vigilem/core/stat.rb +121 -0
  29. data/lib/vigilem/core/system.rb +9 -0
  30. data/lib/vigilem/core/system/check.rb +33 -0
  31. data/lib/vigilem/core/transfer_agent.rb +67 -0
  32. data/lib/vigilem/core/version.rb +5 -0
  33. data/spec/bug_notes.txt +12 -0
  34. data/spec/given_helper.rb +12 -0
  35. data/spec/spec_helper.rb +7 -0
  36. data/spec/vigilem/core/abstract_device_spec.rb +103 -0
  37. data/spec/vigilem/core/adapters/adapter_spec.rb +28 -0
  38. data/spec/vigilem/core/adapters/basic_adapter_spec.rb +53 -0
  39. data/spec/vigilem/core/adapters/buffered_adapter_spec.rb +16 -0
  40. data/spec/vigilem/core/buffer_handler_spec.rb +51 -0
  41. data/spec/vigilem/core/buffer_spec.rb +236 -0
  42. data/spec/vigilem/core/default_buffer_spec.rb +17 -0
  43. data/spec/vigilem/core/demultiplexer_spec.rb +166 -0
  44. data/spec/vigilem/core/device_spec.rb +62 -0
  45. data/spec/vigilem/core/event_handler_spec.rb +134 -0
  46. data/spec/vigilem/core/hooks/callback_proc_spec.rb +66 -0
  47. data/spec/vigilem/core/hooks/hook_spec.rb +230 -0
  48. data/spec/vigilem/core/hooks/inheritable_spec.rb +19 -0
  49. data/spec/vigilem/core/hooks/meta_callback_spec.rb +69 -0
  50. data/spec/vigilem/core/hooks/utils_spec.rb +25 -0
  51. data/spec/vigilem/core/hooks_spec.rb +50 -0
  52. data/spec/vigilem/core/hub_spec.rb +51 -0
  53. data/spec/vigilem/core/input_system_handler_spec.rb +33 -0
  54. data/spec/vigilem/core/lockable_pipeline_component_spec.rb +19 -0
  55. data/spec/vigilem/core/multiplexer_spec.rb +113 -0
  56. data/spec/vigilem/core/pipeline_spec.rb +5 -0
  57. data/spec/vigilem/core/stat_spec.rb +63 -0
  58. data/spec/vigilem/core/system/check_spec.rb +24 -0
  59. data/spec/vigilem/core/system_spec.rb +29 -0
  60. data/spec/vigilem/core/transfer_agent_spec.rb +80 -0
  61. metadata +273 -0
@@ -0,0 +1,16 @@
1
+ require 'vigilem/core/adapters/buffered_adapter'
2
+
3
+ describe Vigilem::Core::Adapters::BufferedAdapter do
4
+
5
+ it 'is a BufferHandler' do
6
+ expect(described_class).to be < Vigilem::Core::BufferHandler
7
+ end
8
+
9
+ describe '#initialize_buffered' do
10
+ it %q<init's a buffer_handler and adapter> do
11
+ pending('@todo test')
12
+ raise 'NotImplementedError'
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,51 @@
1
+ require 'vigilem/core/buffer_handler'
2
+
3
+ # @TODO finish
4
+ describe Vigilem::Core::BufferHandler do
5
+
6
+ before :all do
7
+ FakeBHandler = Class.new do
8
+ include Vigilem::Core::BufferHandler
9
+ def initialize
10
+ initialize_buffer_handler
11
+ end
12
+ end
13
+ end
14
+
15
+ subject do
16
+ FakeBHandler.new
17
+ end
18
+
19
+ describe '#initialize_buffer_handler' do
20
+
21
+ it 'will initialize the default buffer' do
22
+ expect(subject.buffers[:default]).not_to be_nil
23
+ end
24
+ end
25
+
26
+ describe '#buffer' do
27
+ it 'returns a buffer' do
28
+ expect(subject.buffer).not_to be_nil
29
+ #alias_method :inbox, :buffer
30
+ end
31
+ it 'assigns a new Buffer of type passed in' do
32
+ subject.buffers[:default] = nil
33
+ subject.buffer(:default, '')
34
+ expect(subject.buffer).to be == Vigilem::Core::DefaultBuffer.new('')
35
+ end
36
+ end
37
+
38
+ describe '#buffered' do
39
+ #@todo
40
+ end
41
+
42
+ describe '#buffered!' do
43
+ #@todo
44
+ end
45
+
46
+ context 'private' do
47
+ describe '#buffer=' do
48
+ #alias_method :inbox=, :buffer=
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,236 @@
1
+ require 'vigilem/core/buffer'
2
+
3
+ require 'delegate'
4
+
5
+ describe Vigilem::Core::Buffer do
6
+
7
+
8
+ context 'private' do
9
+
10
+ before :all do
11
+ SuperCheck = Class.new(String) { include ::Vigilem::Core::Buffer }
12
+ end
13
+
14
+ before :all do
15
+ SuperDelegateCheck = Class.new(SimpleDelegator) { include ::Vigilem::Core::Buffer }
16
+ end
17
+
18
+ subject { SuperCheck.new('abcdef') }
19
+
20
+ describe '_super_check' do
21
+ it 'will call the superclass method if it exists' do
22
+ expect(subject.send(:_super_check, :slice, nil, 1,2)).to eql('bc')
23
+ end
24
+
25
+ it %Q(will call the otherwise block if the superclass doesn't have the method) do
26
+ expect(subject.send(:_super_check, :dice, nil, 1,2) { '$' }).to eql('$')
27
+ end
28
+
29
+ context 'delegate' do
30
+ subject do
31
+ SuperDelegateCheck.new(%Q(ces't cheese))
32
+ end
33
+
34
+ it 'will call __getobj__ if the class responds to it' do
35
+ expect(subject.send(:_super_check, :slice, nil, 7,2)).to eql('he')
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+
42
+ class StrBuffer
43
+ include ::Vigilem::Core::Buffer
44
+
45
+ def initialize(str=nil)
46
+ @str = str || 'I am rawrg!'
47
+ end
48
+
49
+ def _dump(level)
50
+ Marshal.dump(@ary)
51
+ end
52
+
53
+ def self._load(str)
54
+ self.new(*Marshal.load(str))
55
+ end
56
+
57
+ def slice!(*args)
58
+ self.class.new(*@str.slice!(*args))
59
+ end
60
+
61
+ def concat(other_str)
62
+ self.class.new(*@str.concat(other_str))
63
+ end
64
+
65
+ def ==(other_obj)
66
+ @str == other_obj.instance_variable_get(:@str)
67
+ end
68
+
69
+ def length
70
+ @str.length
71
+ end
72
+ end
73
+
74
+ class AryBuffer
75
+ include ::Vigilem::Core::Buffer
76
+
77
+ def initialize(*ary)
78
+ @ary = if ary.empty? then %w(a b c d) else ary end
79
+ end
80
+
81
+ def _dump(level)
82
+ Marshal.dump(@ary)
83
+ end
84
+
85
+ def self._load(str)
86
+ self.new(*Marshal.load(str))
87
+ end
88
+
89
+ def slice!(*args)
90
+ self.class.new(*@ary.slice!(*args))
91
+ end
92
+
93
+ def concat(other_str)
94
+ self.class.new(*@ary.concat(other_str))
95
+ end
96
+
97
+ def ==(other_obj)
98
+ @ary == other_obj.instance_variable_get(:@ary)
99
+ end
100
+
101
+ def length
102
+ @ary.length
103
+ end
104
+ end
105
+
106
+ class FailBuffer
107
+ include ::Vigilem::Core::Buffer
108
+ def _dump(level)
109
+ Marshal.dump(@ary)
110
+ end
111
+
112
+ def self._load(str)
113
+ self.new(*Marshal.dump(str))
114
+ end
115
+
116
+ def initialize
117
+ @str = %w(a b c d)
118
+ end
119
+
120
+ def concat(other_str)
121
+ @str.concat(other_str)
122
+ end
123
+ end
124
+
125
+ describe '#offset!' do
126
+ context 'will slice! from the @input_buffer and return the remainder' do
127
+
128
+ context StrBuffer do
129
+ it 'buffer > len' do
130
+ expect(subject.offset!(4)).to be == [described_class.new('I am'), 0]
131
+ end
132
+ it 'buffer < len' do
133
+ expect(subject.offset!(13)).to be == [described_class.new('I am rawrg!'), 2]
134
+ end
135
+ end
136
+ context AryBuffer do
137
+ it 'buffer > len' do
138
+ expect(subject.offset!(3)).to be == [described_class.new('a', 'b', 'c'), 0]
139
+ end
140
+
141
+ it 'buffer < len' do
142
+ expect(subject.offset!(9)).to be == [described_class.new('a', 'b', 'c', 'd'), 5]
143
+ end
144
+ end
145
+
146
+ end
147
+ end
148
+
149
+ shared_examples 'modifier!' do
150
+ before(:all) { @buffer = described_class.new }
151
+
152
+ let(:result) { @buffer.send(method_name, *args) }
153
+
154
+ it 'return a subset of the original' do
155
+ expect(result).to be == described_class.new(*result_match)
156
+ end
157
+
158
+ it 'will modify the original buffer' do
159
+ expect(@buffer).to be == described_class.new(*buffer_state)
160
+ end
161
+ end
162
+
163
+ shared_examples 'modifier' do
164
+ before(:all) { @buffer = described_class.new }
165
+
166
+ let(:result) { @buffer.send(method_name, *args) }
167
+
168
+ it 'return a subset of the original' do
169
+ expect(result).to be == described_class.new(*result_match)
170
+ end
171
+
172
+ it 'will not effect the original buffer' do
173
+ expect(@buffer).to be == described_class.new(*buffer_state)
174
+ end
175
+ end
176
+
177
+ describe '#slice' do
178
+ context AryBuffer do
179
+ it_behaves_like 'modifier' do
180
+ let(:method_name) { :slice }
181
+ let(:args) { [1, 2] }
182
+ let(:result_match) { %w(b c) }
183
+ let(:buffer_state) { %w(a b c d) }
184
+ end
185
+ end
186
+
187
+ context StrBuffer do
188
+ it_behaves_like 'modifier' do
189
+ let(:method_name) { :slice }
190
+ let(:args) { [1, 2] }
191
+ let(:result_match) { ' a' }
192
+ let(:buffer_state) { 'I am rawrg!' }
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '#slice!' do
198
+ context AryBuffer do
199
+ it_behaves_like 'modifier!' do
200
+ let(:method_name) { :slice! }
201
+ let(:args) { [1, 2] }
202
+ let(:result_match) { %w(b c) }
203
+ let(:buffer_state) { %w(a d) }
204
+ end
205
+ end
206
+
207
+ context StrBuffer do
208
+ it_behaves_like 'modifier!' do
209
+ let(:method_name) { :slice! }
210
+ let(:args) { [1, 2] }
211
+ let(:result_match) { ' a' }
212
+ let(:buffer_state) { 'Im rawrg!' }
213
+ end
214
+ end
215
+ end
216
+
217
+ describe 'concat' do
218
+ context AryBuffer do
219
+ it_behaves_like 'modifier!' do
220
+ let(:method_name) { :concat }
221
+ let(:args) { [[1]] }
222
+ let(:result_match) { %w(a b c d) + [1] }
223
+ let(:buffer_state) { %w(a b c d) + [1] }
224
+ end
225
+ end
226
+
227
+ context StrBuffer do
228
+ it_behaves_like 'modifier!' do
229
+ let(:method_name) { :concat }
230
+ let(:args) { 'E>' }
231
+ let(:result_match) { 'I am rawrg!E>' }
232
+ let(:buffer_state) { 'I am rawrg!E>' }
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,17 @@
1
+ require 'vigilem/core/default_buffer'
2
+
3
+ describe Vigilem::Core::DefaultBuffer do
4
+ context 'declared type' do
5
+ describe '::wrap' do
6
+ it 'becomes the type passed in' do
7
+ expect(described_class.wrap('').__getobj__).to be_a(String)
8
+ end
9
+ end
10
+ end
11
+
12
+ context 'default type ([])' do
13
+ it 'defaults the type to an array' do
14
+ expect(described_class.new.__getobj__).to be_an(Array)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,166 @@
1
+ require 'spec_helper'
2
+
3
+ require 'tempfile'
4
+
5
+ require 'vigilem/core/demultiplexer'
6
+
7
+ describe Vigilem::Core::Demultiplexer do
8
+
9
+ after(:each) do
10
+ (described_class.instance_variables).each do |ivar|
11
+ described_class.send(:remove_instance_variable, ivar)
12
+ end
13
+ end
14
+
15
+ class OutEvent < Struct.new(:metadata, :type); end
16
+
17
+ let(:outputs) { [[[], {:func => :concat}], [[], {:func => :concat}], [[], {:func => :concat}]] }
18
+
19
+ let(:input) { [] }
20
+
21
+ let(:device_one) do
22
+ t = Tempfile.new('dev')
23
+ def t.name
24
+ 'at keyboard'
25
+ end
26
+ t
27
+ end
28
+
29
+ let(:device_two) do
30
+ t = Tempfile.new('dev2')
31
+ def t.name
32
+ 'wheel mouse'
33
+ end
34
+ t
35
+ end
36
+
37
+ let(:devices) { [device_one, device_two] }
38
+
39
+ let(:events) do
40
+ [
41
+ OutEvent.new({:source => devices.first}),
42
+ OutEvent.new({:source => devices.last}),
43
+ OutEvent.new({}, 1),
44
+ OutEvent.new({}, 2)
45
+ ]
46
+ end
47
+
48
+ context 'class-level' do
49
+
50
+ describe '#option_names' do
51
+ it 'returns a list of options for this observer' do
52
+ expect(described_class.option_names).to all(be_a(Symbol))
53
+ end
54
+ end
55
+
56
+ describe '#event_option_names' do
57
+ it 'returns the event option Symbols' do
58
+ good_opt = described_class.event_option_names
59
+ expect(described_class.event_option_names).to all(be_a(Symbol)) and not include(:func)
60
+ end
61
+ end
62
+
63
+ describe '::all' do
64
+ it 'defaults to []' do
65
+ expect(described_class.all).to be_empty
66
+ end
67
+ end
68
+
69
+ describe '::filter_events' do
70
+
71
+ it 'filters events if the device is the same as an event source' do
72
+ expect(described_class.filter_events(events, {:device => device_one })).to eql(events.take(1))
73
+ end
74
+
75
+ it 'filters events if a device is the same as an event source' do
76
+ expect(described_class.filter_events(events, {:devices => devices })).to eql(events.take(2))
77
+ end
78
+
79
+ it 'filters events if the Regexp matches an event source name' do
80
+ expect(described_class.filter_events(events, {:device_name => /keyboard/ })).to eql(events.take(1))
81
+ end
82
+
83
+ it 'filters events if a Regexp matches an event source name' do
84
+ expect(described_class.filter_events(events, {:device_names => [/keyboard/, /mouse/] })).to eql(events.take(2))
85
+ end
86
+
87
+ it 'filters events if the type is the same as an event type' do
88
+ expect(described_class.filter_events(events, {:type => 1 })).to eql([events[2]])
89
+ end
90
+
91
+ it 'filters events if a type is the same as an event type' do
92
+ expect(described_class.filter_events(events, {:types => [1, 2] })).to eql(events[2,2])
93
+ end
94
+ end
95
+
96
+ end
97
+
98
+ describe '#filter_events' do
99
+ it 'calls the clas level filter events' do
100
+ allow(described_class).to receive(:filter_events)
101
+ expect(described_class).to receive(:filter_events)
102
+ subject.filter_events([], {})
103
+ end
104
+ end
105
+
106
+ describe '#outputs' do
107
+ it 'starts empty' do
108
+ expect(subject.outputs).to be_empty
109
+ end
110
+ end
111
+
112
+ describe '#input' do
113
+ it 'starts empty' do
114
+ expect(subject.input).to be_nil
115
+ end
116
+ end
117
+
118
+ describe '#add_observer' do
119
+
120
+ it 'returns the opts args passed in (like Observerable)' do
121
+ expect(subject.add_observer(*outputs.first)).to eql(outputs.first.last)
122
+ end
123
+
124
+ it 'adds to #ouputs' do
125
+ subject.add_observer(*outputs.first)
126
+ expect(subject.outputs).to be == outputs.first.take(1)
127
+ end
128
+ end
129
+
130
+ describe '#initialize' do
131
+
132
+ subject { described_class.new(input, outputs) }
133
+
134
+ it 'sets #outputs' do
135
+ expect(subject.outputs).to eql(outputs.map(&:first))
136
+ end
137
+
138
+ it 'sets #input' do
139
+ expect(subject.input).to eql(input)
140
+ end
141
+
142
+ it 'adds it to #all' do
143
+ expect(described_class.all).to eql([subject])
144
+ end
145
+
146
+ end
147
+
148
+ describe '#notify_observers' do
149
+ it 'pushes passed in events to observers' do
150
+ arg = described_class.new(input, outputs)
151
+ arg.changed
152
+ arg.notify_observers(*events)
153
+ expect(outputs.flat_map(&:first)).not_to be_empty
154
+ end
155
+ end
156
+
157
+ describe '#demux' do
158
+ it 'pulls from the input and pushes to the correct observers' do
159
+ arg = described_class.new(input, outputs)
160
+ (arg.input ||= []) << events.first
161
+ arg.demux
162
+ expect(outputs.flat_map(&:first)).to all(be_a(OutEvent))
163
+ end
164
+ end
165
+
166
+ end