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.
- 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
|