little_boxes 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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +20 -0
- data/README.md +28 -0
- data/Rakefile +10 -0
- data/lib/little_boxes.rb +7 -0
- data/lib/little_boxes/box.rb +19 -0
- data/lib/little_boxes/defined_dependant.rb +9 -0
- data/lib/little_boxes/dependant.rb +44 -0
- data/lib/little_boxes/dependant_registry.rb +44 -0
- data/lib/little_boxes/memoized_dependant.rb +9 -0
- data/lib/little_boxes/null_logger.rb +8 -0
- data/lib/little_boxes/obtained.rb +13 -0
- data/lib/little_boxes/registry.rb +84 -0
- data/lib/little_boxes/version.rb +3 -0
- data/little_boxes.gemspec +27 -0
- data/spec/little_boxes/box_spec.rb +341 -0
- data/spec/little_boxes/dependant_spec.rb +28 -0
- data/spec/little_boxes_spec.rb +7 -0
- data/spec/spec_helper.rb +15 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 86e6644930011e5254977f6ab0809cafa6a22696
|
4
|
+
data.tar.gz: bc84eb541accd46a4f35a3eb3e13d51913f489ca
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: efe43b09428af99ed51374d404f2d590ab135cba431fc7d53317d93d304befdb00db1ddb38f65aace6460d0bd684932d88d8cd26e0950e72ee551543eca5d531
|
7
|
+
data.tar.gz: 3fe8e90d9769f77b80b795eb939b5fc4b4779e4c61db4bc7ac6d84861c32824e1cfbc6650b3061f5dc009e415ae2eac4fbcbd8d266b1b521afd83dc243967379
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2014 Manuel Morales, et al.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# LittleBoxes
|
2
|
+
|
3
|
+
Dependancy injection framework in Ruby.
|
4
|
+
|
5
|
+
|
6
|
+
## Contributing
|
7
|
+
|
8
|
+
Do not forget to run the tests with:
|
9
|
+
|
10
|
+
```bash
|
11
|
+
rake
|
12
|
+
```
|
13
|
+
|
14
|
+
And bump the version with any of:
|
15
|
+
|
16
|
+
```bash
|
17
|
+
$ gem bump --version 1.1.1 # Bump the gem version to the given version number
|
18
|
+
$ gem bump --version major # Bump the gem version to the next major level (e.g. 0.0.1 to 1.0.0)
|
19
|
+
$ gem bump --version minor # Bump the gem version to the next minor level (e.g. 0.0.1 to 0.1.0)
|
20
|
+
$ gem bump --version patch # Bump the gem version to the next patch level (e.g. 0.0.1 to 0.0.2)
|
21
|
+
```
|
22
|
+
|
23
|
+
|
24
|
+
## License
|
25
|
+
|
26
|
+
Released under the MIT License.
|
27
|
+
See the [LICENSE](LICENSE.txt) file for further details.
|
28
|
+
|
data/Rakefile
ADDED
data/lib/little_boxes.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module LittleBoxes
|
2
|
+
class Box
|
3
|
+
include Registry
|
4
|
+
|
5
|
+
def get
|
6
|
+
self
|
7
|
+
end
|
8
|
+
|
9
|
+
def customize name, &block
|
10
|
+
ForwardingDsl.run self[name], &block
|
11
|
+
end
|
12
|
+
|
13
|
+
def box name, &block
|
14
|
+
s = self.class.new parent: self, name: name
|
15
|
+
self[name] = s
|
16
|
+
ForwardingDsl.run s, &block
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'mini_object'
|
2
|
+
|
3
|
+
module LittleBoxes
|
4
|
+
module Dependant
|
5
|
+
module ClassMethods
|
6
|
+
def dependency name, opts = {}
|
7
|
+
instance_dependencies[name] = opts
|
8
|
+
attr_injectable name
|
9
|
+
end
|
10
|
+
|
11
|
+
def class_dependency name, opts = {}
|
12
|
+
class_dependencies[name] = opts
|
13
|
+
cattr_injectable name
|
14
|
+
end
|
15
|
+
|
16
|
+
def instance_dependencies
|
17
|
+
@instance_dependencies ||= {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def class_dependencies
|
21
|
+
@class_dependencies ||= {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def dependencies
|
25
|
+
class_dependencies
|
26
|
+
end
|
27
|
+
|
28
|
+
def inherited klass
|
29
|
+
klass.class_dependencies.merge! class_dependencies
|
30
|
+
klass.instance_dependencies.merge! instance_dependencies
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.included klass
|
36
|
+
klass.extend ClassMethods
|
37
|
+
klass.include MiniObject::Injectable
|
38
|
+
end
|
39
|
+
|
40
|
+
def dependencies
|
41
|
+
self.class.instance_dependencies
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module LittleBoxes
|
2
|
+
module DependantRegistry
|
3
|
+
def self.included base
|
4
|
+
base.class_eval do
|
5
|
+
include Registry
|
6
|
+
attr_accessor :build_block
|
7
|
+
|
8
|
+
def initialize name: nil, parent: parent, &block
|
9
|
+
@build_block = block
|
10
|
+
@name = name
|
11
|
+
@parent = parent
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def get
|
17
|
+
raise NotImplementedError
|
18
|
+
end
|
19
|
+
|
20
|
+
def build &block
|
21
|
+
@build_block = block
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_dependency name, options = nil
|
25
|
+
options ||= {}
|
26
|
+
|
27
|
+
if d = self[name]; d.get
|
28
|
+
elsif s = options[:default]; s.call parent
|
29
|
+
else raise(MissingDependency.new "Could not find #{name}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def run
|
35
|
+
ForwardingDsl.run(self, &build_block).tap do |subject|
|
36
|
+
if subject.respond_to? :dependencies
|
37
|
+
subject.dependencies.each do |name, options|
|
38
|
+
subject.send("#{name}"){ get_dependency(name, options) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'forwarding_dsl'
|
2
|
+
|
3
|
+
module LittleBoxes
|
4
|
+
module Registry
|
5
|
+
attr_accessor :parent
|
6
|
+
attr_accessor :name
|
7
|
+
|
8
|
+
def initialize parent: nil, name: self.class, &block
|
9
|
+
@parent = parent
|
10
|
+
@name = name
|
11
|
+
ForwardingDsl.run self, &block
|
12
|
+
end
|
13
|
+
|
14
|
+
def registry
|
15
|
+
@registry ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_missing name, *args, &block
|
19
|
+
if self[name]
|
20
|
+
self[name].get
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def respond_to_missing? name, *args
|
27
|
+
!!self[name] || super
|
28
|
+
end
|
29
|
+
|
30
|
+
def [] name
|
31
|
+
registry[name] || (parent && parent[name])
|
32
|
+
end
|
33
|
+
|
34
|
+
def []= name, value
|
35
|
+
registry[name]= value
|
36
|
+
end
|
37
|
+
|
38
|
+
def clear
|
39
|
+
@registry = {}
|
40
|
+
end
|
41
|
+
|
42
|
+
def let name, &block
|
43
|
+
self[name] = MemoizedDependant.new name: name, parent: self, &block
|
44
|
+
end
|
45
|
+
|
46
|
+
def define name, &block
|
47
|
+
self[name] = DefinedDependant.new name: name, parent: self, &block
|
48
|
+
end
|
49
|
+
|
50
|
+
def obtain name, &block
|
51
|
+
self[name] = Obtained.new name: name, parent: self, &block
|
52
|
+
end
|
53
|
+
|
54
|
+
def inspect
|
55
|
+
"<#{name} box: #{registry.keys.join(" ")}>"
|
56
|
+
end
|
57
|
+
|
58
|
+
alias to_s inspect
|
59
|
+
|
60
|
+
def name
|
61
|
+
@name || self.class.name
|
62
|
+
end
|
63
|
+
|
64
|
+
def path
|
65
|
+
if parent
|
66
|
+
parent.path + [self]
|
67
|
+
else
|
68
|
+
[self]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def root
|
73
|
+
path.first
|
74
|
+
end
|
75
|
+
|
76
|
+
def reset
|
77
|
+
@value = nil
|
78
|
+
|
79
|
+
registry.each do |name, register|
|
80
|
+
register.reset
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
gem_name = "little_boxes" # TODO: Rename this
|
3
|
+
|
4
|
+
lib = File.expand_path('../lib', __FILE__)
|
5
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
|
+
require "#{gem_name}/version"
|
7
|
+
|
8
|
+
Gem::Specification.new do |spec|
|
9
|
+
spec.name = gem_name
|
10
|
+
spec.version = LittleBoxes::VERSION
|
11
|
+
spec.authors = ["Workshare's dev team"]
|
12
|
+
spec.email = ['_Development@workshare.com']
|
13
|
+
spec.description = File.read('README.md').split("\n").reject{|l| l.length == 0 || l =~ /^[#=]+/ }.first
|
14
|
+
spec.summary = spec.description
|
15
|
+
spec.homepage = "https://github.com/worshare/#{spec.name.gsub('_','-')}"
|
16
|
+
spec.license = "Copyright"
|
17
|
+
|
18
|
+
spec.files = `git ls-files`.split($/)
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_runtime_dependency "forwarding_dsl"
|
26
|
+
spec.add_runtime_dependency "mini_object"
|
27
|
+
end
|
@@ -0,0 +1,341 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
describe LittleBoxes::Box do
|
5
|
+
subject{ described_class.new }
|
6
|
+
|
7
|
+
describe '#customize' do
|
8
|
+
it 'allows customizing dependencies' do
|
9
|
+
subject.let(:loglevel) { 0 }
|
10
|
+
subject.let(:logger) { double('logger', loglevel: loglevel) }
|
11
|
+
|
12
|
+
subject.customize(:logger) do |l|
|
13
|
+
l.let(:loglevel) { 1 }
|
14
|
+
end
|
15
|
+
|
16
|
+
expect(subject.logger.loglevel).to eq 1
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'supports overriding lets attributes from the outside' do
|
20
|
+
server_class = Class.new do
|
21
|
+
include LittleBoxes::Dependant
|
22
|
+
dependency :logger
|
23
|
+
end
|
24
|
+
|
25
|
+
subject.let(:logger) { :logger }
|
26
|
+
|
27
|
+
subject.let(:server) { server_class.new }
|
28
|
+
|
29
|
+
subject.customize(:server) do
|
30
|
+
let(:logger) { :new_logger }
|
31
|
+
end
|
32
|
+
|
33
|
+
expect(subject.server.logger).to be :new_logger
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#let' do
|
38
|
+
it 'has freely defined registers with just a lambda' do
|
39
|
+
subject.let(:loglevel) { 0 }
|
40
|
+
expect(subject.loglevel).to eq 0
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'memoizes the result' do
|
44
|
+
n = 0
|
45
|
+
subject.let(:loglevel) { n = n + 1 }
|
46
|
+
|
47
|
+
expect(subject.loglevel).to eq 1
|
48
|
+
expect(subject.loglevel).to eq 1
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'allows referencing other dependencies within such lambda' do
|
52
|
+
subject.let(:loglevel) { 0 }
|
53
|
+
subject.let(:logger) { double('logger', loglevel: loglevel) }
|
54
|
+
expect(subject.logger.loglevel).to eq 0
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'has instances that have dependencies' do
|
58
|
+
server_class = Class.new do
|
59
|
+
include LittleBoxes::Dependant
|
60
|
+
dependency :logger
|
61
|
+
end
|
62
|
+
|
63
|
+
subject.let(:logger) { double('logger') }
|
64
|
+
subject.let(:server) { server_class.new }
|
65
|
+
expect(subject.server.logger).to be subject.logger
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'unknown dependencies raise exception' do
|
69
|
+
server_class = Class.new do
|
70
|
+
include LittleBoxes::Dependant
|
71
|
+
dependency :unknown_dep
|
72
|
+
end
|
73
|
+
|
74
|
+
subject.let(:server) { server_class.new }
|
75
|
+
expect{ subject.server.unknown_dep }.to raise_error(LittleBoxes::MissingDependency)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'has classes that have class dependencies' do
|
79
|
+
server_class = Class.new do
|
80
|
+
include LittleBoxes::Dependant
|
81
|
+
class_dependency :host
|
82
|
+
end
|
83
|
+
|
84
|
+
subject.let(:host) { 'localhost' }
|
85
|
+
subject.let(:server_class) { server_class }
|
86
|
+
expect(subject.server_class.host).to eq 'localhost'
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'supports defaults' do
|
90
|
+
server_class = Class.new do
|
91
|
+
include LittleBoxes::Dependant
|
92
|
+
dependency :log, default: ->(d){ d.logger }
|
93
|
+
end
|
94
|
+
|
95
|
+
subject.let(:logger) { :logger }
|
96
|
+
|
97
|
+
subject.let(:server) { server_class.new }
|
98
|
+
|
99
|
+
expect(subject.server.log).to be :logger
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'assigns dependencies with lambdas' do
|
103
|
+
server_class = Class.new do
|
104
|
+
include LittleBoxes::Dependant
|
105
|
+
|
106
|
+
dependency :logger
|
107
|
+
end
|
108
|
+
|
109
|
+
subject.let(:server) { server_class.new }
|
110
|
+
|
111
|
+
subject.let(:logger) { :old }
|
112
|
+
expect(subject.server.logger).to be :old
|
113
|
+
|
114
|
+
subject.let(:logger) { :new }
|
115
|
+
expect(subject.server.logger).to be :new
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'supports overriding specific attributes' do
|
119
|
+
server_class = Class.new do
|
120
|
+
include LittleBoxes::Dependant
|
121
|
+
dependency :logger
|
122
|
+
end
|
123
|
+
|
124
|
+
subject.let(:logger) { :logger }
|
125
|
+
subject.let(:new_logger) { :new_logger }
|
126
|
+
|
127
|
+
subject.let(:server) do
|
128
|
+
build { server_class.new }
|
129
|
+
let(:logger) { new_logger }
|
130
|
+
end
|
131
|
+
|
132
|
+
expect(subject.server.logger).to be :new_logger
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe '#obtain' do
|
137
|
+
it 'does not memoize the result' do
|
138
|
+
n = 0
|
139
|
+
subject.obtain(:loglevel) { n = n + 1 }
|
140
|
+
|
141
|
+
expect(subject.loglevel).to eq 1
|
142
|
+
expect(subject.loglevel).to eq 2
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'doesn not inject anything' do
|
146
|
+
server_class = Class.new do
|
147
|
+
include LittleBoxes::Dependant
|
148
|
+
dependency :logger
|
149
|
+
end
|
150
|
+
|
151
|
+
subject.let(:logger) { double('logger') }
|
152
|
+
subject.obtain(:server) { server_class.new.tap { |s| s.logger = :old_logger } }
|
153
|
+
expect(subject.server.logger).to be :old_logger
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe '#define' do
|
158
|
+
it 'does not memoize the result' do
|
159
|
+
n = 0
|
160
|
+
subject.define(:loglevel) { n = n + 1 }
|
161
|
+
|
162
|
+
expect(subject.loglevel).to eq 1
|
163
|
+
expect(subject.loglevel).to eq 2
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'has instances that have dependencies' do
|
167
|
+
server_class = Class.new do
|
168
|
+
include LittleBoxes::Dependant
|
169
|
+
dependency :logger
|
170
|
+
end
|
171
|
+
|
172
|
+
subject.let(:logger) { double('logger') }
|
173
|
+
subject.define(:server) { server_class.new }
|
174
|
+
expect(subject.server.logger).to be subject.logger
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'unknown dependencies raise exception' do
|
178
|
+
server_class = Class.new do
|
179
|
+
include LittleBoxes::Dependant
|
180
|
+
dependency :unknown_dep
|
181
|
+
end
|
182
|
+
|
183
|
+
subject.define(:server) { server_class.new }
|
184
|
+
expect{ subject.server.unknown_dep }.to raise_error(LittleBoxes::MissingDependency)
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'has classes that have class dependencies' do
|
188
|
+
server_class = Class.new do
|
189
|
+
include LittleBoxes::Dependant
|
190
|
+
class_dependency :host
|
191
|
+
end
|
192
|
+
|
193
|
+
subject.let(:host) { 'localhost' }
|
194
|
+
subject.define(:server_class) { server_class }
|
195
|
+
expect(subject.server_class.host).to eq 'localhost'
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'supports defaults' do
|
199
|
+
server_class = Class.new do
|
200
|
+
include LittleBoxes::Dependant
|
201
|
+
dependency :log, default: ->(d){ d.logger }
|
202
|
+
end
|
203
|
+
|
204
|
+
subject.let(:logger) { :logger }
|
205
|
+
|
206
|
+
subject.define(:server) { server_class.new }
|
207
|
+
|
208
|
+
expect(subject.server.log).to be :logger
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'assigns dependencies with lambdas' do
|
212
|
+
server_class = Class.new do
|
213
|
+
include LittleBoxes::Dependant
|
214
|
+
|
215
|
+
dependency :logger
|
216
|
+
end
|
217
|
+
|
218
|
+
subject.define(:server) { server_class.new }
|
219
|
+
|
220
|
+
subject.let(:logger) { :old }
|
221
|
+
expect(subject.server.logger).to be :old
|
222
|
+
|
223
|
+
subject.let(:logger) { :new }
|
224
|
+
expect(subject.server.logger).to be :new
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe '#box' do
|
229
|
+
it 'supports boxes' do
|
230
|
+
subject.box :loggers do
|
231
|
+
let(:null) { :null_logger }
|
232
|
+
let(:file) { :file_logger }
|
233
|
+
end
|
234
|
+
|
235
|
+
expect(subject.loggers.null).to be :null_logger
|
236
|
+
end
|
237
|
+
|
238
|
+
it 'supports finding dependencies upwards in the ancestry' do
|
239
|
+
server_class = Class.new do
|
240
|
+
include LittleBoxes::Dependant
|
241
|
+
dependency :logger
|
242
|
+
end
|
243
|
+
|
244
|
+
subject.let(:logger) { :logger }
|
245
|
+
|
246
|
+
subject.box :servers do
|
247
|
+
let(:one) { server_class.new }
|
248
|
+
end
|
249
|
+
|
250
|
+
expect(subject.servers.one.logger).to be :logger
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'defaults within boxes' do
|
254
|
+
server_class = Class.new do
|
255
|
+
include LittleBoxes::Dependant
|
256
|
+
dependency :log, default: ->(a){ a.logger }
|
257
|
+
end
|
258
|
+
|
259
|
+
subject.let(:logger) { :logger }
|
260
|
+
|
261
|
+
subject.box :servers do
|
262
|
+
let(:apache) { server_class.new }
|
263
|
+
end
|
264
|
+
|
265
|
+
expect(subject.servers.apache.log).to be :logger
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
describe '#inspect' do
|
270
|
+
it 'has nice inspect' do
|
271
|
+
subject.let(:loglevel) { 0 }
|
272
|
+
subject.let(:logger) { 0 }
|
273
|
+
expect(subject.inspect).to eq "<LittleBoxes::Box box: loglevel logger>"
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
describe '#path' do
|
278
|
+
it 'has a path' do
|
279
|
+
subject.box :second do
|
280
|
+
box :third do
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
expect(subject.second.third.path).to eq [subject, subject.second, subject.second.third]
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
describe '#name' do
|
289
|
+
it 'names boxes' do
|
290
|
+
subject.name = :first
|
291
|
+
|
292
|
+
subject.box :second do
|
293
|
+
box :third do
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
expect(subject.second.third.path.map(&:name)).to eq [:first, :second, :third]
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
describe '#reset' do
|
302
|
+
it 'has a reset' do
|
303
|
+
first = subject
|
304
|
+
|
305
|
+
first.box :second do
|
306
|
+
let(:logger) { Object.new }
|
307
|
+
end
|
308
|
+
|
309
|
+
old_logger = first.second.logger
|
310
|
+
|
311
|
+
first.reset
|
312
|
+
expect(first.second.logger).not_to be old_logger
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
describe '#root' do
|
317
|
+
it 'has a root' do
|
318
|
+
first = subject
|
319
|
+
|
320
|
+
first.box :second do
|
321
|
+
box(:third) { }
|
322
|
+
end
|
323
|
+
|
324
|
+
expect(first.second.third.root).to eq first
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
describe '.new' do
|
329
|
+
it 'executes block on initialize' do
|
330
|
+
subject = described_class.new do
|
331
|
+
let(:loglevel) { 0 }
|
332
|
+
end
|
333
|
+
|
334
|
+
expect(subject.loglevel).to eq 0
|
335
|
+
end
|
336
|
+
|
337
|
+
it 'can build instances' do
|
338
|
+
expect(subject).to be_a(described_class)
|
339
|
+
end
|
340
|
+
end
|
341
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe LittleBoxes::Dependant do
|
4
|
+
let(:box) { LittleBoxes::Box.new }
|
5
|
+
|
6
|
+
describe 'Dependant' do
|
7
|
+
it 'can be inherited' do
|
8
|
+
class_one = Class.new do
|
9
|
+
include LittleBoxes::Dependant
|
10
|
+
dependency :one
|
11
|
+
end
|
12
|
+
|
13
|
+
class_two = Class.new class_one do
|
14
|
+
include LittleBoxes::Dependant
|
15
|
+
dependency :two
|
16
|
+
end
|
17
|
+
|
18
|
+
box.let(:one) { :one }
|
19
|
+
box.let(:two) { :two }
|
20
|
+
box.let(:dependant_one) { class_one.new }
|
21
|
+
box.let(:dependant_two) { class_two.new }
|
22
|
+
|
23
|
+
expect(box.dependant_one.one).to be :one
|
24
|
+
expect(box.dependant_two.one).to be :one
|
25
|
+
expect(box.dependant_two.two).to be :two
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rspec'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.color = true
|
7
|
+
config.tty = true
|
8
|
+
config.formatter = :documentation # :documentation, :progress, :html, :textmate
|
9
|
+
end
|
10
|
+
|
11
|
+
$LOAD_PATH.unshift File.expand_path('lib')
|
12
|
+
require 'little_boxes'
|
13
|
+
|
14
|
+
$LOAD_PATH.unshift File.expand_path('spec/support')
|
15
|
+
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: little_boxes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Workshare's dev team
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: forwarding_dsl
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mini_object
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Dependancy injection framework in Ruby.
|
70
|
+
email:
|
71
|
+
- _Development@workshare.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- Gemfile
|
78
|
+
- LICENSE.txt
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- lib/little_boxes.rb
|
82
|
+
- lib/little_boxes/box.rb
|
83
|
+
- lib/little_boxes/defined_dependant.rb
|
84
|
+
- lib/little_boxes/dependant.rb
|
85
|
+
- lib/little_boxes/dependant_registry.rb
|
86
|
+
- lib/little_boxes/memoized_dependant.rb
|
87
|
+
- lib/little_boxes/null_logger.rb
|
88
|
+
- lib/little_boxes/obtained.rb
|
89
|
+
- lib/little_boxes/registry.rb
|
90
|
+
- lib/little_boxes/version.rb
|
91
|
+
- little_boxes.gemspec
|
92
|
+
- spec/little_boxes/box_spec.rb
|
93
|
+
- spec/little_boxes/dependant_spec.rb
|
94
|
+
- spec/little_boxes_spec.rb
|
95
|
+
- spec/spec_helper.rb
|
96
|
+
homepage: https://github.com/worshare/little-boxes
|
97
|
+
licenses:
|
98
|
+
- Copyright
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.2.2
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: Dependancy injection framework in Ruby.
|
120
|
+
test_files:
|
121
|
+
- spec/little_boxes/box_spec.rb
|
122
|
+
- spec/little_boxes/dependant_spec.rb
|
123
|
+
- spec/little_boxes_spec.rb
|
124
|
+
- spec/spec_helper.rb
|
125
|
+
has_rdoc:
|