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