vigilem-core 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/vigilem/core.rb +9 -0
- data/lib/vigilem/core/abstract_device.rb +97 -0
- data/lib/vigilem/core/adapters.rb +2 -0
- data/lib/vigilem/core/adapters/adapter.rb +57 -0
- data/lib/vigilem/core/adapters/basic_adapter.rb +43 -0
- data/lib/vigilem/core/adapters/buffered_adapter.rb +28 -0
- data/lib/vigilem/core/buffer.rb +151 -0
- data/lib/vigilem/core/buffer_handler.rb +95 -0
- data/lib/vigilem/core/default_buffer.rb +45 -0
- data/lib/vigilem/core/demultiplexer.rb +225 -0
- data/lib/vigilem/core/device.rb +43 -0
- data/lib/vigilem/core/event_handler.rb +156 -0
- data/lib/vigilem/core/eventable.rb +80 -0
- data/lib/vigilem/core/hooks.rb +36 -0
- data/lib/vigilem/core/hooks/callback.rb +66 -0
- data/lib/vigilem/core/hooks/callback_proc.rb +25 -0
- data/lib/vigilem/core/hooks/conditional_hook.rb +62 -0
- data/lib/vigilem/core/hooks/hook.rb +193 -0
- data/lib/vigilem/core/hooks/inheritable.rb +24 -0
- data/lib/vigilem/core/hooks/meta_callback.rb +53 -0
- data/lib/vigilem/core/hooks/utils.rb +23 -0
- data/lib/vigilem/core/hub.rb +50 -0
- data/lib/vigilem/core/input_system_handler.rb +55 -0
- data/lib/vigilem/core/lockable_pipeline_component.rb +30 -0
- data/lib/vigilem/core/multiplexer.rb +168 -0
- data/lib/vigilem/core/pipeline.rb +68 -0
- data/lib/vigilem/core/stat.rb +121 -0
- data/lib/vigilem/core/system.rb +9 -0
- data/lib/vigilem/core/system/check.rb +33 -0
- data/lib/vigilem/core/transfer_agent.rb +67 -0
- data/lib/vigilem/core/version.rb +5 -0
- data/spec/bug_notes.txt +12 -0
- data/spec/given_helper.rb +12 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/vigilem/core/abstract_device_spec.rb +103 -0
- data/spec/vigilem/core/adapters/adapter_spec.rb +28 -0
- data/spec/vigilem/core/adapters/basic_adapter_spec.rb +53 -0
- data/spec/vigilem/core/adapters/buffered_adapter_spec.rb +16 -0
- data/spec/vigilem/core/buffer_handler_spec.rb +51 -0
- data/spec/vigilem/core/buffer_spec.rb +236 -0
- data/spec/vigilem/core/default_buffer_spec.rb +17 -0
- data/spec/vigilem/core/demultiplexer_spec.rb +166 -0
- data/spec/vigilem/core/device_spec.rb +62 -0
- data/spec/vigilem/core/event_handler_spec.rb +134 -0
- data/spec/vigilem/core/hooks/callback_proc_spec.rb +66 -0
- data/spec/vigilem/core/hooks/hook_spec.rb +230 -0
- data/spec/vigilem/core/hooks/inheritable_spec.rb +19 -0
- data/spec/vigilem/core/hooks/meta_callback_spec.rb +69 -0
- data/spec/vigilem/core/hooks/utils_spec.rb +25 -0
- data/spec/vigilem/core/hooks_spec.rb +50 -0
- data/spec/vigilem/core/hub_spec.rb +51 -0
- data/spec/vigilem/core/input_system_handler_spec.rb +33 -0
- data/spec/vigilem/core/lockable_pipeline_component_spec.rb +19 -0
- data/spec/vigilem/core/multiplexer_spec.rb +113 -0
- data/spec/vigilem/core/pipeline_spec.rb +5 -0
- data/spec/vigilem/core/stat_spec.rb +63 -0
- data/spec/vigilem/core/system/check_spec.rb +24 -0
- data/spec/vigilem/core/system_spec.rb +29 -0
- data/spec/vigilem/core/transfer_agent_spec.rb +80 -0
- metadata +273 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7f7e0fb9fd7b92605d1955856208831867a90b48
|
4
|
+
data.tar.gz: 091edf82db552c23f118d102c0794a6aba48ad04
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9775f83362a45b3504895d8a07325e59ed645e31e398d3081e9ed9101ce8b27aa9c72f161b1421c372812416607bcd0900c29fe9225a56fe9bbf2943407eb20
|
7
|
+
data.tar.gz: 0809ddb3e7428936737ddcbcb1e1611cd173563376add3b2ae11b623354e06987995555950ab2aceebb5335ad084b4266c3768453221168279249dd6e198776b
|
data/lib/vigilem/core.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'vigilem/support/core_ext'
|
2
|
+
|
3
|
+
require 'vigilem/support/obj_space'
|
4
|
+
|
5
|
+
require 'vigilem/core/hooks'
|
6
|
+
|
7
|
+
require 'vigilem/support/lazy_simple_delegator'
|
8
|
+
|
9
|
+
require 'vigilem/core/adapters/adapter'
|
10
|
+
|
11
|
+
module Vigilem
|
12
|
+
module Core
|
13
|
+
#
|
14
|
+
class AbstractDevice < Support::LazySimpleDelegator
|
15
|
+
|
16
|
+
extend Hooks
|
17
|
+
|
18
|
+
include Adapters::Adapter
|
19
|
+
|
20
|
+
extend Support::ObjSpace
|
21
|
+
|
22
|
+
class << self
|
23
|
+
# @param [Array] args
|
24
|
+
# @param [Proc] block
|
25
|
+
def new(*args, &block)
|
26
|
+
ret = obj_register(super(*args, &block))
|
27
|
+
run_hook(:after_init, ret)
|
28
|
+
ret
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# @param [Class] base
|
33
|
+
# @return
|
34
|
+
def inherited(base)
|
35
|
+
super(base)
|
36
|
+
hooks.select(&:inheritable?).each do |hook|
|
37
|
+
base.instance_eval do
|
38
|
+
define_method(hook.name, &hook)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
Hooks::Hook.new(:after_init).bind(self)
|
46
|
+
|
47
|
+
after_init do |dev|
|
48
|
+
dev.run_system_checks
|
49
|
+
end
|
50
|
+
|
51
|
+
# calls all the hooks with options[:type] == :system_check
|
52
|
+
# @return [Array<Hook>] the hooks that ran
|
53
|
+
def run_system_checks
|
54
|
+
self.class.hooks.select {|hook| hook.options[:type] == :system_check }.map do |hook|
|
55
|
+
run_hook hook.name
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# the Callbacks that passed/ran
|
60
|
+
# @return [Array<CallBack>]
|
61
|
+
def settings
|
62
|
+
hks = self.class.hooks
|
63
|
+
passed_hooks = hks.select {|hk| hk.respond_to?(:passed) }
|
64
|
+
if _hooks_status_hash_cache_ != (nw_hash = passed_hooks.map(&:status_hash).join)
|
65
|
+
@settings = hks.select {|hook| setting?(hook) }.compact
|
66
|
+
_hooks_status_hash_cache_ = nw_hash
|
67
|
+
end
|
68
|
+
@settings
|
69
|
+
end
|
70
|
+
|
71
|
+
# test whether or not a hook is a setting
|
72
|
+
# @param [Hook] hook the hook to test
|
73
|
+
# @return [TrueClass || FalseClass]
|
74
|
+
def setting?(hook)
|
75
|
+
conditional = hook.respond_to?(:passed)
|
76
|
+
(not conditional) or (conditional and not hook.passed.empty?)
|
77
|
+
end
|
78
|
+
|
79
|
+
# if any system_checks pass this device is available
|
80
|
+
# @return [TrueClass || FalseClass] whether or not it's available
|
81
|
+
def available?
|
82
|
+
self.settings.any? {|name, hook| hook.options[:type] == :system_check }
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# @param obj
|
87
|
+
# @return
|
88
|
+
def import(obj)
|
89
|
+
self.link = obj
|
90
|
+
__setobj__(obj)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
attr_accessor :_hooks_status_hash_cache_
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
require 'thread'
|
4
|
+
|
5
|
+
require 'active_support/concern'
|
6
|
+
|
7
|
+
require 'vigilem/support/core_ext'
|
8
|
+
|
9
|
+
require 'vigilem/core/lockable_pipeline_component'
|
10
|
+
|
11
|
+
require 'vigilem/core/adapters/basic_adapter'
|
12
|
+
|
13
|
+
module Vigilem
|
14
|
+
module Core
|
15
|
+
module Adapters
|
16
|
+
#
|
17
|
+
module Adapter
|
18
|
+
|
19
|
+
extend ActiveSupport::Concern
|
20
|
+
|
21
|
+
include BasicAdapter
|
22
|
+
|
23
|
+
include LockablePipelineComponent
|
24
|
+
|
25
|
+
#
|
26
|
+
# @param link
|
27
|
+
def initialize_adapter(lnk=nil)
|
28
|
+
initialize_basic_adapter(lnk)
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
#
|
33
|
+
module ClassMethods
|
34
|
+
include Forwardable
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# @param src
|
39
|
+
# @param [Hash] opts, future use
|
40
|
+
# @return self
|
41
|
+
def attach(src, opts={})
|
42
|
+
self.link = src
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# @param src
|
48
|
+
# @param [Hash] opts, future use
|
49
|
+
# @return link
|
50
|
+
def affix(src, opts={})
|
51
|
+
self.link = src
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'observer'
|
2
|
+
|
3
|
+
module Vigilem
|
4
|
+
module Core
|
5
|
+
module Adapters
|
6
|
+
#
|
7
|
+
#
|
8
|
+
module BasicAdapter
|
9
|
+
|
10
|
+
include Observable
|
11
|
+
|
12
|
+
#
|
13
|
+
# @param lnk value to assign to @link, defaults to nil
|
14
|
+
def initialize_basic_adapter(lnk=nil)
|
15
|
+
@link = lnk
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# @param value
|
20
|
+
# @return
|
21
|
+
def link=(value)
|
22
|
+
@link = value
|
23
|
+
changed
|
24
|
+
notify_observers('link', @link)
|
25
|
+
@link
|
26
|
+
end
|
27
|
+
|
28
|
+
# source is more dynamic than link,
|
29
|
+
# i.e. and input system handler can have multiple sources
|
30
|
+
# or get it's info from a demultiplexer, yet have no direct #link
|
31
|
+
def source
|
32
|
+
@source || link()
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# the direct item next in line
|
38
|
+
attr_reader :link
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'vigilem/core/adapters/adapter'
|
2
|
+
|
3
|
+
require 'vigilem/core/buffer_handler'
|
4
|
+
|
5
|
+
module Vigilem
|
6
|
+
module Core
|
7
|
+
module Adapters
|
8
|
+
#
|
9
|
+
module BufferedAdapter
|
10
|
+
|
11
|
+
include Vigilem::Core::Adapters::Adapter
|
12
|
+
|
13
|
+
include BufferHandler
|
14
|
+
|
15
|
+
extend ActiveSupport::Concern
|
16
|
+
|
17
|
+
#
|
18
|
+
# @param lnk
|
19
|
+
# @param buffer_type
|
20
|
+
def initialize_buffered(lnk=nil, buffer_type=[])
|
21
|
+
initialize_adapter(lnk)
|
22
|
+
initialize_buffer_handler(buffer_type)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require 'vigilem/support/core_ext'
|
2
|
+
|
3
|
+
require 'vigilem/support/utils'
|
4
|
+
|
5
|
+
module Vigilem
|
6
|
+
module Core
|
7
|
+
#
|
8
|
+
# @abstract
|
9
|
+
# minimum compliance #concat, #slice!, #peek
|
10
|
+
# buffers are typically String or Array
|
11
|
+
module Buffer
|
12
|
+
|
13
|
+
#
|
14
|
+
# @param start_idx_range
|
15
|
+
# @param [Integer] len
|
16
|
+
# @return
|
17
|
+
def slice(start_idx_range, len=nil)
|
18
|
+
_super_check((method_name = __method__), nil, *[start_idx_range, *len]) do
|
19
|
+
self.deep_dup.slice!(start_idx_range, len)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# used because it's available on both String and Array
|
25
|
+
# maybe drop this in favor of shift...
|
26
|
+
# @param [Integer || Range] start_idx_range
|
27
|
+
# @param [Integer] len
|
28
|
+
# @return
|
29
|
+
def slice!(start_idx_range, len=nil)
|
30
|
+
_super_check_fail_on_error(__method__, nil, *[start_idx_range, *len])
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# @return
|
35
|
+
def shift(n=nil)
|
36
|
+
_super_check(__method__, nil, *n) do
|
37
|
+
slice!(0, *n)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# @todo memoization
|
42
|
+
# @raise [RuntimeError]
|
43
|
+
# @return
|
44
|
+
def peek
|
45
|
+
_super_check(__method__) do
|
46
|
+
if (enum = respond(:each)).respond_to? :peek
|
47
|
+
enum.peek
|
48
|
+
else
|
49
|
+
_super_check_fail_on_error(__method__)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# @param other_ary
|
56
|
+
# @return
|
57
|
+
def concat(other_buffer)
|
58
|
+
_super_check_fail_on_error(__method__, nil, other_buffer)
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# @param [Integer] len
|
63
|
+
# @return [Array<Object, Integer>] [obj #slice!ed, remainder of len]
|
64
|
+
def offset!(len)
|
65
|
+
Support::Utils.offset!(self, len)
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# @param [Integer] len
|
70
|
+
# @return [Array<Object, Integer>] [obj #slice!ed, remainder of len]
|
71
|
+
def offset(len)
|
72
|
+
Support::Utils.offset(self, len)
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# @param [Integer] num
|
77
|
+
# @raise [ArgumentError]
|
78
|
+
# @return
|
79
|
+
def pop(num=nil)
|
80
|
+
_super_check((method_name = __method__), nil, *num) do
|
81
|
+
raise ArgumentError, 'negative array size' if num < 0
|
82
|
+
ret = slice!(-num, num)
|
83
|
+
if num.nil? then slice!(-num, num) else Support::Utils.unwrap_ary(ret) end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# @return [TrueClass || FalseClass]
|
89
|
+
def empty?
|
90
|
+
_super_check(__method__) do
|
91
|
+
begin
|
92
|
+
!!peek
|
93
|
+
rescue StopIteration
|
94
|
+
false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
#
|
100
|
+
# @raise [TypeError]
|
101
|
+
# @return [Buffer]
|
102
|
+
def deep_dup
|
103
|
+
_super_check(__method__) do
|
104
|
+
Support::Utils.deep_dup(self)
|
105
|
+
end
|
106
|
+
rescue TypeError
|
107
|
+
raise "#{self} does not respond_to? :slice, :deep_dup, :_dump and no :_dump_data is defined for class #{self.class}"
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# @param
|
112
|
+
# @return [DefaultBuffer]
|
113
|
+
def self.new(type=[])
|
114
|
+
require 'vigilem/core/default_buffer'
|
115
|
+
DefaultBuffer.new(type)
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
#
|
121
|
+
# @param [Symbol] method_name
|
122
|
+
# @param [Proc] arg_block
|
123
|
+
# @param [Array] args
|
124
|
+
# @raise [RuntimeError]
|
125
|
+
# @return
|
126
|
+
def _super_check_fail_on_error(method_name, arg_block=nil, *args)
|
127
|
+
_super_check(method_name, arg_block, *args) do
|
128
|
+
raise NoMethodError, "This #{self.inspect} does not respond_to? :#{method_name}"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# checks to see if the method has a super
|
133
|
+
# if it does, it calls it, else executes the otherwise block
|
134
|
+
# @param [Symbol] method_name
|
135
|
+
# @param [Proc] arg_block
|
136
|
+
# @param [Array] args
|
137
|
+
# @param [Proc] otherwise
|
138
|
+
# @return
|
139
|
+
def _super_check(method_name, arg_block=nil, *args, &otherwise)
|
140
|
+
if (obj = respond(:__getobj__)).respond_to?(method_name)
|
141
|
+
obj.method(method_name).call(*args, &arg_block)
|
142
|
+
elsif (supa = self.class.superclass).method_defined?(method_name)
|
143
|
+
supa.instance_method(method_name).bind(self).call(*args, &arg_block)
|
144
|
+
else
|
145
|
+
otherwise.call
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'monitor'
|
2
|
+
|
3
|
+
require 'thread_safe'
|
4
|
+
|
5
|
+
require 'vigilem/core/default_buffer'
|
6
|
+
|
7
|
+
module Vigilem
|
8
|
+
module Core
|
9
|
+
#
|
10
|
+
module BufferHandler
|
11
|
+
|
12
|
+
attr_accessor :buffers
|
13
|
+
|
14
|
+
# @todo set default buffer type to with somthing like Queue
|
15
|
+
# @todo allow buffer_type argument to be a buffer object
|
16
|
+
# instead of a delegation to DefaultBuffer
|
17
|
+
# @param buffer_type
|
18
|
+
def initialize_buffer_handler(buffer_type=[])
|
19
|
+
(@buffers ||= ThreadSafe::Hash.new)[:default] = Buffer.new(buffer_type)
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# @return [Monitor]
|
24
|
+
def semaphore
|
25
|
+
if defined? super
|
26
|
+
super
|
27
|
+
else
|
28
|
+
@semaphore ||= Monitor.new
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# @param [Symbol] name, defaults to :default
|
34
|
+
# @param type, defaults to nil
|
35
|
+
# @return [Buffer]
|
36
|
+
def buffer(name=:default, type=nil)
|
37
|
+
raise "default buffer not initialised, call #initialize_buffer_handler or #buffer=" unless buffers
|
38
|
+
if type
|
39
|
+
buffers[name] ||= Buffer.new(type)
|
40
|
+
else
|
41
|
+
buffers[name]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method :inbox, :buffer
|
46
|
+
|
47
|
+
# needed for peek
|
48
|
+
# @param [Integer] len
|
49
|
+
# @param [Symbol] buffer_name
|
50
|
+
# @param [Proc] block
|
51
|
+
# @return
|
52
|
+
def buffered(len, buffer_name=:default, opts={}, &block)
|
53
|
+
semaphore.synchronize {
|
54
|
+
ret, still_to_get = buffer(buffer_name, opts[:type]).offset(len)
|
55
|
+
if still_to_get > 0
|
56
|
+
src_data = Support::Utils.send_all_or_no_args(block, still_to_get)
|
57
|
+
called_for = src_data.slice!(0, still_to_get)
|
58
|
+
ret.concat(called_for)
|
59
|
+
end
|
60
|
+
ret
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
# buffers the block, by taking len from the buffer
|
65
|
+
# and calling the block for the remaining
|
66
|
+
# @param [Integer] len
|
67
|
+
# @param [Symbol] buffer_name
|
68
|
+
# @param [Proc] block
|
69
|
+
# @return
|
70
|
+
def buffered!(len=nil, buffer_name=:default, opts={}, &block)
|
71
|
+
semaphore.synchronize {
|
72
|
+
ret, still_to_get = buffer(buffer_name, opts[:type]).offset!(len)
|
73
|
+
if still_to_get > 0
|
74
|
+
src_data = Support::Utils.send_all_or_no_args(block, still_to_get)
|
75
|
+
called_for = src_data.slice!(0, still_to_get)
|
76
|
+
ret.concat(called_for)
|
77
|
+
buffer(buffer_name).concat(src_data)
|
78
|
+
end
|
79
|
+
ret
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
#
|
86
|
+
# @param set_val
|
87
|
+
# @return
|
88
|
+
def buffer=(set_val)
|
89
|
+
@buffers[:default] = set_val
|
90
|
+
end
|
91
|
+
|
92
|
+
alias_method :inbox=, :buffer=
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|