instantiator 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  I want to be able to instantiate an arbitrary Ruby class without knowing anything about the constructor.
4
4
 
5
+ The initial requirement for this has come from my [Introspection](https://github.com/floehopper/introspection) project.
6
+
5
7
  ### Usage
6
8
 
7
9
  class ArbitraryClass
@@ -3,7 +3,15 @@ require "blankslate"
3
3
 
4
4
  module Instantiator
5
5
 
6
- class InstantiationError < StandardError; end
6
+ UNSUPPORTED_NAMESPACES = %w(Introspection OptionParser::Switch URI Net).freeze
7
+ UNSUPPORTED_CLASSES = %w(Introspection OptionParser::Switch Gem::Installer Gem::Package::TarInput Zlib::GzipReader Zlib::GzipWriter Zlib::GzipFile Zlib::ZStream Bundler::Dependency Bundler::Definition Digest::Base Binding UnboundMethod Method Proc Process::Status Dir File::Stat MatchData Struct Bignum Float Fixnum Integer Continuation Thread NameError::message SignalException FalseClass TrueClass Data Symbol NilClass Socket UNIXServer UNIXSocket TCPServer TCPSocket UDPSocket IPSocket BasicSocket Trying).freeze
8
+ UNSUPPORTED_REGEX = Regexp.new((UNSUPPORTED_NAMESPACES.map { |ns| "^#{ns}::" } + UNSUPPORTED_CLASSES.map { |c| "^#{c}$" }).join("|")).freeze
9
+
10
+ def self.unsupported_class?(klass)
11
+ klass.to_s[UNSUPPORTED_REGEX]
12
+ end
13
+
14
+ class Error < StandardError; end
7
15
 
8
16
  class MethodInvocationSink < ::BlankSlate
9
17
  def method_missing(method_name, *args, &block)
@@ -12,10 +20,22 @@ module Instantiator
12
20
  def to_str
13
21
  String.new
14
22
  end
23
+ def to_int
24
+ Integer(0)
25
+ end
26
+ def to_ary
27
+ Array.new
28
+ end
29
+ def to_hash
30
+ Hash.new
31
+ end
15
32
  end
16
33
 
17
34
  module ClassMethods
18
35
  def instantiate
36
+ if Instantiator.unsupported_class?(self)
37
+ raise Error.new("#{self}.instantiate is not yet supported")
38
+ end
19
39
  if singleton_methods(false).map(&:to_sym).include?(:new)
20
40
  arity = method(:new).arity
21
41
  else
@@ -28,10 +48,9 @@ module Instantiator
28
48
  instance = new(*Array.new(number_of_parameters) { MethodInvocationSink.new })
29
49
  return instance if instance
30
50
  rescue ArgumentError => e
31
- ensure
32
51
  end
33
52
  end
34
- raise InstantiationError.new("Unable to instantiate #{self}")
53
+ raise Error.new("Unable to instantiate #{self}")
35
54
  end
36
55
  end
37
56
  end
@@ -1,3 +1,3 @@
1
1
  module Instantiator
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -197,4 +197,9 @@ class InstantiatorTest < Test::Unit::TestCase
197
197
  instance = StringScanner.instantiate
198
198
  end
199
199
 
200
+ def test_should_raise_exception_if_instantiating_class_is_unsupported
201
+ e = assert_raises(Instantiator::Error) { Proc.instantiate }
202
+ assert_equal "Proc.instantiate is not yet supported", e.message
203
+ end
204
+
200
205
  end
@@ -0,0 +1,27 @@
1
+ require "test_helper"
2
+ require "instantiator"
3
+
4
+ class MethodInvocationSinkTest < Test::Unit::TestCase
5
+
6
+ include Instantiator
7
+
8
+ def setup
9
+ @sink = MethodInvocationSink.new
10
+ end
11
+
12
+ def test_should_return_instance_of_string
13
+ assert_instance_of String, @sink.to_str
14
+ end
15
+
16
+ def test_should_return_instance_of_fixnum
17
+ assert_instance_of Fixnum, @sink.to_int
18
+ end
19
+
20
+ def test_should_return_instance_of_array
21
+ assert_instance_of Array, @sink.to_ary
22
+ end
23
+
24
+ def test_should_return_instance_of_hash
25
+ assert_instance_of Hash, @sink.to_hash
26
+ end
27
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instantiator
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - James Mead
@@ -50,6 +50,7 @@ files:
50
50
  - lib/instantiator.rb
51
51
  - lib/instantiator/version.rb
52
52
  - test/instantiator_test.rb
53
+ - test/method_invocation_sink_test.rb
53
54
  - test/test_helper.rb
54
55
  has_rdoc: true
55
56
  homepage: ""
@@ -87,4 +88,5 @@ specification_version: 3
87
88
  summary: Instantiate an arbitrary Ruby class
88
89
  test_files:
89
90
  - test/instantiator_test.rb
91
+ - test/method_invocation_sink_test.rb
90
92
  - test/test_helper.rb