vigilem-core 0.0.9

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