instantiator 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.
- data/.gitignore +4 -0
- data/Gemfile +3 -0
- data/README.md +17 -0
- data/Rakefile +10 -0
- data/instantiator.gemspec +21 -0
- data/lib/instantiator.rb +27 -0
- data/lib/instantiator/version.rb +3 -0
- data/test/instantiator_test.rb +195 -0
- data/test/test_helper.rb +5 -0
- metadata +90 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## Instantiator
|
|
2
|
+
|
|
3
|
+
I want to be able to instantiate an arbitrary Ruby class without knowing anything about the constructor.
|
|
4
|
+
|
|
5
|
+
### Usage
|
|
6
|
+
|
|
7
|
+
class ArbitraryClass
|
|
8
|
+
def initialize(arg1, arg2, *other_args)
|
|
9
|
+
# stuff
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
require "instantiator"
|
|
14
|
+
|
|
15
|
+
instance = ArbitraryClass.instantiate
|
|
16
|
+
|
|
17
|
+
p instance.class # => ArbitraryClass
|
data/Rakefile
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "instantiator/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "instantiator"
|
|
7
|
+
s.version = Instantiator::VERSION
|
|
8
|
+
s.authors = ["James Mead"]
|
|
9
|
+
s.email = ["james@floehopper.org"]
|
|
10
|
+
s.homepage = ""
|
|
11
|
+
s.summary = %q{Instantiate an arbitrary Ruby class}
|
|
12
|
+
|
|
13
|
+
s.rubyforge_project = "instantiator"
|
|
14
|
+
|
|
15
|
+
s.files = `git ls-files`.split("\n")
|
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
|
+
s.require_paths = ["lib"]
|
|
19
|
+
|
|
20
|
+
s.add_dependency("blankslate")
|
|
21
|
+
end
|
data/lib/instantiator.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require "instantiator/version"
|
|
2
|
+
require "blankslate"
|
|
3
|
+
|
|
4
|
+
module Instantiator
|
|
5
|
+
|
|
6
|
+
class MethodInvocationSink < ::BlankSlate
|
|
7
|
+
def method_missing(*args, &block)
|
|
8
|
+
MethodInvocationSink.new
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
def instantiate
|
|
14
|
+
if singleton_methods(false).map(&:to_sym).include?(:new)
|
|
15
|
+
arity = method(:new).arity
|
|
16
|
+
else
|
|
17
|
+
arity = instance_method(:initialize).arity
|
|
18
|
+
end
|
|
19
|
+
number_of_parameters = arity >= 0 ? arity : -(arity + 1)
|
|
20
|
+
new(*Array.new(number_of_parameters) { MethodInvocationSink.new })
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Class
|
|
26
|
+
include Instantiator::ClassMethods
|
|
27
|
+
end
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
require "instantiator"
|
|
3
|
+
|
|
4
|
+
class InstantiatorTest < Test::Unit::TestCase
|
|
5
|
+
def test_should_instantiate_class_with_no_explicit_initialize
|
|
6
|
+
klass = Class.new
|
|
7
|
+
instance = klass.instantiate
|
|
8
|
+
assert_equal klass, instance.class
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_should_instantiate_class_with_initialize_with_no_parameters
|
|
12
|
+
klass = Class.new do
|
|
13
|
+
def initialize; end
|
|
14
|
+
end
|
|
15
|
+
instance = klass.instantiate
|
|
16
|
+
assert_equal klass, instance.class
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_should_instantiate_class_with_initialize_with_one_parameter
|
|
20
|
+
klass = Class.new do
|
|
21
|
+
def initialize(parameter_one); end
|
|
22
|
+
end
|
|
23
|
+
instance = klass.instantiate
|
|
24
|
+
assert_equal klass, instance.class
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_should_instantiate_class_with_initialize_with_multiple_parameters
|
|
28
|
+
klass = Class.new do
|
|
29
|
+
def initialize(parameter_one, parameter_two, parameter_three, parameter_four); end
|
|
30
|
+
end
|
|
31
|
+
instance = klass.instantiate
|
|
32
|
+
assert_equal klass, instance.class
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_should_instantiate_class_with_initialize_with_only_optional_parameters
|
|
36
|
+
klass = Class.new do
|
|
37
|
+
def initialize(*optional_parameters); end
|
|
38
|
+
end
|
|
39
|
+
instance = klass.instantiate
|
|
40
|
+
assert_equal klass, instance.class
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_should_instantiate_class_with_initialize_with_some_required_parameters_and_some_optional_parameters
|
|
44
|
+
klass = Class.new do
|
|
45
|
+
def initialize(parameter_one, parameter_two, *optional_parameters); end
|
|
46
|
+
end
|
|
47
|
+
instance = klass.instantiate
|
|
48
|
+
assert_equal klass, instance.class
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_should_instantiate_class_which_calls_method_on_parameter
|
|
52
|
+
klass = Class.new do
|
|
53
|
+
def initialize(parameter_one)
|
|
54
|
+
parameter_one.foo
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
instance = klass.instantiate
|
|
58
|
+
assert_equal klass, instance.class
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_should_instantiate_class_which_calls_method_on_multiple_parameters
|
|
62
|
+
klass = Class.new do
|
|
63
|
+
def initialize(parameter_one, parameter_two, parameter_three, parameter_four)
|
|
64
|
+
parameter_one.foo
|
|
65
|
+
parameter_two.foo
|
|
66
|
+
parameter_three.foo
|
|
67
|
+
parameter_four.foo
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
instance = klass.instantiate
|
|
71
|
+
assert_equal klass, instance.class
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_should_instantiate_class_which_calls_method_on_result_of_calling_method_on_parameter
|
|
75
|
+
klass = Class.new do
|
|
76
|
+
def initialize(parameter_one)
|
|
77
|
+
parameter_one.foo.bar
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
instance = klass.instantiate
|
|
81
|
+
assert_equal klass, instance.class
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_with_no_parameters
|
|
85
|
+
klass = Class.new do
|
|
86
|
+
class << self
|
|
87
|
+
alias_method :__new__, :new
|
|
88
|
+
def new
|
|
89
|
+
__new__("parameter_one")
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
def initialize(parameter_one); end
|
|
93
|
+
end
|
|
94
|
+
instance = klass.instantiate
|
|
95
|
+
assert_equal klass, instance.class
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_with_one_parameter
|
|
99
|
+
klass = Class.new do
|
|
100
|
+
class << self
|
|
101
|
+
alias_method :__new__, :new
|
|
102
|
+
def new(parameter_one)
|
|
103
|
+
__new__
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
instance = klass.instantiate
|
|
108
|
+
assert_equal klass, instance.class
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_with_multiple_parameters
|
|
112
|
+
klass = Class.new do
|
|
113
|
+
class << self
|
|
114
|
+
alias_method :__new__, :new
|
|
115
|
+
def new(parameter_one, parameter_two, parameter_three, parameter_four)
|
|
116
|
+
__new__
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
instance = klass.instantiate
|
|
121
|
+
assert_equal klass, instance.class
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_with_only_optional_parameters
|
|
125
|
+
klass = Class.new do
|
|
126
|
+
class << self
|
|
127
|
+
alias_method :__new__, :new
|
|
128
|
+
def new(*optional_parameters)
|
|
129
|
+
__new__
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
instance = klass.instantiate
|
|
134
|
+
assert_equal klass, instance.class
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_with_some_required_parameters_and_some_optional_parameters
|
|
138
|
+
klass = Class.new do
|
|
139
|
+
class << self
|
|
140
|
+
alias_method :__new__, :new
|
|
141
|
+
def new(parameter_one, parameter_two, *optional_parameters)
|
|
142
|
+
__new__
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
instance = klass.instantiate
|
|
147
|
+
assert_equal klass, instance.class
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_which_calls_method_on_parameter
|
|
151
|
+
klass = Class.new do
|
|
152
|
+
class << self
|
|
153
|
+
alias_method :__new__, :new
|
|
154
|
+
def new(parameter_one)
|
|
155
|
+
parameter_one.foo
|
|
156
|
+
__new__
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
instance = klass.instantiate
|
|
161
|
+
assert_equal klass, instance.class
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_which_calls_method_on_multiple_parameters
|
|
165
|
+
klass = Class.new do
|
|
166
|
+
class << self
|
|
167
|
+
alias_method :__new__, :new
|
|
168
|
+
def new(parameter_one, parameter_two, parameter_three, parameter_four)
|
|
169
|
+
parameter_one.foo
|
|
170
|
+
parameter_two.foo
|
|
171
|
+
parameter_three.foo
|
|
172
|
+
parameter_four.foo
|
|
173
|
+
__new__
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
instance = klass.instantiate
|
|
178
|
+
assert_equal klass, instance.class
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_should_instantiate_class_which_defines_its_own_new_method_which_calls_method_on_result_of_calling_method_on_parameter
|
|
182
|
+
klass = Class.new do
|
|
183
|
+
class << self
|
|
184
|
+
alias_method :__new__, :new
|
|
185
|
+
def new(parameter_one)
|
|
186
|
+
parameter_one.foo.bar
|
|
187
|
+
__new__
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
instance = klass.instantiate
|
|
192
|
+
assert_equal klass, instance.class
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: instantiator
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 29
|
|
5
|
+
prerelease:
|
|
6
|
+
segments:
|
|
7
|
+
- 0
|
|
8
|
+
- 0
|
|
9
|
+
- 1
|
|
10
|
+
version: 0.0.1
|
|
11
|
+
platform: ruby
|
|
12
|
+
authors:
|
|
13
|
+
- James Mead
|
|
14
|
+
autorequire:
|
|
15
|
+
bindir: bin
|
|
16
|
+
cert_chain: []
|
|
17
|
+
|
|
18
|
+
date: 2011-07-27 00:00:00 +01:00
|
|
19
|
+
default_executable:
|
|
20
|
+
dependencies:
|
|
21
|
+
- !ruby/object:Gem::Dependency
|
|
22
|
+
name: blankslate
|
|
23
|
+
prerelease: false
|
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
hash: 3
|
|
30
|
+
segments:
|
|
31
|
+
- 0
|
|
32
|
+
version: "0"
|
|
33
|
+
type: :runtime
|
|
34
|
+
version_requirements: *id001
|
|
35
|
+
description:
|
|
36
|
+
email:
|
|
37
|
+
- james@floehopper.org
|
|
38
|
+
executables: []
|
|
39
|
+
|
|
40
|
+
extensions: []
|
|
41
|
+
|
|
42
|
+
extra_rdoc_files: []
|
|
43
|
+
|
|
44
|
+
files:
|
|
45
|
+
- .gitignore
|
|
46
|
+
- Gemfile
|
|
47
|
+
- README.md
|
|
48
|
+
- Rakefile
|
|
49
|
+
- instantiator.gemspec
|
|
50
|
+
- lib/instantiator.rb
|
|
51
|
+
- lib/instantiator/version.rb
|
|
52
|
+
- test/instantiator_test.rb
|
|
53
|
+
- test/test_helper.rb
|
|
54
|
+
has_rdoc: true
|
|
55
|
+
homepage: ""
|
|
56
|
+
licenses: []
|
|
57
|
+
|
|
58
|
+
post_install_message:
|
|
59
|
+
rdoc_options: []
|
|
60
|
+
|
|
61
|
+
require_paths:
|
|
62
|
+
- lib
|
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
|
+
none: false
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
hash: 3
|
|
69
|
+
segments:
|
|
70
|
+
- 0
|
|
71
|
+
version: "0"
|
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ">="
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
hash: 3
|
|
78
|
+
segments:
|
|
79
|
+
- 0
|
|
80
|
+
version: "0"
|
|
81
|
+
requirements: []
|
|
82
|
+
|
|
83
|
+
rubyforge_project: instantiator
|
|
84
|
+
rubygems_version: 1.6.2
|
|
85
|
+
signing_key:
|
|
86
|
+
specification_version: 3
|
|
87
|
+
summary: Instantiate an arbitrary Ruby class
|
|
88
|
+
test_files:
|
|
89
|
+
- test/instantiator_test.rb
|
|
90
|
+
- test/test_helper.rb
|