trailblazer-context 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68c328cb817dbf1889d8e4619afa0b950786a839d8685c145ac9cda543b63c5b
4
- data.tar.gz: 3bbe468cf341ebb429715983c3ea284b02251eedfe0084b6225252fbf5240e4b
3
+ metadata.gz: f2f68ea3324607256a507718188b38dcb7d0252f17bf49221b97b5e62be4d252
4
+ data.tar.gz: 6841b846db299f4c21352f03703c3b8780539e2eb59efbadf0bd1ecd780bb0d8
5
5
  SHA512:
6
- metadata.gz: 0001ec043007eec13ac0ce4c836f406a4fbfcfee8c759fb85c2059d0fffce774423d8986f504a9b0fc36c31e4d0bd75673a02f2d1e9f92b1229f95af3115f029
7
- data.tar.gz: 85848da20e2f7639183f4cefc2095294f183f3217927b8ed573ba307ed122871549f1a5409d3369e767a896f8a64c18af598e30fbf10bc33de3918e546e2c6dd
6
+ metadata.gz: d1ec16cbdba1cfeca1f3820e188dc5c8b449ff0295ee8849f5509297123b5c8b5046a9265206dff83051457e42aa7a7771387c82a4dfb5da6be9b2d93387b3aa
7
+ data.tar.gz: ee014562e35ad36355a8e62f18b8e8c2e497c86014aabac143ef308099e1f79f0b740d3f3e78fdeb0d9e5155b440ddb31e7f945da02fd48fc42eba1d7197f681
@@ -0,0 +1,17 @@
1
+ name: CI
2
+ on: [push, pull_request]
3
+ jobs:
4
+ test:
5
+ strategy:
6
+ fail-fast: false
7
+ matrix:
8
+ # Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
9
+ ruby: [2.5, 2.6, 2.7, '3.0', head, jruby, jruby-head]
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: ${{ matrix.ruby }}
16
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
17
+ - run: bundle exec rake
data/CHANGES.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.5.0
2
+
3
+ * Extracted `Option` into its own repository, `trailblazer-option` ✨
4
+
1
5
  # 0.4.0
2
6
 
3
7
  * Ready for Ruby 3.0. :heart:
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec
3
3
 
4
+ gem "benchmark-ips"
4
5
  gem "minitest-line"
data/README.md CHANGED
@@ -5,5 +5,4 @@ _Argument-specific data structures for Trailblazer._
5
5
  This gem provides data structures needed across `Activity`, `Workflow` and `Operation`, such as the following.
6
6
 
7
7
  * `Trailblazer::Context` implements the so-called `options` hash that is passed between steps and implements the keyword arguments.
8
- * `Trailblazer::Option` is often used to wrap an option at compile-time and `call` it at runtime, which allows to have the common `-> ()`, `:method` or `Callable` pattern used for most options.
9
8
  * `Trailblazer::ContainerChain` to implement chained lookups of properties and allow including containers such as `Dry::Container` in this chain. This is experimental.
@@ -1,3 +1,2 @@
1
1
  require "trailblazer/context/version"
2
2
  require "trailblazer/context"
3
- require "trailblazer/option"
@@ -1,5 +1,5 @@
1
1
  module Trailblazer
2
2
  module Context
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-context
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-26 00:00:00.000000000 Z
11
+ date: 2021-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -74,8 +74,8 @@ executables: []
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
+ - ".github/workflows/ci.yml"
77
78
  - ".gitignore"
78
- - ".travis.yml"
79
79
  - CHANGES.md
80
80
  - Gemfile
81
81
  - LICENSE
@@ -88,19 +88,17 @@ files:
88
88
  - lib/trailblazer/context/container/with_aliases.rb
89
89
  - lib/trailblazer/context/store/indifferent_access.rb
90
90
  - lib/trailblazer/context/version.rb
91
- - lib/trailblazer/option.rb
92
91
  - test/benchmark/benchmark_helper.rb
93
92
  - test/benchmark/indifferent_access_test.rb
94
93
  - test/benchmark/indifferent_access_with_aliasing_test.rb
95
94
  - test/context_test.rb
96
- - test/option_test.rb
97
95
  - test/test_helper.rb
98
96
  - trailblazer-context.gemspec
99
97
  homepage: https://trailblazer.to/
100
98
  licenses:
101
99
  - MIT
102
100
  metadata: {}
103
- post_install_message:
101
+ post_install_message:
104
102
  rdoc_options: []
105
103
  require_paths:
106
104
  - lib
@@ -116,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
114
  version: '0'
117
115
  requirements: []
118
116
  rubygems_version: 3.0.8
119
- signing_key:
117
+ signing_key:
120
118
  specification_version: 4
121
119
  summary: Argument-specific data structures for Trailblazer.
122
120
  test_files:
@@ -124,5 +122,4 @@ test_files:
124
122
  - test/benchmark/indifferent_access_test.rb
125
123
  - test/benchmark/indifferent_access_with_aliasing_test.rb
126
124
  - test/context_test.rb
127
- - test/option_test.rb
128
125
  - test/test_helper.rb
data/.travis.yml DELETED
@@ -1,13 +0,0 @@
1
- language: ruby
2
- before_install: gem install bundler
3
- cache: bundler
4
- rvm:
5
- - ruby-head
6
- - 3.0
7
- - 2.7
8
- - 2.6
9
- - 2.5
10
- - 2.4
11
- jobs:
12
- allow_failures:
13
- - rvm: ruby-head
@@ -1,47 +0,0 @@
1
- module Trailblazer
2
- class Option
3
- # A call implementation invoking `proc.(*args)` and plainly forwarding all arguments.
4
- # Override this for your own step strategy (see KW#call!).
5
- # @private
6
- def self.call!(proc, *args, keyword_arguments: {}, **, &block)
7
- # {**keyword_arguments} gets removed automatically if it's an empty hash.
8
- # DISCUSS: is this a good practice?
9
- proc.(*args, **keyword_arguments, &block)
10
- end
11
-
12
- # Note that both #evaluate_callable and #evaluate_method drop most of the args.
13
- # If you need those, override this class.
14
- # @private
15
- def self.evaluate_callable(proc, *args, **options, &block)
16
- call!(proc, *args, **options, &block)
17
- end
18
-
19
- # Make the context's instance method a "lambda" and reuse #call!.
20
- # @private
21
- def self.evaluate_method(proc, *args, exec_context: raise("No :exec_context given."), **options, &block)
22
- call!(exec_context.method(proc), *args, **options, &block)
23
- end
24
-
25
- # Generic builder for a callable "option".
26
- # @param call_implementation [Class, Module] implements the process of calling the proc
27
- # while passing arguments/options to it in a specific style (e.g. kw args, step interface).
28
- # @return [Proc] when called, this proc will evaluate its option (at run-time).
29
- def self.build(proc)
30
- if proc.is_a? Symbol
31
- ->(*args, **kws, &block) { Option.evaluate_method(proc, *args, **kws, &block) }
32
- else
33
- ->(*args, **kws, &block) {
34
- Option.evaluate_callable(proc, *args, **kws, &block) }
35
- end
36
- end
37
-
38
- def self.KW(proc)
39
- raise "The `Option::KW()` method has been removed in trailblazer-context-0.4.
40
- Please use `Option(task, keyword_arguments: {...})` instead. Check https://trailblazer.to/2.1/docs/trailblazer.html#trailblazer-context-option"
41
- end
42
- end
43
- # @note This might go to trailblazer-args along with `Context` at some point.
44
- def self.Option(proc)
45
- Option.build(proc)
46
- end
47
- end
data/test/option_test.rb DELETED
@@ -1,147 +0,0 @@
1
- require "test_helper"
2
-
3
- class OptionTest < Minitest::Spec
4
- def assert_result(result, block = nil)
5
- _(result).must_equal([{a: 1}, 2, {b: 3}, block])
6
-
7
- _(positional.inspect).must_equal %({:a=>1})
8
- _(keywords.inspect).must_equal %({:a=>2, :b=>3})
9
- end
10
-
11
- # it "what" do
12
- # ctx = {params: 1}
13
- # tmp_options = {constant: Object, model: Module}
14
-
15
- # builder = Class.new do
16
- # def builder(ctx, constant:, model:, **)
17
- # raise model.inspect
18
- # end
19
- # end.new
20
-
21
- # circuit_options = {exec_context: builder}
22
-
23
- # # Trailblazer::Option(:builder, ).(ctx, tmp_options, **circuit_options.merge(keyword_arguments: tmp_options)) # calls {def default_contract!(options, constant:, model:, **)}
24
- # Trailblazer::Option(:builder, ).(ctx, **circuit_options.merge(keyword_arguments: tmp_options)) # calls {def default_contract!(options, constant:, model:, **)}
25
- # end
26
-
27
- describe "positional and kws" do
28
- class Step
29
- def with_positional_and_keywords(options, a: nil, **more_options, &block)
30
- [options, a, more_options, block]
31
- end
32
- end
33
-
34
- WITH_POSITIONAL_AND_KEYWORDS = ->(options, a: nil, **more_options, &block) do
35
- [options, a, more_options, block]
36
- end
37
-
38
- class WithPositionalAndKeywords
39
- def self.call(options, a: nil, **more_options, &block)
40
- [options, a, more_options, block]
41
- end
42
- end
43
-
44
- let(:positional) { {a: 1} }
45
- let(:keywords) { {a: 2, b: 3} }
46
-
47
- let(:block) { ->(*) { snippet } }
48
-
49
- describe ":method" do
50
- let(:option) { Trailblazer::Option(:with_positional_and_keywords) }
51
-
52
- it "passes through all args" do
53
- step = Step.new
54
-
55
- # positional = { a: 1 }
56
- # keywords = { a: 2, b: 3 }
57
- assert_result option.(positional, keyword_arguments: keywords, exec_context: step)
58
- end
59
-
60
- it "allows passing a block, too" do
61
- step = Step.new
62
-
63
- assert_result option.(positional, keyword_arguments: keywords, exec_context: step, &block), block
64
- end
65
- end
66
-
67
- describe "lambda" do
68
- let(:option) { Trailblazer::Option(WITH_POSITIONAL_AND_KEYWORDS) }
69
-
70
- it "-> {} lambda" do
71
- assert_result option.(positional, **{keyword_arguments: keywords})
72
- end
73
-
74
- it "allows passing a block, too" do
75
- assert_result option.(positional, **{keyword_arguments: keywords}, &block), block
76
- end
77
-
78
- it "doesn't mind :exec_context" do
79
- assert_result option.(positional, keyword_arguments: keywords, exec_context: "bogus")
80
- end
81
- end
82
-
83
- describe "Callable" do
84
- let(:option) { Trailblazer::Option(WithPositionalAndKeywords) }
85
-
86
- it "passes through all args" do
87
- assert_result option.(positional, keyword_arguments: keywords, exec_context: nil)
88
- end
89
-
90
- it "allows passing a block, too" do
91
- assert_result option.(positional, keyword_arguments: keywords, exec_context: nil, &block), block
92
- end
93
- end
94
- end
95
-
96
- describe "positionals" do
97
- def assert_result_pos(result)
98
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.7.0")
99
- _(result).must_equal([1, 2, [3, 4]])
100
- _(positionals).must_equal [1, 2, 3, 4]
101
- else
102
- _(result).must_equal([1, 2, [3, 4, {}]])
103
- _(positionals).must_equal [1, 2, 3, 4]
104
- end
105
- end
106
-
107
- # In Ruby < 3.0, {*args} will grab both positionals and keyword arguments.
108
- class Step
109
- def with_positionals(a, b, *args)
110
- [a, b, args]
111
- end
112
- end
113
-
114
- WITH_POSITIONALS = ->(a, b, *args) do
115
- [a, b, args]
116
- end
117
-
118
- class WithPositionals
119
- def self.call(a, b, *args)
120
- [a, b, args]
121
- end
122
- end
123
-
124
- let(:positionals) { [1, 2, 3, 4] }
125
-
126
- it ":method" do
127
- step = Step.new
128
-
129
- option = Trailblazer::Option(:with_positionals)
130
-
131
- assert_result_pos option.(*positionals, exec_context: step)
132
- end
133
-
134
- it "-> {} lambda" do
135
- option = Trailblazer::Option(WITH_POSITIONALS)
136
-
137
- assert_result_pos option.(*positionals, exec_context: "something")
138
- end
139
-
140
- it "callable" do
141
- option = Trailblazer::Option(WithPositionals)
142
-
143
- assert_result_pos option.(*positionals, exec_context: "something")
144
- end
145
- end
146
-
147
- end