shuber-interface 0.0.0 → 0.0.1

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.
@@ -1,10 +1,16 @@
1
1
  module Interface
2
- # When extended, this abstract interface will re-define an object's methods to raise <tt>NotImplementedError</tt> when called
2
+ # When extended, this abstract interface will re-define an object's methods to raise <tt>NotImplementedError</tt> when called (unless handled by <tt>method_missing</tt>)
3
3
  module Abstract
4
4
  def self.extended(base) # :nodoc:
5
5
  base.class_eval do
6
6
  instance_methods(false).each do |method|
7
- define_method(method) { |*args| raise NotImplementedError.new("#{self.class} needs to implement '#{method}' for interface #{base}") }
7
+ define_method(method) do |*args|
8
+ begin
9
+ method_missing(method.to_sym, *args)
10
+ rescue NoMethodError
11
+ raise NotImplementedError.new("#{self.class} needs to implement '#{method}' for interface #{base}")
12
+ end
13
+ end
8
14
  end
9
15
  end
10
16
  end
@@ -3,7 +3,7 @@ module Interface
3
3
  module Version
4
4
  MAJOR = 0
5
5
  MINOR = 0
6
- PATCH = 0
6
+ PATCH = 1
7
7
 
8
8
  # Returns a version string by joining <tt>MAJOR</tt>, <tt>MINOR</tt>, and <tt>PATCH</tt> with <tt>'.'</tt>
9
9
  #
@@ -6,6 +6,9 @@ module MockInterface end
6
6
  module Remote
7
7
  def on
8
8
  end
9
+
10
+ def off
11
+ end
9
12
  end
10
13
 
11
14
  class BrokenDevice
@@ -18,6 +21,10 @@ class Device < BrokenDevice
18
21
  def on
19
22
  @power = true
20
23
  end
24
+
25
+ def method_missing(method, *args)
26
+ method == :off ? @power = false : super
27
+ end
21
28
  end
22
29
 
23
30
  class InterfaceTest < Test::Unit::TestCase
@@ -34,10 +41,14 @@ class InterfaceTest < Test::Unit::TestCase
34
41
  assert_raises(NotImplementedError) { BrokenDevice.new.on }
35
42
  end
36
43
 
37
- def test_should_not_raise_not_implemented_error
44
+ def test_should_not_raise_not_implemented_error_if_method_is_defined
38
45
  assert Device.new.on
39
46
  end
40
47
 
48
+ def test_should_not_raise_not_implemented_error_if_method_is_defined_by_method_missing
49
+ assert !Device.new.off
50
+ end
51
+
41
52
  def test_should_return_interfaces
42
53
  assert_equal [Remote, MockInterface], Device.interfaces
43
54
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shuber-interface
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 0
10
- version: 0.0.0
9
+ - 1
10
+ version: 0.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sean Huber