pinball 0.0.6 → 0.0.7

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: c67bda90aed3cdc0c6601537ec403dd8d058670d
4
- data.tar.gz: 47a52408df2402cd0c41cf59c3ce43280d5d4e1b
3
+ metadata.gz: 47516b049661968362374418a15718a832ee2748
4
+ data.tar.gz: 935d17aab842e964e98d32e993edffb1c1fe57c9
5
5
  SHA512:
6
- metadata.gz: 5a34bcc0043862fbbda2663bd3d6d0732ae4e229f925b092cf0802ad6e10537655f857885cbcf1ee74251901bb4a874a0cf4a7da4e8e2a4ca45c3063f6be2594
7
- data.tar.gz: e69012ec43691c7daba542c29e8e7ebfb7a46533bf775f6c6a1c19c6981dcf6eb66f6de5569705e79a433f33872a2e185af6f12489d5aa9067f58a8ac1269155
6
+ metadata.gz: 26597ab29677f387763717c6b6aaf780ce4c3fd4af30680d463ee4eca89247da56bce48772f6d70480f504e4caac0570b7de775b4e56418958e85254dddcf3cc
7
+ data.tar.gz: 10d39becea4769759500d0846073ac61752e87e5a9324fc55886c494ccceb8dd7831830691c82a2b70d55eb2e7d1bb7adcfc2bb0ec1000b2e904cce111721c74
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ pinball
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.2
data/.travis.yml CHANGED
@@ -4,6 +4,9 @@ rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
6
  - 2.1.0
7
+ - 2.1.1
8
+ - 2.1.2
9
+ - 2.1.3
7
10
  - jruby-19mode
8
11
  script: bundle exec rspec
9
12
  cache: bundler
data/README.md CHANGED
@@ -8,7 +8,7 @@ dependencies between your classes.
8
8
 
9
9
  # Features
10
10
 
11
- * Stores objects, classes(as factories) and blocks
11
+ * Stores objects, classes(as factories), blocks and singletons
12
12
  * Can inject dependencies to classes and instances
13
13
  * Simple DSL for configuring the container
14
14
  * Stored block will be call in dependent class instance
@@ -97,6 +97,17 @@ This block will be executed it `FirstService` instance context where
97
97
  `@current_user` will be accessible.
98
98
  **Notice:** each call of `second_service` will call this block over and over again.
99
99
 
100
+ ### Singleton injection
101
+
102
+ Instead of class injection, singleton injection will not create new objects every time. It will create only one and then
103
+ returns it. Perfect for stateless services and other singletons. Modifying of classes is not required.
104
+
105
+ ```ruby
106
+ class Service
107
+ inject_singleton :service
108
+ end
109
+ ```
110
+
100
111
  ### class_inject
101
112
 
102
113
  Sometimes you need to inject dependency to class, when it must be available in
data/lib/pinball.rb CHANGED
@@ -13,6 +13,12 @@ module Pinball
13
13
  end
14
14
  end
15
15
 
16
+ class UnknownDependency < StandardError
17
+ end
18
+
19
+ class WrongArity < StandardError
20
+ end
21
+
16
22
  attr_reader :dependencies
17
23
 
18
24
  def new(*args)
data/lib/pinball/class.rb CHANGED
@@ -1,11 +1,8 @@
1
1
  class Class
2
2
  def inject(*deps)
3
3
  check_pinball
4
- if @dependencies
5
- @dependencies.concat(deps).uniq!
6
- else
7
- @dependencies = deps
8
- end
4
+ @dependencies ||= []
5
+ @dependencies.concat(deps).uniq!
9
6
  end
10
7
 
11
8
  def class_inject(*deps)
@@ -24,13 +24,16 @@ module Pinball
24
24
  Pinball::Container.instance.define(key, value, &block)
25
25
  end
26
26
 
27
+ def define_singleton(key, klass)
28
+ Pinball::Container.instance.define_singleton(key, klass)
29
+ end
30
+
27
31
  def undefine(key)
28
32
  Pinball::Container.instance.undefine(key)
29
33
  end
30
34
  end
31
35
 
32
36
  def initialize
33
-
34
37
  @items = {}
35
38
  end
36
39
 
@@ -38,14 +41,24 @@ module Pinball
38
41
  @items[key] = ContainerItem.new(value || block)
39
42
  end
40
43
 
44
+ def define_singleton(key, klass)
45
+ if klass.instance_method(:initialize).arity <= 0
46
+ @items[key] = ContainerItem.new(klass.new)
47
+ else
48
+ raise Pinball::WrongArity.new('Singleton dependency initializer should not have mandatory params')
49
+ end
50
+ end
51
+
41
52
  def undefine(key)
42
53
  @items.delete(key)
43
54
  end
44
55
 
45
56
  def inject(target)
46
57
  target.class.dependencies.each do |dep|
47
- target.define_singleton_method dep do
48
- Container.instance.items.merge(overridden_dependencies)[dep].fetch(self)
58
+ unless target.respond_to?(dep)
59
+ target.define_singleton_method dep do
60
+ Container.instance.items.merge(overridden_dependencies)[dep].fetch(self) rescue raise Pinball::UnknownDependency.new("Dependency #{dep} is unknown, check your pinball config")
61
+ end
49
62
  end
50
63
  end
51
64
  end
@@ -1,3 +1,3 @@
1
1
  module Pinball
2
- VERSION = '0.0.6'
2
+ VERSION = '0.0.7'
3
3
  end
data/pinball.gemspec CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.6'
22
- spec.add_development_dependency 'rake'
22
+ spec.add_development_dependency 'rake', '~> 10.3'
23
23
 
24
- spec.add_development_dependency 'coveralls'
25
- spec.add_development_dependency 'rspec', '~> 2.14.1'
24
+ spec.add_development_dependency 'coveralls', '~> 0.7'
25
+ spec.add_development_dependency 'rspec', '~> 2.14'
26
26
  end
@@ -37,6 +37,21 @@ describe Class do
37
37
  foo.inject :bar
38
38
  expect(foo.dependencies).to match_array([:baz, :bar])
39
39
  end
40
+
41
+ it 'resolves known dependencies' do
42
+ foo.inject :baz
43
+ foo.inject :bar
44
+ foo.inject :egg
45
+
46
+ expect(foo.new.baz).to eq(0)
47
+ expect(foo.new.bar).to eq(1)
48
+ expect(foo.new.egg).to eq(2)
49
+ end
50
+
51
+ it 'raises exception while resolving unknown dependecies' do
52
+ foo.inject :unknown
53
+ expect { foo.new.unknown }.to raise_error(Pinball::UnknownDependency)
54
+ end
40
55
  end
41
56
 
42
57
  describe '::class_inject' do
@@ -41,11 +41,41 @@ describe Pinball::Container do
41
41
  end
42
42
  end
43
43
 
44
+ describe '::define_singleton' do
45
+ context 'with class without mandatory initializer params' do
46
+ it 'adds new container item' do
47
+ Pinball::Container.define_singleton :baz, String
48
+ expect(Pinball::Container.instance.items[:baz].value).to be_an_instance_of(String)
49
+ end
50
+ end
51
+
52
+ context 'with class with mandatory initialize params' do
53
+ it 'raises exception' do
54
+ WithMandatory = Class.new do
55
+ def initialize(param)
56
+ end
57
+ end
58
+
59
+ expect{Pinball::Container.define_singleton :baz, WithMandatory}.to raise_error(Pinball::WrongArity)
60
+ end
61
+ end
62
+ end
63
+
44
64
  describe '::undefine' do
45
- it 'removes container item' do
46
- Pinball::Container.define :baz, 0
47
- Pinball::Container.undefine :baz
48
- expect(Pinball::Container.instance.items[:baz]).to be_nil
65
+ context 'with usual dependency' do
66
+ it 'removes container item' do
67
+ Pinball::Container.define :baz, 0
68
+ Pinball::Container.undefine :baz
69
+ expect(Pinball::Container.instance.items[:baz]).to be_nil
70
+ end
71
+ end
72
+
73
+ context 'with singleton dependency' do
74
+ it 'removes container item' do
75
+ Pinball::Container.define_singleton :baz, String
76
+ Pinball::Container.undefine :baz
77
+ expect(Pinball::Container.instance.items[:baz]).to be_nil
78
+ end
49
79
  end
50
80
  end
51
81
 
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinball
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Sinyavsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-02 00:00:00.000000000 Z
11
+ date: 2014-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.6'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '10.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '10.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: coveralls
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '0.7'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '0.7'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.14.1
61
+ version: '2.14'
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: 2.14.1
68
+ version: '2.14'
69
69
  description: Simple and stupid IOC container and dependency injection tool for ruby
70
70
  email:
71
71
  - zhulik.gleb@gmail.com
@@ -73,9 +73,11 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
- - .coveralls.yml
77
- - .gitignore
78
- - .travis.yml
76
+ - ".coveralls.yml"
77
+ - ".gitignore"
78
+ - ".ruby-gemset"
79
+ - ".ruby-version"
80
+ - ".travis.yml"
79
81
  - Gemfile
80
82
  - LICENSE
81
83
  - LICENSE.txt
@@ -100,17 +102,17 @@ require_paths:
100
102
  - lib
101
103
  required_ruby_version: !ruby/object:Gem::Requirement
102
104
  requirements:
103
- - - '>='
105
+ - - ">="
104
106
  - !ruby/object:Gem::Version
105
107
  version: '0'
106
108
  required_rubygems_version: !ruby/object:Gem::Requirement
107
109
  requirements:
108
- - - '>='
110
+ - - ">="
109
111
  - !ruby/object:Gem::Version
110
112
  version: '0'
111
113
  requirements: []
112
114
  rubyforge_project:
113
- rubygems_version: 2.0.2
115
+ rubygems_version: 2.2.2
114
116
  signing_key:
115
117
  specification_version: 4
116
118
  summary: Simple dependency injection for ruby