tzu 0.0.2.0 → 0.1.0.0

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.
@@ -2,6 +2,7 @@ require 'rubygems'
2
2
  require 'byebug'
3
3
  require 'rspec'
4
4
  require 'active_record'
5
+ require 'virtus'
5
6
  require 'bundler/setup'
6
7
  Bundler.setup
7
8
 
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tzu::Step do
4
+ let(:dummy_mutator) { proc { 'Dummy!' } }
5
+
6
+ context '#name' do
7
+ context 'when name is symbol' do
8
+ let(:step) { Tzu::Step.new(:step_name) }
9
+
10
+ it 'returns name' do
11
+ expect(step.name).to eq :step_name
12
+ end
13
+ end
14
+
15
+ context 'when name is a class' do
16
+ let(:step) { Tzu::Step.new(StandardError) }
17
+ let(:outcome) { ControlledOutcome.run(result: :success) }
18
+
19
+ it 'returns underscored name' do
20
+ expect(step.name).to eq :standard_error
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,39 +1,214 @@
1
1
  require 'spec_helper'
2
2
 
3
+ class ControlledOutcome
4
+ include Tzu
5
+
6
+ def call(params)
7
+ result = params[:result]
8
+ return 123 if result == :success
9
+ return invalid!('Invalid Message') if result == :invalid
10
+ return fail!(:falure_type, 'Failure Message') if result == :failure
11
+ end
12
+ end
13
+
14
+ class MyRequestObject
15
+ attr_reader :value, :errors
16
+
17
+ def initialize(params)
18
+ @params = params
19
+ @value = params[:value]
20
+ @errors = 'Error Message'
21
+ end
22
+
23
+ def valid?
24
+ @params[:valid]
25
+ end
26
+ end
27
+
28
+ class VirtusRequestObject
29
+ include Virtus.model
30
+ include ActiveModel::Validations
31
+
32
+ validates :name, :age, presence: :true
33
+
34
+ attribute :name, String
35
+ attribute :age, Integer
36
+ end
37
+
38
+ class ValidatedCommand
39
+ include Tzu
40
+
41
+ request_object MyRequestObject
42
+
43
+ def call(request)
44
+ request.value
45
+ end
46
+ end
47
+
48
+ class VirtusValidatedCommand
49
+ include Tzu
50
+
51
+ request_object VirtusRequestObject
52
+
53
+ def call(request)
54
+ "Name: #{request.name}, Age: #{request.age}"
55
+ end
56
+ end
57
+
3
58
  describe Tzu do
59
+ context '#run' do
60
+ context 'when command succeeds' do
61
+ let(:outcome) { ControlledOutcome.run(result: :success) }
4
62
 
5
- context 'command fails' do
6
- subject do
7
- Class.new do
8
- include Tzu
63
+ it 'correctly returns sets pass/fail flags' do
64
+ expect(outcome.success?).to be true
65
+ expect(outcome.failure?).to be false
66
+ end
9
67
 
10
- def call(params)
11
- fail! :something
12
- end
68
+ it 'returns result' do
69
+ expect(outcome.result).to eq(123)
13
70
  end
14
71
  end
15
72
 
16
- it 'returns failure' do
17
- result = subject.run(nil)
18
- expect(result).to have_attributes(success: false, type: :something)
73
+ context 'when command is invalid' do
74
+ let(:outcome) { ControlledOutcome.run(result: :invalid) }
75
+
76
+ it 'correctly returns sets pass/fail flags' do
77
+ expect(outcome.success?).to be false
78
+ expect(outcome.failure?).to be true
79
+ end
80
+
81
+ it 'returns error string as errors hash' do
82
+ expect(outcome.result).to eq(errors: 'Invalid Message')
83
+ end
84
+
85
+ it 'sets type to validation' do
86
+ expect(outcome.type).to eq(:validation)
87
+ end
88
+ end
89
+
90
+ context 'when command fails' do
91
+ let(:outcome) { ControlledOutcome.run(result: :failure) }
92
+
93
+ it 'correctly returns sets pass/fail flags' do
94
+ expect(outcome.success?).to be false
95
+ expect(outcome.failure?).to be true
96
+ end
97
+
98
+ it 'returns error string as errors hash' do
99
+ expect(outcome.result).to eq(errors: 'Failure Message')
100
+ end
101
+
102
+ it 'sets type to falure_type' do
103
+ expect(outcome.type).to eq(:falure_type)
104
+ end
19
105
  end
20
106
  end
21
107
 
22
- context 'command succeeds' do
23
- subject do
24
- Class.new do
25
- include Tzu
108
+ context '#run with block' do
109
+ let(:success_spy) { spy('success') }
110
+ let(:invalid_spy) { spy('invalid') }
111
+ let(:failure_spy) { spy('failure') }
26
112
 
27
- def call(params)
28
- 1234
29
- end
113
+ before do
114
+ ControlledOutcome.run(result: result) do
115
+ success { |_| success_spy.call }
116
+ invalid { |_| invalid_spy.call }
117
+ failure { |_| failure_spy.call }
30
118
  end
31
119
  end
32
120
 
33
- it 'returns result' do
34
- result = subject.run(nil)
35
- expect(result).to have_attributes(success: true, result: 1234)
121
+ context 'when command succeeds' do
122
+ let(:result) { :success }
123
+ it 'executes success block' do
124
+ expect(success_spy).to have_received(:call)
125
+ end
126
+ end
127
+
128
+ context 'when command is invalid' do
129
+ let(:result) { :invalid }
130
+ it 'executes invalid block' do
131
+ expect(invalid_spy).to have_received(:call)
132
+ end
133
+ end
134
+
135
+ context 'when command fails' do
136
+ let(:result) { :failure }
137
+ it 'executes failure block' do
138
+ expect(failure_spy).to have_received(:call)
139
+ end
36
140
  end
37
141
  end
38
142
 
143
+ context '#run with request object' do
144
+ context 'when request is valid' do
145
+ let(:outcome) { ValidatedCommand.run(value: 1111, valid: true) }
146
+
147
+ it 'executes successfully' do
148
+ expect(outcome.success?).to be true
149
+ end
150
+
151
+ it 'returns value' do
152
+ expect(outcome.result).to eq 1111
153
+ end
154
+ end
155
+
156
+ context 'when request is invalid' do
157
+ let(:outcome) { ValidatedCommand.run(value: 2222, valid: false) }
158
+
159
+ it 'does not execute successfully' do
160
+ expect(outcome.failure?).to be true
161
+ end
162
+
163
+ it 'has outcome type :validation' do
164
+ expect(outcome.type).to eq :validation
165
+ end
166
+
167
+ it 'returns error string as errors hash' do
168
+ expect(outcome.result).to eq(errors: 'Error Message')
169
+ end
170
+ end
171
+
172
+ context 'with virtus/active_model request object' do
173
+ let(:outcome) { VirtusValidatedCommand.run(params) }
174
+
175
+ context 'when request is valid' do
176
+ let(:params) { { name: 'Young Tzu', age: '19' } }
177
+
178
+ it 'executes successfully' do
179
+ expect(outcome.success?).to be true
180
+ end
181
+ end
182
+
183
+ context 'when request is invalid' do
184
+ let(:params) { { name: 'My Name' } }
185
+
186
+ it 'does not execute successfully' do
187
+ expect(outcome.failure?).to be true
188
+ end
189
+
190
+ it 'returns ActiveModel error object' do
191
+ expect(outcome.result).to eq(age: ["can't be blank"])
192
+ end
193
+ end
194
+ end
195
+ end
196
+
197
+ context '#run!' do
198
+ context 'when command is invalid' do
199
+ let(:outcome) { ControlledOutcome.run!(result: :invalid) }
200
+
201
+ it 'raises Tzu::Invalid' do
202
+ expect { outcome }.to raise_error Tzu::Invalid, 'Invalid Message'
203
+ end
204
+ end
205
+
206
+ context 'when command fails' do
207
+ let(:outcome) { ControlledOutcome.run!(result: :failure) }
208
+
209
+ it 'raises Tzu::Failure' do
210
+ expect { outcome }.to raise_error Tzu::Failure, 'Failure Message'
211
+ end
212
+ end
213
+ end
39
214
  end
@@ -6,7 +6,6 @@ describe Tzu::Validation do
6
6
  subject do
7
7
  Class.new do
8
8
  include Tzu
9
- include Tzu::Validation
10
9
  end
11
10
  end
12
11
 
@@ -24,29 +23,10 @@ describe Tzu::Validation do
24
23
  end
25
24
  end
26
25
 
27
- context 'command defines valid? method' do
28
- subject do
29
- Class.new do
30
- include Tzu
31
- include Tzu::Validation
32
-
33
- def valid?(params)
34
- Tzu::ValidationResult.new(false, [])
35
- end
36
- end
37
- end
38
-
39
- it 'returns validation result' do
40
- result = subject.run(nil)
41
- expect(result).to have_attributes(success: false, type: :validation)
42
- end
43
- end
44
-
45
- context 'error message is string' do
46
- let(:str) { 'error_message' }
47
- subject { Tzu::Invalid.new(str) }
48
-
49
- context 'invoked directly' do
26
+ context 'invoked directly' do
27
+ context 'error message is string' do
28
+ let(:str) { 'error_message' }
29
+ subject { Tzu::Invalid.new(str) }
50
30
  it 'has string as #message' do
51
31
  expect(subject.message).to eq str
52
32
  end
@@ -55,36 +35,40 @@ describe Tzu::Validation do
55
35
  expect(subject.errors).to eq(errors: str)
56
36
  end
57
37
  end
38
+ end
58
39
 
59
- context 'rescued' do
60
- subject do
61
- Class.new do
62
- include Tzu
63
- include Tzu::Validation
40
+ context 'rescued' do
41
+ subject do
42
+ Class.new do
43
+ include Tzu
64
44
 
65
- def call(params)
66
- raise StandardError.new(params)
67
- rescue StandardError => e
68
- invalid! e
69
- end
45
+ def call(params)
46
+ raise StandardError.new(params[:message])
47
+ rescue StandardError => e
48
+ invalid! e
70
49
  end
71
50
  end
51
+ end
52
+
53
+ context 'error message is string' do
54
+ let(:str) { 'error_message' }
55
+ let(:params) { { message: str } }
72
56
 
73
57
  describe '#run' do
74
58
  it 'returns error hash as result' do
75
- outcome = subject.run(str)
59
+ outcome = subject.run(params)
76
60
  expect(outcome.result).to eq(errors: str)
77
61
  end
78
62
  end
79
63
 
80
64
  describe '#run!' do
81
65
  it 'has string as #message' do
82
- expect { subject.run!(str) }.to raise_error Tzu::Invalid, str
66
+ expect { subject.run!(params) }.to raise_error Tzu::Invalid, str
83
67
  end
84
68
 
85
69
  it 'has string as #errors' do
86
70
  begin
87
- subject.run!(str)
71
+ subject.run!(params)
88
72
  expect(false).to be true # Should never reach this
89
73
  rescue Tzu::Invalid => e
90
74
  expect(e.errors).to eq(errors: str)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tzu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.0
4
+ version: 0.1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Morgan Bruce
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-01 00:00:00.000000000 Z
12
+ date: 2015-07-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -95,6 +95,20 @@ dependencies:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: virtus
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
98
112
  description: Encapsulate your database queries with dynamically generated classes
99
113
  email: morgan@onfido.com
100
114
  executables: []
@@ -104,18 +118,22 @@ files:
104
118
  - LICENSE.txt
105
119
  - README.md
106
120
  - lib/tzu.rb
121
+ - lib/tzu/core_extensions/string.rb
107
122
  - lib/tzu/failure.rb
108
123
  - lib/tzu/hooks.rb
109
124
  - lib/tzu/invalid.rb
110
125
  - lib/tzu/match.rb
111
- - lib/tzu/organizer.rb
112
126
  - lib/tzu/outcome.rb
127
+ - lib/tzu/run_methods.rb
128
+ - lib/tzu/sequence.rb
129
+ - lib/tzu/step.rb
113
130
  - lib/tzu/validation.rb
114
131
  - lib/tzu/validation_result.rb
115
132
  - spec/hooks_spec.rb
116
- - spec/organizer_spec.rb
117
133
  - spec/outcome_spec.rb
134
+ - spec/sequence_spec.rb
118
135
  - spec/spec_helper.rb
136
+ - spec/step_spec.rb
119
137
  - spec/tzu_spec.rb
120
138
  - spec/validation_spec.rb
121
139
  homepage: https://github.com/onfido/tzu
@@ -145,9 +163,10 @@ summary: Get is a library designed to encapsulate Rails database queries and pre
145
163
  query pollution in the view layer.
146
164
  test_files:
147
165
  - spec/hooks_spec.rb
148
- - spec/organizer_spec.rb
149
166
  - spec/outcome_spec.rb
167
+ - spec/sequence_spec.rb
150
168
  - spec/spec_helper.rb
169
+ - spec/step_spec.rb
151
170
  - spec/tzu_spec.rb
152
171
  - spec/validation_spec.rb
153
172
  has_rdoc:
@@ -1,35 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Tzu
4
- module Organizer
5
- def self.included(base)
6
- base.class_eval do
7
- include Tzu
8
- end
9
- end
10
-
11
- Step = Struct.new(:command, :transform)
12
-
13
- def steps
14
- @steps ||= []
15
- end
16
-
17
- def add_step(command, &transform)
18
- steps << Step.new(command, transform)
19
- end
20
-
21
- def call(params)
22
- result = call_steps(params)
23
- self.respond_to?(:parse) ? parse(result) : result
24
- end
25
-
26
- def call_steps(params)
27
- result = ::OpenStruct.new
28
- steps.each do |step|
29
- call_with = step.transform ? step.transform(params, result) : params
30
- result[step.command.command_name] = step.command.run!(call_with)
31
- end
32
- result
33
- end
34
- end
35
- end