little_boxes 0.1.0 → 0.3.7
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 +4 -4
- data/.gitignore +2 -0
- data/Gemfile +1 -0
- data/README.md +187 -2
- data/Rakefile +4 -0
- data/lib/little_boxes.rb +10 -4
- data/lib/little_boxes/box.rb +111 -10
- data/lib/little_boxes/configurable.rb +66 -0
- data/lib/little_boxes/entry.rb +30 -0
- data/lib/little_boxes/entry_definition.rb +28 -0
- data/lib/little_boxes/strategy.rb +79 -0
- data/lib/little_boxes/version.rb +1 -1
- data/little_boxes.gemspec +0 -2
- data/spec/benchmarks_spec.rb +162 -0
- data/spec/docs/readme_spec.rb +32 -0
- data/spec/integration/thread_safety_spec.rb +76 -0
- data/spec/little_boxes/box_spec.rb +222 -234
- data/spec/real_benchmarks_spec.rb +164 -0
- data/spec/spec_helper.rb +24 -6
- metadata +17 -41
- data/lib/little_boxes/defined_dependant.rb +0 -9
- data/lib/little_boxes/dependant.rb +0 -44
- data/lib/little_boxes/dependant_registry.rb +0 -44
- data/lib/little_boxes/memoized_dependant.rb +0 -9
- data/lib/little_boxes/null_logger.rb +0 -8
- data/lib/little_boxes/obtained.rb +0 -13
- data/lib/little_boxes/registry.rb +0 -84
- data/spec/little_boxes/dependant_spec.rb +0 -28
@@ -0,0 +1,164 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
require 'benchmark'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
RSpec.describe 'Benchmark the speed', benchmark: true do
|
6
|
+
def define_class name, &block
|
7
|
+
stub_const(name.to_s, Class.new).tap do |c|
|
8
|
+
c.class_eval(&block)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def iterations
|
13
|
+
500000
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_name
|
17
|
+
@__inspect_output.
|
18
|
+
gsub(/^"/,'').
|
19
|
+
gsub(/" \([^\(]+\)/,'')
|
20
|
+
end
|
21
|
+
|
22
|
+
def measure
|
23
|
+
b = Benchmark.measure{ iterations.times { yield } }
|
24
|
+
@results << {name: test_name, time: b.real}
|
25
|
+
end
|
26
|
+
|
27
|
+
before :all do
|
28
|
+
@results = []
|
29
|
+
end
|
30
|
+
|
31
|
+
after :all do
|
32
|
+
File.open 'tmp/real_benchmarks.log', 'w' do |r|
|
33
|
+
@results.sort_by{|res| res[:time] }.each do |res|
|
34
|
+
r.puts "#{'%0.4f' % res[:time]}s #{res[:name]}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
puts File.read 'tmp/real_benchmarks.log' if ENV['BENCH_OUT']
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'shallow' do
|
42
|
+
before do
|
43
|
+
define_class :Server do
|
44
|
+
include Configurable
|
45
|
+
|
46
|
+
dependency :logger
|
47
|
+
dependency :new_logger
|
48
|
+
public :new_logger
|
49
|
+
public :logger
|
50
|
+
def logger= value
|
51
|
+
config[:logger] = value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
configurable_server = Server.new
|
56
|
+
|
57
|
+
define_class :MainBox do
|
58
|
+
include Box
|
59
|
+
|
60
|
+
get(:new_logger) { :logger }
|
61
|
+
let(:logger) { :logger }
|
62
|
+
letc(:server) { Server.new }
|
63
|
+
getc(:explicit_server) { Server.new }.then do |s, b|
|
64
|
+
s.logger = b.another_logger
|
65
|
+
end
|
66
|
+
getc(:new_server) { configurable_server }
|
67
|
+
let(:another_logger) { :another_logger }
|
68
|
+
end
|
69
|
+
|
70
|
+
define_class :Logger do
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
let(:box) { MainBox.new }
|
75
|
+
define_method(:logger) { box.logger }
|
76
|
+
define_method(:server) { box.server }
|
77
|
+
|
78
|
+
it 'measures getting a memoized dependency within the dependant' do
|
79
|
+
server = server()
|
80
|
+
measure { server.logger }
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'measures getting a dependency within the dependant' do
|
84
|
+
server = server()
|
85
|
+
measure { server.new_logger }
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'measures config time' do
|
89
|
+
box = box()
|
90
|
+
measure { box.new_server }
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'measures first dependency injection time' do
|
94
|
+
box = box()
|
95
|
+
measure { box.new_server.logger }
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'lookup logger in then block' do
|
99
|
+
box = box()
|
100
|
+
measure { box.explicit_server }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'deep' do
|
105
|
+
before do
|
106
|
+
define_class :Server do
|
107
|
+
include Configurable
|
108
|
+
|
109
|
+
def logger= value
|
110
|
+
@config[:logger] = value
|
111
|
+
end
|
112
|
+
|
113
|
+
dependency :logger
|
114
|
+
dependency :new_logger
|
115
|
+
public :new_logger
|
116
|
+
public :logger
|
117
|
+
end
|
118
|
+
|
119
|
+
configurable_server = Server.new
|
120
|
+
|
121
|
+
define_class :MainBox do
|
122
|
+
include Box
|
123
|
+
|
124
|
+
get(:new_logger) { :logger }
|
125
|
+
let(:logger) { :logger }
|
126
|
+
let(:another_logger) { :another_logger }
|
127
|
+
|
128
|
+
box(:level) do
|
129
|
+
box(:level) do
|
130
|
+
box(:level) do
|
131
|
+
letc(:server) { Server.new }
|
132
|
+
getc(:new_server) { configurable_server }
|
133
|
+
getc(:explicit_server) { Server.new }.then do |s, b|
|
134
|
+
s.logger = b.another_logger
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
define_class :Logger do
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
let(:box) { MainBox.new }
|
146
|
+
define_method(:logger) { box.logger }
|
147
|
+
define_method(:server) { box.level.level.level.server }
|
148
|
+
|
149
|
+
it 'measures config time (deep)' do
|
150
|
+
box = box().level.level.level
|
151
|
+
measure { box.new_server }
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'measures first dependency injection time (deep)' do
|
155
|
+
box = box().level.level.level
|
156
|
+
measure { box.new_server.logger }
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'lookup logger in then block (deep)' do
|
160
|
+
box = box().level.level.level
|
161
|
+
measure { box.explicit_server }
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,14 +2,32 @@ require 'rubygems'
|
|
2
2
|
require 'rspec'
|
3
3
|
require 'pry'
|
4
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
5
|
$LOAD_PATH.unshift File.expand_path('lib')
|
12
6
|
require 'little_boxes'
|
13
7
|
|
14
8
|
$LOAD_PATH.unshift File.expand_path('spec/support')
|
15
9
|
|
10
|
+
module LittleBoxes
|
11
|
+
module SpecHelper
|
12
|
+
def self.configure_rspec
|
13
|
+
RSpec.configure do |c|
|
14
|
+
c.color = true
|
15
|
+
c.tty = true
|
16
|
+
c.formatter = :documentation # :documentation, :progress, :html, :textmate
|
17
|
+
c.filter_run_excluding benchmark: !benchmark_enabled?, docs: !docs?
|
18
|
+
c.include SpecHelper
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.benchmark_enabled?
|
23
|
+
ENV['BENCH'] == "true"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.docs?
|
27
|
+
ENV['DOCS'] == "true"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
LittleBoxes::SpecHelper.configure_rspec
|
33
|
+
include LittleBoxes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: little_boxes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Workshare's dev team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,35 +38,7 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
|
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.
|
41
|
+
description: Dependency injection library in Ruby.
|
70
42
|
email:
|
71
43
|
- _Development@workshare.com
|
72
44
|
executables: []
|
@@ -80,19 +52,20 @@ files:
|
|
80
52
|
- Rakefile
|
81
53
|
- lib/little_boxes.rb
|
82
54
|
- lib/little_boxes/box.rb
|
83
|
-
- lib/little_boxes/
|
84
|
-
- lib/little_boxes/
|
85
|
-
- lib/little_boxes/
|
86
|
-
- lib/little_boxes/
|
87
|
-
- lib/little_boxes/null_logger.rb
|
88
|
-
- lib/little_boxes/obtained.rb
|
89
|
-
- lib/little_boxes/registry.rb
|
55
|
+
- lib/little_boxes/configurable.rb
|
56
|
+
- lib/little_boxes/entry.rb
|
57
|
+
- lib/little_boxes/entry_definition.rb
|
58
|
+
- lib/little_boxes/strategy.rb
|
90
59
|
- lib/little_boxes/version.rb
|
91
60
|
- little_boxes.gemspec
|
61
|
+
- spec/benchmarks_spec.rb
|
62
|
+
- spec/docs/readme_spec.rb
|
63
|
+
- spec/integration/thread_safety_spec.rb
|
92
64
|
- spec/little_boxes/box_spec.rb
|
93
|
-
- spec/little_boxes/dependant_spec.rb
|
94
65
|
- spec/little_boxes_spec.rb
|
66
|
+
- spec/real_benchmarks_spec.rb
|
95
67
|
- spec/spec_helper.rb
|
68
|
+
- tmp/.gitkeep
|
96
69
|
homepage: https://github.com/worshare/little-boxes
|
97
70
|
licenses:
|
98
71
|
- Copyright
|
@@ -116,10 +89,13 @@ rubyforge_project:
|
|
116
89
|
rubygems_version: 2.2.2
|
117
90
|
signing_key:
|
118
91
|
specification_version: 4
|
119
|
-
summary:
|
92
|
+
summary: Dependency injection library in Ruby.
|
120
93
|
test_files:
|
94
|
+
- spec/benchmarks_spec.rb
|
95
|
+
- spec/docs/readme_spec.rb
|
96
|
+
- spec/integration/thread_safety_spec.rb
|
121
97
|
- spec/little_boxes/box_spec.rb
|
122
|
-
- spec/little_boxes/dependant_spec.rb
|
123
98
|
- spec/little_boxes_spec.rb
|
99
|
+
- spec/real_benchmarks_spec.rb
|
124
100
|
- spec/spec_helper.rb
|
125
101
|
has_rdoc:
|
@@ -1,44 +0,0 @@
|
|
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
|
@@ -1,44 +0,0 @@
|
|
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
|
@@ -1,84 +0,0 @@
|
|
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
|