jerry 1.0.0 → 1.0.1

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: 602f20059904dc280342beeba26963492e75a566
4
- data.tar.gz: e41a4ebdb936fa0beee388d153cbb505ba8f6c90
3
+ metadata.gz: 7b5cd829b2996185f8ef423ab36069d638754a23
4
+ data.tar.gz: 341a9a49bcc3a33149320ecd0ac003264a31e03f
5
5
  SHA512:
6
- metadata.gz: 0a96708a2dc2bf0d3e8ce206e7763760ca08bf1570e58fa5ef8dd12530e03d432ab1bbcd6e4085f2f29efce794bfb236bed57a3bf93bde039849e9be70dc7f38
7
- data.tar.gz: 93da221784a25aecda8d98ac356110a791a0b8e7aeca64923a6e7a81b38d2755ce17f34e6cc9c7f217461a19fc8ea62ab5b822a807608033b08c9e0655da8673
6
+ metadata.gz: 233d001c305c8f4b57a2b2fa850b32459aacb3d86ab8a071079653b886b3691b4b048017d66e7b61a923e959ae8aed47eba4867af491246f6b2e5e54da277365
7
+ data.tar.gz: 22afec9ff0c750bc7838a140aa356cc92df22a0d0cb0a8654628ffc9d7d91fe90e949974dc59674ff72707f0595acfd9448add6b05f42854d018d4309f303938
data/.yardopts ADDED
@@ -0,0 +1,2 @@
1
+ --protected
2
+ --no-private
data/lib/jerry/config.rb CHANGED
@@ -1,9 +1,11 @@
1
- require 'jerry/sugar'
2
-
3
1
  class Jerry
2
+ # Indicated that an error occurred when defining a component
3
+ class ComponentError < StandardError; end
4
+
4
5
  # Base class for all jerry configs.
5
6
  #
6
- # It defines all of the instance methods for a config
7
+ # A config is a class that tells jerry about a set of available
8
+ # components and how those should be created
7
9
  #
8
10
  # @abstract Subclass to define a config
9
11
  # @example
@@ -11,11 +13,42 @@ class Jerry
11
13
  # component(:service) { MyService.new }
12
14
  # component(:app) { MyApp.new rig(:service) }
13
15
  # end
14
- # @see Jerry::Sugar injected class methods
15
16
  class Config
16
- # Injects Jerry::Sugar into inherited classes
17
- def self.inherited(subclass)
18
- subclass.send :extend, Jerry::Sugar
17
+ class << self
18
+ # @return [Array<Symbol>] list of the components defined by the config
19
+ def components
20
+ @components ||= []
21
+ end
22
+
23
+ # Defines a component
24
+ #
25
+ # @param [Symbol] name name of the component
26
+ # @param [Hash] options options hash see supported options
27
+ # @option options [Symbol] (:single) The scope of the component. Can be either :single or :instance.
28
+ # When the scope is :single, only one instance of the component will be created and every call
29
+ # to Jerry#rig will return the same instance. When the scope is :instance, every call to Jerry#rig
30
+ # will return a new instance.
31
+ # @yield Block used to instantiate the component. This block in only called when Jerry#rig is called.
32
+ # @raise [Jerry::ComponentError] when the block is missing or the scope is invalid
33
+ def component(name, options={}, &block)
34
+ raise Jerry::ComponentError, "could not define component #{name}, block is missing" if block.nil?
35
+
36
+ scope = options[:scope] || :single
37
+ unless [:single, :instance].include? scope
38
+ raise Jerry::ComponentError, "could not define component #{name}, scope #{scope} is unknown"
39
+ end
40
+
41
+ define_method name do
42
+ case scope
43
+ when :single
44
+ cache[name] ||= instance_eval(&block)
45
+ when :instance
46
+ instance_eval(&block)
47
+ end
48
+ end
49
+
50
+ components << name
51
+ end
19
52
  end
20
53
 
21
54
  # @return [Array<Symbol>] list of components defined by the config
@@ -31,15 +64,20 @@ class Jerry
31
64
  protected
32
65
 
33
66
  # Creates a component
67
+ #
68
+ # This should be used inside the block passed to Config::component
34
69
  def rig(component)
35
70
  @jerry.rig component
36
71
  end
37
72
 
38
73
  # Check if given component exists
74
+ #
75
+ # This should be used inside the block passed to Config::component
39
76
  def knows?(component)
40
77
  @jerry.knows? component
41
78
  end
42
79
 
80
+ # Used internally to cache single instance components
43
81
  def cache
44
82
  @cache ||= {}
45
83
  end
data/lib/jerry/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Jerry
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
data/lib/jerry.rb CHANGED
@@ -12,10 +12,11 @@ require 'jerry/config'
12
12
  # jerry = Jerry.new MyConfig.new
13
13
  # jerry.rig :app #=> #<MyApp:...>
14
14
  class Jerry
15
+ # Indicated that an error occurred while rigging a component
15
16
  class RigError < StandardError; end
16
17
 
17
18
  # @param [Jerry::Config] configs Configs used to rig components. Multiple config can be given. If two configs
18
- # define the same component, the later one will have priority.
19
+ # define the same component, the later config will have priority.
19
20
  def initialize(*configs)
20
21
  @index = {}
21
22
 
data/spec/config_spec.rb CHANGED
@@ -4,10 +4,11 @@ require 'jerry/config'
4
4
  describe Jerry::Config do
5
5
  let(:klass) {Class.new(Jerry::Config)}
6
6
 
7
- it 'should extend the its subclass with Jerry::Sugar when inherited' do
8
- expect(klass.singleton_class.included_modules).to include Jerry::Sugar
9
- expect(klass).to respond_to :components
10
- expect(klass).to respond_to :component
7
+ describe 'subclass' do
8
+ it 'should respond to all inherited class methods' do
9
+ expect(klass).to respond_to :components
10
+ expect(klass).to respond_to :component
11
+ end
11
12
  end
12
13
 
13
14
  describe '#components' do
@@ -61,4 +62,111 @@ describe Jerry::Config do
61
62
  expect(config.instance_eval { knows? :something }).to be_truthy
62
63
  end
63
64
  end
65
+
66
+ describe 'class methods' do
67
+ describe '#component' do
68
+ it 'should create a method with the given name' do
69
+ klass.component(:my_component) {}
70
+
71
+ expect(klass.new).to respond_to(:my_component)
72
+ end
73
+
74
+ it 'should add the name to the list of components' do
75
+ klass.component(:target) {}
76
+
77
+ expect(klass.components).to include(:target)
78
+ end
79
+
80
+ it 'should raise an error when scope is unknown' do
81
+ expect{klass.component(:target, scope: :not_a_thing) {}}.to raise_error(Jerry::ComponentError)
82
+ end
83
+
84
+ it 'should raise an error when block is missing' do
85
+ expect{klass.component :target}.to raise_error(Jerry::ComponentError)
86
+ end
87
+
88
+ describe 'defined method' do
89
+ it 'should have the right self set' do
90
+ klass.component(:_self) { self }
91
+ instance = klass.new
92
+
93
+ expect(instance._self).not_to be_a Class
94
+ expect(instance._self).to be_a klass
95
+ expect(instance._self).to eq(instance)
96
+ end
97
+
98
+ context 'with scope set to :single' do
99
+ it 'should only call the block once' do
100
+ call_count = 0
101
+ klass.component(:target, scope: :single) {call_count += 1}
102
+ instance = klass.new
103
+
104
+ 3.times {instance.target}
105
+
106
+ expect(call_count).to eq(1)
107
+ end
108
+
109
+ it 'should keep returning the first created component' do
110
+ call_count = 0
111
+ klass.component(:target, scope: :single) {call_count += 1}
112
+ instance = klass.new
113
+
114
+ expect(instance.target).to eq(1)
115
+ expect(instance.target).to eq(1)
116
+ expect(instance.target).to eq(1)
117
+ end
118
+ end
119
+
120
+ context 'with scope set to :instance' do
121
+ it 'should call the block every time' do
122
+ call_count = 0
123
+ klass.component(:target, scope: :instance) {call_count += 1}
124
+ instance = klass.new
125
+
126
+ 3.times {instance.target}
127
+
128
+ expect(call_count).to eq(3)
129
+ end
130
+
131
+ it 'should return a new instance every time' do
132
+ call_count = 0
133
+ klass.component(:target, scope: :instance) {call_count += 1}
134
+ instance = klass.new
135
+
136
+ expect(instance.target).to eq(1)
137
+ expect(instance.target).to eq(2)
138
+ expect(instance.target).to eq(3)
139
+ end
140
+ end
141
+
142
+ context 'with no scope' do
143
+ it 'should only call the block once' do
144
+ call_count = 0
145
+ klass.component(:target) {call_count += 1}
146
+ instance = klass.new
147
+
148
+ 3.times {instance.target}
149
+
150
+ expect(call_count).to eq(1)
151
+ end
152
+
153
+ it 'should keep returning the first created component' do
154
+ call_count = 0
155
+ klass.component(:target) {call_count += 1}
156
+ instance = klass.new
157
+
158
+ expect(instance.target).to eq(1)
159
+ expect(instance.target).to eq(1)
160
+ expect(instance.target).to eq(1)
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ describe '#components' do
167
+ it 'should default to an empty array' do
168
+ expect(klass.components).to eq([])
169
+ end
170
+ end
171
+ end
64
172
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jerry
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boris Bera
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-21 00:00:00.000000000 Z
11
+ date: 2014-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -77,6 +77,7 @@ files:
77
77
  - ".gitignore"
78
78
  - ".rspec"
79
79
  - ".travis.yml"
80
+ - ".yardopts"
80
81
  - Gemfile
81
82
  - LICENSE.txt
82
83
  - README.md
@@ -84,12 +85,10 @@ files:
84
85
  - jerry.gemspec
85
86
  - lib/jerry.rb
86
87
  - lib/jerry/config.rb
87
- - lib/jerry/sugar.rb
88
88
  - lib/jerry/version.rb
89
89
  - spec/config_spec.rb
90
90
  - spec/jerry_spec.rb
91
91
  - spec/spec_helper.rb
92
- - spec/sugar_spec.rb
93
92
  - spec/support/silence_warnings.rb
94
93
  homepage: http://github.com/beraboris/jerry
95
94
  licenses:
@@ -119,6 +118,5 @@ test_files:
119
118
  - spec/config_spec.rb
120
119
  - spec/jerry_spec.rb
121
120
  - spec/spec_helper.rb
122
- - spec/sugar_spec.rb
123
121
  - spec/support/silence_warnings.rb
124
122
  has_rdoc:
data/lib/jerry/sugar.rb DELETED
@@ -1,41 +0,0 @@
1
- class Jerry
2
- class ComponentError < StandardError; end
3
-
4
- # Contains all the class helper methods that are injected when you inherit from Jerry::Config
5
- module Sugar
6
- # @return [Array<Symbol>] list of the components defined by the config
7
- def components
8
- @components ||= []
9
- end
10
-
11
- # Defines a component
12
- #
13
- # @param [Symbol] name name of the component
14
- # @param [Hash] options options hash see supported options
15
- # @option options [Symbol] (:single) The scope of the component. Can be either :single or :instance.
16
- # When the scope is :single, only one instance of the component will be created and every call
17
- # to Jerry#rig will return the same instance. When the scope is :instance, every call to Jerry#rig
18
- # will return a new instance.
19
- # @yield Block used to instantiate the component. This block in only called when Jerry#rig is called.
20
- # @raise [Jerry::ComponentError] when the block is missing or the scope is invalid
21
- def component(name, options={}, &block)
22
- raise Jerry::ComponentError, "could not define component #{name}, block is missing" if block.nil?
23
-
24
- scope = options[:scope] || :single
25
- unless [:single, :instance].include? scope
26
- raise Jerry::ComponentError, "could not define component #{name}, scope #{scope} is unknown"
27
- end
28
-
29
- define_method name do
30
- case scope
31
- when :single
32
- cache[name] ||= instance_eval(&block)
33
- when :instance
34
- instance_eval(&block)
35
- end
36
- end
37
-
38
- components << name
39
- end
40
- end
41
- end
data/spec/sugar_spec.rb DELETED
@@ -1,111 +0,0 @@
1
- require 'rspec'
2
- require 'jerry/config'
3
-
4
- describe Jerry::Sugar do
5
- let(:sugar) {Class.new Jerry::Config}
6
-
7
- describe '#component' do
8
- it 'should create a method with the given name' do
9
- sugar.component(:my_component) {}
10
-
11
- expect(sugar.new).to respond_to(:my_component)
12
- end
13
-
14
- it 'should add the name to the list of components' do
15
- sugar.component(:target) {}
16
-
17
- expect(sugar.components).to include(:target)
18
- end
19
-
20
- it 'should raise an error when scope is unknown' do
21
- expect{sugar.component(:target, scope: :not_a_thing) {}}.to raise_error(Jerry::ComponentError)
22
- end
23
-
24
- it 'should raise an error when block is missing' do
25
- expect{sugar.component :target}.to raise_error(Jerry::ComponentError)
26
- end
27
-
28
- describe 'defined method' do
29
- it 'should have the right self set' do
30
- sugar.component(:_self) { self }
31
- instance = sugar.new
32
-
33
- expect(instance._self).not_to be_a Class
34
- expect(instance._self).to be_a sugar
35
- expect(instance._self).to eq(instance)
36
- end
37
-
38
- context 'with scope set to :single' do
39
- it 'should only call the block once' do
40
- call_count = 0
41
- sugar.component(:target, scope: :single) {call_count += 1}
42
- instance = sugar.new
43
-
44
- 3.times {instance.target}
45
-
46
- expect(call_count).to eq(1)
47
- end
48
-
49
- it 'should keep returning the first created component' do
50
- call_count = 0
51
- sugar.component(:target, scope: :single) {call_count += 1}
52
- instance = sugar.new
53
-
54
- expect(instance.target).to eq(1)
55
- expect(instance.target).to eq(1)
56
- expect(instance.target).to eq(1)
57
- end
58
- end
59
-
60
- context 'with scope set to :instance' do
61
- it 'should call the block every time' do
62
- call_count = 0
63
- sugar.component(:target, scope: :instance) {call_count += 1}
64
- instance = sugar.new
65
-
66
- 3.times {instance.target}
67
-
68
- expect(call_count).to eq(3)
69
- end
70
-
71
- it 'should return a new instance every time' do
72
- call_count = 0
73
- sugar.component(:target, scope: :instance) {call_count += 1}
74
- instance = sugar.new
75
-
76
- expect(instance.target).to eq(1)
77
- expect(instance.target).to eq(2)
78
- expect(instance.target).to eq(3)
79
- end
80
- end
81
-
82
- context 'with no scope' do
83
- it 'should only call the block once' do
84
- call_count = 0
85
- sugar.component(:target) {call_count += 1}
86
- instance = sugar.new
87
-
88
- 3.times {instance.target}
89
-
90
- expect(call_count).to eq(1)
91
- end
92
-
93
- it 'should keep returning the first created component' do
94
- call_count = 0
95
- sugar.component(:target) {call_count += 1}
96
- instance = sugar.new
97
-
98
- expect(instance.target).to eq(1)
99
- expect(instance.target).to eq(1)
100
- expect(instance.target).to eq(1)
101
- end
102
- end
103
- end
104
- end
105
-
106
- describe '#components' do
107
- it 'should default to an empty array' do
108
- expect(sugar.components).to eq([])
109
- end
110
- end
111
- end