nurse-rb 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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