hypo 0.6.2 → 0.7.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 +4 -4
- data/README.md +39 -3
- data/lib/hypo/container.rb +21 -3
- data/lib/hypo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a5df4c1be9652a444db79865461197009cf9b49
|
4
|
+
data.tar.gz: 71d0370d8cf8f3e9f672651c1ecab2e61e477047
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19459aa0a3c3a230855b25d3750c2540d958732698791f02dce185ff6b2a7c3de885b10ba84e8b303495a5aa11cb811a6eaf862efce9f98265613c855892e58b
|
7
|
+
data.tar.gz: d852deaa4743bcf8783c5a4da1a3f752c6e9897926005acae1873107b22607edd68c1065fc1619eca12e40fea0e5ec621cdc72a71deb3c97ae82d5894a595528
|
data/README.md
CHANGED
@@ -73,10 +73,8 @@ end
|
|
73
73
|
In that case you can register an instance instead of a type:
|
74
74
|
```ruby
|
75
75
|
connection = DB.connect
|
76
|
-
container.
|
76
|
+
container.register_instance(connection, :connection)
|
77
77
|
```
|
78
|
-
You must specify component name as it's done in example above.
|
79
|
-
|
80
78
|
## Component Life Cycle
|
81
79
|
By default all registered components have life cycle Hypo::Transient (:transient).
|
82
80
|
It means, every time when you resolve a component Hypo returns new instance of its type.
|
@@ -89,6 +87,44 @@ container.register(User).using_life_cycle(:singleton)
|
|
89
87
|
Actually you can implement your own life cycle,
|
90
88
|
i.e. makes sense to think about HttpRequest strategy for your web applications.
|
91
89
|
|
90
|
+
**Instances support only :singleton life cycle.**
|
91
|
+
|
92
|
+
Sometimes you need to manage a component life cycle manually. Especially it can be useful for "instances".
|
93
|
+
For example, you're going to inject new instance of request parameters every http request in your web application:
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
# somewhere in Rack application
|
97
|
+
# ...
|
98
|
+
query_string = env['QUERY_STRING']
|
99
|
+
container.register_instance(query_string, :query_string)
|
100
|
+
|
101
|
+
# handle the request
|
102
|
+
|
103
|
+
container.remove(:query_string)
|
104
|
+
# ...
|
105
|
+
```
|
106
|
+
|
107
|
+
Hypo resolves components with different life cycle strategies independently.
|
108
|
+
In other words you can inject a dependency with less lifespan than acceptor type. I.e.:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
class A; end
|
112
|
+
|
113
|
+
class B
|
114
|
+
def initialize(type_a)
|
115
|
+
@type_a = type_a
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
container.register(A, :type_a).using_life_cycle(:transient)
|
121
|
+
container.register(B, :type_b).using_life_cycle(:singleton)
|
122
|
+
|
123
|
+
```
|
124
|
+
|
125
|
+
According to :transient strategy every time when you try to resolve a singleton
|
126
|
+
you retrieve exactly the same instance of the singleton **but with new instance** of transient dependency.
|
127
|
+
|
92
128
|
## Development
|
93
129
|
|
94
130
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/hypo/container.rb
CHANGED
@@ -13,12 +13,16 @@ module Hypo
|
|
13
13
|
@life_cycles = {}
|
14
14
|
add_life_cycle(LifeCycle::Transient.new, :transient)
|
15
15
|
add_life_cycle(LifeCycle::Singleton.new, :singleton)
|
16
|
-
|
16
|
+
register_instance self, :container
|
17
17
|
end
|
18
18
|
|
19
19
|
def register(item, name = nil)
|
20
|
-
|
21
|
-
|
20
|
+
unless item.is_a?(Class)
|
21
|
+
raise ContainerError, 'Using method "register" you can register only a type. ' \
|
22
|
+
'If you wanna register an instance please use method "register_instance".'
|
23
|
+
end
|
24
|
+
|
25
|
+
component = Component.new(item, self, name)
|
22
26
|
|
23
27
|
if @components.key?(component.name)
|
24
28
|
raise ContainerError, "Component \"#{component.name}\" has already been registered"
|
@@ -27,6 +31,20 @@ module Hypo
|
|
27
31
|
@components[component.name] = component
|
28
32
|
end
|
29
33
|
|
34
|
+
def register_instance(item, name)
|
35
|
+
if item.is_a?(Class)
|
36
|
+
raise ContainerError, 'Using method "register_instance" you can register only an instance. ' \
|
37
|
+
'If you wanna register a type please use method "register".'
|
38
|
+
end
|
39
|
+
|
40
|
+
if @components.key?(name)
|
41
|
+
raise ContainerError, "Component \"#{name}\" has already been registered"
|
42
|
+
end
|
43
|
+
|
44
|
+
instance = Instance.new(item, self, name)
|
45
|
+
@components[name] = instance
|
46
|
+
end
|
47
|
+
|
30
48
|
def resolve(name)
|
31
49
|
unless @components.key?(name)
|
32
50
|
raise ContainerError, "Component with name \"#{name}\" is not registered"
|
data/lib/hypo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hypo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Kalinkin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|