conject 0.0.7 → 0.0.8

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/README.md CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
3
  Retrieve and relate objects within contexts. Provides dependency injection convenience inspired by the simplicity of Google's Guice.
4
4
 
5
- # Example: Basic composition #
5
+ # Basic composition #
6
+
7
+ Declare required component objects for a class using .construct_with
8
+
6
9
 
7
10
  require 'conject'
8
11
 
@@ -26,7 +29,23 @@ Retrieve and relate objects within contexts. Provides dependency injection conv
26
29
  puts fence
27
30
  #=> "I'm made of Wood and Nails"
28
31
 
29
- # Example: Modules as namespaces #
32
+ # Configuring objects #
33
+
34
+ Call #configure_object or #configure_objects to configure one or more objects wrt
35
+ their construction or handling.
36
+
37
+ * :cache [true|false] - Enable/disable object caching in context. If false, a new instance is created for every request for an object with the given name. Default true.
38
+ * :construct [Proc|Lambda] - Anonymous function to call to provide the named object. Will be cached like any other object, subject to :cache configuration for this context.
39
+
40
+ Eg.
41
+ context.configure_objects({
42
+ :wood => { :cache => false },
43
+ :nails => { :construct => lambda do "The nails" end},
44
+ })
45
+ # context[:wood] != context[:wood]
46
+ # context[:nails] == "The nails"
47
+
48
+ # Modules as namespaces #
30
49
 
31
50
  module Chart
32
51
  class Presenter
@@ -38,3 +57,37 @@ Retrieve and relate objects within contexts. Provides dependency injection conv
38
57
  end
39
58
  end
40
59
 
60
+ # Subcontexts #
61
+
62
+ first_fence = nil
63
+ second_fence = nil
64
+
65
+ Conject.default_object_context.in_subcontext do |sub|
66
+ first_fence = sub[:fence]
67
+ end
68
+
69
+ Conject.default_object_context.in_subcontext do |sub|
70
+ second_fence = sub[:fence]
71
+ end
72
+
73
+ # second_fence != first_fence
74
+
75
+ If you'd like to ensure that certain dependencies needed by objects built in subcontexts are actually housed in the parent context, but they
76
+ have not necessarily been cached or injected in advance, AND you've got an "owner"-like object living in that context, you can declare
77
+ object peers within the class definition of that owner object. This ensures that collaborators in the subcontext will not cause the peer
78
+ objects to be instantiated in those subcontexts as well.
79
+
80
+ class Game
81
+ peer_objects :missile_coordinator, :wind_affector
82
+ end
83
+
84
+ In this example, the instantiation of a Game instance in an object context will cause missile coordinator and wind affector to be "anchored"
85
+ in the same context as the game instance, meaning they prefer to be instantiated here, if needed by any objects in this same context or any
86
+ subcontexts thereof. It also means that they will be preferred over any objects of the same name in a super context.
87
+
88
+ # My ObjectContext #
89
+
90
+ All classes built within an ObjectContext are able to reference the context directly via the private accessor method "#object_context", which
91
+ is available as early as the call to #initialize.
92
+
93
+
data/TODO CHANGED
@@ -1,5 +1,6 @@
1
1
  ISSUE 2012-04-25: construct_with cyclic dependency checking! Eg. Presenter construc_with :presenter -> stack overlow
2
-
2
+ ISSUE 2012-04-30: prevent #put for already-existant objects
3
+ ISSUE 2012-04-30: prevent #configure_object(s) for already-existant objects
3
4
 
4
5
  Features:
5
6
  customer construction lambda via configure_objects
@@ -16,8 +17,12 @@ Features:
16
17
 
17
18
  Support classes namespaced to modules
18
19
 
20
+ Conject.new_object_context (support no-args, default parent context to nil)
21
+
22
+
23
+ Tasks:
24
+ GET GOING IN TRAVIS CI
25
+
26
+ Cleanup meta programming in .construct_with it's NASTY
19
27
 
20
- Move / copy test data (loadable classes) into spec/acceptance/testdata
21
- Make helpers for accessing that folder
22
- Make helper to set load path for a specific test
23
28
 
@@ -18,4 +18,5 @@ Gem::Specification.new do |gem|
18
18
  gem.add_development_dependency "rake"
19
19
  gem.add_development_dependency "rspec"
20
20
  gem.add_development_dependency "simplecov"
21
+ gem.add_development_dependency "pry"
21
22
  end
@@ -3,6 +3,7 @@ require "conject/version"
3
3
  require 'conject/object_definition'
4
4
  require 'conject/extended_metaid'
5
5
  require 'conject/class_ext_construct_with'
6
+ require 'conject/class_ext_object_peers'
6
7
  require 'conject/object_context'
7
8
  require 'conject/object_factory'
8
9
  require 'conject/class_finder'
@@ -0,0 +1,9 @@
1
+ require 'conject/utilities'
2
+ class Class
3
+ def object_peers(*syms)
4
+ if !syms.empty?
5
+ @_conject_object_peers = syms
6
+ end
7
+ @_conject_object_peers || []
8
+ end
9
+ end
@@ -23,7 +23,7 @@ module Conject
23
23
  name = name.to_sym
24
24
  return @cache[name] if @cache.keys.include?(name)
25
25
 
26
- if parent_context and parent_context.has?(name)
26
+ if !has_config?(name) and 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)
@@ -50,7 +50,11 @@ module Conject
50
50
  # Indicates if this context has the requested object in its own personal cache.
51
51
  # (Does not consult any parent contexts.)
52
52
  def directly_has?(name)
53
- @cache.keys.include?(name.to_sym)
53
+ @cache.keys.include?(name.to_sym) or has_config?(name.to_sym)
54
+ end
55
+
56
+ def has_config?(name)
57
+ @object_configs.keys.include?(name.to_sym)
54
58
  end
55
59
 
56
60
  # Create and yield a new ObjectContext with this ObjectContext as its parent
@@ -62,9 +66,11 @@ module Conject
62
66
  #
63
67
  # Allow configuration options to be set for named objects.
64
68
  #
65
- def configure_objects(conf={})
66
- conf.each do |key,opts|
67
- get_object_config(key).merge!(opts)
69
+ def configure_objects(confs={})
70
+ confs.each do |key,opts|
71
+ key = key.to_sym
72
+ @object_configs[key] ={} unless has_config?(key)
73
+ @object_configs[key].merge!(opts)
68
74
  end
69
75
  end
70
76
 
@@ -72,7 +78,7 @@ module Conject
72
78
  # Get the object configuration options for the given name
73
79
  #
74
80
  def get_object_config(name)
75
- @object_configs[name.to_sym]
81
+ @object_configs[name.to_sym] || {}
76
82
  end
77
83
 
78
84
  private
@@ -4,21 +4,36 @@ 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]
7
+ object = nil
8
+ config = object_context.get_object_config(name)
9
+ lambda_constructor = config[:construct]
8
10
  if lambda_constructor
9
11
  case lambda_constructor.arity
10
12
  when 0
11
- return lambda_constructor[]
13
+ object = lambda_constructor[]
12
14
  when 1
13
- return lambda_constructor[object_context]
15
+ object = lambda_constructor[object_context]
14
16
  when 2
15
- return lambda_constructor[name, object_context]
17
+ object = lambda_constructor[name, object_context]
16
18
  else
17
19
  raise "Constructor lambda takes 0, 1 or 2 params; this lambda takes #{lambda_constructor.arity}"
18
20
  end
21
+
22
+ # Provide a private accessor to the assigned object context
23
+ class << object
24
+ private
25
+ def object_context
26
+ @_conject_object_context #|| Conject.default_object_context
27
+ end
28
+ end
19
29
  else
20
- return type_1_constructor(name, object_context)
30
+ object = type_1_constructor(name, object_context)
21
31
  end
32
+
33
+ # Stuff an internal back reference to the object context into the new object:
34
+ object.send(:instance_variable_set, :@_conject_object_context, object_context)
35
+
36
+ return object
22
37
  end
23
38
 
24
39
  private
@@ -31,18 +46,49 @@ module Conject
31
46
  def type_1_constructor(name, object_context)
32
47
  klass = class_finder.find_class(name)
33
48
 
49
+ if !klass.object_peers.empty?
50
+ anchor_object_peers object_context, klass.object_peers
51
+ end
52
+
53
+ # Provide a private accessor to the assigned object context
54
+ klass.class_def_private :object_context do
55
+ @_conject_object_context || Thread.current[:current_object_context] #|| Conject.default_object_context
56
+ end
57
+
58
+ constructor_func = nil
34
59
  if klass.has_object_definition?
35
60
  object_map = dependency_resolver.resolve_for_class(klass, object_context)
36
- return klass.new(object_map)
61
+ constructor_func = lambda do klass.new(object_map) end
37
62
 
38
63
  elsif Utilities.has_zero_arg_constructor?(klass)
39
64
  # Default construction
40
- return klass.new
65
+ constructor_func = lambda do klass.new end
66
+ Thread.current[:current_object_context] = object_context
67
+ begin
68
+ ensure
69
+ Thread.current[:current_object_context] = nil
70
+ end
41
71
  else
42
72
  # Oops, out of ideas on how to build.
43
73
  raise ArgumentError.new("Class #{klass} has no special component needs, but neither does it have a zero-argument constructor.");
44
74
  end
45
75
 
76
+ object = nil
77
+ Thread.current[:current_object_context] = object_context
78
+ begin
79
+ object = constructor_func.call
80
+ ensure
81
+ Thread.current[:current_object_context] = nil
82
+ end
83
+
84
+ return object
85
+
86
+ end
87
+
88
+ def anchor_object_peers(object_context, object_peers)
89
+ object_peers.each do |name|
90
+ object_context.configure_objects(name => {})
91
+ end
46
92
  end
47
93
  end
48
94
  end
@@ -1,3 +1,3 @@
1
1
  module Conject
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -0,0 +1,87 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "object_peers" do
4
+ subject { new_object_context }
5
+
6
+ before do
7
+ append_test_load_path "object_peers"
8
+ require 'game'
9
+ require 'alt_game'
10
+ require 'bullet'
11
+ require 'bullet_coordinator'
12
+ end
13
+
14
+ after do
15
+ restore_load_path
16
+ end
17
+
18
+ it "establishes objects that should, when summoned (even from objects in sub contexts), be constructed in the declarer's context" do
19
+ subject.has?(:bullet_coordinator).should be_false
20
+ subject.instance_variable_get(:@cache).keys.should_not include(:bullet_coordinator)
21
+
22
+ subject[:game]
23
+
24
+ subject.has?(:bullet_coordinator).should be_true
25
+ subject.instance_variable_get(:@cache).keys.should_not include(:bullet_coordinator) # shouldn't actually be there
26
+
27
+ sub1 = nil
28
+ bullet1 = nil
29
+ subject.in_subcontext do |sub|
30
+ sub1 = sub
31
+ bullet1 = sub[:bullet]
32
+ end
33
+
34
+ bullet1.should be
35
+
36
+ sub2 = nil
37
+ bullet2 = nil
38
+ subject.in_subcontext do |sub|
39
+ sub2 = sub
40
+ bullet2 = sub[:bullet]
41
+ end
42
+
43
+ bullet2.should be
44
+
45
+ bullet1.should_not == bullet2
46
+ sub1.should_not == subject
47
+ sub1.should_not == sub2
48
+
49
+ subject.has?(:bullet_coordinator).should be_true
50
+ subject.instance_variable_get(:@cache).keys.should include(:bullet_coordinator)
51
+
52
+ bullet1.bullet_coordinator.should be
53
+ bullet1.bullet_coordinator.should == subject[:bullet_coordinator]
54
+
55
+ bullet2.bullet_coordinator.should be
56
+ bullet2.bullet_coordinator.should == subject[:bullet_coordinator]
57
+
58
+ sub1[:bullet_coordinator].should == subject[:bullet_coordinator]
59
+ sub2[:bullet_coordinator].should == subject[:bullet_coordinator]
60
+ end
61
+
62
+ it "allows subcontexts to shadow parent context objects" do
63
+ # Instantiate objs in super context
64
+ game = subject[:game]
65
+ # See it working normally: bullets in subcontexts should cause the bc to be built in the super
66
+ bullet1 = nil
67
+ subject.in_subcontext do |sub|
68
+ bullet1 = sub[:bullet]
69
+ end
70
+ bc1 = subject[:bullet_coordinator]
71
+ bc1.should be
72
+ bullet1.bullet_coordinator.should == bc1
73
+
74
+ # Now try a shadow:
75
+ game2 = nil
76
+ bc2 = nil
77
+ subject.in_subcontext do |sub|
78
+ game2 = sub[:alt_game] # This class declares bullet_coordinator as an object peer, so we should be getting a newly built coord...
79
+ bc2 = sub[:bullet_coordinator]
80
+ end
81
+ game2.should be
82
+ bc2.should be
83
+
84
+ bc2.should_not == bc1
85
+ end
86
+ end
87
+
@@ -1,7 +1,7 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
2
 
3
3
  describe "basic object composition" do
4
- subject { Conject.create_object_context(nil) }
4
+ subject { new_object_context }
5
5
 
6
6
  before do
7
7
  append_test_load_path "basic_composition"
@@ -17,12 +17,15 @@ describe "basic object composition" do
17
17
  it "constructs objects by providing necessary object components" do
18
18
  fence = subject.get('fence')
19
19
  fence.should_not be_nil
20
+ fence.send(:object_context).should == subject
20
21
 
21
22
  fence.wood.should_not be_nil
22
23
  fence.wood.object_id.should == subject.get('wood').object_id
24
+ fence.wood.send(:object_context).should == subject
23
25
 
24
26
  fence.nails.should_not be_nil
25
27
  fence.nails.object_id.should == subject.get('nails').object_id
28
+ fence.nails.send(:object_context).should == subject
26
29
  end
27
30
 
28
31
  end
@@ -2,11 +2,12 @@ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
2
 
3
3
 
4
4
  describe "simple object creation" do
5
- subject { Conject.create_object_context(nil) }
5
+ subject { new_object_context }
6
6
 
7
7
  before do
8
8
  append_test_load_path "simple_stuff"
9
9
  require 'some_random_class'
10
+ require 'class_that_uses_context_in_init'
10
11
  end
11
12
 
12
13
  after do
@@ -17,6 +18,7 @@ describe "simple object creation" do
17
18
  obj = subject.get('some_random_class')
18
19
  obj.should_not be_nil
19
20
  obj.class.should == SomeRandomClass
21
+ obj.send(:object_context).should == subject
20
22
  end
21
23
 
22
24
  it "caches and returns references to same objects once built" do
@@ -38,5 +40,11 @@ describe "simple object creation" do
38
40
  obj.object_id.should == obj2.object_id
39
41
  end
40
42
 
43
+ it "ensures access to object_context in initializer" do
44
+ obj = subject.get('class_that_uses_context_in_init')
45
+ obj.init_time_object_context.should == subject
46
+ obj.send(:object_context).should == subject
47
+ end
48
+
41
49
  end
42
50
 
@@ -12,11 +12,11 @@ describe "configuring objects to be built with a lambda" do
12
12
 
13
13
  let :wood_substitute do
14
14
  Class.new do
15
- attr_reader :name, :object_context
15
+ attr_reader :name, :my_object_context
16
16
 
17
- def initialize(name,object_context)
17
+ def initialize(name,my_object_context)
18
18
  @name = name
19
- @object_context = object_context
19
+ @my_object_context = my_object_context
20
20
  end
21
21
 
22
22
  def to_s
@@ -35,9 +35,9 @@ describe "configuring objects to be built with a lambda" do
35
35
 
36
36
  subject.configure_objects(
37
37
  :wood => {
38
- :construct => lambda do |name,object_context|
38
+ :construct => lambda do |name,the_object_context|
39
39
  wood_constructs += 1
40
- wood_substitute.new name,object_context
40
+ wood_substitute.new name,the_object_context
41
41
  end
42
42
  }
43
43
  )
@@ -46,11 +46,14 @@ describe "configuring objects to be built with a lambda" do
46
46
  fence.wood.should be
47
47
  fence.wood.to_s.should == "MDF"
48
48
  fence.wood.name.should == :wood
49
- fence.wood.object_context.should == subject
49
+ fence.wood.my_object_context.should == subject # shows the context was passed along to the lambda
50
+ fence.wood.send(:object_context).should == subject # shows Conject assigned the object context on its own
50
51
  wood_constructs.should == 1
51
52
 
52
53
  subject.get(:wood).should == fence.wood
53
54
  wood_constructs.should == 1
55
+
56
+
54
57
  end
55
58
 
56
59
  end
@@ -1,11 +1,13 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
2
 
3
3
  describe "object referencing its own context" do
4
- subject { Conject.create_object_context(nil) }
4
+ subject { new_object_context }
5
5
 
6
6
  before do
7
7
  append_test_load_path "basic_composition"
8
8
  require 'master_of_puppets'
9
+ require 'ride_the_lightning'
10
+ require 'and_justice_for_all'
9
11
  end
10
12
 
11
13
  after do
@@ -23,6 +25,36 @@ describe "object referencing its own context" do
23
25
  master.this_object_context.get('master_of_puppets').should == master
24
26
  end
25
27
 
28
+ describe "NEW AND IMPROVED" do
29
+
30
+ describe "classes with object definitions" do
31
+ let(:justice) { subject.get('and_justice_for_all') }
32
+ let(:ride) { subject.get('ride_the_lightning') }
33
+
34
+ it "automatically get a private accessor for object_context, even if not requested" do
35
+ justice.send(:object_context).should == subject
36
+ ride.send(:object_context).should == subject # watching out for interaction bugs wrt dependency construction
37
+ end
38
+
39
+ it "can use object_context in initialize" do
40
+ justice.init_time_object_context.should == subject
41
+ ride.init_time_object_context.should == subject # watching out for interaction bugs wrt dependency construction
42
+ end
43
+ end
44
+
45
+ describe "classes WITHOUT object definitions" do
46
+ let(:ride) { subject.get('ride_the_lightning') }
47
+
48
+ it "automatically get a private accessor for object_context, even if not requested" do
49
+ ride.send(:object_context).should == subject
50
+ end
51
+
52
+ it "can use object_context in initialize" do
53
+ ride.init_time_object_context.should == subject
54
+ end
55
+ end
56
+
57
+ end
26
58
 
27
59
  end
28
60
 
@@ -2,7 +2,7 @@
2
2
  require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
3
3
 
4
4
  describe "nested contexts" do
5
- subject { Conject.create_object_context(nil) }
5
+ subject { new_object_context }
6
6
 
7
7
  let(:root_context) { subject }
8
8
 
@@ -12,6 +12,7 @@ describe "nested contexts" do
12
12
  require 'front_desk'
13
13
  require 'guest'
14
14
  require 'tv'
15
+ require 'grass'
15
16
  end
16
17
 
17
18
  after do
@@ -82,5 +83,17 @@ describe "nested contexts" do
82
83
  end
83
84
  end
84
85
 
86
+ it "assigns the correct object context to objects at each level" do
87
+ grass = root_context[:grass]
88
+ grass.should be
89
+ grass.send(:object_context).should == root_context
90
+
91
+ root_context.in_subcontext do |hotel|
92
+ hotel.should_not == root_context
93
+ front_desk = hotel[:front_desk]
94
+ front_desk.send(:object_context).should == hotel
95
+ end
96
+ end
97
+
85
98
  end
86
99
 
@@ -31,10 +31,6 @@ describe "configuring objects to be non-cacheable" do
31
31
  # nails should also be unique:
32
32
  f1.nails.should_not == f2.nails
33
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
34
  # wood should remain cached as usual, and shared
39
35
  f1.wood.should == f2.wood
40
36
  subject.has?(:wood).should == true
@@ -25,6 +25,8 @@ describe Conject::ObjectFactory do
25
25
  describe "for Type 1 object construction" do
26
26
  before do
27
27
  object_context.stub(:get_object_config).and_return({})
28
+ my_object_class.stub(:class_def_private) # the effect of this is tested in acceptance tests
29
+ my_object_class.stub(:object_peers).and_return([]) # the effect of this is tested in acceptance tests
28
30
 
29
31
  class_finder.should_receive(:find_class).with(my_object_name).and_return my_object_class
30
32
  Conject::Utilities.stub(:has_zero_arg_constructor?).and_return true
@@ -13,6 +13,8 @@ ENV["APP_ENV"] = "rspec"
13
13
 
14
14
  require 'conject'
15
15
 
16
+ require 'pry'
17
+
16
18
  # Load all support files
17
19
  Dir["#{PROJECT_ROOT}/spec/support/*.rb"].each do |support|
18
20
  require support
@@ -0,0 +1,9 @@
1
+ class AndJusticeForAll
2
+ construct_with :ride_the_lightning
3
+
4
+ attr_reader :init_time_object_context
5
+
6
+ def initialize
7
+ @init_time_object_context = object_context
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ class RideTheLightning
2
+ attr_reader :init_time_object_context
3
+
4
+ def initialize
5
+ @init_time_object_context = object_context
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ class AltGame
2
+ object_peers :bullet_coordinator
3
+ end
@@ -0,0 +1,4 @@
1
+ class Bullet
2
+ construct_with :bullet_coordinator
3
+ public :bullet_coordinator
4
+ end
@@ -0,0 +1,2 @@
1
+ class BulletCoordinator
2
+ end
@@ -0,0 +1,3 @@
1
+ class Game
2
+ object_peers :bullet_coordinator
3
+ end
@@ -0,0 +1,7 @@
1
+ class ClassThatUsesContextInInit
2
+ attr_reader :init_time_object_context
3
+
4
+ def initialize
5
+ @init_time_object_context = object_context
6
+ end
7
+ 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.7
4
+ version: 0.0.8
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-04-26 00:00:00.000000000 Z
12
+ date: 2012-12-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70218584593060 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70218584593060
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rspec
27
- requirement: &70218584592640 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,31 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70218584592640
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: simplecov
38
- requirement: &70218584592140 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: pry
64
+ requirement: !ruby/object:Gem::Requirement
39
65
  none: false
40
66
  requirements:
41
67
  - - ! '>='
@@ -43,7 +69,12 @@ dependencies:
43
69
  version: '0'
44
70
  type: :development
45
71
  prerelease: false
46
- version_requirements: *70218584592140
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
47
78
  description: Enable Guice-like dependency injection and contextual object interactions.
48
79
  email:
49
80
  - david.crosby@atomicobject.com
@@ -59,12 +90,12 @@ files:
59
90
  - README.md
60
91
  - Rakefile
61
92
  - TODO
62
- - TODO.txt
63
93
  - conject.gemspec
64
94
  - doc/inheritance_woes.txt
65
95
  - lib/conject.rb
66
96
  - lib/conject/borrowed_active_support_inflector.rb
67
97
  - lib/conject/class_ext_construct_with.rb
98
+ - lib/conject/class_ext_object_peers.rb
68
99
  - lib/conject/class_finder.rb
69
100
  - lib/conject/composition_error.rb
70
101
  - lib/conject/dependency_resolver.rb
@@ -87,6 +118,7 @@ files:
87
118
  - scratch/sample.rb
88
119
  - scratch/special_construct.rb
89
120
  - spec/acceptance/dev/README
121
+ - spec/acceptance/dev/object_peers_spec.rb
90
122
  - spec/acceptance/regression/README
91
123
  - spec/acceptance/regression/basic_composition_spec.rb
92
124
  - spec/acceptance/regression/basic_object_creation_spec.rb
@@ -111,6 +143,7 @@ files:
111
143
  - spec/support/SPEC_HELPERS_GO_HERE
112
144
  - spec/support/conject_helpers.rb
113
145
  - spec/support/load_path_helpers.rb
146
+ - spec/test_data/basic_composition/and_justice_for_all.rb
114
147
  - spec/test_data/basic_composition/fence.rb
115
148
  - spec/test_data/basic_composition/front_desk.rb
116
149
  - spec/test_data/basic_composition/grass.rb
@@ -118,6 +151,7 @@ files:
118
151
  - spec/test_data/basic_composition/lobby.rb
119
152
  - spec/test_data/basic_composition/master_of_puppets.rb
120
153
  - spec/test_data/basic_composition/nails.rb
154
+ - spec/test_data/basic_composition/ride_the_lightning.rb
121
155
  - spec/test_data/basic_composition/special_guest.rb
122
156
  - spec/test_data/basic_composition/tv.rb
123
157
  - spec/test_data/basic_composition/very_special_guest.rb
@@ -132,6 +166,11 @@ files:
132
166
  - spec/test_data/namespace/chart/presenter.rb
133
167
  - spec/test_data/namespace/chart/view.rb
134
168
  - spec/test_data/namespace/somewhere/deep/inside/the/earth.rb
169
+ - spec/test_data/object_peers/alt_game.rb
170
+ - spec/test_data/object_peers/bullet.rb
171
+ - spec/test_data/object_peers/bullet_coordinator.rb
172
+ - spec/test_data/object_peers/game.rb
173
+ - spec/test_data/simple_stuff/class_that_uses_context_in_init.rb
135
174
  - spec/test_data/simple_stuff/some_random_class.rb
136
175
  - src/user_model.rb
137
176
  - src/user_presenter.rb
@@ -148,20 +187,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
187
  - - ! '>='
149
188
  - !ruby/object:Gem::Version
150
189
  version: '0'
190
+ segments:
191
+ - 0
192
+ hash: -3446257381673869502
151
193
  required_rubygems_version: !ruby/object:Gem::Requirement
152
194
  none: false
153
195
  requirements:
154
196
  - - ! '>='
155
197
  - !ruby/object:Gem::Version
156
198
  version: '0'
199
+ segments:
200
+ - 0
201
+ hash: -3446257381673869502
157
202
  requirements: []
158
203
  rubyforge_project:
159
- rubygems_version: 1.8.10
204
+ rubygems_version: 1.8.24
160
205
  signing_key:
161
206
  specification_version: 3
162
207
  summary: Enable Guice-like dependency injection and contextual object interactions.
163
208
  test_files:
164
209
  - spec/acceptance/dev/README
210
+ - spec/acceptance/dev/object_peers_spec.rb
165
211
  - spec/acceptance/regression/README
166
212
  - spec/acceptance/regression/basic_composition_spec.rb
167
213
  - spec/acceptance/regression/basic_object_creation_spec.rb
@@ -186,6 +232,7 @@ test_files:
186
232
  - spec/support/SPEC_HELPERS_GO_HERE
187
233
  - spec/support/conject_helpers.rb
188
234
  - spec/support/load_path_helpers.rb
235
+ - spec/test_data/basic_composition/and_justice_for_all.rb
189
236
  - spec/test_data/basic_composition/fence.rb
190
237
  - spec/test_data/basic_composition/front_desk.rb
191
238
  - spec/test_data/basic_composition/grass.rb
@@ -193,6 +240,7 @@ test_files:
193
240
  - spec/test_data/basic_composition/lobby.rb
194
241
  - spec/test_data/basic_composition/master_of_puppets.rb
195
242
  - spec/test_data/basic_composition/nails.rb
243
+ - spec/test_data/basic_composition/ride_the_lightning.rb
196
244
  - spec/test_data/basic_composition/special_guest.rb
197
245
  - spec/test_data/basic_composition/tv.rb
198
246
  - spec/test_data/basic_composition/very_special_guest.rb
@@ -207,4 +255,9 @@ test_files:
207
255
  - spec/test_data/namespace/chart/presenter.rb
208
256
  - spec/test_data/namespace/chart/view.rb
209
257
  - spec/test_data/namespace/somewhere/deep/inside/the/earth.rb
258
+ - spec/test_data/object_peers/alt_game.rb
259
+ - spec/test_data/object_peers/bullet.rb
260
+ - spec/test_data/object_peers/bullet_coordinator.rb
261
+ - spec/test_data/object_peers/game.rb
262
+ - spec/test_data/simple_stuff/class_that_uses_context_in_init.rb
210
263
  - spec/test_data/simple_stuff/some_random_class.rb
data/TODO.txt DELETED
@@ -1,4 +0,0 @@
1
-
2
- Wed Mar 14 00:44:52 EDT 2012
3
-
4
- * Cleanup meta programming in .construct_with it's NASTY