conject 0.1.2 → 0.1.3
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/CHANGELOG +3 -0
- data/lib/conject/class_ext_construct_with.rb +20 -53
- data/lib/conject/version.rb +1 -1
- data/scratch/car.rb +18 -0
- data/scratch/different_way.rb +81 -0
- data/scratch/reloading.rb +20 -0
- data/spec/acceptance/regression/inherited_dependencies_spec.rb +2 -2
- metadata +7 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
Conject v0.1.3
|
2
|
+
* Changed the way Class.construct_with rewrites Class.new(). It is now safe to re-load the source code of a class that uses construct_with.
|
3
|
+
|
1
4
|
Conject v0.1.2
|
2
5
|
* Aliasing objects via 'is', eg: context.configure_objects album: { is: "and_justice_for_all" }
|
3
6
|
Conject v0.1.1
|
@@ -78,63 +78,30 @@ class Class
|
|
78
78
|
end
|
79
79
|
klass.meta_eval do private :object_context_prep end
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
81
|
+
klass.meta_def :new do |component_map|
|
82
|
+
obj = allocate
|
83
|
+
if has_object_definition?
|
84
|
+
# Apply the given components
|
85
|
+
obj.send(:set_components, component_map)
|
86
|
+
else
|
87
|
+
raise "#{self.class} has an ancestor that uses construct_with, but has not declared any component dependencies. Will not be able to instantiate!"
|
85
88
|
end
|
86
89
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
#
|
93
|
-
|
94
|
-
# will be installed BEFORE the user-defined #initialize, and it may accept arguments thusly:
|
95
|
-
# * zero args. Nothing will be passed to #initialize
|
96
|
-
# * single arg. The component_map will be passed.
|
97
|
-
# * var args (eg, def initialize(*args)). args[0] will be the component map. NO OTHER ARGS WILL BE PASSED. See Footnote a)
|
98
|
-
#
|
99
|
-
klass.meta_def :new do |component_map|
|
100
|
-
# We only want to do the following one time, but we've waited until now
|
101
|
-
# in order to make sure our metaprogramming didn't get ahead of the user's
|
102
|
-
# own definition of initialize:
|
103
|
-
unless object_context_prep[:initialize_has_been_wrapped]
|
104
|
-
# Define a new wrapper'd version of initialize that accepts and uses a component map
|
105
|
-
init_alias = "original_#{self.name}_initialize".to_sym
|
106
|
-
alias_method init_alias, :initialize
|
107
|
-
class_def :initialize do |component_map|
|
108
|
-
if self.class.has_object_definition?
|
109
|
-
# Apply the given components
|
110
|
-
set_components component_map
|
111
|
-
else
|
112
|
-
raise "#{self.class} has an ancestor that uses construct_with, but has not declared any component dependencies. Will not be able to instantiate!"
|
113
|
-
end
|
114
|
-
|
115
|
-
# Invoke the normal initialize method.
|
116
|
-
# User-defined initialize method may accept 0 args, or it may accept a single arg
|
117
|
-
# which will be the component map.
|
118
|
-
arg_count = method(init_alias).arity
|
119
|
-
case arg_count
|
120
|
-
when 0
|
121
|
-
self.send init_alias
|
122
|
-
|
123
|
-
when 1, -1 # See Footnote a) at the bottom of this file
|
124
|
-
self.send init_alias, component_map
|
125
|
-
|
126
|
-
else
|
127
|
-
# We're not equipped to handle this
|
128
|
-
raise "User-defined initialize method defined with #{arg_count} parameters; must either be 0, other wise 1 or -1 (varargs) to receive the component map."
|
129
|
-
end
|
130
|
-
end
|
131
|
-
# Make a note that the initialize wrapper has been applied
|
132
|
-
object_context_prep[:initialize_has_been_wrapped] = true
|
133
|
-
end
|
90
|
+
arg_count = obj.method(:initialize).arity
|
91
|
+
case arg_count
|
92
|
+
when 0
|
93
|
+
obj.send :initialize
|
94
|
+
|
95
|
+
when 1, -1 # See Footnote a) at the bottom of this file
|
96
|
+
obj.send :initialize, component_map
|
134
97
|
|
135
|
-
|
136
|
-
|
98
|
+
else
|
99
|
+
# We're not equipped to handle this
|
100
|
+
raise "User-defined initialize method defined with #{arg_count} parameters; must either be 0, other wise 1 or -1 (varargs) to receive the component map."
|
137
101
|
end
|
102
|
+
|
103
|
+
obj
|
104
|
+
|
138
105
|
end
|
139
106
|
end
|
140
107
|
|
data/lib/conject/version.rb
CHANGED
data/scratch/car.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
class Car
|
2
|
+
construct_with :engine, :chassis
|
3
|
+
def initialize
|
4
|
+
# puts "(car being constructed with #{engine} and #{chassis})#{caller.join("\n")}"
|
5
|
+
puts "(car being constructed with #{engine} and #{chassis})"
|
6
|
+
end
|
7
|
+
def to_s
|
8
|
+
"Car has #{engine} and #{chassis}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Engine
|
13
|
+
def to_s; "Engine!"; end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Chassis
|
17
|
+
def to_s; "Chassis!"; end
|
18
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
$: << File.expand_path(File.dirname(__FILE__) + "/../lib")
|
2
|
+
require 'conject/extended_metaid.rb'
|
3
|
+
|
4
|
+
# module CJ
|
5
|
+
# class DepDef
|
6
|
+
# attr_reader :object_name, :constructor_time
|
7
|
+
#
|
8
|
+
# def initialize(opts)
|
9
|
+
# @object_name = opts[:object_name]
|
10
|
+
# @constructor_time = opts[:constructor_time] || false
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# def constructor_time?
|
14
|
+
# @constructor_time
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
|
19
|
+
class Class
|
20
|
+
def construct_with(*object_names)
|
21
|
+
klass = self
|
22
|
+
@_conject_construct_with = object_names
|
23
|
+
|
24
|
+
self.
|
25
|
+
object_names.each do |n|
|
26
|
+
self.class_def_private n do
|
27
|
+
components[n]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# @dep_defs = object_names.map do |x| CJ::DepDef.new(object_name: x, constructor_time: true) end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def constructor_dependencies
|
37
|
+
@_conject_construct_with
|
38
|
+
end
|
39
|
+
|
40
|
+
# def self.new
|
41
|
+
# puts "?"
|
42
|
+
# end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Class
|
46
|
+
def new(*a)
|
47
|
+
puts "?"
|
48
|
+
obj = allocate
|
49
|
+
obj.initialize
|
50
|
+
obj
|
51
|
+
end
|
52
|
+
# raise "No!"
|
53
|
+
end
|
54
|
+
|
55
|
+
class Car
|
56
|
+
construct_with :engine, :chassis
|
57
|
+
def initialize
|
58
|
+
puts "Car#initialize"
|
59
|
+
end
|
60
|
+
|
61
|
+
def hi
|
62
|
+
puts "hi"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class Engine
|
67
|
+
end
|
68
|
+
|
69
|
+
class Chassis
|
70
|
+
end
|
71
|
+
|
72
|
+
c = Car.new
|
73
|
+
c.hi
|
74
|
+
|
75
|
+
|
76
|
+
# class Dog
|
77
|
+
# def initialize
|
78
|
+
# puts "Dog initialize"
|
79
|
+
# end
|
80
|
+
# end
|
81
|
+
#
|
@@ -0,0 +1,20 @@
|
|
1
|
+
here = File.expand_path(File.dirname(__FILE__))
|
2
|
+
$: << here + "/../lib"
|
3
|
+
|
4
|
+
require 'conject'
|
5
|
+
|
6
|
+
load here + "/car.rb"
|
7
|
+
|
8
|
+
# puts Car.respond_to?(:conject_new)
|
9
|
+
# puts String.respond_to?(:conject_new)
|
10
|
+
#
|
11
|
+
context = Conject.default_object_context
|
12
|
+
context.configure_objects car: { cache: false }
|
13
|
+
car = context[:car]
|
14
|
+
puts car
|
15
|
+
|
16
|
+
load here + "/car.rb"
|
17
|
+
|
18
|
+
car = context[:car]
|
19
|
+
puts car
|
20
|
+
|
@@ -72,7 +72,7 @@ describe "basic inheritance" do
|
|
72
72
|
attr_accessor :got_map
|
73
73
|
def initialize(map)
|
74
74
|
@got_map = map
|
75
|
-
super
|
75
|
+
super() # YOU GOTTA USE PARENS LIKE THIS TO INDICATE THAT YOU DON'T INTEND TO PASS ARGS TO SUPER CONSTRUCTOR
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -95,7 +95,7 @@ describe "basic inheritance" do
|
|
95
95
|
attr_accessor :legs
|
96
96
|
def initialize
|
97
97
|
@legs = 4
|
98
|
-
super
|
98
|
+
super
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: conject
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -106,14 +106,17 @@ files:
|
|
106
106
|
- lib/conject/version.rb
|
107
107
|
- rake_tasks/rspec.rake
|
108
108
|
- scratch/arity_funny_business_in_different_ruby_versions.rb
|
109
|
+
- scratch/car.rb
|
109
110
|
- scratch/class_singletons.rb
|
110
111
|
- scratch/depends_on_spike.rb
|
112
|
+
- scratch/different_way.rb
|
111
113
|
- scratch/donkey_fail.rb
|
112
114
|
- scratch/donkey_journey.rb
|
113
115
|
- scratch/go.rb
|
114
116
|
- scratch/metaid.rb
|
115
117
|
- scratch/namespace_support.rb
|
116
118
|
- scratch/object_definition.rb
|
119
|
+
- scratch/reloading.rb
|
117
120
|
- scratch/sample.rb
|
118
121
|
- scratch/special_construct.rb
|
119
122
|
- spec/acceptance/dev/README
|
@@ -198,7 +201,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
198
201
|
version: '0'
|
199
202
|
segments:
|
200
203
|
- 0
|
201
|
-
hash:
|
204
|
+
hash: 4140830812471281535
|
202
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
206
|
none: false
|
204
207
|
requirements:
|
@@ -207,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
210
|
version: '0'
|
208
211
|
segments:
|
209
212
|
- 0
|
210
|
-
hash:
|
213
|
+
hash: 4140830812471281535
|
211
214
|
requirements: []
|
212
215
|
rubyforge_project:
|
213
216
|
rubygems_version: 1.8.24
|