conject 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/TODO CHANGED
@@ -1,9 +1,20 @@
1
- Sketch out some more use cases
1
+ Features:
2
+ customer construction lambda via configure_objects
3
+
4
+ Class singletons:
5
+ use_class_in_context
6
+ class_depends_on
7
+
8
+ context.configure( :use_class_singletons => true)
9
+
10
+ ObjectContext#no_cache? <- reimplement for recursive upward search of object configs
11
+
12
+ contexts can accept configurations targeted at named subcontext
13
+
14
+ Support classes namespaced to modules
15
+
2
16
 
3
17
  Move / copy test data (loadable classes) into spec/acceptance/testdata
4
18
  Make helpers for accessing that folder
5
19
  Make helper to set load path for a specific test
6
20
 
7
- Move basic object creation spec to regression
8
-
9
-
data/TODO.txt ADDED
@@ -0,0 +1,4 @@
1
+
2
+ Wed Mar 14 00:44:52 EDT 2012
3
+
4
+ * Cleanup meta programming in .construct_with it's NASTY
@@ -5,6 +5,7 @@ module Conject
5
5
 
6
6
  def initialize
7
7
  @cache = { :this_object_context => self }
8
+ @object_configs = Hash.new do |h,k| h[k] = {} end
8
9
  end
9
10
 
10
11
  # Inject a named object into this context
@@ -20,32 +21,31 @@ module Conject
20
21
  # If the object exists nowhere in this or a super context: construct, cache and return a new instance of the requested object using the object factory.
21
22
  def get(name)
22
23
  name = name.to_sym
23
- object = @cache[name]
24
24
  return @cache[name] if @cache.keys.include?(name)
25
25
 
26
26
  if parent_context and parent_context.has?(name)
27
27
  return parent_context.get(name)
28
28
  else
29
29
  object = object_factory.construct_new(name,self)
30
- @cache[name] = object
30
+ @cache[name] = object unless no_cache?(name)
31
31
  return object
32
32
  end
33
33
  end
34
34
 
35
35
  alias_method :[], :get
36
36
 
37
- # Indicates if this context, or any parent context, contains the requested object in its cache.
38
- def has?(name)
39
- return true if directly_has?(name)
37
+ def walk_up_contexts(&block)
38
+ yield self
39
+ parent_context.walk_up_contexts(&block) unless parent_context.nil?
40
+ end
40
41
 
41
- # Ask parent (if i have a parent) if I don't have the object:
42
- if !parent_context.nil?
43
- return parent_context.has?(name)
44
- else
45
- # I don't have it, and neither do my ancestors.
46
- return false
42
+ def has?(name)
43
+ walk_up_contexts do |context|
44
+ return true if context.directly_has?(name)
47
45
  end
46
+ return false
48
47
  end
48
+
49
49
 
50
50
  # Indicates if this context has the requested object in its own personal cache.
51
51
  # (Does not consult any parent contexts.)
@@ -53,9 +53,36 @@ module Conject
53
53
  @cache.keys.include?(name.to_sym)
54
54
  end
55
55
 
56
+ # Create and yield a new ObjectContext with this ObjectContext as its parent
56
57
  def in_subcontext
57
58
  yield Conject.create_object_context(self) if block_given?
58
59
  end
59
60
 
61
+
62
+ #
63
+ # Allow configuration options to be set for named objects.
64
+ #
65
+ def configure_objects(conf={})
66
+ conf.each do |key,opts|
67
+ get_object_config(key).merge!(opts)
68
+ end
69
+ end
70
+
71
+ #
72
+ # Get the object configuration options for the given name
73
+ #
74
+ def get_object_config(name)
75
+ @object_configs[name.to_sym]
76
+ end
77
+
78
+ private
79
+
80
+ #
81
+ # Returns true if an object has been specifically declared as non-cacheable.
82
+ #
83
+ def no_cache?(name)
84
+ get_object_config(name)[:cache] == false
85
+ end
86
+
60
87
  end
61
88
  end
@@ -4,13 +4,31 @@ module Conject
4
4
  construct_with :class_finder, :dependency_resolver
5
5
 
6
6
  def construct_new(name, object_context)
7
+ lambda_constructor = object_context.get_object_config(name)[:construct]
8
+ if lambda_constructor
9
+ case lambda_constructor.arity
10
+ when 0
11
+ return lambda_constructor[]
12
+ when 1
13
+ return lambda_constructor[object_context]
14
+ when 2
15
+ return lambda_constructor[name, object_context]
16
+ else
17
+ raise "Constructor lambda takes 0, 1 or 2 params; this lambda takes #{lambda_constructor.arity}"
18
+ end
19
+ else
20
+ return type_1_constructor(name, object_context)
21
+ end
22
+ end
7
23
 
8
- #
9
- # This implementation is what I'm loosely calling "type 1" or "regular" object creation:
10
- # - Assume we're looking for a class to create an instance with
11
- # - it may or may not have a declared list of named objects it needs to be constructed with
12
- #
24
+ private
13
25
 
26
+ #
27
+ # This implementation is what I'm loosely calling "type 1" or "regular" object creation:
28
+ # - Assume we're looking for a class to create an instance with
29
+ # - it may or may not have a declared list of named objects it needs to be constructed with
30
+ #
31
+ def type_1_constructor(name, object_context)
14
32
  klass = class_finder.find_class(name)
15
33
 
16
34
  if klass.has_object_definition?
@@ -1,3 +1,3 @@
1
1
  module Conject
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -0,0 +1,61 @@
1
+ #
2
+ # Classes-as-objects can be a convenient way to build
3
+ # systems of objects that need to collaborate, but which
4
+ # have no other need for repeated instantiation, or implementation
5
+ # substitutions within the roles. (Ie, objects are what they are, and the
6
+ # system objects are more or less free of mutable state.)
7
+ #
8
+ # Ruby's classes, when declared "normally", are named objects available globally.
9
+ # So class S3, while a Class that could be used to generate instances, is also
10
+ # and _object_, a singleton named S3, and any other object can refer to this
11
+ # singleton by name. Implement your functionality as class methods and you're ready to go.
12
+ #
13
+ # Drawbacks:
14
+ #
15
+ # You have to be right about not needing subcontexts or impl.
16
+ # substitution; without this assumption, you're left with nothing.
17
+ #
18
+ # Code NOT written this way might have difficulty using Classes-as-objects code
19
+ #
20
+ # Classes-as-objects code cannot utilize systems that aren't written in the same way
21
+ #
22
+ # A classes-as-objects system, if during development is discovered to break these assumptions,
23
+ # they must be re-written.
24
+ #
25
+ # Observations:
26
+ # Classes-as-objects is a special case of contextual objects: all system objects are
27
+ # singletons, no implementation substitution is ever required, dependency injection
28
+ # is not required, and no construction-time behavior needs to be implemented.
29
+ # (No constructors. This isn't 100% off the table; there's always in-body configuration, eg,
30
+ # via metacoding.) All objects are at the top-most (global, or root) context in the application,
31
+ # and no subcontexts are ever needed.
32
+ #
33
+ # We could provide tooling to imply context for classes, and give them more abstract
34
+ # access to their constituents, in a way that can be modified orthogonally to their
35
+ # code. (Whereas you can't change what it means for S3 to refer to NameFormatter, you _could_
36
+ # change the way name_formatter is provided to the S3 class).
37
+ #
38
+ # NEEDS:
39
+ # - Let a class singleton declare itself to participate in a Context (root context by default)
40
+ # - withing class singleton, reference collaborator objects contextually
41
+ # - ObjectContext configuration: assume all objects are serviced by class singletons
42
+ # - ObjcetContext configuration: object-by-object config to indicate class singletons
43
+
44
+
45
+ class S3
46
+ use_class_in_context
47
+ class_depends_on :name_formatter
48
+
49
+ class << self
50
+
51
+ def store_file(name, data)
52
+ formatted_name = name_formatter.format(name)
53
+ end
54
+ end
55
+ end
56
+
57
+ context.configure :use_class_singletons => true
58
+
59
+ context.configure_object :s3 => { :use_class_singleton => true }
60
+ # same as: context[:s3] = S3 ??
61
+
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ class Something
2
+ construct_with :engine__starter_motor, :engine__throttle
3
+ end
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+
2
+ Conject.default_object_context.configure_object :s3 => { :construct => lambda do |c|
3
+ S3.new(
4
+ :items => c[:treasure_chest].items
5
+ )
6
+ end }
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "configuring objects to be built with a lambda" do
4
+ subject { new_object_context }
5
+
6
+ before do
7
+ append_test_load_path "basic_composition"
8
+ require 'fence'
9
+ require 'wood'
10
+ require 'nails'
11
+ end
12
+
13
+ let :wood_substitute do
14
+ Class.new do
15
+ attr_reader :name, :object_context
16
+
17
+ def initialize(name,object_context)
18
+ @name = name
19
+ @object_context = object_context
20
+ end
21
+
22
+ def to_s
23
+ "MDF"
24
+ end
25
+ end
26
+ end
27
+
28
+ after do
29
+ restore_load_path
30
+ end
31
+
32
+
33
+ it "constructs and caches instances by running the given lamdba" do
34
+ wood_constructs = 0
35
+
36
+ subject.configure_objects(
37
+ :wood => {
38
+ :construct => lambda do |name,object_context|
39
+ wood_constructs += 1
40
+ wood_substitute.new name,object_context
41
+ end
42
+ }
43
+ )
44
+
45
+ fence = subject.get(:fence)
46
+ fence.wood.should be
47
+ fence.wood.to_s.should == "MDF"
48
+ fence.wood.name.should == :wood
49
+ fence.wood.object_context.should == subject
50
+ wood_constructs.should == 1
51
+
52
+ subject.get(:wood).should == fence.wood
53
+ wood_constructs.should == 1
54
+ end
55
+
56
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "Conject" do
4
+ before do
5
+ append_test_load_path "basic_composition"
6
+ require 'fence'
7
+ require 'wood'
8
+ require 'nails'
9
+ end
10
+
11
+ describe ".default_object_context" do
12
+ it "provides an object context" do
13
+ context = Conject.default_object_context
14
+ context[:fence].should be
15
+ end
16
+
17
+
18
+ it "provides the SAME object context on repeated use" do
19
+ context1 = Conject.default_object_context
20
+ context2 = Conject.default_object_context
21
+
22
+ context1.should be
23
+ context1.should == context2
24
+ context1[:fence].should == context2[:fence]
25
+ end
26
+
27
+ end
28
+
29
+ after do
30
+ restore_load_path
31
+ # Sneak in and reset default object context instance inside Conject:
32
+ Conject.instance_variable_set(:@default_object_context, nil)
33
+ end
34
+
35
+ end
36
+
@@ -136,10 +136,6 @@ describe "basic inheritance" do
136
136
  end
137
137
 
138
138
 
139
-
140
-
141
-
142
-
143
139
  context "superclass has 1-arg #initialize" do
144
140
  class Reptile
145
141
  construct_with :scales
@@ -250,4 +246,23 @@ describe "basic inheritance" do
250
246
  end
251
247
 
252
248
  end
249
+
250
+ context "subclass not declaring deps, though its superclass DOES have deps" do
251
+ let(:parent) do
252
+ Class.new do
253
+ construct_with :home, :money
254
+ end
255
+ end
256
+
257
+ let(:child) do
258
+ Class.new(parent) do
259
+ end
260
+ end
261
+
262
+ it "raises an error at init time" do
263
+ lambda do
264
+ child.new nil
265
+ end.should raise_error(/ancestor.*construct_with.*dependencies.*instantiate/)
266
+ end
267
+ end
253
268
  end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "configuring objects to be non-cacheable" do
4
+ subject { new_object_context }
5
+
6
+ before do
7
+ append_test_load_path "basic_composition"
8
+ require 'fence'
9
+ require 'wood'
10
+ require 'nails'
11
+ end
12
+
13
+ after do
14
+ restore_load_path
15
+ end
16
+
17
+ it "causes an object to be rebuilt with every request" do
18
+ subject.configure_objects(
19
+ :fence => { :cache => false },
20
+ :nails => { :cache => false },
21
+ )
22
+
23
+ f1 = subject.get(:fence)
24
+ f2 = subject.get(:fence)
25
+
26
+ # Show new fences built:
27
+ f1.should be
28
+ f2.should be
29
+ f1.should_not == f2
30
+
31
+ # nails should also be unique:
32
+ f1.nails.should_not == f2.nails
33
+
34
+ # context should not retain references to fence or nails:
35
+ subject.has?(:fence).should == false
36
+ subject.has?(:nails).should == false
37
+
38
+ # wood should remain cached as usual, and shared
39
+ f1.wood.should == f2.wood
40
+ subject.has?(:wood).should == true
41
+ subject.get(:wood).should == f1.wood
42
+ subject.get(:wood).should == f2.wood
43
+ end
44
+
45
+ end
46
+
47
+ #
48
+ # other syntax ideas:
49
+ #
50
+ # subject.no_cache(:fence)
51
+
52
+ # subject.do_not_cache(:fence)
53
+
54
+ # subject.configure(:fence, :cache => false)
55
+
56
+ # subject.configure(:fence, :singleton => false)
57
+
58
+ # subject.configure do |config|
59
+ # config.object :fence, :cache => false
60
+ # end
61
+
62
+ # subject.configure.object :fence, :cache => false
@@ -119,10 +119,12 @@ describe Conject::ObjectContext do
119
119
 
120
120
  describe "when there is a parent context" do
121
121
  it "delegates the question to the parent context" do
122
- parent_context.should_receive(:has?).with(:a_clue).and_return("the parent answer")
123
- subject.has?(:a_clue).should == "the parent answer"
122
+ parent_context.should_receive(:walk_up_contexts).and_yield(parent_context)
123
+ parent_context.should_receive(:directly_has?).with(:a_clue).and_return(true)
124
+ subject.has?(:a_clue).should == true
124
125
  end
125
126
  end
127
+
126
128
  end
127
129
  end
128
130
 
@@ -183,4 +185,30 @@ describe Conject::ObjectContext do
183
185
  subsubcontext_executed.should be_true
184
186
  end
185
187
  end
188
+
189
+ describe "#configure_objects" do
190
+ describe ":cache => false" do
191
+ before do
192
+ parent_context.stub(:has?).and_return(false)
193
+ parent_context.should_not_receive(:get)
194
+ @first_burger = "first burger"
195
+ @second_burger = "second burger"
196
+
197
+ subject.configure_objects :cheezburger => { :cache => false }
198
+ end
199
+
200
+ it "causes the Context not to cache a constructed object, but to build new each time" do
201
+ object_factory.should_receive(:construct_new).with(:cheezburger, subject).and_return(@first_burger)
202
+ object_factory.should_receive(:construct_new).with(:cheezburger, subject).and_return(@second_burger)
203
+
204
+ subject[:cheezburger].should == @first_burger
205
+ subject[:cheezburger].should == @second_burger
206
+ end
207
+ end
208
+
209
+ # describe "for already-cached objects" do
210
+ # it "raises an error"
211
+ # end
212
+
213
+ end
186
214
  end
@@ -22,46 +22,96 @@ describe Conject::ObjectFactory do
22
22
  let :my_objects_components do mock(:my_objects_components) end
23
23
 
24
24
  describe "#construct_new" do
25
- before do
26
- class_finder.should_receive(:find_class).with(my_object_name).and_return my_object_class
27
- Conject::Utilities.stub(:has_zero_arg_constructor?).and_return true
28
- end
29
-
30
- describe "when target class has an object definition (implying composition dependencies)" do
25
+ describe "for Type 1 object construction" do
31
26
  before do
32
- my_object_class.should_receive(:has_object_definition?).and_return true
27
+ object_context.stub(:get_object_config).and_return({})
28
+
29
+ class_finder.should_receive(:find_class).with(my_object_name).and_return my_object_class
30
+ Conject::Utilities.stub(:has_zero_arg_constructor?).and_return true
33
31
  end
34
32
 
35
- it "finds the object definition, pulls its deps, and instantiates a new instance" do
36
- dependency_resolver.should_receive(:resolve_for_class).with(my_object_class, object_context).and_return my_objects_components
37
- my_object_class.should_receive(:new).with(my_objects_components).and_return(my_object)
33
+ describe "when target class has an object definition (implying composition dependencies)" do
34
+ before do
35
+ my_object_class.should_receive(:has_object_definition?).and_return true
36
+ end
38
37
 
39
- subject.construct_new(my_object_name, object_context).should == my_object
38
+ it "finds the object definition, pulls its deps, and instantiates a new instance" do
39
+ dependency_resolver.should_receive(:resolve_for_class).with(my_object_class, object_context).and_return my_objects_components
40
+ my_object_class.should_receive(:new).with(my_objects_components).and_return(my_object)
41
+
42
+ subject.construct_new(my_object_name, object_context).should == my_object
43
+ end
40
44
  end
41
- end
42
45
 
43
- describe "when target class has no object definition" do
44
- before do
45
- my_object_class.should_receive(:has_object_definition?).and_return false
46
+ describe "when target class has no object definition" do
47
+ before do
48
+ my_object_class.should_receive(:has_object_definition?).and_return false
49
+ end
50
+
51
+ it "creates a new instance of the class without any arguments" do
52
+ my_object_class.should_receive(:new).and_return(my_object)
53
+ subject.construct_new(my_object_name, object_context).should == my_object
54
+ end
46
55
  end
47
56
 
48
- it "creates a new instance of the class without any arguments" do
49
- my_object_class.should_receive(:new).and_return(my_object)
50
- subject.construct_new(my_object_name, object_context).should == my_object
57
+ describe "when target class has no object def, but also a non-default constructor" do
58
+ before do
59
+ my_object_class.should_receive(:has_object_definition?).and_return false
60
+ Conject::Utilities.stub(:has_zero_arg_constructor?).and_return false
61
+ end
62
+
63
+ it "raises a CompositionError" do
64
+ lambda do
65
+ subject.construct_new(my_object_name, object_context)
66
+ end.should raise_error(ArgumentError)
67
+ end
51
68
  end
52
69
  end
53
70
 
54
- describe "when target class has no object def, but also a non-default constructor" do
71
+ describe "for custom lambda construction" do
72
+ let(:object_config) do { :construct => lambda do "The Object" end } end
73
+ let(:object_config2) do { :construct => lambda do |object_context| { :the_oc => object_context } end } end
74
+ let(:object_config3) do { :construct => lambda do |name, object_context| { :the_name => name, :the_oc => object_context } end } end
75
+ let(:object_config4) do { :construct => lambda do raise("the roof") end } end
76
+ let(:object_config5) do { :construct => lambda do |a,b,c| "whatev" end } end
77
+
55
78
  before do
56
- my_object_class.should_receive(:has_object_definition?).and_return false
57
- Conject::Utilities.stub(:has_zero_arg_constructor?).and_return false
79
+ object_context.stub(:get_object_config).with(:the_object).and_return(object_config)
80
+ object_context.stub(:get_object_config).with(:the_other_object).and_return(object_config2)
81
+ object_context.stub(:get_object_config).with(:the_third_object).and_return(object_config3)
82
+ object_context.stub(:get_object_config).with(:the_fail_object).and_return(object_config4)
83
+ object_context.stub(:get_object_config).with(:the_two_many_params).and_return(object_config5)
58
84
  end
59
85
 
60
- it "raises a CompositionError" do
61
- lambda do
62
- subject.construct_new(my_object_name, object_context)
63
- end.should raise_error(ArgumentError)
86
+ it "invokes the configured lambda in order to build the object" do
87
+ subject.construct_new(:the_object, object_context).should == "The Object"
64
88
  end
89
+
90
+ it "supplies object_context for lambdas with arity of 1" do
91
+ obj = subject.construct_new(:the_other_object, object_context)
92
+ obj.should be
93
+ obj[:the_oc].should == object_context
94
+ end
95
+
96
+ it "supplies name, object_context for lambdas with arity of 2" do
97
+ obj = subject.construct_new(:the_third_object, object_context)
98
+ obj.should be
99
+ obj[:the_name].should == :the_third_object
100
+ obj[:the_oc].should == object_context
101
+ end
102
+
103
+ describe "when lambda has more than two args" do
104
+ it "raises an error" do
105
+ lambda do subject.construct_new(:the_fail_object, object_context) end.should raise_error(/the roof/)
106
+ end
107
+ end
108
+
109
+ describe "when lambda raises an error" do
110
+ it "raises an error" do
111
+ lambda do subject.construct_new(:the_two_many_params, object_context) end.should raise_error(/constructor lambda takes 0, 1 or 2 params/i)
112
+ end
113
+ end
114
+
65
115
  end
66
116
  end
67
117
  end
@@ -1,2 +1,5 @@
1
1
  class Wood
2
+ def to_s
3
+ "Real wood"
4
+ end
2
5
  end
@@ -0,0 +1,4 @@
1
+ module Chart
2
+ class Model
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ module Chart
2
+ class Presenter
3
+ construct_with :chart__model, :chart__view
4
+
5
+ public :model, :view
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ module Chart
2
+ class View
3
+ end
4
+ end
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.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-14 00:00:00.000000000 Z
12
+ date: 2012-04-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &2152782340 !ruby/object:Gem::Requirement
16
+ requirement: &2152736840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2152782340
24
+ version_requirements: *2152736840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &2152781820 !ruby/object:Gem::Requirement
27
+ requirement: &2152736400 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152781820
35
+ version_requirements: *2152736400
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: simplecov
38
- requirement: &2152781320 !ruby/object:Gem::Requirement
38
+ requirement: &2152735900 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152781320
46
+ version_requirements: *2152735900
47
47
  description: Enable Guice-like dependency injection and contextual object interactions.
48
48
  email:
49
49
  - david.crosby@atomicobject.com
@@ -59,6 +59,7 @@ files:
59
59
  - README.md
60
60
  - Rakefile
61
61
  - TODO
62
+ - TODO.txt
62
63
  - conject.gemspec
63
64
  - doc/inheritance_woes.txt
64
65
  - lib/conject.rb
@@ -74,13 +75,27 @@ files:
74
75
  - lib/conject/utilities.rb
75
76
  - lib/conject/version.rb
76
77
  - rake_tasks/rspec.rake
78
+ - scratch/arity_funny_business_in_different_ruby_versions.rb
79
+ - scratch/class_singletons.rb
80
+ - scratch/depends_on_spike.rb
81
+ - scratch/donkey_fail.rb
82
+ - scratch/donkey_journey.rb
83
+ - scratch/go.rb
84
+ - scratch/metaid.rb
85
+ - scratch/namespace_support.rb
86
+ - scratch/object_definition.rb
87
+ - scratch/sample.rb
88
+ - scratch/special_construct.rb
77
89
  - spec/acceptance/dev/README
78
90
  - spec/acceptance/regression/README
79
91
  - spec/acceptance/regression/basic_composition_spec.rb
80
92
  - spec/acceptance/regression/basic_object_creation_spec.rb
93
+ - spec/acceptance/regression/custom_constructor_spec.rb
94
+ - spec/acceptance/regression/default_object_context_spec.rb
81
95
  - spec/acceptance/regression/inherited_dependencies_spec.rb
82
96
  - spec/acceptance/regression/inject_object_context_spec.rb
83
97
  - spec/acceptance/regression/nested_contexts_spec.rb
98
+ - spec/acceptance/regression/non_singleton_spec.rb
84
99
  - spec/conject/borrowed_active_support_inflector_spec.rb
85
100
  - spec/conject/class_ext_construct_with_spec.rb
86
101
  - spec/conject/class_finder_spec.rb
@@ -112,15 +127,10 @@ files:
112
127
  - spec/test_data/inheritance/malibu.rb
113
128
  - spec/test_data/inheritance/vehicle.rb
114
129
  - spec/test_data/inheritance/wheel.rb
130
+ - spec/test_data/namespace/chart/model.rb
131
+ - spec/test_data/namespace/chart/presenter.rb
132
+ - spec/test_data/namespace/chart/view.rb
115
133
  - spec/test_data/simple_stuff/some_random_class.rb
116
- - spike/arity_funny_business_in_different_ruby_versions.rb
117
- - spike/depends_on_spike.rb
118
- - spike/donkey_fail.rb
119
- - spike/donkey_journey.rb
120
- - spike/go.rb
121
- - spike/metaid.rb
122
- - spike/object_definition.rb
123
- - spike/sample.rb
124
134
  - src/user_model.rb
125
135
  - src/user_presenter.rb
126
136
  - src/user_view.rb
@@ -153,9 +163,12 @@ test_files:
153
163
  - spec/acceptance/regression/README
154
164
  - spec/acceptance/regression/basic_composition_spec.rb
155
165
  - spec/acceptance/regression/basic_object_creation_spec.rb
166
+ - spec/acceptance/regression/custom_constructor_spec.rb
167
+ - spec/acceptance/regression/default_object_context_spec.rb
156
168
  - spec/acceptance/regression/inherited_dependencies_spec.rb
157
169
  - spec/acceptance/regression/inject_object_context_spec.rb
158
170
  - spec/acceptance/regression/nested_contexts_spec.rb
171
+ - spec/acceptance/regression/non_singleton_spec.rb
159
172
  - spec/conject/borrowed_active_support_inflector_spec.rb
160
173
  - spec/conject/class_ext_construct_with_spec.rb
161
174
  - spec/conject/class_finder_spec.rb
@@ -187,4 +200,7 @@ test_files:
187
200
  - spec/test_data/inheritance/malibu.rb
188
201
  - spec/test_data/inheritance/vehicle.rb
189
202
  - spec/test_data/inheritance/wheel.rb
203
+ - spec/test_data/namespace/chart/model.rb
204
+ - spec/test_data/namespace/chart/presenter.rb
205
+ - spec/test_data/namespace/chart/view.rb
190
206
  - spec/test_data/simple_stuff/some_random_class.rb