nurse-rb 1.0.0 → 2.0.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/.travis.yml +9 -1
- data/README.md +37 -3
- data/Rakefile +4 -5
- data/bin/console +3 -3
- data/lib/nurse.rb +6 -4
- data/lib/nurse/dependency_container.rb +38 -35
- data/lib/nurse/service_factory.rb +17 -0
- data/lib/nurse/shared_service_factory.rb +9 -0
- data/lib/nurse/version.rb +1 -1
- data/nurse-rb.gemspec +18 -17
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd381da253e837a08d3fdce402293a69d6a3c639
|
4
|
+
data.tar.gz: e12e0499bb82f1206b454e01a56cacfb97d34aff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18a59ab5c45f4becab2bb9a9c29fc13f6a712929306be4ecb3e64ba5c03be8a20a3a0a3c26a579f037998877e4045d99c957b0664fba481f698b4b28ffba3d69
|
7
|
+
data.tar.gz: 35fed3c5f7ee5a829e2eb96c06f33512b1dcaaaf40882a937a7dfa7e619f0d45b1ce60b7dd3a38f4d36c2b833cb33212a37d330ece79784dc071188711cf6fa2
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -2,10 +2,16 @@
|
|
2
2
|
|
3
3
|
Nurse, for your dependency injection
|
4
4
|
|
5
|
+
Code quality
|
6
|
+
|
5
7
|
[](https://travis-ci.org/mjacobus/nurse-rb)
|
8
|
+
[](https://coveralls.io/github/mjacobus/nurse?branch=master)
|
6
9
|
[](https://scrutinizer-ci.com/g/mjacobus/nurse-rb/?branch=master)
|
7
10
|
[](https://codeclimate.com/github/mjacobus/nurse-rb)
|
8
11
|
[](https://scrutinizer-ci.com/g/mjacobus/nurse-rb/?branch=master)
|
12
|
+
|
13
|
+
Package information
|
14
|
+
|
9
15
|
[](https://gemnasium.com/mjacobus/nurse-rb)
|
10
16
|
[](https://badge.fury.io/rb/nurse-rb)
|
11
17
|
|
@@ -32,12 +38,12 @@ Or install it yourself as:
|
|
32
38
|
```ruby
|
33
39
|
dependency_manager = Nurse::DependencyContainer.new
|
34
40
|
|
35
|
-
dependency_manager.
|
41
|
+
dependency_manager.share(:connection) do |dependency_manager|
|
36
42
|
MyConnection.new("mysql://root@localhost/my_db")
|
37
43
|
end
|
38
44
|
|
39
|
-
dependency_manager.
|
40
|
-
|
45
|
+
dependency_manager.share(UserRepository) do |dependency_manager|
|
46
|
+
connection = dependency_manager.get(:connection)
|
41
47
|
UserRepository.new(connection)
|
42
48
|
end
|
43
49
|
```
|
@@ -63,6 +69,34 @@ class UsersController < SomeBaseController
|
|
63
69
|
end
|
64
70
|
end
|
65
71
|
```
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
class DatabaseConnectionFactory < Nurse::SharedServiceFactory
|
75
|
+
def create_service(dependencies)
|
76
|
+
DatabaseConnection.new(dependencies.get(:db_config))
|
77
|
+
end
|
78
|
+
|
79
|
+
def dependency_key
|
80
|
+
:db_connection
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class UserRepositoryFactory < Nurse::ServiceFactory
|
85
|
+
def create_service(dependencies)
|
86
|
+
UserRepository.new(dependencies.get(:db_connection))
|
87
|
+
end
|
88
|
+
|
89
|
+
def dependency_key
|
90
|
+
:user_repository
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
dependency_manager.add_factory(DatabaseConnectionFactory.new)
|
95
|
+
dependency_manager.add_factory(UserRepositoryFactory.new)
|
96
|
+
```
|
97
|
+
|
98
|
+
### Using factories
|
99
|
+
|
66
100
|
## Development
|
67
101
|
|
68
102
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/Rakefile
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
3
|
|
4
4
|
Rake::TestTask.new do |t|
|
5
|
-
t.libs <<
|
5
|
+
t.libs << 'spec'
|
6
6
|
t.test_files = FileList['spec/**/*_spec.rb']
|
7
7
|
t.verbose = true
|
8
8
|
end
|
@@ -24,5 +24,4 @@ namespace :test do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
task :default => :test
|
27
|
+
task default: :test
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'nurse'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "nurse"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/lib/nurse.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'nurse/version'
|
2
|
+
require 'nurse/dependency_container'
|
3
|
+
require 'nurse/service_factory'
|
4
|
+
require 'nurse/shared_service_factory'
|
3
5
|
|
4
6
|
module Nurse
|
5
|
-
def self.
|
6
|
-
|
7
|
+
def self.instance
|
8
|
+
@instance ||= DependencyContainer.new
|
7
9
|
end
|
8
10
|
end
|
@@ -1,68 +1,71 @@
|
|
1
1
|
module Nurse
|
2
|
+
# The dependency container class
|
2
3
|
class DependencyContainer
|
3
4
|
class UndefinedDependency < RuntimeError; end
|
4
5
|
class DependencyAlreadyDefined < RuntimeError; end
|
5
6
|
|
6
|
-
def
|
7
|
+
def initialize
|
8
|
+
@factories = {}
|
9
|
+
@shared_factories = {}
|
10
|
+
@instances = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def share(dependency, &block)
|
7
14
|
ensure_undefined(dependency)
|
8
|
-
|
15
|
+
shared_factories[to_key(dependency)] = block
|
9
16
|
self
|
10
17
|
end
|
11
18
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
19
|
+
def set(dependency, &block)
|
20
|
+
ensure_undefined(dependency)
|
21
|
+
factories[to_key(dependency)] = block
|
22
|
+
self
|
15
23
|
end
|
16
24
|
|
17
25
|
def defined?(dependency)
|
18
|
-
|
26
|
+
key = to_key(dependency)
|
27
|
+
shared_factories.key?(key) || factories.key?(key)
|
19
28
|
end
|
20
29
|
|
21
|
-
def get(dependency)
|
22
|
-
return nil unless self.defined?(dependency)
|
23
|
-
|
30
|
+
def get(dependency, &_block)
|
24
31
|
key = to_key(dependency)
|
25
32
|
|
26
|
-
|
27
|
-
|
33
|
+
if self.defined?(key)
|
34
|
+
return from_shared_factories(key) || from_factories(key)
|
28
35
|
end
|
29
36
|
|
30
|
-
|
37
|
+
return yield if block_given?
|
38
|
+
|
39
|
+
fail UndefinedDependency, "'#{dependency}' was not defined"
|
31
40
|
end
|
32
41
|
|
33
|
-
def
|
34
|
-
|
35
|
-
return block.call(dependency) if block_given?
|
36
|
-
raise UndefinedDependency, "'#{dependency}' was not defined"
|
42
|
+
def add_factory(factory)
|
43
|
+
factory.attach_to(self)
|
37
44
|
end
|
38
45
|
|
39
|
-
|
46
|
+
protected
|
40
47
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
"Dependency '#{dependency}' was already defined"
|
45
|
-
)
|
46
|
-
end
|
47
|
-
end
|
48
|
+
attr_reader :factories
|
49
|
+
attr_reader :instances
|
50
|
+
attr_reader :shared_factories
|
48
51
|
|
49
|
-
def
|
50
|
-
|
52
|
+
def from_shared_factories(key)
|
53
|
+
return unless shared_factories.key?(key)
|
54
|
+
instances[key] ||= shared_factories[key].call(self)
|
51
55
|
end
|
52
56
|
|
53
|
-
def
|
54
|
-
|
57
|
+
def from_factories(key)
|
58
|
+
factories[key].call(self) if factories.key?(key)
|
55
59
|
end
|
56
60
|
|
57
|
-
def
|
58
|
-
|
61
|
+
def ensure_undefined(dependency)
|
62
|
+
return unless self.defined?(dependency)
|
63
|
+
fail DependencyAlreadyDefined,
|
64
|
+
"Dependency '#{dependency}' was already defined"
|
59
65
|
end
|
60
66
|
|
61
|
-
def
|
62
|
-
|
63
|
-
key = to_key(dependency)
|
64
|
-
definitions.delete(key)
|
65
|
-
instances.delete(key)
|
67
|
+
def to_key(object)
|
68
|
+
object.to_s
|
66
69
|
end
|
67
70
|
end
|
68
71
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Nurse
|
2
|
+
class ServiceFactory
|
3
|
+
def attach_to(dependency_manager)
|
4
|
+
dependency_manager.set(dependency_key) do |di|
|
5
|
+
create_service(di)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_service(_dependency_manager)
|
10
|
+
fail 'create_service must be implemented'
|
11
|
+
end
|
12
|
+
|
13
|
+
def dependency_key
|
14
|
+
fail 'dependency_key must be implemented'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/nurse/version.rb
CHANGED
data/nurse-rb.gemspec
CHANGED
@@ -4,33 +4,34 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'nurse/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'nurse-rb'
|
8
8
|
spec.version = Nurse::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Marcelo Jacobus']
|
10
|
+
spec.email = ['marcelo.jacobus@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
12
|
+
spec.summary = 'Nurse, for your dependnecy injection'
|
13
|
+
spec.description = 'Nurse, for your dependnecy injection. Dependency injection management'
|
14
|
+
spec.homepage = 'https://github.com/mjacobus/nurse-rb'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
18
|
# delete this section to allow pushing this gem to any host.
|
19
19
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] =
|
20
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
21
21
|
else
|
22
|
-
|
22
|
+
fail 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
23
23
|
end
|
24
24
|
|
25
25
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
-
spec.bindir =
|
26
|
+
spec.bindir = 'exe'
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
-
spec.require_paths = [
|
28
|
+
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
30
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
+
spec.add_development_dependency 'minitest'
|
33
|
+
spec.add_development_dependency 'minitest-reporters'
|
34
|
+
spec.add_development_dependency 'scrutinizer-ocular'
|
35
|
+
spec.add_development_dependency 'coveralls'
|
36
|
+
spec.add_development_dependency 'simplecov'
|
36
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nurse-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcelo Jacobus
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest-reporters
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: scrutinizer-ocular
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,6 +127,8 @@ files:
|
|
113
127
|
- bin/setup
|
114
128
|
- lib/nurse.rb
|
115
129
|
- lib/nurse/dependency_container.rb
|
130
|
+
- lib/nurse/service_factory.rb
|
131
|
+
- lib/nurse/shared_service_factory.rb
|
116
132
|
- lib/nurse/version.rb
|
117
133
|
- nurse-rb.gemspec
|
118
134
|
homepage: https://github.com/mjacobus/nurse-rb
|
@@ -136,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
152
|
version: '0'
|
137
153
|
requirements: []
|
138
154
|
rubyforge_project:
|
139
|
-
rubygems_version: 2.
|
155
|
+
rubygems_version: 2.5.1
|
140
156
|
signing_key:
|
141
157
|
specification_version: 4
|
142
158
|
summary: Nurse, for your dependnecy injection
|