pimple 0.0.1.alpha → 0.0.2.beta

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.
data/lib/pimple.rb CHANGED
@@ -1,11 +1,18 @@
1
1
  class Pimple < Hash
2
2
 
3
- VERSION = '0.0.1.alpha'
3
+ VERSION = '0.0.2.beta'
4
4
 
5
+ # Initialize a container with some default parameters
5
6
  def initialize(parameters={})
6
7
  self.replace(parameters)
7
8
  end
8
9
 
10
+ # Get an object.
11
+ # If the fetched object is a lambda, it returns its value.
12
+ #
13
+ # @params [Symbol, String] key Identifier of the searched elements in the container.
14
+ #
15
+ # @return [Object]
9
16
  def [](key)
10
17
  obj = self.fetch key
11
18
  obj.kind_of?(Proc) ? obj.call(self) : obj
@@ -13,11 +20,29 @@ class Pimple < Hash
13
20
  raise KeyError, "Identifier \"#{key}\" is not defined."
14
21
  end
15
22
 
23
+ # Create a protected parameter.
24
+ #
25
+ # @return [Proc]
26
+ #
27
+ # @example
28
+ # container[:rand] = container.protect { rand(100) }
29
+ # container[:rand] # => 34
30
+ # container[:rand] # => 67
16
31
  def protect
17
32
  raise ArgumentError, "Missing block for protected function" unless block_given?
18
33
  Proc.new { yield }
19
34
  end
20
35
 
36
+ # Create a shared service definition
37
+ # This method require to called with a block that contains service definition
38
+ #
39
+ # @return [Proc]
40
+ #
41
+ # @example
42
+ # container[:session] = container.share { |c| Session.new }
43
+ # container[:session] # => #<Session:0x007>
44
+ # # Returns the same object later...
45
+ # container[:session] # => #<Session:0x007>
21
46
  def share
22
47
  raise ArgumentError, "Missing block for shared service" unless block_given?
23
48
  lambda do |c|
@@ -26,8 +51,42 @@ class Pimple < Hash
26
51
  end
27
52
  end
28
53
 
29
- def extend
30
- # Not implemented yet
54
+ # Get the raw data from the container
55
+ # If you call this method by specifying a service as the key, it will return the Proc.
56
+ #
57
+ # @return [Object, Proc]
58
+ #
59
+ # @example
60
+ # container[:session] = lambda { |c| Service.new }
61
+ # container.raw(:service) # => #<Proc:0x007>
62
+ def raw(key)
63
+ self.fetch key
64
+ rescue
65
+ raise KeyError, "Identifier \"#{key}\" is not defined."
66
+ end
67
+
68
+ # Extend a service definition
69
+ #
70
+ # @param [Symbol, String] key Identifier of the service definition to extend
71
+ #
72
+ # @return [Proc]
73
+ #
74
+ # @example
75
+ # container[:service] = container.share { |c| Service.new }
76
+ # container[:service] = container.extend(:service) { |s, c|
77
+ # c.configure (:foo, 'bar')
78
+ # return c # need to return the service object.
79
+ # }
80
+ def extends(key)
81
+ factory = self.raw(key)
82
+
83
+ unless factory.kind_of?(Proc)
84
+ raise ArgumentError, "Identifier #{key} does not contain an object definition."
85
+ end
86
+
87
+ lambda do |c|
88
+ yield(factory.call(c), c)
89
+ end
31
90
  end
32
91
 
33
92
  end
data/spec/pimple_spec.rb CHANGED
@@ -17,16 +17,21 @@ describe Pimple do
17
17
 
18
18
  describe '.[]' do
19
19
  let(:container) { Pimple.new }
20
- before { class Facebook; end; } # Simulate Facebook Api Client class
21
20
 
22
21
  it 'should inject service' do
23
- container[:facebook] = lambda { |c| Facebook.new }
24
- container[:facebook].class.should equal(Facebook)
22
+ container[:service] = lambda { |c| Service.new }
23
+ container[:service].class.should equal(Service)
24
+ end
25
+
26
+ it 'should inject configuring service from container parameters' do
27
+ container[:foo] = 'bar'
28
+ container[:service] = lambda { |c| Service.new(c[:foo]) }
29
+ container[:service].param.should == 'bar'
25
30
  end
26
31
 
27
32
  it 'should return a new instance each time the [](key) method is invoked' do
28
- container[:facebook] = lambda { |c| Facebook.new }
29
- container[:facebook].should_not equal(container[:facebook])
33
+ container[:service] = lambda { |c| Service.new }
34
+ container[:service].should_not equal(container[:service])
30
35
  end
31
36
 
32
37
  it 'should raise KeyError if service not found' do
@@ -39,13 +44,13 @@ describe Pimple do
39
44
  let(:container) { Pimple.new }
40
45
 
41
46
  it 'should define anonymous function as parameter' do
42
- container[:lambda_param] = container.protect { rand(1000) }
43
- container[:lambda_param].should_not equal(container[:lambda_param])
47
+ container[:protected] = container.protect { rand(1000) }
48
+ container[:protected].should_not equal(container[:protected])
44
49
  end
45
50
 
46
51
  it 'should define anonymous function as parameter by Proc.new way' do
47
- container[:lambda_param] = Proc.new { rand(1000) }
48
- container[:lambda_param].should_not equal(container[:lambda_param])
52
+ container[:protected] = Proc.new { rand(1000) }
53
+ container[:protected].should_not equal(container[:protected])
49
54
  end
50
55
 
51
56
  it 'should raise ArgumentError when block is missing' do
@@ -56,21 +61,81 @@ describe Pimple do
56
61
 
57
62
  describe '.share' do
58
63
  let(:container) { Pimple.new }
59
- before { class Facebook; end; } # Simulate Facebook Api Client class
60
64
 
61
- it 'should define shared (global) service' do
62
- container[:facebook] = container.share { |c| Facebook.new }
63
- container[:facebook].class.should equal(Facebook)
65
+ it 'should define shared service' do
66
+ container[:service] = container.share { |c| Service.new }
67
+ container[:service].class.should equal(Service)
68
+ end
69
+
70
+ it 'should inject configuring shared service from container parameters' do
71
+ container[:foo] = 'bar'
72
+ container[:service] = container.share { |c| Service.new(c[:foo]) }
73
+ container[:service].param.should == 'bar'
64
74
  end
65
75
 
66
76
  it 'should get the same instance each time [](key) method is invoked' do
67
- container[:facebook] = container.share { |c| Facebook.new }
68
- container[:facebook].should equal(container[:facebook])
77
+ container[:service] = container.share { |c| Service.new }
78
+ container[:service].should equal(container[:service])
79
+ end
80
+
81
+ end
82
+
83
+ describe '.raw' do
84
+ let(:container) { Pimple.new }
85
+
86
+ it 'should return the anonymous function for the defined serivce' do
87
+ container[:service] = lambda { |c| Service.new }
88
+ container.raw(:service).kind_of?(Proc).should be_true
89
+ end
90
+
91
+ it 'should raise KeyError exception if service not defined' do
92
+ lambda { container.raw :notfound }.should raise_error(KeyError)
69
93
  end
70
94
 
71
95
  end
72
96
 
73
- describe '.extend', :pending => true do
97
+ describe '.extends' do
98
+ let(:container) { Pimple.new }
99
+
100
+ it 'should extend a service definition' do
101
+ container[:service] = lambda { |c| Service.new }
102
+ container[:service] = container.extends(:service) do |service, c|
103
+ service.param = 'foo'
104
+ service
105
+ end
106
+ container[:service].param.should == 'foo'
107
+ end
108
+
109
+ it 'should extend a shared service definition' do
110
+ container[:service] = container.share { |c| Service.new }
111
+ container[:service] = container.extends(:service) do |service, c|
112
+ service.param = 'foo'
113
+ service
114
+ end
115
+ container[:service].should equal(container[:service])
116
+ container[:service].param.should == 'foo'
117
+ end
118
+
119
+ it 'should extend protected parameter' do
120
+ container[:protected] = container.protect { rand(100) }
121
+ container[:protected] = container.extends(:protected) do |p, c|
122
+ p + 200
123
+ end
124
+ container[:protected].should_not == container[:protected]
125
+ end
126
+
127
+ it 'should not extend parameter' do
128
+ container[:foo] = 'bar'
129
+ lambda {
130
+ container.extends(:foo) { |p, c| 'foo' }
131
+ }.should raise_error(ArgumentError)
132
+ end
133
+
134
+ it 'should raise KeyError if service not found' do
135
+ lambda {
136
+ container.extends(:notfound) { |p, c| }
137
+ }.should raise_error(KeyError)
138
+ end
74
139
 
75
140
  end
76
141
 
data/spec/spec_helper.rb CHANGED
@@ -10,4 +10,11 @@ require 'pimple'
10
10
 
11
11
  RSpec.configure do |config|
12
12
  config.filter_run_excluding :broken => true
13
+ end
14
+
15
+ class Service
16
+ attr_accessor :param
17
+ def initialize(param=nil)
18
+ @param = param
19
+ end
13
20
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pimple
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha
4
+ version: 0.0.2.beta
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-08 00:00:00.000000000 Z
12
+ date: 2012-04-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake