ioc_rb 0.0.2 → 0.1.0

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 CHANGED
@@ -2,3 +2,4 @@ vendor/
2
2
  tags
3
3
  .bundle
4
4
  .DS_Store
5
+ pkg
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ioc_rb (0.0.2)
4
+ ioc_rb (0.1.0)
5
5
  activesupport
6
6
  request_store
7
7
 
@@ -60,9 +60,22 @@ class IocRb::BeanFactory
60
60
  end
61
61
  bean = bean_metadata.instance ? bean_class.new : bean_class
62
62
 
63
- # put to container first to prevent circular dependencies
64
- beans_storage[bean_metadata.name] = bean
63
+ if bean_metadata.has_factory_method?
64
+ set_bean_dependencies(bean, bean_metadata)
65
+ bean = bean.send(bean_metadata.factory_method)
66
+ beans_storage[bean_metadata.name] = bean
67
+ else
68
+ # put to container first to prevent circular dependencies
69
+ beans_storage[bean_metadata.name] = bean
70
+ set_bean_dependencies(bean, bean_metadata)
71
+ end
65
72
 
73
+ bean
74
+ end
75
+
76
+ private
77
+
78
+ def set_bean_dependencies(bean, bean_metadata)
66
79
  bean_metadata.attrs.each do |attr|
67
80
  bean_metadata = @beans_metadata_storage.by_name(attr.ref)
68
81
  unless bean_metadata
@@ -83,7 +96,6 @@ class IocRb::BeanFactory
83
96
  end
84
97
  end
85
98
  end
86
- bean
87
99
  end
88
100
 
89
101
  end
@@ -1,7 +1,7 @@
1
1
  # Stores bean specific data: bean class, name,
2
2
  # scope and bean dependencies
3
3
  class IocRb::BeanMetadata
4
- attr_reader :name, :bean_class, :scope, :instance, :attrs
4
+ attr_reader :name, :bean_class, :scope, :instance, :factory_method, :attrs
5
5
 
6
6
  # Constructor
7
7
  # @param name [Symbol] bean name
@@ -17,11 +17,12 @@ class IocRb::BeanMetadata
17
17
  def initialize(name, options, &block)
18
18
  IocRb::ArgsValidator.has_key!(options, :class)
19
19
 
20
- @name = name
21
- @bean_class = options[:class]
22
- @scope = options[:scope] || :singleton
23
- @instance = options[:instance].nil? ? true : options[:instance]
24
- @attrs = []
20
+ @name = name
21
+ @bean_class = options[:class]
22
+ @scope = options[:scope] || :singleton
23
+ @instance = options[:instance].nil? ? true : options[:instance]
24
+ @factory_method = options[:factory_method]
25
+ @attrs = []
25
26
 
26
27
  if @bean_class.respond_to?(:_iocrb_injectable_attrs)
27
28
  @bean_class._iocrb_injectable_attrs.each do |attr, options|
@@ -35,6 +36,10 @@ class IocRb::BeanMetadata
35
36
  end
36
37
  end
37
38
 
39
+ def has_factory_method?
40
+ !!@factory_method
41
+ end
42
+
38
43
  class Attribute
39
44
  attr_reader :name, :ref
40
45
 
@@ -1,3 +1,3 @@
1
1
  module IocRb
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -119,4 +119,28 @@ describe IocRb::Container do
119
119
  first_validator.should_not == second_validator
120
120
  end
121
121
  end
122
+
123
+ describe "factory method" do
124
+ module Test
125
+ class Config
126
+ end
127
+ class ConfigsFactory
128
+ def load_config
129
+ Config.new
130
+ end
131
+ end
132
+ end
133
+
134
+ let(:container) do
135
+ IocRb::Container.new do |c|
136
+ c.bean :config, class: Test::ConfigsFactory, factory_method: :load_config
137
+ end
138
+ end
139
+
140
+ it "should instantiate bean using factory method" do
141
+ container[:config].should be_instance_of(Test::Config)
142
+ end
143
+
144
+ end
145
+
122
146
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ioc_rb
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Albert Gazizov
@@ -10,18 +10,18 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-02-24 00:00:00.000000000 Z
13
+ date: 2014-04-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
+ prerelease: false
17
+ name: request_store
18
+ type: :runtime
16
19
  version_requirements: !ruby/object:Gem::Requirement
17
20
  requirements:
18
21
  - - ! '>='
19
22
  - !ruby/object:Gem::Version
20
23
  version: '0'
21
24
  none: false
22
- name: request_store
23
- type: :runtime
24
- prerelease: false
25
25
  requirement: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ! '>='
@@ -29,15 +29,15 @@ dependencies:
29
29
  version: '0'
30
30
  none: false
31
31
  - !ruby/object:Gem::Dependency
32
+ prerelease: false
33
+ name: activesupport
34
+ type: :runtime
32
35
  version_requirements: !ruby/object:Gem::Requirement
33
36
  requirements:
34
37
  - - ! '>='
35
38
  - !ruby/object:Gem::Version
36
39
  version: '0'
37
40
  none: false
38
- name: activesupport
39
- type: :runtime
40
- prerelease: false
41
41
  requirement: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,15 +45,15 @@ dependencies:
45
45
  version: '0'
46
46
  none: false
47
47
  - !ruby/object:Gem::Dependency
48
+ prerelease: false
49
+ name: bundler
50
+ type: :development
48
51
  version_requirements: !ruby/object:Gem::Requirement
49
52
  requirements:
50
53
  - - ~>
51
54
  - !ruby/object:Gem::Version
52
55
  version: '1.3'
53
56
  none: false
54
- name: bundler
55
- type: :development
56
- prerelease: false
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ~>
@@ -61,15 +61,15 @@ dependencies:
61
61
  version: '1.3'
62
62
  none: false
63
63
  - !ruby/object:Gem::Dependency
64
+ prerelease: false
65
+ name: rake
66
+ type: :development
64
67
  version_requirements: !ruby/object:Gem::Requirement
65
68
  requirements:
66
69
  - - ! '>='
67
70
  - !ruby/object:Gem::Version
68
71
  version: '0'
69
72
  none: false
70
- name: rake
71
- type: :development
72
- prerelease: false
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - ! '>='
@@ -120,12 +120,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - ! '>='
122
122
  - !ruby/object:Gem::Version
123
+ segments:
124
+ - 0
125
+ hash: -861473019195277398
123
126
  version: '0'
124
127
  none: false
125
128
  required_rubygems_version: !ruby/object:Gem::Requirement
126
129
  requirements:
127
130
  - - ! '>='
128
131
  - !ruby/object:Gem::Version
132
+ segments:
133
+ - 0
134
+ hash: -861473019195277398
129
135
  version: '0'
130
136
  none: false
131
137
  requirements: []
@@ -138,4 +144,3 @@ test_files:
138
144
  - spec/ioc_rb/container_spec.rb
139
145
  - spec/ioc_rb/inject_spec.rb
140
146
  - spec/spec_helper.rb
141
- has_rdoc: