trailblazer-option 0.1.1 → 0.1.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 +4 -4
- data/CHANGES.md +4 -0
- data/README.md +62 -1
- data/lib/trailblazer/option/version.rb +1 -1
- data/lib/trailblazer/option.rb +6 -12
- data/test/docs/option_test.rb +26 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0d62e8bc54ba2cf87c8f8039a753a23ec1d1ae86c54345c44b049465ed6c7e4
|
4
|
+
data.tar.gz: 5a84e2737e097ac47fd952fdab0888413e77ef9586863eb25dfc7a4221bda2e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bff90fce5bc96d842ddfc81c7ce281a6abf1a474a35f02513d0dd764c3506a612ee92f88f2bdb55cd4ec0e12811554bcfd36408760b0536694d524942d3f96f
|
7
|
+
data.tar.gz: 469819438960ec5e67ff5020543399c79b795e5632b9bc57ef836f3b62aa2a029521f8346ad233e0c9d655691b8908f3916d658b2cca6fe19ed8db5b6e219d4e
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -1 +1,62 @@
|
|
1
|
-
#
|
1
|
+
# Trailblazer::Option
|
2
|
+
|
3
|
+
_Dynamic options to evaluate at runtime._
|
4
|
+
|
5
|
+
`Trailblazer::Option` is the one of the core concept behind `traiblazer-operation`'s [step API](https://trailblazer.to/2.1/docs/activity.html#activity-wiring-api), `reform`'s [populator API](https://trailblazer.to/2.1/docs/reform.html#reform-populators) etc. It makes us possible to accept any kind of callable objects at compile time and execute them at runtime.
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
class Song::Create < Trailblazer::Operation
|
9
|
+
step Authorize # Module callable
|
10
|
+
step :model # Method callable
|
11
|
+
step ->(ctx, model:, **) { puts model } # Proc callable
|
12
|
+
end
|
13
|
+
```
|
14
|
+
|
15
|
+
This gem is a replacement over [declarative-option](https://github.com/apotonick/declarative-option) and has been extracted out from [trailblazer-context](https://github.com/trailblazer/trailblazer-context) by identifying common callable patterns.
|
16
|
+
|
17
|
+
# Option
|
18
|
+
|
19
|
+
`Trailblazer::Option()` accepts `:symbol`, `lambda` and any other type of `callable` as an argument. It will be wrapped accordingly to make an executable, so you can call the value at runtime to evaluate it.
|
20
|
+
|
21
|
+
When passing in a `:symbol`, this will be treated as a method that's called on the given `exec_context`.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
option = Trailblazer::Option(:object_id)
|
25
|
+
option.(exec_context: Object.new) #=> 2354383
|
26
|
+
```
|
27
|
+
|
28
|
+
Same with objects responding to `.call` or `#call` method.
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
class CallMe
|
32
|
+
def self.call(*args, message:, **options)
|
33
|
+
message
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
option = Trailblazer::Option(CallMe)
|
38
|
+
option.(*args, keyword_arguments: { message: "hello!" }, exec_context: nil) => "hello!"
|
39
|
+
```
|
40
|
+
|
41
|
+
Notice the usage of `keyword_arguments` while calling an `Option`. This is because keyword arguments needs to be forwarded separately in order for them to be [compatible](https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/) with ruby 2.7+.
|
42
|
+
|
43
|
+
And of course, passing lambdas. They gets executed within given `exec_context` when set.
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
option = Trailblazer::Option( -> { object_id } )
|
47
|
+
option.(exec_context: Object.new) #=> 1234567
|
48
|
+
```
|
49
|
+
|
50
|
+
# Installation
|
51
|
+
|
52
|
+
Add this line to your application's Gemfile:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
gem 'trailblazer-option'
|
56
|
+
```
|
57
|
+
|
58
|
+
# Copyright
|
59
|
+
|
60
|
+
Copyright (c) 2017-2021 TRAILBLAZER GmbH.
|
61
|
+
|
62
|
+
`trailblazer-option` is released under the [MIT License](http://www.opensource.org/licenses/MIT).
|
data/lib/trailblazer/option.rb
CHANGED
@@ -36,24 +36,18 @@ module Trailblazer
|
|
36
36
|
call!(exec_context.method(value), *args, **options, &block)
|
37
37
|
end
|
38
38
|
|
39
|
-
#
|
40
|
-
# @
|
41
|
-
|
39
|
+
# Generic builder for a callable "option".
|
40
|
+
# @param call_implementation [Class, Module] implements the process of calling the proc
|
41
|
+
# while passing arguments/options to it in a specific style (e.g. kw args, step interface).
|
42
|
+
# @return [Proc] when called, this proc will evaluate its option (at run-time).
|
43
|
+
def self.build(value)
|
42
44
|
evaluate = case value
|
43
45
|
when Symbol then method(:evaluate_method)
|
44
46
|
when Proc then method(:evaluate_proc)
|
45
47
|
else method(:evaluate_callable)
|
46
48
|
end
|
47
49
|
|
48
|
-
evaluate.(value, *args, **options, &block)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Generic builder for a callable "option".
|
52
|
-
# @param call_implementation [Class, Module] implements the process of calling the proc
|
53
|
-
# while passing arguments/options to it in a specific style (e.g. kw args, step interface).
|
54
|
-
# @return [Proc] when called, this proc will evaluate its option (at run-time).
|
55
|
-
def self.build(value)
|
56
|
-
->(*args, **options, &block) { evaluator(value, *args, **options, &block) }
|
50
|
+
->(*args, **options, &block) { evaluate.(value, *args, **options, &block) }
|
57
51
|
end
|
58
52
|
end
|
59
53
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DocsOptionTest < Minitest::Spec
|
4
|
+
it do
|
5
|
+
#:method
|
6
|
+
option = Trailblazer::Option(:object_id)
|
7
|
+
option.(exec_context: Object.new) # => 1234567
|
8
|
+
#:method end
|
9
|
+
|
10
|
+
#:lambda
|
11
|
+
option = Trailblazer::Option(-> { object_id })
|
12
|
+
option.(exec_context: Object.new) # => 1234567
|
13
|
+
#:lambda end
|
14
|
+
|
15
|
+
#:module
|
16
|
+
class CallMe
|
17
|
+
def self.call(message:, **options)
|
18
|
+
message
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
option = Trailblazer::Option(CallMe)
|
23
|
+
option.(keyword_arguments: { message: "hello!" }, exec_context: nil) # => "hello!"
|
24
|
+
#:module end
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trailblazer-option
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- lib/trailblazer-option.rb
|
73
73
|
- lib/trailblazer/option.rb
|
74
74
|
- lib/trailblazer/option/version.rb
|
75
|
+
- test/docs/option_test.rb
|
75
76
|
- test/option_test.rb
|
76
77
|
- test/test_helper.rb
|
77
78
|
- trailblazer-option.gemspec
|
@@ -99,5 +100,6 @@ signing_key:
|
|
99
100
|
specification_version: 4
|
100
101
|
summary: Callable patterns for options in Trailblazer
|
101
102
|
test_files:
|
103
|
+
- test/docs/option_test.rb
|
102
104
|
- test/option_test.rb
|
103
105
|
- test/test_helper.rb
|