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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc73aaa654b2bb9094f89bdc59eadb2c6e6850ad
4
- data.tar.gz: daf146af027dca257b571f6ee43487a1a30343cd
3
+ metadata.gz: 4e7056ae1ef3157772218479526874fa94e710f7
4
+ data.tar.gz: fd9a2327b8919bfd623d72e7fbe66ec6e0ced364
5
5
  SHA512:
6
- metadata.gz: a18e3f021309842f666d8c8ee25d95468aa68c23d8c8d0bae297dbbe0a0868a125f23c436c7207ad3536b4aa1bfe645b51fa50069d246628f9eaa4e1f9b74fde
7
- data.tar.gz: cfca654335a96807e4e95351981643a6e0a1dff902a604fadda53905b85da1c52a3e955981700a11344400499d6d25524f1eb34b688fce5d299c23481cc48d35
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.2'
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::Command
29
- def run(params)
30
- attempt_all do
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
- Success(params)
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
- Success(params)
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
- Success(params[:user])
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
- render_new(error_data, "Oops, fix your mistakes and try again")
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
- render_new(error_data, "Sorry, something went wrong on our side.")
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] = "Something went terribly wrong"
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 render_new(user, error_message)
87
+ def render_form_errors(user, error_message)
92
88
  @user = user
93
89
  @error_message = error_message
94
90
  render 'new'
@@ -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/command/util.rb'
6
- require 'solid_use_case/command/error_struct.rb'
7
- require 'solid_use_case/command.rb'
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
@@ -1,5 +1,5 @@
1
1
  module SolidUseCase
2
- module CommandUtil
2
+ module BaseUtil
3
3
 
4
4
  def symbolize_names(object)
5
5
  case object
@@ -1,3 +1,3 @@
1
1
  module SolidUseCase
2
- VERSION = "1.0.2"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -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.2.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::Command do
3
+ describe SolidUseCase::Base do
4
4
 
5
5
  describe 'Stepping' do
6
- class GiantSteps < SolidUseCase::Command
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
- next_step(inputs)
16
+ continue(inputs)
17
17
  end
18
18
 
19
19
  def step_2(inputs)
20
20
  inputs[:number] *= 2
21
- succeed(inputs)
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::Command
80
+ class FailureMatch < SolidUseCase::Base
35
81
  def run(inputs)
36
82
  attempt_all do
37
83
  step { fail_it(inputs) }
@@ -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::Command
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::Command
12
+ class SuccessCase < SolidUseCase::Base
13
13
  def run(val)
14
- succeed(val)
14
+ continue(val)
15
15
  end
16
16
  end
17
17
 
18
- class ExceptionCase < SolidUseCase::Command
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.2
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-04-16 00:00:00.000000000 Z
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.2.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.2.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
- - ".gitignore"
78
- - ".rspec"
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/command.rb
85
- - lib/solid_use_case/command/error_struct.rb
86
- - lib/solid_use_case/command/util.rb
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/command_spec.rb
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/command_spec.rb
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