slayer 0.5.0.beta → 0.5.2

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
  SHA256:
3
- metadata.gz: bc095dc4fad61e836560eb30851324c846f8a5a1b3fd51bdc48d692ab576d8a3
4
- data.tar.gz: 9a77c6b602b544462311a897bb53685434a51dde783602274fce9d83096f3644
3
+ metadata.gz: 8afcb532ebe21d444e89baf763a76b20cf4ab19ad1bf51d45bfbd29042f3ec16
4
+ data.tar.gz: 5f77a3a44acf2cd3a2888f38e67963b22866c5c81a44a628be1c28128d128812
5
5
  SHA512:
6
- metadata.gz: 3a95c4d4b95bffc5d4f129e07fae690fcccd3543c6f7f745471aeaa8093bbfd9e5b377ffc931d52c0bb0f4f3048330f7b9421233246f633dde19de52526a6851
7
- data.tar.gz: 2de8ba806e4210a197ec87323f8a48777f6e024e9546170cee4ce15a651cfad2dc62134f3e4021003fde1ef378e57771778d98eec49a9747110955c675956926
6
+ metadata.gz: f383e130f4d8bef5d42f9de29db7890f585c8116f3f6ea093cb83fc3c8b29b608ee82b16e881130527adedaf36761e216985d8b13208abac93bfef74739d53c7
7
+ data.tar.gz: 2b96b3b9473ad470033138e8f201a6fc5cdc893c2724fa4e0de1a0c7e820af93256d91569fe67f2a36dc66191f0956cf5ba45c11394e6d7778d015ee2633e7cb
@@ -4,7 +4,6 @@ name: Release
4
4
 
5
5
  on:
6
6
  workflow_dispatch:
7
- pull_request:
8
7
 
9
8
  jobs:
10
9
  release:
@@ -2,7 +2,7 @@ name: Test & Lint
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [master]
5
+ branches: [main]
6
6
  pull_request:
7
7
 
8
8
  jobs:
data/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  Slayer is intended to operate as a minimal service layer for your ruby application. To achieve this, Slayer provides base classes for business logic.
8
8
 
9
+ **Slayer is still under development, and not yet ready for production use. We are targetting a stable API with the 0.4.0 launch, so expect breaking changes until then.**
10
+
9
11
  ## Application Structure
10
12
 
11
13
  Slayer provides 2 base classes for organizing your business logic: `Forms` and `Commands`. These each have a distinct role in your application's structure.
@@ -259,6 +261,39 @@ RSpec.describe RSpecCommand do
259
261
  end
260
262
  ```
261
263
 
264
+ #### Stubbing Command Results
265
+
266
+ The RSpec helpers provide two utility functions for use in your tests which should simplify testing commands with stubbed results. This can be useful when you want
267
+ test a Rails controller, and your command is already tested separately. In this case, you only really care about the logic in your matching blocks --- not in the command itself.
268
+
269
+ Put another way: this is useful when you want to test the success or failure conditions of your commands.
270
+
271
+ ```ruby
272
+ RSpec.describe FooController, type: :controller do do
273
+ context 'successful command' do
274
+ let(:foo) { create(:foo) }
275
+ let(:fake_res) { fake_result(ok: true, message: 'foo updated') }
276
+
277
+ describe '#update' do
278
+ # Foo will not be called, instead we will get back the stubbed response
279
+ # from the let block above, allowing us to bypass the command logic and
280
+ # test only the controller logic
281
+ stub_command_response(UpdateFooCommand, fake_res)
282
+ post :update, params: { id: foo.id }
283
+ expect(response).to have_http_status :ok
284
+ end
285
+ end
286
+ end
287
+
288
+ ```
289
+
290
+ This method --- `stub_command_response` --- can take the return value as either a second argument, or as a block:
291
+
292
+ ```ruby
293
+ stub_command_response(UpdateFooCommand, fake_res) # => fake result as an argument
294
+ stub_command_response(UpdateFooCommand) { fake_res } # => fake result as a block
295
+ ```
296
+
262
297
  ### Minitest
263
298
 
264
299
  To use with Minitest, update your 'test_helper' file to include:
@@ -366,6 +401,24 @@ $ bin/rails g slayer:form foo_form
366
401
  $ bin/rails g slayer:command foo_command
367
402
  ```
368
403
 
404
+ ## Compatability
405
+
406
+ Backwards compatability with previous versions requires additional includes.
407
+
408
+ ```ruby
409
+ require 'slayer/compat/compat_040'
410
+ ```
411
+
412
+ If you use test matchers, you will have to separately require the compatability layer for your test runner:
413
+
414
+ ```ruby
415
+ require 'slayer/compat/minitest_compat_040'
416
+
417
+ # OR
418
+
419
+ require 'slayer/compat/rspec_compat_040'
420
+ ```
421
+
369
422
  ## Development
370
423
 
371
424
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -389,3 +442,11 @@ Any PRs should be accompanied with documentation in `README.md`, and changes doc
389
442
  ## License
390
443
 
391
444
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
445
+
446
+ ---
447
+
448
+ # Built by Apsis
449
+
450
+ [![apsis](https://s3-us-west-2.amazonaws.com/apsiscdn/apsis.png)](https://www.apsis.io)
451
+
452
+ `slayer` was built by Apsis Labs. We love sharing what we build! Check out our [other libraries on Github](https://github.com/apsislabs), and if you like our work you can [hire us](https://www.apsis.io/work-with-us/) to build your vision.
@@ -4,15 +4,11 @@ module Slayer
4
4
  def call(*args, &block)
5
5
  instance = self.new
6
6
 
7
- begin
8
- res = instance.call(*args, &block)
9
- rescue ResultFailureError => e
10
- res = e.result
11
- end
7
+ res = __get_result(instance, *args, &block)
8
+ handle_match(res, instance, block) if block_given?
12
9
 
13
10
  raise CommandNotImplementedError unless res.is_a? Result
14
11
 
15
- handle_match(res, instance, block) if block_given?
16
12
  return res
17
13
  end
18
14
  ruby2_keywords :call if respond_to?(:ruby2_keywords, true)
@@ -30,6 +26,18 @@ module Slayer
30
26
  raise ResultFailureError, err(value: value, status: status, message: message)
31
27
  end
32
28
 
29
+ def __get_result(instance, *args, &block)
30
+ res = nil
31
+
32
+ begin
33
+ res = instance.call(*args, &block)
34
+ rescue ResultFailureError => e
35
+ res = e.result
36
+ end
37
+
38
+ res
39
+ end
40
+
33
41
  private
34
42
 
35
43
  def handle_match(res, instance, block)
@@ -1,6 +1,4 @@
1
1
  # :nocov:
2
- require 'minitest/assertions'
3
- require 'rspec/expectations'
4
2
 
5
3
  module Slayer
6
4
  class Command
@@ -51,14 +49,4 @@ module Slayer
51
49
  end
52
50
  end
53
51
 
54
- module Minitest::Assertions
55
- alias assert_success assert_ok
56
- alias refute_failed assert_ok
57
- alias assert_failed refute_ok
58
- alias refute_success refute_ok
59
- end
60
-
61
- RSpec::Matchers.alias_matcher :be_failed_result, :be_err_result
62
- RSpec::Matchers.alias_matcher :be_success_result, :be_ok_result
63
-
64
52
  # :nocov:
@@ -0,0 +1,12 @@
1
+ # :nocov:
2
+
3
+ require 'minitest/assertions'
4
+
5
+ module Minitest::Assertions
6
+ alias assert_success assert_ok
7
+ alias refute_failed assert_ok
8
+ alias assert_failed refute_ok
9
+ alias refute_success refute_ok
10
+ end
11
+
12
+ # :nocov:
@@ -0,0 +1,8 @@
1
+ # :nocov:
2
+
3
+ require 'rspec/expectations'
4
+
5
+ RSpec::Matchers.alias_matcher :be_failed_result, :be_err_result
6
+ RSpec::Matchers.alias_matcher :be_success_result, :be_ok_result
7
+
8
+ # :nocov:
data/lib/slayer/rspec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'rspec/mocks'
1
2
  require 'rspec/expectations'
2
3
 
3
4
  # rubocop:disable Metrics/BlockLength
@@ -92,3 +93,25 @@ RSpec::Matchers.define :be_err_result do
92
93
  end
93
94
 
94
95
  # rubocop:enable Metrics/BlockLength
96
+
97
+ module Slayer
98
+ module RspecHelpers
99
+ def stub_command_response(klass, res = nil, &block)
100
+ res = block.call if block_given? && res.nil?
101
+
102
+ expect(klass).to receive(:__get_result).and_return(res)
103
+ end
104
+
105
+ # rubocop:disable Naming/MethodParameterName
106
+ def fake_result(ok: true, value: nil, message: nil, status: nil)
107
+ res = Slayer::Result.new(value, status, message)
108
+ res.fail unless ok == true
109
+
110
+ res
111
+ end
112
+
113
+ # rubocop:enable Naming/MethodParameterName
114
+ end
115
+ end
116
+
117
+ RSpec.configure { |config| config.include Slayer::RspecHelpers }
@@ -1,3 +1,3 @@
1
1
  module Slayer
2
- VERSION = '0.5.0.beta'
2
+ VERSION = '0.5.2'
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.5.0.beta
4
+ version: 0.5.2
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: 2022-12-20 00:00:00.000000000 Z
12
+ date: 2023-02-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: virtus
@@ -183,6 +183,8 @@ files:
183
183
  - lib/slayer.rb
184
184
  - lib/slayer/command.rb
185
185
  - lib/slayer/compat/compat_040.rb
186
+ - lib/slayer/compat/minitest_compat_040.rb
187
+ - lib/slayer/compat/rspec_compat_040.rb
186
188
  - lib/slayer/cops/return_matcher.rb
187
189
  - lib/slayer/errors.rb
188
190
  - lib/slayer/form.rb
@@ -208,9 +210,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
208
210
  version: '0'
209
211
  required_rubygems_version: !ruby/object:Gem::Requirement
210
212
  requirements:
211
- - - ">"
213
+ - - ">="
212
214
  - !ruby/object:Gem::Version
213
- version: 1.3.1
215
+ version: '0'
214
216
  requirements: []
215
217
  rubygems_version: 3.2.3
216
218
  signing_key: