dumpling 0.3.1 → 0.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b5d404a4a72ad2d88b92a4008aa5c875e52d6413
4
- data.tar.gz: 492a47199347c218b0cb6b5cb3dad15a95695af6
3
+ metadata.gz: f385ef8e4373fe02d5a641294ad7cbc0393843db
4
+ data.tar.gz: e800048ab2616729db0086867caf77ea32ab5be3
5
5
  SHA512:
6
- metadata.gz: 968bb215aa7e4f57291e65c32623107c1754add1860cc5fac55c14ffa9ce90e01969383d0ab21c2b0b2214214e15d00c90968c3b39e21425e5dbe4bf03e66a5c
7
- data.tar.gz: 17530a9342d58289fec18806a023c4c6057bf8dc4eb15cad8f4c8c2aaa8facf25e9c98fa9bfcb62dfd39cc09bcff0cdd922decab655ed603e67ab7ea48aaaac7
6
+ metadata.gz: b5a86fc3c310dd05bb3c9c4f498126f7b43b293d8296c6a288128923e530ea32a57dc765a8e89ec973f2486af64201f95e755cd196f5cdcc1534ac4e1d1dfc5b
7
+ data.tar.gz: cea6309abeae32d6d34f133c652071de233b7a1db0ba7270cb36355df96acbf6bde7e1f0d70b14ae650eeefb2c4d609ed45ed4144da01ef50fcdff4cacb3153e
data/README.md CHANGED
@@ -36,6 +36,10 @@ Or install it yourself as:
36
36
 
37
37
  ### Basics
38
38
 
39
+ Use ```instance``` for long-lived objects. ```#get``` returns the same instance at each call
40
+
41
+ Use ```class``` for short-lived objects. ```#get``` returns a new instance on every call
42
+
39
43
  ```ruby
40
44
  class UsersRepository
41
45
  attr_writer :logger
@@ -52,11 +56,11 @@ Dumpling.configure do
52
56
  end
53
57
  end
54
58
 
55
- # Every time you invoke the #get method you will get a new instance of the #class
59
+ # Every time you invoke the #get method you get a new instance of the #class
56
60
  Dumpling.get(:users_repository) # => #<UsersRepository:0x00000000ebee20>
57
61
  Dumpling.get(:users_repository) # => #<UsersRepository:0x00000000e8a8f0>
58
62
 
59
- # Every time you invoke the #get method you will get the same predefined #instance
63
+ # Every time you invoke the #get method you get the same predefined #instance
60
64
  Dumpling.get(:logger) # => #<Logger:0x00000000e281a0>
61
65
  Dumpling.get(:logger) # => #<Logger:0x00000000e281a0>
62
66
  ```
@@ -133,27 +137,56 @@ end
133
137
  ```
134
138
 
135
139
  ### Defining abstract services
140
+ Abstract service cannot be instantiated (accessed outside of the container). Whenever you include an abstract service into a regular service, you inherit its dependencies.
136
141
 
137
142
  ```ruby
138
143
  container = Dumpling::Container.new
139
144
  container.configure do
140
145
  abstract :repository do |s|
141
- s.dependency :logger
142
- s.dependency :persistence_adapter
146
+ s.dependency :logger # => #<Logger:0x00000000e281a0>
147
+ s.dependency :persistence_adapter # => #<Sequel:0x00000000e281a0>
143
148
  end
144
149
 
145
150
  set :users_repository do |s|
146
151
  s.class UsersRepository
147
152
  s.include :repository
148
153
  end
154
+ end
155
+
156
+ container[:users_repository].logger # => #<Logger:0x00000000e281a0>
157
+ container[:users_repository].persistence_adapter # => #<Sequel:0x00000000e281a0>
149
158
 
159
+ container.configure do
150
160
  set :posts_repository do |s|
151
161
  s.class PostsRepository
152
162
  s.include :repository
153
163
  # overriding dependencies
154
- s.dependency :postgres_adapter, attribute: :persistence_adapter
164
+ s.dependency :postgres_adapter, attribute: :persistence_adapter # => #<PG:0x00000000e281a0>
165
+ end
166
+ end
167
+
168
+ container[:users_repository].persistence_adapter # => #<PG:0x00000000e281a0>
169
+ ```
170
+
171
+ ### Duplicating a container
172
+
173
+ ```ruby
174
+ original = Dumpling::Container.new
175
+ original.configure do
176
+ set :logger do |s|
177
+ s.instance Logger.new(STDOUT)
155
178
  end
156
179
  end
180
+
181
+ duplicate = original.dup
182
+ duplicate.get(:logger).equal?(original.get(:logger)) # => true
183
+
184
+ # Changes in the original container do not affect the duplicate and vise versa
185
+ original.set :game do |s|
186
+ s.instance 'Tetris'
187
+ end
188
+
189
+ duplicate.get(:game) # => BOOM! raise Dumpling::Errors::Container::Missing
157
190
  ```
158
191
 
159
192
  ## Development
data/dumpling.gemspec CHANGED
@@ -21,6 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'bundler', '~> 1.11'
22
22
  spec.add_development_dependency 'rake', '~> 11.1'
23
23
  spec.add_development_dependency 'rspec', '~> 3.0'
24
- spec.add_development_dependency 'rubocop', '~> 0.39.0'
24
+ spec.add_development_dependency 'rubocop', '~> 0.40.0'
25
25
  spec.add_development_dependency 'simplecov', '~> 0.11'
26
26
  end
@@ -5,11 +5,6 @@ module Dumpling
5
5
  @abstract_services = Registry.new
6
6
  end
7
7
 
8
- def configure(&block)
9
- instance_eval(&block)
10
- self
11
- end
12
-
13
8
  def set(id, &block)
14
9
  raise(Errors::Container::Duplicate, id) if @services.has?(id)
15
10
 
@@ -35,6 +30,26 @@ module Dumpling
35
30
 
36
31
  alias :[] get
37
32
 
33
+ def configure(&block)
34
+ instance_eval(&block)
35
+ self
36
+ end
37
+
38
+ def initialize_dup(original)
39
+ @services = original.services.dup
40
+ @abstract_services = original.abstract_services.dup
41
+ super
42
+ end
43
+
44
+ def inspect
45
+ services = @services.keys.sort.map { |id| inspect_service(id) }
46
+ services.empty? ? to_s : "#{self}\n#{services.join("\n").strip}"
47
+ end
48
+
49
+ protected
50
+
51
+ attr_reader :services, :abstract_services
52
+
38
53
  private
39
54
 
40
55
  def create_specification
@@ -63,5 +78,22 @@ module Dumpling
63
78
  def build_service(specification)
64
79
  ServiceBuilder.new(@services, @abstract_services).build(specification)
65
80
  end
81
+
82
+ def inspect_service(id)
83
+ service = @services.get(id)
84
+ string = id.to_s
85
+ string << inspect_service_object(service.instance, service.class).to_s
86
+ string << inspect_service_dependencies(service.dependencies).to_s
87
+ end
88
+
89
+ def inspect_service_object(service_instance, service_class)
90
+ service_object = (service_instance.nil? ? service_class.inspect : service_instance.inspect)
91
+ "\n --> #{service_instance.nil? ? 'class' : 'instance'}: #{service_object}"
92
+ end
93
+
94
+ def inspect_service_dependencies(dependencies)
95
+ dependencies = dependencies.keys.join(',')
96
+ "\n --> dependencies: #{dependencies}" unless dependencies.empty?
97
+ end
66
98
  end
67
99
  end
@@ -21,5 +21,15 @@ module Dumpling
21
21
  def has?(id)
22
22
  @keys.include?(id)
23
23
  end
24
+
25
+ def initialize_dup(original)
26
+ @data = original.data.dup
27
+ @keys = original.keys.dup
28
+ super
29
+ end
30
+
31
+ protected
32
+
33
+ attr_reader :data
24
34
  end
25
35
  end
@@ -2,7 +2,7 @@ module Dumpling
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 3
5
- TINY = 1
5
+ TINY = 2
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.').freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dumpling
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Kuzmenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-02 00:00:00.000000000 Z
11
+ date: 2016-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.39.0
61
+ version: 0.40.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.39.0
68
+ version: 0.40.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement