solid_use_case 1.0.2 → 1.1.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.
- checksums.yaml +4 -4
- data/README.md +13 -17
- data/lib/solid_use_case.rb +3 -3
- data/lib/solid_use_case/base.rb +48 -0
- data/lib/solid_use_case/{command → base}/error_struct.rb +0 -0
- data/lib/solid_use_case/{command → base}/util.rb +1 -1
- data/lib/solid_use_case/version.rb +1 -1
- data/solid_use_case.gemspec +1 -1
- data/spec/{command_spec.rb → base_spec.rb} +51 -5
- data/spec/rspec_matchers_spec.rb +4 -4
- metadata +22 -21
- data/lib/solid_use_case/command.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e7056ae1ef3157772218479526874fa94e710f7
|
4
|
+
data.tar.gz: fd9a2327b8919bfd623d72e7fbe66ec6e0ced364
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0dcee4954826b006d3c3bda5516536db3db27c1e1eca0c7731029daec17cd00a6122f8846f48237387e3fe45d81a81da2f8998a71b0fa9d3c287cea9c77d5a76
|
7
|
+
data.tar.gz: 24dab826516eab7bfe84842e89c3361ac06c039edfbbe0d82c226fd339ebbc843bc24a96878c431f59071a8d5637f1aab307fa3215cbc3447fb58fa23861516d
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
Add this line to your application's Gemfile:
|
8
8
|
|
9
|
-
gem 'solid_use_case', '~> 1.0
|
9
|
+
gem 'solid_use_case', '~> 1.1.0'
|
10
10
|
|
11
11
|
And then execute:
|
12
12
|
|
@@ -25,22 +25,17 @@ The only required method is the `#run` method.
|
|
25
25
|
### Rails Example
|
26
26
|
|
27
27
|
```ruby
|
28
|
-
class UserSignup < SolidUseCase::
|
29
|
-
|
30
|
-
|
31
|
-
step { validate(params) }
|
32
|
-
step {|params| save_user(params) }
|
33
|
-
try {|params| email_user(params) }
|
34
|
-
end
|
35
|
-
end
|
28
|
+
class UserSignup < SolidUseCase::Base
|
29
|
+
|
30
|
+
steps :validate, :save_user, :email_user
|
36
31
|
|
37
32
|
def validate(params)
|
38
33
|
user = User.new(params[:user])
|
39
|
-
if user.valid?
|
34
|
+
if !user.valid?
|
40
35
|
fail :invalid_user, :user => user
|
41
36
|
else
|
42
37
|
params[:user] = user
|
43
|
-
|
38
|
+
continue(params)
|
44
39
|
end
|
45
40
|
end
|
46
41
|
|
@@ -49,13 +44,14 @@ class UserSignup < SolidUseCase::Command
|
|
49
44
|
if user.save
|
50
45
|
fail :user_save_failed, :user => user
|
51
46
|
else
|
52
|
-
|
47
|
+
continue(params)
|
53
48
|
end
|
54
49
|
end
|
55
50
|
|
56
51
|
def email_user(params)
|
57
52
|
UserMailer.async.deliver(:welcome, params[:user].id)
|
58
|
-
|
53
|
+
# Because this is the last step, we want to end with the created user
|
54
|
+
continue(params[:user])
|
59
55
|
end
|
60
56
|
end
|
61
57
|
```
|
@@ -72,15 +68,15 @@ class UsersController < ApplicationController
|
|
72
68
|
end
|
73
69
|
|
74
70
|
failure(:invalid_user) do |error_data|
|
75
|
-
|
71
|
+
render_form_errors(error_data, "Oops, fix your mistakes and try again")
|
76
72
|
end
|
77
73
|
|
78
74
|
failure(:user_save_failed) do |error_data|
|
79
|
-
|
75
|
+
render_form_errors(error_data, "Sorry, something went wrong on our side.")
|
80
76
|
end
|
81
77
|
|
82
78
|
failure do |exception|
|
83
|
-
flash[:error] = "
|
79
|
+
flash[:error] = "something went terribly wrong"
|
84
80
|
render 'new'
|
85
81
|
end
|
86
82
|
end
|
@@ -88,7 +84,7 @@ class UsersController < ApplicationController
|
|
88
84
|
|
89
85
|
private
|
90
86
|
|
91
|
-
def
|
87
|
+
def render_form_errors(user, error_message)
|
92
88
|
@user = user
|
93
89
|
@error_message = error_message
|
94
90
|
render 'new'
|
data/lib/solid_use_case.rb
CHANGED
@@ -2,9 +2,9 @@ require "deterministic"
|
|
2
2
|
require "deterministic/core_ext/either"
|
3
3
|
|
4
4
|
require "solid_use_case/version"
|
5
|
-
require 'solid_use_case/
|
6
|
-
require 'solid_use_case/
|
7
|
-
require 'solid_use_case/
|
5
|
+
require 'solid_use_case/base/util.rb'
|
6
|
+
require 'solid_use_case/base/error_struct.rb'
|
7
|
+
require 'solid_use_case/base.rb'
|
8
8
|
|
9
9
|
module SolidUseCase
|
10
10
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SolidUseCase
|
2
|
+
class Base
|
3
|
+
include Deterministic::CoreExt::Either
|
4
|
+
include BaseUtil
|
5
|
+
|
6
|
+
def self.run(input_hash={})
|
7
|
+
self.new.run(input_hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.steps(*args)
|
11
|
+
@__steps ||= []
|
12
|
+
@__steps += args
|
13
|
+
end
|
14
|
+
|
15
|
+
def run(inputs)
|
16
|
+
steps = self.class.instance_variable_get("@__steps").clone
|
17
|
+
result = Success(inputs)
|
18
|
+
return result unless steps
|
19
|
+
|
20
|
+
while steps.count > 0
|
21
|
+
next_step = steps.shift
|
22
|
+
|
23
|
+
if next_step.is_a?(Class) && (next_step < SolidUseCase::Base)
|
24
|
+
subresult = next_step.run(result.value)
|
25
|
+
elsif next_step.is_a?(Symbol)
|
26
|
+
subresult = self.send(next_step, result.value)
|
27
|
+
else
|
28
|
+
raise "Invalid step type: #{next_step.inspect}"
|
29
|
+
end
|
30
|
+
|
31
|
+
result = result.and(subresult)
|
32
|
+
end
|
33
|
+
|
34
|
+
result
|
35
|
+
end
|
36
|
+
|
37
|
+
# # # # # #
|
38
|
+
# Helpers #
|
39
|
+
# # # # # #
|
40
|
+
|
41
|
+
def fail(type, data={})
|
42
|
+
data[:type] = type
|
43
|
+
Failure(ErrorStruct.new(data))
|
44
|
+
end
|
45
|
+
|
46
|
+
alias :continue :Success
|
47
|
+
end
|
48
|
+
end
|
File without changes
|
data/solid_use_case.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.required_ruby_version = '~> 2.0'
|
22
22
|
|
23
|
-
spec.add_dependency "deterministic", '~> 0.
|
23
|
+
spec.add_dependency "deterministic", '~> 0.6.0'
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
26
|
spec.add_development_dependency "rake"
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe SolidUseCase::
|
3
|
+
describe SolidUseCase::Base do
|
4
4
|
|
5
5
|
describe 'Stepping' do
|
6
|
-
class GiantSteps < SolidUseCase::
|
6
|
+
class GiantSteps < SolidUseCase::Base
|
7
7
|
def run(inputs)
|
8
8
|
attempt_all do
|
9
9
|
step { step_1(inputs) }
|
@@ -13,12 +13,12 @@ describe SolidUseCase::Command do
|
|
13
13
|
|
14
14
|
def step_1(inputs)
|
15
15
|
inputs[:number] += 10
|
16
|
-
|
16
|
+
continue(inputs)
|
17
17
|
end
|
18
18
|
|
19
19
|
def step_2(inputs)
|
20
20
|
inputs[:number] *= 2
|
21
|
-
|
21
|
+
continue(inputs)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -30,8 +30,54 @@ describe SolidUseCase::Command do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
|
33
|
+
describe 'Stepping DSL' do
|
34
|
+
class GiantStepsDSL < SolidUseCase::Base
|
35
|
+
|
36
|
+
steps :step_1, :step_2
|
37
|
+
|
38
|
+
def step_1(inputs)
|
39
|
+
inputs[:number] += 10
|
40
|
+
continue(inputs)
|
41
|
+
end
|
42
|
+
|
43
|
+
def step_2(inputs)
|
44
|
+
inputs[:number] *= 2
|
45
|
+
continue(inputs)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "pipes one step result to the next step" do
|
50
|
+
result = GiantStepsDSL.run(:number => 10)
|
51
|
+
expect(result).to be_a_success
|
52
|
+
expect(result.value[:number]).to eq(40)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "can run multiple times" do
|
56
|
+
result = GiantStepsDSL.run(:number => 10)
|
57
|
+
result = GiantStepsDSL.run(:number => 10)
|
58
|
+
expect(result).to be_a_success
|
59
|
+
expect(result.value[:number]).to eq(40)
|
60
|
+
end
|
61
|
+
|
62
|
+
class SubStep < SolidUseCase::Base
|
63
|
+
steps GiantStepsDSL, :last_step
|
64
|
+
|
65
|
+
def last_step(inputs)
|
66
|
+
inputs[:number] += 1
|
67
|
+
continue(inputs[:number])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it "pipes one step result to the next step" do
|
72
|
+
result = SubStep.run(:number => 10)
|
73
|
+
expect(result).to be_a_success
|
74
|
+
expect(result.value).to eq(41)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
33
79
|
describe 'Failure Matching' do
|
34
|
-
class FailureMatch < SolidUseCase::
|
80
|
+
class FailureMatch < SolidUseCase::Base
|
35
81
|
def run(inputs)
|
36
82
|
attempt_all do
|
37
83
|
step { fail_it(inputs) }
|
data/spec/rspec_matchers_spec.rb
CHANGED
@@ -3,19 +3,19 @@ require 'spec_helper'
|
|
3
3
|
describe 'Custom RSpec Matchers' do
|
4
4
|
include SolidUseCase::RSpecMatchers
|
5
5
|
|
6
|
-
class FailCase < SolidUseCase::
|
6
|
+
class FailCase < SolidUseCase::Base
|
7
7
|
def run(error)
|
8
8
|
fail(error)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
class SuccessCase < SolidUseCase::
|
12
|
+
class SuccessCase < SolidUseCase::Base
|
13
13
|
def run(val)
|
14
|
-
|
14
|
+
continue(val)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
class ExceptionCase < SolidUseCase::
|
18
|
+
class ExceptionCase < SolidUseCase::Base
|
19
19
|
def run(val)
|
20
20
|
attempt_all do
|
21
21
|
try { raise_exception }
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solid_use_case
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gilbert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deterministic
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.6.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.6.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.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
40
|
version: '1.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
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
54
|
version: '0'
|
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
61
|
version: 2.14.1
|
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
68
|
version: 2.14.1
|
69
69
|
description: Create use cases the way they were meant to be. Easily verify inputs
|
@@ -74,20 +74,20 @@ executables: []
|
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
|
-
-
|
78
|
-
-
|
77
|
+
- .gitignore
|
78
|
+
- .rspec
|
79
79
|
- Gemfile
|
80
80
|
- LICENSE.txt
|
81
81
|
- README.md
|
82
82
|
- Rakefile
|
83
83
|
- lib/solid_use_case.rb
|
84
|
-
- lib/solid_use_case/
|
85
|
-
- lib/solid_use_case/
|
86
|
-
- lib/solid_use_case/
|
84
|
+
- lib/solid_use_case/base.rb
|
85
|
+
- lib/solid_use_case/base/error_struct.rb
|
86
|
+
- lib/solid_use_case/base/util.rb
|
87
87
|
- lib/solid_use_case/rspec_matchers.rb
|
88
88
|
- lib/solid_use_case/version.rb
|
89
89
|
- solid_use_case.gemspec
|
90
|
-
- spec/
|
90
|
+
- spec/base_spec.rb
|
91
91
|
- spec/rspec_matchers_spec.rb
|
92
92
|
- spec/spec_helper.rb
|
93
93
|
homepage: https://github.com/mindeavor/solid_use_case
|
@@ -100,12 +100,12 @@ require_paths:
|
|
100
100
|
- lib
|
101
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
|
-
- -
|
103
|
+
- - ~>
|
104
104
|
- !ruby/object:Gem::Version
|
105
105
|
version: '2.0'
|
106
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
requirements: []
|
@@ -115,6 +115,7 @@ signing_key:
|
|
115
115
|
specification_version: 4
|
116
116
|
summary: A flexible UseCase pattern that works *with* your workflow, not against it.
|
117
117
|
test_files:
|
118
|
-
- spec/
|
118
|
+
- spec/base_spec.rb
|
119
119
|
- spec/rspec_matchers_spec.rb
|
120
120
|
- spec/spec_helper.rb
|
121
|
+
has_rdoc:
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module SolidUseCase
|
2
|
-
class Command
|
3
|
-
include Deterministic::CoreExt::Either
|
4
|
-
include CommandUtil
|
5
|
-
|
6
|
-
def self.run(input_hash={})
|
7
|
-
self.new.run(input_hash)
|
8
|
-
end
|
9
|
-
|
10
|
-
# # # # # #
|
11
|
-
# Helpers #
|
12
|
-
# # # # # #
|
13
|
-
|
14
|
-
def fail(type, data={})
|
15
|
-
data[:type] = type
|
16
|
-
Failure(ErrorStruct.new(data))
|
17
|
-
end
|
18
|
-
|
19
|
-
alias :next_step :Success
|
20
|
-
alias :succeed :Success
|
21
|
-
end
|
22
|
-
end
|