slayer 0.2.1 → 0.3.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: 7e09fbfa409b97335f8476da1445d716025e0230
4
- data.tar.gz: 8c3964b9a74d94d510681dde108d0acad83a8efb
3
+ metadata.gz: 324ed5c2712dfb7b91ab54d26035264be046c975
4
+ data.tar.gz: 9cbef2f5c7393d18d8323a19a12d94972e417806
5
5
  SHA512:
6
- metadata.gz: 908f87de03974d652fb42acb9a9765b02872890cdb429f40d89eb578e9e0caff4655730e94f8c9b8f4e0805a93785bd3c367ca449ea15c622d467912b22e9b46
7
- data.tar.gz: 6cbf9533c1e47a292446194a8b26163269258709abe89cb2a4777d2a7ccc6c72720ae6f594adab3959caecd1c7b07140b88acb0c4cf7ca65f3bcaa4d21795aaa
6
+ metadata.gz: 50c3825dce992223f71114a6f0db3aac21534e5d24332422549f687470a07acaf45e0750303e1cf66a4ee716c1e84c457a092bc7aa5ee68cdf6624abc409a20a
7
+ data.tar.gz: b86843b30033d24661fcb01a4572a3d8f16054b59ff1bcd1e422c5bed386f53d0f166a39ec6b532abf46c5331227899f4440220f03cd2bc6bc371912ec070d82
@@ -1,7 +1,7 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.3
4
+ TargetRubyVersion: 2.1
5
5
  Include:
6
6
  - 'lib/**/*.rb'
7
7
  - 'test/**/*.rb'
data/README.md CHANGED
@@ -44,11 +44,88 @@ Or install it yourself as:
44
44
  $ gem install slayer
45
45
  ```
46
46
 
47
+ ## Rails Integration
48
+
49
+ While Slayer is independent of any framework, we do offer a first-class integration with Ruby on Rails. To install the Rails extensions, add this line to your application's Gemfile:
50
+
51
+ ```ruby
52
+ gem 'slayer_rails'
53
+ ```
54
+
55
+ And then execute:
56
+
57
+ ```sh
58
+ $ bundle
59
+ ```
60
+
61
+ And that's it. The integration provides a small handful of features that make your life easier when working with Ruby on Rails.
62
+
63
+ ### Form Validations
64
+
65
+ With `slayer_rails`, `Slayer::Form` objects are automatically extended with `ActiveRecord` validations. You can use the same validations you would on your `ActiveRecord` models, but directly on your forms.
66
+
67
+ ### Form Creation
68
+
69
+ With `slayer_rails` there are two new methods for instantiating `Slayer::Form` objects: `from_params` and `from_model`. These make it easier to populate forms with data while in your Rails controllers.
70
+
71
+ Take the following example for a `FooController`:
72
+
73
+ ```ruby
74
+ class FooController < ApplicationController
75
+ def new
76
+ @foo_form = FooForm.new
77
+ end
78
+
79
+ def edit
80
+ @foo = Foo.find(params[:id])
81
+ @foo_form = FooForm.from_model(@foo)
82
+ end
83
+
84
+ def create
85
+ @foo_form = FooForm.from_params(foo_params)
86
+ end
87
+
88
+ def update
89
+ @foo_form = FooForm.from_params(foo_params)
90
+ end
91
+
92
+ private
93
+
94
+ def foo_params
95
+ params.require(:foo).permit(:bar, :baz)
96
+ end
97
+ end
98
+ ```
99
+
100
+ ### Transactions
101
+
102
+ `Slayer::Command` and `Slayer::Service` objects are extended with access to `ActiveRecord` transactions. Anywhere in your `Command` or `Service` objects, you can execute a `transaction` block, which will let you bundle database interactions.
103
+
104
+ ```ruby
105
+ class FooCommand < Slayer::Command
106
+ def call
107
+ transaction do
108
+ # => database interactions
109
+ end
110
+ end
111
+ end
112
+ ```
113
+
114
+ ### Generators
115
+
116
+ Use generators to make sure your `Slayer` objects are always in the right place. `slayer_rails` includes generators for `Slayer::Form`, `Slayer::Command`, and `Slayer::Service` objects.
117
+
118
+ ```sh
119
+ $ bin/rails g slayer:form foo_form
120
+ $ bin/rails g slayer:command foo_command
121
+ $ bin/rails g slayer:service foo_service
122
+ ```
123
+
47
124
  ## Usage
48
125
 
49
126
  ### Commands
50
127
 
51
- Slayer Commands should implement `call`, which will `pass` or `fail` the service based on input. Commands return a `Slayer::Result` which has a predictable interface for determining `success?` or `failure?`, a `message`, and a `result` payload object.
128
+ Slayer Commands should implement `call`, which will `pass` or `fail` the service based on input. Commands return a `Slayer::Result` which has a predictable interface for determining `success?` or `failure?`, a 'value' payload object, a 'status' value, and a user presentable `message`.
52
129
 
53
130
  ```ruby
54
131
  # A Command that passes when given the string "foo"
@@ -56,9 +133,9 @@ Slayer Commands should implement `call`, which will `pass` or `fail` the service
56
133
  class FooCommand < Slayer::Command
57
134
  def call(foo:)
58
135
  if foo == "foo"
59
- pass! result: foo, message: "Passing FooCommand"
136
+ pass! value: foo, message: "Passing FooCommand"
60
137
  else
61
- fail! result: foo, message: "Failing FooCommand"
138
+ fail! value: foo, message: "Failing FooCommand"
62
139
  end
63
140
  end
64
141
  end
@@ -56,14 +56,15 @@ module Slayer
56
56
  end
57
57
 
58
58
  # Fail the Command
59
- def fail!(result:, status: :default, message: nil)
60
- @result = Result.new(result, status, message)
59
+
60
+ def fail!(value: nil, status: :default, message: nil)
61
+ @result = Result.new(value, status, message)
61
62
  @result.fail!
62
63
  end
63
64
 
64
65
  # Pass the Command
65
- def pass!(result:, status: :default, message: nil)
66
- @result = Result.new(result, status, message)
66
+ def pass!(value: nil, status: :default, message: nil)
67
+ @result = Result.new(value, status, message)
67
68
  end
68
69
 
69
70
  # Call the command
@@ -195,23 +195,26 @@ module Slayer
195
195
  # @api private
196
196
  def execute_matching_block
197
197
  if @matching_block != false # nil should pass this test
198
- @matching_block&.call(@result, @command) # explicit nil will not get called with
199
- # safe navigation (&.)
198
+ run_block(@matching_block)
200
199
  elsif @matching_all != false
201
- @matching_all&.call(@result, @command)
200
+ run_block(@matching_all)
202
201
  elsif @default_block != false
203
- @default_block&.call(@result, @command)
202
+ run_block(@default_block)
204
203
  elsif @default_all
205
- @default_all&.call(@result, @command)
204
+ run_block(@default_all)
206
205
  end
207
206
  end
208
207
 
208
+ # Executes the ensure block if one exists.
209
+ # @api private
209
210
  def execute_ensure_block
210
- # rubocop:disable Style/IfUnlessModifier
211
- if @ensure_block != false # nil should pass this test
212
- @ensure_block.call(@result, @command)
213
- end
214
- # rubocop:enable Style/IfUnlessModifier
211
+ run_block(@ensure_block) if @ensure_block != false # nil should pass this test
215
212
  end
213
+
214
+ private
215
+
216
+ def run_block(block)
217
+ block.call(@result.value, @result, @command) if block # explicit nil should fail this test
218
+ end
216
219
  end
217
220
  end
@@ -1,3 +1,3 @@
1
1
  module Slayer
2
- VERSION = '0.2.1'
2
+ VERSION = '0.3.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wyatt Kirby
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-02-14 00:00:00.000000000 Z
12
+ date: 2017-02-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: virtus