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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7f7e0fb9fd7b92605d1955856208831867a90b48
4
+ data.tar.gz: 091edf82db552c23f118d102c0794a6aba48ad04
5
+ SHA512:
6
+ metadata.gz: f9775f83362a45b3504895d8a07325e59ed645e31e398d3081e9ed9101ce8b27aa9c72f161b1421c372812416607bcd0900c29fe9225a56fe9bbf2943407eb20
7
+ data.tar.gz: 0809ddb3e7428936737ddcbcb1e1611cd173563376add3b2ae11b623354e06987995555950ab2aceebb5335ad084b4266c3768453221168279249dd6e198776b
@@ -0,0 +1,9 @@
1
+
2
+ require 'vigilem/support'
3
+
4
+ # req's Core::System
5
+ require 'vigilem/core/device'
6
+
7
+ require 'vigilem/core/input_system_handler'
8
+
9
+ require 'vigilem/core/event_handler'
@@ -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,2 @@
1
+ require 'vigilem/core/adapters/adapter'
2
+ require 'vigilem/core/adapters/buffered_adapter'
@@ -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