toolbelt 0.0.1 → 0.0.2

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: a7afd7745cf8454490939df0c70494c9607e56d7
4
- data.tar.gz: 4cf8e403fd73e10e5f38d7574d607d8285919140
3
+ metadata.gz: 12bb6c26bbb60833d04dd08d3e31f2e759f0bf31
4
+ data.tar.gz: a57efa4ad0393db69a9d4d3783a07e4bd9de5a98
5
5
  SHA512:
6
- metadata.gz: 460ce56fd6d50ccd4638ea447847bcf728112a76678b8e17ac7de8143e2f5de7f3d243b7b58a422ff338a2ddc84af42dacb57346d89d6ca12e9a050a46062901
7
- data.tar.gz: 6f403237c9310f9d5a356dcecac2ae692ce9326cbd734ac67608b8125e17ae4434d2f0a3fc5f574e4fb8e0e4dfca81e53c783518222c213668b78d961179a33a
6
+ metadata.gz: 7b8e755e1b4c4ed6ce9626180ef346df6ca3f2d212219b46a664108fc36ddc6ffce8c3636db2fcde623dd98974d829ee89613e4683e909166ff8c57b23f6bdc0
7
+ data.tar.gz: 8bf95f7c0d2de5a16b9f2a902ec57a7e1bc9cf44281a0e4c8807f121b85c7ef364511f2abb4e99bc5487d89d2fa6bef01981331fcfe51294dc89b5d8112045af
@@ -1 +1 @@
1
- 2.0.0-p247
1
+ 2.1.2
@@ -4,8 +4,7 @@ cache: bundler
4
4
  rvm:
5
5
  - 1.9.3
6
6
  - 2.0.0
7
- - 2.1.1
7
+ - 2.1.2
8
8
 
9
9
  script:
10
- - bundle exec rubocop
11
10
  - CODECLIMATE_REPO_TOKEN=2874a735738a5bd9b54d2a05acd81d988d54e3c68902282b1e316214489b2708 bundle exec rake
@@ -1,6 +1,8 @@
1
1
  require 'toolbelt/version'
2
2
  require 'hashie'
3
+ require 'hash_validator'
3
4
 
5
+ require 'toolbelt/util/option_validator'
4
6
  require 'toolbelt/service'
5
7
  require 'toolbelt/policy'
6
8
 
@@ -10,4 +12,11 @@ module Toolbelt
10
12
 
11
13
  class OverrideInSubclassError < ToolbeltError
12
14
  end
15
+
16
+ class RequiredOptionsError < ToolbeltError
17
+ # Internal
18
+ def initialize(errors)
19
+ super("Missing required options '#{errors.inspect}'")
20
+ end
21
+ end
13
22
  end
@@ -1,5 +1,7 @@
1
1
  module Toolbelt
2
2
  class Policy
3
+ include Util::OptionValidator
4
+
3
5
  attr_reader :options
4
6
 
5
7
  def self.pass?(options = {})
@@ -11,6 +13,7 @@ module Toolbelt
11
13
  end
12
14
 
13
15
  def initialize(options = {})
16
+ validate_options!(options)
14
17
  @options = Hashie::Mash.new(options)
15
18
  end
16
19
 
@@ -1,5 +1,7 @@
1
1
  module Toolbelt
2
2
  class Service
3
+ include Util::OptionValidator
4
+
3
5
  attr_reader :options
4
6
 
5
7
  def self.call(options = {})
@@ -7,6 +9,7 @@ module Toolbelt
7
9
  end
8
10
 
9
11
  def initialize(options = {})
12
+ validate_options!(options)
10
13
  @options = Hashie::Mash.new(options)
11
14
  end
12
15
 
@@ -0,0 +1,14 @@
1
+ module Toolbelt
2
+ module Util
3
+ module OptionValidator
4
+ def validate_options!(options)
5
+ validator = HashValidator.validate(options, required_options)
6
+ fail Toolbelt::RequiredOptionsError, validator.errors unless validator.valid?
7
+ end
8
+
9
+ def required_options
10
+ {}
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Toolbelt
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -1,12 +1,30 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Toolbelt::Policy' do
4
- class ValidWidget < Toolbelt::Policy
4
+ class ValidWidgetPolicy < Toolbelt::Policy
5
5
  def pass?
6
6
  true
7
7
  end
8
8
  end
9
9
 
10
+ class PassingStudentPolicy < Toolbelt::Policy
11
+ def pass?
12
+ true
13
+ end
14
+
15
+ protected
16
+
17
+ def required_options
18
+ {
19
+ :grade => 'required'
20
+ }
21
+ end
22
+ end
23
+
24
+ it_behaves_like 'an object with required options' do
25
+ let(:callable) { PassingStudentPolicy.pass? }
26
+ end
27
+
10
28
  describe '.pass?' do
11
29
  context 'when interacted with on the base class' do
12
30
  it 'raises an exception' do
@@ -16,14 +34,14 @@ describe 'Toolbelt::Policy' do
16
34
  end
17
35
 
18
36
  describe 'when properly overriden from a subclass' do
19
- subject { ValidWidget.pass? }
37
+ subject { ValidWidgetPolicy.pass? }
20
38
  it { should eq(true) }
21
39
  end
22
40
  end
23
41
 
24
42
  describe '.fail?' do
25
43
  describe 'when properly overriden from a subclass' do
26
- let(:policy) { ValidWidget.new }
44
+ let(:policy) { ValidWidgetPolicy.new }
27
45
 
28
46
  it 'returns the opposite of #pass?' do
29
47
  expect(policy.fail?).to eq(!policy.pass?)
@@ -5,6 +5,14 @@ describe 'Toolbelt::Service' do
5
5
  def call
6
6
  true
7
7
  end
8
+
9
+ protected
10
+
11
+ def required_options
12
+ {
13
+ :object => 'required'
14
+ }
15
+ end
8
16
  end
9
17
 
10
18
  describe '.call' do
@@ -15,8 +23,12 @@ describe 'Toolbelt::Service' do
15
23
  end
16
24
  end
17
25
 
26
+ it_behaves_like 'an object with required options' do
27
+ let(:callable) { CreateWidget.call }
28
+ end
29
+
18
30
  describe 'when properly overriden from a subclass' do
19
- subject { CreateWidget.call }
31
+ subject { CreateWidget.call(:object => 'mock') }
20
32
  it { should eq(true) }
21
33
  end
22
34
  end
@@ -2,6 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Toolbelt::VERSION' do
4
4
  it 'should be the correct version' do
5
- expect(Toolbelt::VERSION).to eq('0.0.1')
5
+ expect(Toolbelt::VERSION).to eq('0.0.2')
6
6
  end
7
7
  end
@@ -0,0 +1,21 @@
1
+ shared_examples_for 'an object with required options' do
2
+ let(:validator) { double('hash_validator', :valid? => true) }
3
+
4
+ it 'validates the options passed in against #required_options' do
5
+ expect(HashValidator).to receive(:validate).and_return(validator)
6
+ callable
7
+ end
8
+
9
+ it 'validates the options passed in against #required_options' do
10
+ allow(HashValidator).to receive(:validate).and_return(validator)
11
+ expect(validator).to receive(:valid?)
12
+ callable
13
+ end
14
+
15
+ context 'when missing required options' do
16
+ it 'raises an exception' do
17
+ expect { callable }
18
+ .to raise_error { Toolbelt::RequiredOptionsError }
19
+ end
20
+ end
21
+ end
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.require_paths = ['lib']
22
22
 
23
23
  spec.add_dependency('hashie')
24
+ spec.add_dependency('hash_validator')
24
25
  spec.add_development_dependency 'bundler', '~> 1.3'
25
26
  spec.add_development_dependency('pry')
26
27
  spec.add_development_dependency('rake')
metadata CHANGED
@@ -1,153 +1,167 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toolbelt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - PJ Kelly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-05 00:00:00.000000000 Z
11
+ date: 2014-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hash_validator
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ~>
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
47
  version: '1.3'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ~>
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '1.3'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: pry
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '>='
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - '>='
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - '>='
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '>='
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '>='
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '>='
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rubocop
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - '>='
101
+ - - ">="
88
102
  - !ruby/object:Gem::Version
89
103
  version: '0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - '>='
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: guard
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - '>='
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - '>='
122
+ - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: guard-rspec
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - '>='
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - '>='
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: guard-rubocop
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - '>='
143
+ - - ">="
130
144
  - !ruby/object:Gem::Version
131
145
  version: '0'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - '>='
150
+ - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: codeclimate-test-reporter
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - '>='
157
+ - - ">="
144
158
  - !ruby/object:Gem::Version
145
159
  version: '0'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - '>='
164
+ - - ">="
151
165
  - !ruby/object:Gem::Version
152
166
  version: '0'
153
167
  description: A collection of POROs to use in your applications.
@@ -157,10 +171,10 @@ executables: []
157
171
  extensions: []
158
172
  extra_rdoc_files: []
159
173
  files:
160
- - .gitignore
161
- - .rubocop.yml
162
- - .ruby-version
163
- - .travis.yml
174
+ - ".gitignore"
175
+ - ".rubocop.yml"
176
+ - ".ruby-version"
177
+ - ".travis.yml"
164
178
  - CHANGELOG.md
165
179
  - Gemfile
166
180
  - Guardfile
@@ -170,12 +184,14 @@ files:
170
184
  - lib/toolbelt.rb
171
185
  - lib/toolbelt/policy.rb
172
186
  - lib/toolbelt/service.rb
187
+ - lib/toolbelt/util/option_validator.rb
173
188
  - lib/toolbelt/version.rb
174
189
  - spec/lib/toolbelt/policy_spec.rb
175
190
  - spec/lib/toolbelt/service_spec.rb
176
191
  - spec/lib/toolbelt/version_spec.rb
177
192
  - spec/lib/toolbelt_spec.rb
178
193
  - spec/spec_helper.rb
194
+ - spec/support/shared_examples_for_option_validator.rb
179
195
  - toolbelt.gemspec
180
196
  homepage: https://github.com/crushlovely/toolbelt
181
197
  licenses: []
@@ -186,17 +202,17 @@ require_paths:
186
202
  - lib
187
203
  required_ruby_version: !ruby/object:Gem::Requirement
188
204
  requirements:
189
- - - '>='
205
+ - - ">="
190
206
  - !ruby/object:Gem::Version
191
207
  version: '0'
192
208
  required_rubygems_version: !ruby/object:Gem::Requirement
193
209
  requirements:
194
- - - '>='
210
+ - - ">="
195
211
  - !ruby/object:Gem::Version
196
212
  version: '0'
197
213
  requirements: []
198
214
  rubyforge_project: toolbelt
199
- rubygems_version: 2.0.3
215
+ rubygems_version: 2.2.2
200
216
  signing_key:
201
217
  specification_version: 4
202
218
  summary: A collection of POROs to use in your applications.
@@ -206,4 +222,4 @@ test_files:
206
222
  - spec/lib/toolbelt/version_spec.rb
207
223
  - spec/lib/toolbelt_spec.rb
208
224
  - spec/spec_helper.rb
209
- has_rdoc:
225
+ - spec/support/shared_examples_for_option_validator.rb