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,121 @@
1
+ require 'vigilem/support/core_ext'
2
+
3
+ require 'vigilem/support/obj_space'
4
+
5
+ require 'vigilem/core/system'
6
+
7
+ require 'rubygems/dependency_installer'
8
+
9
+ module Vigilem
10
+ module Core
11
+ #
12
+ # Stat(us) of the input_system and the handler
13
+ # gem associated with it
14
+ class Stat
15
+ attr_reader :platform_masks, :gem_name, :input_system_name
16
+
17
+ attr_accessor :api_check
18
+
19
+ private :api_check, :api_check=
20
+
21
+ # @fixme duplicates in ::all
22
+ # @param [String] gem_name
23
+ # @param [Hash] opts
24
+ # @param [Proc] api_check
25
+ # @return
26
+ def self.new(*args, &block)
27
+ obj_register(super(*args, &block))
28
+ end
29
+
30
+ #
31
+ # @param [Array] args
32
+ # @param [Proc] block
33
+ # @return [TrueClass || FalseClass]
34
+ def api_check?(*args, &block)
35
+ !!api_check.call(*args, &block)
36
+ end
37
+
38
+ #
39
+ # @param [String] input_system, the descriptive name of the input_system
40
+ # @param [String] gemname, the gem name of the handler to install
41
+ # @param [Hash] opts
42
+ # @option opts [Array<Regexp || Symbol>] :platforms
43
+ # @option opts :requirement, defaults to Gem::Requirement.default
44
+ # @param [Proc] api_check
45
+ # @return
46
+ def initialize(input_system, gemname, opts={}, &api_check)
47
+ @input_system_name = input_system
48
+ @gem_name = gemname
49
+ @gem_requirement = opts[:requirement] ||= Gem::Requirement.default
50
+
51
+ @platform_masks = [*opts[:platforms] || /.+/].map do |plats|
52
+ if plats.is_a?(Symbol)
53
+ System::SYSTEM_NAME_MASKS[plats]
54
+ elsif plats.is_a?(Regexp)
55
+ plats
56
+ else
57
+ raise NotImplementedError, "UnSupported type #{plats.class}:#{plats}"
58
+ end
59
+ end
60
+ @api_check = api_check
61
+ end
62
+
63
+ #
64
+ #
65
+ def gem_requirement
66
+ @gem_requirement ||= Gem::Requirement.default
67
+ end
68
+
69
+ # whether or not this input_system is availble on given os
70
+ # @param [String || Regexp] os
71
+ # @return [TrueClass || FalseClass]
72
+ def available_on?(os)
73
+ System.check[:os][Regexp.union(platform_masks), os]
74
+ end
75
+
76
+ alias_method :is_available_on?, :available_on?
77
+
78
+ #
79
+ # @param version_requirement, optional
80
+ # @return
81
+ def install(version_requirement=nil)
82
+ @installed = installer.install(gem_name, *version_requirement)
83
+ end
84
+
85
+ #
86
+ # @return [TrueClass || FalseCLass]
87
+ def installed?
88
+ if @installed.nil?
89
+ @installed = Gem::Specification.find_all_by_name(gem_name, *gem_requirement).any?
90
+ else
91
+ @installed
92
+ end
93
+ end
94
+
95
+ #
96
+ # whether or not this input_system is avaialble on this system
97
+ # @return [TrueClass || FalseClass]
98
+ def available?
99
+ available_on?(System.os) and api_check?
100
+ end
101
+
102
+ extend Support::ObjSpace
103
+
104
+ class << self
105
+ #
106
+ # @return [Array<Stat>]
107
+ def all_available
108
+ all.select(&:available?)
109
+ end
110
+
111
+ end
112
+ private
113
+
114
+ #
115
+ # @return [Gem::DependencyInstaller]
116
+ def installer
117
+ @installer ||= Gem::DependencyInstaller.new
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,9 @@
1
+ require 'vigilem/support/system'
2
+
3
+ module Vigilem
4
+ module Core
5
+ System = Vigilem::Support::System
6
+ end
7
+ end
8
+
9
+ require 'vigilem/core/system/check'
@@ -0,0 +1,33 @@
1
+ require 'vigilem/core/stat'
2
+
3
+ module Vigilem
4
+ module Core
5
+ #
6
+ #
7
+ module System
8
+
9
+ # common checks for os and input_system
10
+ # pass `check[:os][/win/]` and it will #=~ against `RbConfig::CONFIG['host_os']`
11
+ # pass a string and it uses #==
12
+ # for input_sysmte_handlers it #find's the input_system_handler with the name that #=~
13
+ # the argument or #== it
14
+ # @return (TruceClass || FalseClass) whether or not the check passed
15
+ def self.check
16
+ @checks ||= {
17
+ :os => lambda do |str_or_regex, os=nil|
18
+ os ||= Support::System.os
19
+ !!(str_or_regex.is_a?(Regexp) and
20
+ str_or_regex =~ os) or
21
+ (str_or_regex.to_s == os.to_s)
22
+ end,
23
+ :input_system => lambda do |name_or_regex|
24
+ ((name_or_regex.is_a?(Regexp) and
25
+ (stats = Stat.all_available).find {|isys| isys.input_system_name =~ name_or_regex }) or
26
+ (stats.find {|isys| isys.input_system_name.to_s == name_or_regex.to_s })
27
+ )
28
+ end
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,67 @@
1
+
2
+ require 'forwardable'
3
+
4
+ require 'vigilem/support/core_ext'
5
+
6
+ require 'vigilem/support/obj_space'
7
+
8
+ require 'vigilem/core/multiplexer'
9
+
10
+ require 'vigilem/core/demultiplexer'
11
+
12
+ module Vigilem
13
+ module Core
14
+ #
15
+ # facade for demultiplexer <-> multiplexer coupling
16
+ class TransferAgent
17
+
18
+ extend Forwardable
19
+
20
+ attr_reader :multiplexer, :demultiplexer
21
+
22
+ def_delegators :demultiplexer, :add_observer, :add_observers, :outputs
23
+
24
+ def_delegator :multiplexer, :add_inputs
25
+
26
+ #
27
+ #
28
+ def self.new(*args)
29
+ obj_register(super(*args))
30
+ end
31
+
32
+ # sets the input on demultiplexer to the ouput of multiplexer
33
+ # if both are nil it sets it to an Array
34
+ # @param [#input=, #demux]
35
+ # @param [#out, #mux]
36
+ def initialize(demuxer, muxer)
37
+ @demultiplexer, @multiplexer = demuxer, muxer
38
+ if (junction = (din = demultiplexer.input) || (mout = multiplexer.out)).nil? or not mout.equal?(din)
39
+ @demultiplexer.input = @multiplexer.out = (junction || [])
40
+ end
41
+ end
42
+
43
+ # checks
44
+ # @param [Integer] num_of_events, defaults to 1
45
+ # @return [NilClass]
46
+ def relay(num_of_events=1)
47
+ multiplexer.mux(num_of_events)
48
+ demultiplexer.demux(num_of_events)
49
+ nil
50
+ end
51
+
52
+ extend Support::ObjSpace
53
+
54
+ class << self
55
+
56
+ #
57
+ # @param [Module]
58
+ # @return
59
+ def inherited(base)
60
+ base.extend Support::ObjSpace
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,5 @@
1
+ module Vigilem
2
+ module Core
3
+ VERSION = '0.0.9'
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ RangeError: bignum too big to convert into `long'/int
2
+ ruby bug Issue #6127
3
+
4
+ doesnt work on default ubuntu ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
5
+
6
+ https://bugs.launchpad.net/ubuntu/+source/ruby1.9.1/+bug/997150
7
+
8
+
9
+ EVIOCGNAME 2164212998
10
+
11
+
12
+ EVIOCGABS
@@ -0,0 +1,12 @@
1
+ # defines a given that takes a block and argument so that the argument given can be used as the description and
2
+ # retrieved by given_value, essentially making bad tests
3
+ RSpec::Core::ExampleGroup.define_singleton_method(:given) do |arg, &example_group_block|
4
+ thread_data = RSpec.thread_local_metadata
5
+ ret = subclass(self, 'given', arg.to_s, &example_group_block).tap do |child|
6
+ children << child
7
+ end
8
+ ret.send(:define_method, :given_value) do
9
+ arg
10
+ end
11
+ ret.new
12
+ end
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+ Bundler.setup
3
+
4
+ require 'rspec/given'
5
+ require 'given_helper'
6
+
7
+ require 'vigilem/support/core_ext/debug_puts'
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/core/abstract_device'
4
+
5
+ describe Vigilem::Core::AbstractDevice do
6
+
7
+ describe '#setting?' do
8
+ describe 'will test whether or not the hook is a setting' do
9
+ context 'Hook' do
10
+ let(:hook) { ::Vigilem::Core::Hooks::Hook.new('tmp') }
11
+
12
+ let!(:callbacks) { hook << ::Vigilem::Core::Hooks::Callback.new { true } }
13
+
14
+ it 'will pass before ran' do
15
+ expect(subject.setting?(hook)).to be_truthy
16
+ end
17
+
18
+ it 'will pass after ran' do
19
+ expect(subject.setting?(hook)).to be_truthy
20
+ end
21
+ end
22
+
23
+ context 'ConditionalHook' do
24
+ context 'passes' do
25
+ let(:hook) do
26
+ ::Vigilem::Core::Hooks::ConditionalHook.new('tmp') do
27
+ condition { true }
28
+ end
29
+ end
30
+
31
+ let!(:callbacks) { hook << ::Vigilem::Core::Hooks::Callback.new { true } }
32
+
33
+ it 'will fail before ran' do
34
+ expect(subject.setting?(hook)).to be_falsey
35
+ end
36
+
37
+ it 'will be a setting when condition passes' do
38
+ hook.call
39
+ expect(subject.setting?(hook)).to be_truthy
40
+ end
41
+ end
42
+
43
+ context 'fails' do
44
+ let(:hook) do
45
+ ::Vigilem::Core::Hooks::ConditionalHook.new('tmp') do
46
+ condition { false }
47
+ end
48
+ end
49
+
50
+ let!(:callbacks) { hook << ::Vigilem::Core::Hooks::Callback.new { true } }
51
+
52
+ it 'will not be a setting when the condition fails' do
53
+ hook.call
54
+ expect(subject.setting?(hook)).to be_falsey
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#new' do
63
+
64
+ it 'will have one init setting after_init' do
65
+ expect(described_class.new.settings.first.name).to eql(:after_init)
66
+ end
67
+
68
+ context 'system checks' do
69
+
70
+ it 'runs the system_check' do
71
+ expect_any_instance_of(described_class).to receive(:run_system_checks)
72
+ described_class.new
73
+ end
74
+
75
+ it 'will add to settings when the check passes' do
76
+ hook = ::Vigilem::Core::Hooks::ConditionalHook.new(:on_always,
77
+ {:type => :system_check, :inheritable => false }) { condition { true } }
78
+ described_class.hooks << hook
79
+ hook << lambda { 'do something' }
80
+ abs = described_class.new
81
+ expect(abs.settings).to_not be_empty
82
+ end
83
+ end
84
+ end
85
+
86
+ describe 'pipeline building' do
87
+ before :all do
88
+ class Cheese
89
+ def yarg?
90
+ puts 'yarg!'
91
+ end
92
+ end
93
+ end
94
+ context 'after_import' do
95
+ let(:cheese) { Cheese.new }
96
+
97
+ it 'will set @delegate_sd_obj to the import arg' do
98
+ subject.import(cheese)
99
+ expect(subject.instance_variable_get(:@delegate_sd_obj)).to eql cheese
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,28 @@
1
+ require 'vigilem/core/adapters/adapter'
2
+
3
+ describe Vigilem::Core::Adapters::Adapter do
4
+
5
+ class Host
6
+ include Vigilem::Core::Adapters::Adapter
7
+
8
+ def initialize(lnk=nil)
9
+ initialize_adapter(lnk)
10
+ end
11
+ end
12
+
13
+ subject { Host.new }
14
+
15
+ describe '#attach' do
16
+ it 'will set the link return self' do
17
+ expect(subject).to receive(:link=).with('new').and_return(subject)
18
+ subject.attach('new')
19
+ end
20
+ end
21
+
22
+ describe '#affix' do
23
+ it 'will set the link and return the new link' do
24
+ expect(subject).to receive(:link=).with('new').and_return('new')
25
+ subject.affix('new')
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,53 @@
1
+ require 'vigilem/core/adapters/basic_adapter'
2
+
3
+ describe Vigilem::Core::Adapters::BasicAdapter do
4
+
5
+ class InitlessBasicHost
6
+ include Vigilem::Core::Adapters::BasicAdapter
7
+ end
8
+
9
+ class BasicHost
10
+ include Vigilem::Core::Adapters::BasicAdapter
11
+
12
+ def initialize(lnk=nil)
13
+ initialize_basic_adapter(lnk)
14
+ end
15
+ end
16
+
17
+ subject { BasicHost.new }
18
+
19
+ describe '#initialize_basic_adapter' do
20
+ it 'sets @link' do
21
+ expect(InitlessBasicHost.new.instance_variable_defined?(:@link)).to be_falsey
22
+ end
23
+ end
24
+
25
+ class Observe
26
+
27
+ attr_writer :notifications
28
+
29
+ def update(type, value)
30
+ notifications << [type, value]
31
+ end
32
+
33
+ def notifications
34
+ @notifications ||= []
35
+ end
36
+ end
37
+
38
+ describe '#link=' do
39
+ it 'will set to changed when link is changed' do
40
+ subject.add_observer(obs = Observe.new)
41
+ subject.link = 'new'
42
+ expect(obs.notifications).to include(['link', 'new'])
43
+ end
44
+ end
45
+
46
+ describe '#source' do
47
+
48
+ end
49
+
50
+ describe '#link' do
51
+
52
+ end
53
+ end