use_case 0.4.0 → 0.5.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.
data/Readme.md CHANGED
@@ -170,7 +170,7 @@ This is the high-level overview of how `UseCase` strings up a pipeline
170
170
  for you to plug in various kinds of business logic:
171
171
 
172
172
  ```
173
- User input (-> input sanitation) (-> pre-conditions) (-> builder) (-> validations) -> command
173
+ User input (-> input sanitation) (-> pre-conditions) (-> builder) (-> validations) -> command (-> command...)
174
174
  ```
175
175
 
176
176
  * Start with a hash of user input
@@ -179,7 +179,7 @@ User input (-> input sanitation) (-> pre-conditions) (-> builder) (-> validation
179
179
  * Optionally run pre-conditions on the santized input
180
180
  * Optionally refine input by running it through a pre-execution "builder"
181
181
  * Optionally (refined) input through one or more validators
182
- * Execute command with (refined) input
182
+ * Execute command(s) with (refined) input
183
183
 
184
184
  ## Input sanitation
185
185
 
@@ -221,11 +221,11 @@ dependency. To use this feature, `gem install activemodel`.
221
221
 
222
222
  When user input has passed input sanitation and pre-conditions have
223
223
  been satisfied, you can optionally pipe input through a "builder"
224
- before handing it over to validations and the command.
224
+ before handing it over to validations and the commands.
225
225
 
226
226
  The builder should be an object with a `build` method. The method will
227
227
  be called with santized input. The return value from `build` will be
228
- passed on to validators and the command.
228
+ passed on to validators and the commands.
229
229
 
230
230
  Builders can be useful if you want to run validations on a domain
231
231
  object rather than directly on "dumb" input.
@@ -307,7 +307,12 @@ better name is welcome.
307
307
  A command is any Ruby object that defines an `execute(params)` method. Its
308
308
  return value will be passed to the outcome's `success` block. Any errors raised
309
309
  by this method is not rescued, so be sure to wrap `use_case.execute(params)` in
310
- a rescue block if you're worried that it raises.
310
+ a rescue block if you're worried that it raises. Better yet, detect known causes
311
+ of exceptions in a pre-condition so you know that the command does not raise.
312
+
313
+ A use case can execute multiple commands. When you do, the result of the first
314
+ command will be the input to the second command and so on. The result of the
315
+ last command will be the final `outcome.result`.
311
316
 
312
317
  ## Use cases
313
318
 
@@ -40,7 +40,8 @@ module UseCase
40
40
  end
41
41
 
42
42
  def command(command)
43
- @command = command
43
+ @commands ||= []
44
+ @commands << command
44
45
  end
45
46
 
46
47
  def builder(builder)
@@ -64,7 +65,8 @@ module UseCase
64
65
  return outcome
65
66
  end
66
67
 
67
- SuccessfulOutcome.new(self, @command.execute(input))
68
+ result = @commands.inject(input) { |input, command| command.execute(input) }
69
+ SuccessfulOutcome.new(self, result)
68
70
  end
69
71
 
70
72
  private
@@ -24,5 +24,5 @@
24
24
  #++
25
25
 
26
26
  module UseCase
27
- VERSION = "0.4.0"
27
+ VERSION = "0.5.0"
28
28
  end
@@ -26,7 +26,7 @@ require "virtus"
26
26
  require "use_case"
27
27
 
28
28
  class Model
29
- attr_reader :id, :name
29
+ attr_accessor :id, :name
30
30
 
31
31
  def initialize(id, name)
32
32
  @id = id
@@ -123,3 +123,19 @@ class CreateRepositoryWithExplodingBuilder
123
123
 
124
124
  def build; raise "Oops"; end
125
125
  end
126
+
127
+ class PimpRepositoryCommand
128
+ def execute(repository); repository.name += " (Pimped)"; repository end
129
+ end
130
+
131
+ class CreatePimpedRepository
132
+ include UseCase
133
+
134
+ def initialize(user)
135
+ input_class(NewRepositoryInput)
136
+ command(CreateRepositoryCommand.new(user))
137
+ command(PimpRepositoryCommand.new)
138
+ end
139
+
140
+ def build; raise "Oops"; end
141
+ end
@@ -113,4 +113,11 @@ describe UseCase do
113
113
 
114
114
  assert outcome.pre_condition_failed?
115
115
  end
116
+
117
+ it "chains two commands" do
118
+ outcome = CreatePimpedRepository.new(@logged_in_user).execute({ :name => "Mr" })
119
+
120
+ assert_equal 1349, outcome.result.id
121
+ assert_equal "Mr (Pimped)", outcome.result.name
122
+ end
116
123
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: use_case
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-03 00:00:00.000000000 Z
12
+ date: 2013-04-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest