solid_use_case 1.1.0 → 2.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.
- checksums.yaml +4 -4
- data/README.md +43 -3
- data/lib/solid_use_case/composable/class_methods.rb +20 -0
- data/lib/solid_use_case/composable/error_struct.rb +9 -0
- data/lib/solid_use_case/{base → composable}/util.rb +1 -1
- data/lib/solid_use_case/{base.rb → composable.rb} +5 -11
- data/lib/solid_use_case/rspec_matchers.rb +1 -1
- data/lib/solid_use_case/version.rb +1 -1
- data/lib/solid_use_case.rb +4 -3
- data/spec/{base_spec.rb → composable_spec.rb} +12 -6
- data/spec/rspec_matchers_spec.rb +6 -3
- metadata +8 -7
- data/lib/solid_use_case/base/error_struct.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc18c2e9f16bf546cfc9d56f5337456213bbbe51
|
4
|
+
data.tar.gz: 1e7c6aa6fd01fdd35095d2fc0d3e066b28237361
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41793a7fef1201f2ab179b85f7d55b8e91df49ef9fcd180c4fc6b11fe1fff29e0dd2aa01910903653dce8b0ff607f11adc5e316aa8631184096fc88ff462a562
|
7
|
+
data.tar.gz: a4e35588c5d5def51e02dabb961b45ffb0dfe6450e19efdc11c7a24f793b47811a9dd203095f23aa280a5653248b3ffb5ef248d7c367931f7e358dbf104887a8
|
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', '~>
|
9
|
+
gem 'solid_use_case', '~> 2.0.0'
|
10
10
|
|
11
11
|
And then execute:
|
12
12
|
|
@@ -20,12 +20,13 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
At its core, this library is a light wrapper around [Deterministic](https://github.com/pzol/deterministic), a practical abstraction over the Either monad. Don't let that scare you - you don't have to understand monad theory to reap its benefits.
|
22
22
|
|
23
|
-
The only required
|
23
|
+
The only thing required is using the `#steps` method:
|
24
24
|
|
25
25
|
### Rails Example
|
26
26
|
|
27
27
|
```ruby
|
28
|
-
class UserSignup
|
28
|
+
class UserSignup
|
29
|
+
include SolidUseCase::Composable
|
29
30
|
|
30
31
|
steps :validate, :save_user, :email_user
|
31
32
|
|
@@ -92,6 +93,45 @@ class UsersController < ApplicationController
|
|
92
93
|
end
|
93
94
|
```
|
94
95
|
|
96
|
+
## RSpec Matchers
|
97
|
+
|
98
|
+
If you're using RSpec, Solid Use Case provides some helpful matchers for testing.
|
99
|
+
|
100
|
+
First you mix them them into RSpec:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# In your spec_helper.rb
|
104
|
+
require 'solid_use_case'
|
105
|
+
require 'solid_use_case/rspec_matchers'
|
106
|
+
|
107
|
+
RSpec.configure do |config|
|
108
|
+
config.include(SolidUseCase::RSpecMatchers)
|
109
|
+
end
|
110
|
+
```
|
111
|
+
|
112
|
+
And then you can use the matchers, with helpful error messages:
|
113
|
+
|
114
|
+
```ruby
|
115
|
+
describe MyApp::SignUp do
|
116
|
+
it "runs successfully" do
|
117
|
+
result = MyApp::SignUp.run(:username => 'alice', :password => '123123')
|
118
|
+
expect(result).to be_a_success
|
119
|
+
end
|
120
|
+
|
121
|
+
it "fails when password is too short" do
|
122
|
+
result = MyApp::SignUp.run(:username => 'alice', :password => '5')
|
123
|
+
expect(result).to fail_with(:invalid_password)
|
124
|
+
|
125
|
+
# The above `fail_with` line is equivalent to:
|
126
|
+
# expect(result.value).to be_a SolidUseCase::Composable::ErrorStruct
|
127
|
+
# expect(result.value.type).to eq :invalid_password
|
128
|
+
|
129
|
+
# You still have access to your arbitrary error data
|
130
|
+
expect(result.value.something).to eq 'whatever'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
```
|
134
|
+
|
95
135
|
## Testing
|
96
136
|
|
97
137
|
$ bundle exec rspec
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SolidUseCase
|
2
|
+
module Composable
|
3
|
+
module ClassMethods
|
4
|
+
|
5
|
+
def run(input_hash={})
|
6
|
+
self.new.run(input_hash)
|
7
|
+
end
|
8
|
+
|
9
|
+
def steps(*args)
|
10
|
+
@__steps ||= []
|
11
|
+
@__steps += args
|
12
|
+
end
|
13
|
+
|
14
|
+
def composable?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,15 +1,9 @@
|
|
1
1
|
module SolidUseCase
|
2
|
-
|
3
|
-
include Deterministic::CoreExt::Either
|
4
|
-
include BaseUtil
|
2
|
+
module Composable
|
5
3
|
|
6
|
-
def self.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def self.steps(*args)
|
11
|
-
@__steps ||= []
|
12
|
-
@__steps += args
|
4
|
+
def self.included(includer)
|
5
|
+
includer.send :include, Deterministic::CoreExt::Either
|
6
|
+
includer.extend ClassMethods
|
13
7
|
end
|
14
8
|
|
15
9
|
def run(inputs)
|
@@ -20,7 +14,7 @@ module SolidUseCase
|
|
20
14
|
while steps.count > 0
|
21
15
|
next_step = steps.shift
|
22
16
|
|
23
|
-
if next_step.is_a?(Class) && (next_step
|
17
|
+
if next_step.is_a?(Class) && (next_step.respond_to? :composable?) && next_step.composable?
|
24
18
|
subresult = next_step.run(result.value)
|
25
19
|
elsif next_step.is_a?(Symbol)
|
26
20
|
subresult = self.send(next_step, result.value)
|
@@ -17,7 +17,7 @@ module SolidUseCase
|
|
17
17
|
|
18
18
|
def failure_message_for_should
|
19
19
|
"expected result to be a success\n" +
|
20
|
-
if @result.value.is_a? SolidUseCase::ErrorStruct
|
20
|
+
if @result.value.is_a? SolidUseCase::Composable::ErrorStruct
|
21
21
|
"Error & Data:\n #{@result.value.type} - #{@result.value.inspect}"
|
22
22
|
elsif @result.value.is_a? Exception
|
23
23
|
backtrace = @result.value.backtrace.reject do |file|
|
data/lib/solid_use_case.rb
CHANGED
@@ -2,9 +2,10 @@ 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/composable/class_methods.rb'
|
6
|
+
require 'solid_use_case/composable/error_struct.rb'
|
7
|
+
require 'solid_use_case/composable/util.rb'
|
8
|
+
require 'solid_use_case/composable.rb'
|
8
9
|
|
9
10
|
module SolidUseCase
|
10
11
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe SolidUseCase::
|
3
|
+
describe SolidUseCase::Composable do
|
4
4
|
|
5
5
|
describe 'Stepping' do
|
6
|
-
class GiantSteps
|
6
|
+
class GiantSteps
|
7
|
+
include SolidUseCase::Composable
|
8
|
+
|
7
9
|
def run(inputs)
|
8
10
|
attempt_all do
|
9
11
|
step { step_1(inputs) }
|
@@ -31,7 +33,8 @@ describe SolidUseCase::Base do
|
|
31
33
|
|
32
34
|
|
33
35
|
describe 'Stepping DSL' do
|
34
|
-
class GiantStepsDSL
|
36
|
+
class GiantStepsDSL
|
37
|
+
include SolidUseCase::Composable
|
35
38
|
|
36
39
|
steps :step_1, :step_2
|
37
40
|
|
@@ -59,7 +62,8 @@ describe SolidUseCase::Base do
|
|
59
62
|
expect(result.value[:number]).to eq(40)
|
60
63
|
end
|
61
64
|
|
62
|
-
class SubStep
|
65
|
+
class SubStep
|
66
|
+
include SolidUseCase::Composable
|
63
67
|
steps GiantStepsDSL, :last_step
|
64
68
|
|
65
69
|
def last_step(inputs)
|
@@ -77,7 +81,9 @@ describe SolidUseCase::Base do
|
|
77
81
|
|
78
82
|
|
79
83
|
describe 'Failure Matching' do
|
80
|
-
class FailureMatch
|
84
|
+
class FailureMatch
|
85
|
+
include SolidUseCase::Composable
|
86
|
+
|
81
87
|
def run(inputs)
|
82
88
|
attempt_all do
|
83
89
|
step { fail_it(inputs) }
|
@@ -95,7 +101,7 @@ describe SolidUseCase::Base do
|
|
95
101
|
# Custom RSpec matcher
|
96
102
|
expect(result).to_not be_a_success
|
97
103
|
|
98
|
-
expect(result.value).to be_a SolidUseCase::ErrorStruct
|
104
|
+
expect(result.value).to be_a SolidUseCase::Composable::ErrorStruct
|
99
105
|
expect(result.value.type).to eq :abc
|
100
106
|
|
101
107
|
matched = false
|
data/spec/rspec_matchers_spec.rb
CHANGED
@@ -3,19 +3,22 @@ require 'spec_helper'
|
|
3
3
|
describe 'Custom RSpec Matchers' do
|
4
4
|
include SolidUseCase::RSpecMatchers
|
5
5
|
|
6
|
-
class FailCase
|
6
|
+
class FailCase
|
7
|
+
include SolidUseCase::Composable
|
7
8
|
def run(error)
|
8
9
|
fail(error)
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
|
-
class SuccessCase
|
13
|
+
class SuccessCase
|
14
|
+
include SolidUseCase::Composable
|
13
15
|
def run(val)
|
14
16
|
continue(val)
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
class ExceptionCase
|
20
|
+
class ExceptionCase
|
21
|
+
include SolidUseCase::Composable
|
19
22
|
def run(val)
|
20
23
|
attempt_all do
|
21
24
|
try { raise_exception }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solid_use_case
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.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-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deterministic
|
@@ -81,13 +81,14 @@ files:
|
|
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/composable.rb
|
85
|
+
- lib/solid_use_case/composable/class_methods.rb
|
86
|
+
- lib/solid_use_case/composable/error_struct.rb
|
87
|
+
- lib/solid_use_case/composable/util.rb
|
87
88
|
- lib/solid_use_case/rspec_matchers.rb
|
88
89
|
- lib/solid_use_case/version.rb
|
89
90
|
- solid_use_case.gemspec
|
90
|
-
- spec/
|
91
|
+
- spec/composable_spec.rb
|
91
92
|
- spec/rspec_matchers_spec.rb
|
92
93
|
- spec/spec_helper.rb
|
93
94
|
homepage: https://github.com/mindeavor/solid_use_case
|
@@ -115,7 +116,7 @@ signing_key:
|
|
115
116
|
specification_version: 4
|
116
117
|
summary: A flexible UseCase pattern that works *with* your workflow, not against it.
|
117
118
|
test_files:
|
118
|
-
- spec/
|
119
|
+
- spec/composable_spec.rb
|
119
120
|
- spec/rspec_matchers_spec.rb
|
120
121
|
- spec/spec_helper.rb
|
121
122
|
has_rdoc:
|