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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a9c9af1309aada52804d8450b27e535f472d024
4
- data.tar.gz: d4b9408f58a551eb229d335aa7b6351227b93078
3
+ metadata.gz: fd381da253e837a08d3fdce402293a69d6a3c639
4
+ data.tar.gz: e12e0499bb82f1206b454e01a56cacfb97d34aff
5
5
  SHA512:
6
- metadata.gz: 876e8e69078cbba014d69a52a92a51cd702cabab44da6e9812206fc07667f01cffb6011c7c9552445691951b93618a18caa855f73812d83fb7ca9c3289bc0c15
7
- data.tar.gz: 4feff6c0fcb4eb4748fe775401d2944b760d59d0eb35fb2680cdf2fed9efeeeea7280161c23645b2e1f41d473ffee84281d814f5540840d78512ab59f2c2ab53
6
+ metadata.gz: 18a59ab5c45f4becab2bb9a9c29fc13f6a712929306be4ecb3e64ba5c03be8a20a3a0a3c26a579f037998877e4045d99c957b0664fba481f698b4b28ffba3d69
7
+ data.tar.gz: 35fed3c5f7ee5a829e2eb96c06f33512b1dcaaaf40882a937a7dfa7e619f0d45b1ce60b7dd3a38f4d36c2b833cb33212a37d330ece79784dc071188711cf6fa2
data/.travis.yml CHANGED
@@ -1,4 +1,12 @@
1
1
  language: ruby
2
+ sudo: false
3
+ cache: bundle
2
4
  rvm:
3
- - 2.2.2
5
+ # - 1.9.3
6
+ - 2.0
7
+ - 2.1
8
+ - 2.2
9
+ - 2.3.0
10
+ - 2.4.0
11
+ script: rake test:coveralls
4
12
  before_install: gem install bundler -v 1.10.6
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
  [![Build Status](https://travis-ci.org/mjacobus/nurse-rb.svg)](https://travis-ci.org/mjacobus/nurse-rb)
8
+ [![Coverage Status](https://coveralls.io/repos/github/mjacobus/nurse/badge.svg?branch=master)](https://coveralls.io/github/mjacobus/nurse?branch=master)
6
9
  [![Code Coverage](https://scrutinizer-ci.com/g/mjacobus/nurse-rb/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/mjacobus/nurse-rb/?branch=master)
7
10
  [![Code Climate](https://codeclimate.com/github/mjacobus/nurse-rb/badges/gpa.svg)](https://codeclimate.com/github/mjacobus/nurse-rb)
8
11
  [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/mjacobus/nurse-rb/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/mjacobus/nurse-rb/?branch=master)
12
+
13
+ Package information
14
+
9
15
  [![Dependency Status](https://gemnasium.com/mjacobus/nurse-rb.svg)](https://gemnasium.com/mjacobus/nurse-rb)
10
16
  [![Gem Version](https://badge.fury.io/rb/nurse-rb.svg)](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.define(:connection) do |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.define(UserRepository) do |dependency_manager|
40
- conneciton = dependency_manager.get(:connection)
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 "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new do |t|
5
- t.libs << "spec"
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 "bundler/setup"
4
- require "nurse"
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 "irb"
13
+ require 'irb'
14
14
  IRB.start
data/lib/nurse.rb CHANGED
@@ -1,8 +1,10 @@
1
- require "nurse/version"
2
- require "nurse/dependency_container"
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.dependency_manager
6
- @@dependency_manager ||= DependencyContainer.new
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 define(dependency, &block)
7
+ def initialize
8
+ @factories = {}
9
+ @shared_factories = {}
10
+ @instances = {}
11
+ end
12
+
13
+ def share(dependency, &block)
7
14
  ensure_undefined(dependency)
8
- definitions[to_key(dependency)] = block
15
+ shared_factories[to_key(dependency)] = block
9
16
  self
10
17
  end
11
18
 
12
- def define!(dependency, &block)
13
- undefine(dependency)
14
- define(dependency, &block)
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
- definitions.has_key?(to_key(dependency))
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
- unless instances.has_key?(key)
27
- instances[key] = definitions[key].call(self)
33
+ if self.defined?(key)
34
+ return from_shared_factories(key) || from_factories(key)
28
35
  end
29
36
 
30
- instances[key]
37
+ return yield if block_given?
38
+
39
+ fail UndefinedDependency, "'#{dependency}' was not defined"
31
40
  end
32
41
 
33
- def fetch(dependency, &block)
34
- return get(dependency) if self.defined?(dependency)
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
- private
46
+ protected
40
47
 
41
- def ensure_undefined(dependency)
42
- if self.defined?(to_key(dependency))
43
- raise DependencyAlreadyDefined.new(
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 instances
50
- @instances ||= {}
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 definitions
54
- @definitions ||= {}
57
+ def from_factories(key)
58
+ factories[key].call(self) if factories.key?(key)
55
59
  end
56
60
 
57
- def to_key(object)
58
- object.to_s.to_sym
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 undefine(dependency)
62
- return unless self.defined?(dependency)
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
@@ -0,0 +1,9 @@
1
+ module Nurse
2
+ class SharedServiceFactory < ServiceFactory
3
+ def attach_to(dependency_manager)
4
+ dependency_manager.share(dependency_key) do |di|
5
+ create_service(di)
6
+ end
7
+ end
8
+ end
9
+ end
data/lib/nurse/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nurse
2
- VERSION = "1.0.0"
2
+ VERSION = '2.0.0'
3
3
  end
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 = "nurse-rb"
7
+ spec.name = 'nurse-rb'
8
8
  spec.version = Nurse::VERSION
9
- spec.authors = ["Marcelo Jacobus"]
10
- spec.email = ["marcelo.jacobus@gmail.com"]
9
+ spec.authors = ['Marcelo Jacobus']
10
+ spec.email = ['marcelo.jacobus@gmail.com']
11
11
 
12
- spec.summary = %q{Nurse, for your dependnecy injection}
13
- spec.description = %q{Nurse, for your dependnecy injection. Dependency injection management}
14
- spec.homepage = "https://github.com/mjacobus/nurse-rb"
15
- spec.license = "MIT"
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'] = "https://rubygems.org"
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
21
  else
22
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
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 = "exe"
26
+ spec.bindir = 'exe'
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
28
+ spec.require_paths = ['lib']
29
29
 
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 "scrutinizer-ocular"
34
- spec.add_development_dependency "coveralls"
35
- spec.add_development_dependency "simplecov"
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: 1.0.0
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: 2015-10-12 00:00:00.000000000 Z
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.4.6
155
+ rubygems_version: 2.5.1
140
156
  signing_key:
141
157
  specification_version: 4
142
158
  summary: Nurse, for your dependnecy injection