wires 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a3c79a4bb96ed3a79e94be39171fda18a4846025
4
- data.tar.gz: 7dd1087d9f74885e1bbbf4a25d70e07ae98919e9
3
+ metadata.gz: 6396df6f8d7307b304ef8d37d8bc75b30de47dae
4
+ data.tar.gz: ae25aa3fac7ea8f28944e959ed3c4c502a6ea47d
5
5
  SHA512:
6
- metadata.gz: 61b8a2c4881a8fdec36257a7ea4f5bfb2d4831a0157e1a9fbe53897c3d0d83d7746ba655025fbd23903a39af623d9bbf672f798ed5d15344972fa707bedb47bb
7
- data.tar.gz: 962a6bca1dfa83c565920750b46bc9699915603a1e8a5c7bf00a7984477dad2a6cea79ba5323c06ae1686362f28a45b0b5a45db969b9f44bf12369b2991840a6
6
+ metadata.gz: 14589e34c908c567b13163fd14f658b76b8bef1eb98ccb86fee49fed2e138d148c9f29e49c082f79311d9d1aa674a18f744a5dfacc955a0da00262160c4395c4
7
+ data.tar.gz: 0b51394fa0aa581c1b95a4a623851be8814b8337a63c7fce7c9c46c2eec7ecf7af47b0d4da24f171993c26b703d09f28f80125610bf8999bc3eff4b3bf9c33d4
data/lib/wires/channel.rb CHANGED
@@ -10,7 +10,7 @@ module Wires
10
10
  def inspect; "#{self.class}(#{name.inspect})"; end
11
11
 
12
12
  @hub = Hub
13
- @router = Router
13
+ @router = Router::Default
14
14
  @new_lock = Mutex.new
15
15
  @@aim_lock = Mutex.new
16
16
 
@@ -20,7 +20,8 @@ module Wires
20
20
 
21
21
  def new(*args)
22
22
  channel = @new_lock.synchronize do
23
- router.get_channel(self, *args) { |name| super(name) } end
23
+ router.get_channel(self, *args) { |name| super(name) }
24
+ end
24
25
  end
25
26
  alias_method :[], :new
26
27
  end
@@ -33,8 +34,8 @@ module Wires
33
34
  # Register a proc to be triggered by an event on this channel
34
35
  # Return the proc that was passed in
35
36
  def register(*events, &proc)
36
- if not proc.is_a?(Proc) then raise SyntaxError, \
37
- "No Proc given to execute on event: #{events}" end
37
+ raise ArgumentError, "No callable given to execute on event: #{events}" \
38
+ unless proc.respond_to? :call
38
39
  events = Event.new_from(*events)
39
40
 
40
41
  @@aim_lock.synchronize do
@@ -60,7 +61,7 @@ module Wires
60
61
 
61
62
  # Add hook methods
62
63
  class << self
63
- include Hooks
64
+ include Util::Hooks
64
65
 
65
66
  def before_fire(*args, &proc)
66
67
  add_hook(:@before_fire, *args, &proc)
@@ -72,10 +73,13 @@ module Wires
72
73
  end
73
74
 
74
75
  # Fire an event on this channel
75
- def fire(input, blocking:false)
76
+ def fire(input, blocking:false, parallel:!blocking)
76
77
 
77
78
  raise *@not_firable if @not_firable
78
79
 
80
+ return [] << Thread.new { fire(input, blocking:true, parallel:false) } \
81
+ if !blocking and !parallel
82
+
79
83
  backtrace = caller
80
84
 
81
85
  event = Event.new_from(*input)
@@ -105,22 +109,27 @@ module Wires
105
109
  end
106
110
 
107
111
  # Fire to selected targets
108
- procs.uniq.each do |pr|
112
+ threads = procs.uniq.map do |pr|
109
113
  self.class.hub.spawn \
110
114
  event, # fired event object event
111
115
  self.name, # name of channel fired from
112
116
  pr, # proc to execute
113
117
  blocking, # boolean from blocking kwarg
118
+ parallel, # boolean from parallel kwarg
114
119
  backtrace # captured backtrace
115
- end
120
+ end.reject &:nil?
121
+
122
+ threads.each &:join if blocking and parallel
116
123
 
117
124
  self.class.run_hooks(:@after_fire, event, self)
118
125
 
119
- nil end
126
+ threads
127
+ end
120
128
 
121
129
  # Fire a blocking event on this channel
122
- def fire_and_wait(event)
123
- self.fire(event, blocking:true)
130
+ def fire!(event)
131
+ kwargs[:blocking] ||= true
132
+ fire(*args, **kwargs)
124
133
  end
125
134
 
126
135
  # Returns true if listening on 'self' would hear a firing on 'other'
@@ -135,8 +144,6 @@ module Wires
135
144
  self.class.router.get_receivers self
136
145
  end
137
146
 
138
- router.clear_channels
139
-
140
147
  end
141
148
 
142
149
  end
@@ -25,8 +25,8 @@ module Wires
25
25
  end
26
26
  nil end
27
27
 
28
- def fire_and_wait(*args, **kwargs)
29
- kwargs[:blocking]=true
28
+ def fire!(*args, **kwargs)
29
+ kwargs[:blocking] ||= true
30
30
  fire(*args, **kwargs)
31
31
  end
32
32
 
@@ -18,11 +18,11 @@ module Wires
18
18
  # Add methods to ::Time and ::Numeric
19
19
  def extend_core
20
20
  # Add Time#fire for timed firing of events
21
- ::Time.class_eval do
21
+ ::Time.class_eval <<-CODE
22
22
  def fire(event, channel='*', **kwargs)
23
- Wires::TimeScheduler.add(self, event, channel, **kwargs)
23
+ #{TimeScheduler}.add(self, event, channel, **kwargs)
24
24
  end
25
- end
25
+ CODE
26
26
 
27
27
  # Add Numeric => Numeric time-factor converters
28
28
  {
data/lib/wires/hub.rb CHANGED
@@ -66,22 +66,22 @@ module Wires
66
66
  return neglect(*args) \
67
67
  if @hold_lock.instance_variable_get(:@mon_mutex).locked?
68
68
 
69
- event, chan, proc, blocking, fire_bt = *args
69
+ event, chan, proc, blocking, parallel, fire_bt = *args
70
70
  *proc_args = event, chan
71
71
  *exc_args = event, chan, fire_bt
72
72
 
73
- # If blocking, run the proc in this thread
74
- if blocking
73
+ # If not parallel, run the proc in this thread
74
+ if !parallel
75
75
  begin
76
76
  proc.call(*proc_args)
77
77
  rescue Exception => exc
78
78
  unhandled_exception(exc, *exc_args)
79
79
  end
80
80
 
81
- return :done
81
+ return nil
82
82
  end
83
83
 
84
- # If not blocking, clear old threads and spawn a new thread
84
+ # If not parallel, clear old threads and spawn a new thread
85
85
  Thread.exclusive do
86
86
  begin
87
87
  # Raise ThreadError for user-set thread limit to mimic OS limit
@@ -94,7 +94,7 @@ module Wires
94
94
  rescue Exception => exc
95
95
  unhandled_exception(exc, *exc_args)
96
96
  ensure
97
- spawn_neglected_task_chain
97
+ spawn_neglected_task_chain unless blocking
98
98
  @children.synchronize { @children.delete Thread.current }
99
99
  end
100
100
  end
@@ -112,11 +112,12 @@ module Wires
112
112
 
113
113
  # Join child threads, one by one, allowing more children to appear
114
114
  def join_children
115
- a_thread = Thread.new{nil}
116
- while a_thread
115
+ a_thread = nil
116
+ loop do
117
117
  @children.synchronize do
118
118
  a_thread = @children.shift
119
119
  end
120
+ break unless a_thread
120
121
  a_thread.join if ((a_thread) and (a_thread!=Thread.current))
121
122
  Thread.pass
122
123
  end
data/lib/wires/router.rb CHANGED
@@ -1,42 +1,64 @@
1
1
 
2
2
  module Wires
3
-
4
- class Router
3
+ module Router
5
4
 
6
- @table = Hash.new
7
5
 
8
- class << self
9
-
10
- attr_accessor :table
11
-
12
- def clear_channels()
13
- @initialized = true
14
- @table = {}
15
- @fuzzy_table = {}
16
- Channel['*']
17
- end
18
-
19
- def get_channel(chan_cls, name)
20
- channel = @table[name] ||= (new_one=true; yield name)
21
-
22
- if new_one and name.is_a? Regexp then
23
- @fuzzy_table[name] = channel
24
- channel.not_firable = [TypeError,
25
- "Cannot fire on Regexp channel: #{name.inspect}."\
26
- " Regexp channels can only used in event handlers."]
6
+ class Default
7
+ class << self
8
+
9
+ def clear_channels()
10
+ @table = {}
11
+ @fuzzy_table = {}
12
+ @star = nil
13
+ end
14
+
15
+ def get_channel(chan_cls, name)
16
+ @chan_cls ||= chan_cls
17
+ channel = @table[name] ||= (new_one=true; yield name)
18
+
19
+ if new_one and name.is_a? Regexp then
20
+ @fuzzy_table[name] = channel
21
+ channel.not_firable = [TypeError,
22
+ "Cannot fire on Regexp channel: #{name.inspect}."\
23
+ " Regexp channels can only used in event handlers."]
24
+ end
25
+
26
+ channel
27
+ end
28
+
29
+ def get_receivers(chan)
30
+ name = chan.name
31
+ return @table.values if name == '*'
32
+
33
+ @fuzzy_table.each_pair.select do |k,v|
34
+ (begin; name =~ k; rescue TypeError; end)
35
+ end.map { |k,v| v } + [chan, (@star||=@chan_cls['*'])]
27
36
  end
28
37
 
29
- channel
30
38
  end
31
-
32
- def get_receivers(chan)
33
- name = chan.name
34
- @fuzzy_table.keys.select do |k|
35
- (begin; name =~ k; rescue TypeError; end)
36
- end.map { |k| @fuzzy_table[k] } + [chan, @table['*']]
39
+ clear_channels
40
+ end
41
+
42
+
43
+ class Simple
44
+ class << self
45
+
46
+ def clear_channels()
47
+ @table = {}
48
+ end
49
+
50
+ def get_channel(chan_cls, name)
51
+ @table[name] ||= yield name
52
+ end
53
+
54
+ def get_receivers(chan)
55
+ [chan]
56
+ end
57
+
37
58
  end
38
-
59
+ clear_channels
39
60
  end
61
+
62
+
40
63
  end
41
-
42
64
  end
@@ -0,0 +1,63 @@
1
+
2
+ module Wires
3
+
4
+ # A singleton class to schedule future firing of events
5
+ class TimeScheduler
6
+ @schedule = Array.new
7
+ @thread = Thread.new {nil}
8
+ @schedule_lock = Monitor.new
9
+ @cond = @schedule_lock.new_cond
10
+
11
+ class << self
12
+
13
+ # Add an event to the schedule
14
+ def add(*args)
15
+ new_item = args.first
16
+ new_item = (TimeSchedulerItem.new *args) \
17
+ unless new_item.is_a? TimeSchedulerItem
18
+
19
+ new_item.schedulers << self
20
+ schedule_update new_item
21
+ new_item
22
+ end
23
+
24
+ # Add an event to the schedule using << operator
25
+ def <<(arg); add(*arg); end
26
+
27
+ # Get a copy of the event schedule from outside the class
28
+ def list; @schedule_lock.synchronize { @schedule.dup } end
29
+ # Clear the event schedule from outside the class
30
+ def clear; @schedule_lock.synchronize { @schedule.clear } end
31
+ # Make the scheduler wake up and re-evaluate
32
+ def refresh; schedule_update end
33
+
34
+ private
35
+
36
+ def schedule_update(item_to_add=nil)
37
+ @schedule_lock.synchronize do
38
+ @schedule << item_to_add if item_to_add
39
+ @schedule.select! {|x| x.active?}
40
+ @schedule.sort! {|a,b| a.time <=> b.time}
41
+ @cond.broadcast
42
+ end
43
+ nil end
44
+
45
+ def main_loop
46
+ pending = []
47
+ loop do
48
+ @schedule_lock.synchronize do
49
+ timeout = (@schedule.first.time_until unless @schedule.empty?)
50
+ @cond.wait timeout
51
+ pending = @schedule.take_while &:ready?
52
+ end
53
+ pending.each &:fire
54
+ end
55
+ nil end
56
+
57
+ end
58
+
59
+ @thread = Thread.new { main_loop }
60
+
61
+ end
62
+
63
+ end
@@ -1,8 +1,6 @@
1
1
 
2
2
  module Wires
3
3
 
4
- class TimeSchedulerAnonEvent < Event; end
5
-
6
4
  class TimeSchedulerItem
7
5
 
8
6
  attr_reader :time, :event, :channel, :interval
@@ -14,7 +12,6 @@ module Wires
14
12
  **kwargs)
15
13
 
16
14
  time ||= Time.now
17
- expect_type time, Time
18
15
 
19
16
  @active = (not cancel)
20
17
  tempcount = count
@@ -81,63 +78,4 @@ module Wires
81
78
  :count_dec
82
79
  end
83
80
 
84
- # A singleton class to schedule future firing of events
85
- class TimeScheduler
86
- @schedule = Array.new
87
- @thread = Thread.new {nil}
88
- @schedule_lock = Monitor.new
89
- @cond = @schedule_lock.new_cond
90
-
91
- class << self
92
-
93
- # Add an event to the schedule
94
- def add(*args)
95
- new_item = args.first
96
- new_item = (TimeSchedulerItem.new *args) \
97
- unless new_item.is_a? TimeSchedulerItem
98
-
99
- new_item.schedulers << self
100
- schedule_update new_item
101
- new_item
102
- end
103
-
104
- # Add an event to the schedule using << operator
105
- def <<(arg); add(*arg); end
106
-
107
- # Get a copy of the event schedule from outside the class
108
- def list; @schedule_lock.synchronize { @schedule.dup } end
109
- # Clear the event schedule from outside the class
110
- def clear; @schedule_lock.synchronize { @schedule.clear } end
111
- # Make the scheduler wake up and re-evaluate
112
- def refresh; schedule_update end
113
-
114
- private
115
-
116
- def schedule_update(item_to_add=nil)
117
- @schedule_lock.synchronize do
118
- @schedule << item_to_add if item_to_add
119
- @schedule.select! {|x| x.active?}
120
- @schedule.sort! {|a,b| a.time <=> b.time}
121
- @cond.broadcast
122
- end
123
- nil end
124
-
125
- def main_loop
126
- pending = []
127
- loop do
128
- @schedule_lock.synchronize do
129
- timeout = (@schedule.first.time_until unless @schedule.empty?)
130
- @cond.wait timeout
131
- pending = @schedule.take_while &:ready?
132
- end
133
- pending.each &:fire
134
- end
135
- nil end
136
-
137
- end
138
-
139
- @thread = Thread.new { main_loop }
140
-
141
- end
142
-
143
81
  end
@@ -0,0 +1,22 @@
1
+
2
+ module Wires
3
+ module Util
4
+
5
+ # Build an alternate version of the Wires module that doesn't
6
+ # know about or interfere with the original Wires module.
7
+ # Specify the module_path as a string, starting with global locator '::':
8
+ # >> module MyModule; end
9
+ # >> Wires::Util.build_alt "::MyModule::MyWires"
10
+ def self.build_alt(module_path)
11
+ main_file = File.expand_path("../../wires.rb", File.dirname(__FILE__))
12
+
13
+ File.read(main_file)
14
+ .scan(/require_relative[\s\(]+(["'])(.*)\1/)
15
+ .map(&:last)
16
+ .map { |file| File.expand_path("#{file}.rb", File.dirname(main_file)) }
17
+ .map { |file| File.read file }
18
+ .each { |code| eval code.gsub("Wires", "#{module_path}") }
19
+ end
20
+
21
+ end
22
+ end
@@ -1,56 +1,58 @@
1
1
 
2
2
  module Wires
3
- module Hooks
4
-
5
- # Register a hook - can be called multiple times if retain is true
6
- def add_hook(hooks_sym, retain=false, &proc)
7
- hooks = instance_variable_get(hooks_sym.to_sym)
8
- if hooks
9
- hooks << [proc, retain]
10
- else
11
- instance_variable_set(hooks_sym.to_sym, [[proc, retain]])
12
- end
13
- proc
14
- end
15
-
16
- # Remove a hook by proc reference
17
- def remove_hook(hooks_sym, &proc)
18
- hooks = instance_variable_get(hooks_sym.to_sym)
19
- return unless hooks
20
- hooks.reject! {|h| h[0]==proc}
21
- end
22
-
23
- # Run all hooks, deleting those not marked for retention
24
- def run_hooks(hooks_sym, *exc_args)
25
- hooks = instance_variable_get(hooks_sym.to_sym)
26
- return unless hooks
27
- for hook in hooks
28
- proc, retain = hook
29
- proc.call(*exc_args)
3
+ module Util
4
+ module Hooks
5
+
6
+ # Register a hook - can be called multiple times if retain is true
7
+ def add_hook(hooks_sym, retain=false, &proc)
8
+ hooks = instance_variable_get(hooks_sym.to_sym)
9
+ if hooks
10
+ hooks << [proc, retain]
11
+ else
12
+ instance_variable_set(hooks_sym.to_sym, [[proc, retain]])
13
+ end
14
+ proc
30
15
  end
31
- nil end
32
-
33
- # Clear hooks not marked for retention (or all hooks if force)
34
- def clear_hooks(hooks_sym, force=false)
35
- hooks = instance_variable_get(hooks_sym.to_sym)
36
- return unless hooks
37
- (force ? hooks.clear : hooks.select!{|h| h[1]})
38
- nil end
39
-
40
- # Flush/run all hooks, keeping only those marked for retention
41
- def flush_hooks(hooks_sym, *exc_args)
42
- hooks = instance_variable_get(hooks_sym.to_sym)
43
- return unless hooks
44
- retained = Queue.new
45
- while not hooks.empty?
46
- proc, retain = hooks.shift
47
- retained << [proc, retain] if retain
48
- proc.call(*exc_args)
16
+
17
+ # Remove a hook by proc reference
18
+ def remove_hook(hooks_sym, &proc)
19
+ hooks = instance_variable_get(hooks_sym.to_sym)
20
+ return unless hooks
21
+ hooks.reject! {|h| h[0]==proc}
49
22
  end
50
- while not retained.empty?
51
- hooks << retained.shift
23
+
24
+ # Run all hooks, deleting those not marked for retention
25
+ def run_hooks(hooks_sym, *exc_args)
26
+ hooks = instance_variable_get(hooks_sym.to_sym)
27
+ return unless hooks
28
+ for hook in hooks
29
+ proc, retain = hook
30
+ proc.call(*exc_args)
31
+ end
32
+ nil end
33
+
34
+ # Clear hooks not marked for retention (or all hooks if force)
35
+ def clear_hooks(hooks_sym, force=false)
36
+ hooks = instance_variable_get(hooks_sym.to_sym)
37
+ return unless hooks
38
+ (force ? hooks.clear : hooks.select!{|h| h[1]})
39
+ nil end
40
+
41
+ # Flush/run all hooks, keeping only those marked for retention
42
+ def flush_hooks(hooks_sym, *exc_args)
43
+ hooks = instance_variable_get(hooks_sym.to_sym)
44
+ return unless hooks
45
+ retained = Queue.new
46
+ while not hooks.empty?
47
+ proc, retain = hooks.shift
48
+ retained << [proc, retain] if retain
49
+ proc.call(*exc_args)
50
+ end
51
+ while not retained.empty?
52
+ hooks << retained.shift
53
+ end
52
54
  end
53
- end
54
55
 
56
+ end
55
57
  end
56
58
  end
data/lib/wires.rb CHANGED
@@ -1,14 +1,15 @@
1
1
 
2
2
  require 'thread'
3
- require 'threadlock' # Easily add re-entrant lock to instance methods
3
+ require 'threadlock'
4
4
 
5
- require_relative 'wires/util/expect_type'
6
5
  require_relative 'wires/util/hooks'
6
+ require_relative 'wires/util/build_alt'
7
7
 
8
8
  require_relative 'wires/event'
9
9
  require_relative 'wires/hub'
10
10
  require_relative 'wires/router'
11
11
  require_relative 'wires/channel'
12
- require_relative 'wires/time'
12
+ require_relative 'wires/time_scheduler_item'
13
+ require_relative 'wires/time_scheduler'
13
14
  require_relative 'wires/core_ext'
14
15
  require_relative 'wires/convenience'
metadata CHANGED
@@ -1,87 +1,88 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wires
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe McIlvain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-19 00:00:00.000000000 Z
11
+ date: 2013-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: threadlock
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: wires-test
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: jemc-reporter
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: An asynchronous (threaded) event routing framework in Ruby. Patch your
70
- objects together with wires. Inspired by the python 'circuits' framework.
69
+ description: A lightweight, extensible asynchronous event routing framework in Ruby.
70
+ Patch your objects together with wires. Inspired by the python 'circuits' framework.
71
71
  email: joe.eli.mac@gmail.com
72
72
  executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
76
  - lib/wires.rb
77
- - lib/wires/time.rb
78
77
  - lib/wires/hub.rb
79
78
  - lib/wires/router.rb
80
79
  - lib/wires/core_ext.rb
81
- - lib/wires/util/expect_type.rb
80
+ - lib/wires/util/build_alt.rb
82
81
  - lib/wires/util/hooks.rb
83
82
  - lib/wires/convenience.rb
84
83
  - lib/wires/channel.rb
84
+ - lib/wires/time_scheduler_item.rb
85
+ - lib/wires/time_scheduler.rb
85
86
  - lib/wires/event.rb
86
87
  - LICENSE
87
88
  - README.md
@@ -95,17 +96,17 @@ require_paths:
95
96
  - lib
96
97
  required_ruby_version: !ruby/object:Gem::Requirement
97
98
  requirements:
98
- - - '>='
99
+ - - ">="
99
100
  - !ruby/object:Gem::Version
100
101
  version: '0'
101
102
  required_rubygems_version: !ruby/object:Gem::Requirement
102
103
  requirements:
103
- - - '>='
104
+ - - ">="
104
105
  - !ruby/object:Gem::Version
105
106
  version: '0'
106
107
  requirements: []
107
108
  rubyforge_project:
108
- rubygems_version: 2.0.3
109
+ rubygems_version: 2.1.5
109
110
  signing_key:
110
111
  specification_version: 4
111
112
  summary: wires
@@ -1,6 +0,0 @@
1
-
2
- def expect_type(x, type)
3
- unless x.is_a? type
4
- raise "Expected #{x.inspect} to be an instance of #{type}."
5
- end
6
- end