pathway 0.12.1 → 0.12.3

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: 45170fed25a15c1d3b5b04630a9829a0a82d3a5f9423a3442445502252a1bb34
4
- data.tar.gz: 424438af1eed0c2a93ca3be3dbe1923033f827809fa67d3b8aac31168402069e
3
+ metadata.gz: 83205585dcf796cdb4a5da8055163491d12586c48915e6d3ef7efe44ff6533f3
4
+ data.tar.gz: 1584cfc7dd38e44e14a810a96a658e29b5756aad62f36e1e69671a3c7631a656
5
5
  SHA512:
6
- metadata.gz: 1a2c4671a9482af68487fa0298bd81cb93940906969e4cf3ecdf170f2332d4b5b988eb77653e71b095619bb1a9e70473a3a94a0eca6462e1aee4cb0d11d8fc88
7
- data.tar.gz: d6dfa471b5d28317b23ae7e671cb1a12052ba11c02a52cd639e4635505c3843c4b7bddf84a7afb3af616bcaae2a067b3f622432d6bf623902b7c7be56a3daa87
6
+ metadata.gz: ade86174156600eb76a84af9ca96097eaa28a8760ba52f150fc9ed6c21ca5a69e387157cb7238c97990aa516ff712b98708941acf4885805e9bb4f8d85db2757
7
+ data.tar.gz: 855252fa3e0639a3d18bd1f0f10f7d379795516723da702c6201076a3767dc3a7f447191260d137f57716bf57915e654270a0209b6b3e36de9896e54faac7927
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [0.12.3] - 2024-08-13
2
+ ### Changed
3
+ - Renamed config option `:auto_wire_options` to `:auto_wire` at `:dry_validation` plugin
4
+ - Updated `Pathway::State#use` to accept block with postional parameters
5
+ - Updated `Pathway::State#use` to raise an `ArgumentError` exception on invalid arguments
6
+ ### Added
7
+ - Provide alias `Pathway::State#use` to `Pathway::State#unwrap`
8
+
9
+ ## [0.12.2] - 2024-08-06
10
+ ### Added
11
+ - Add `Pathway::State#unwrap` and `Pathway::State#u` to access internal state
12
+
1
13
  ## [0.12.1] - 2024-06-23
2
14
  ### Added
3
15
  - Add support for pattern matching on `Result`, `State` and `Error` instances
data/README.md CHANGED
@@ -407,12 +407,12 @@ end
407
407
 
408
408
  If you are familiar with `dry-validation` you probably know it provides a way to [inject options](https://dry-rb.org/gems/dry-validation/1.4/external-dependencies/) before calling the contract.
409
409
 
410
- In those scenarios, you must either set the `auto_wire_options: true` plugin argument or specify how to map options from the execution state to the contract when calling `step :validate`.
410
+ In those scenarios, you must either set the `auto_wire: true` plugin argument or specify how to map options from the execution state to the contract when calling `step :validate`.
411
411
  Lets see and example for the first case:
412
412
 
413
413
  ```ruby
414
414
  class CreateNugget < Pathway::Operation
415
- plugin :dry_validation, auto_wire_options: true
415
+ plugin :dry_validation, auto_wire: true
416
416
 
417
417
  context :user_name
418
418
 
@@ -438,7 +438,7 @@ class CreateNugget < Pathway::Operation
438
438
  end
439
439
  ```
440
440
 
441
- Here the defined contract needs a `:user_name` option, so we tell the operation to grab the attribute with the same name from the state by activating `:auto_wire_options`, afterwards, when the validation runs, the contract will already have the user name available.
441
+ Here the defined contract needs a `:user_name` option, so we tell the operation to grab the attribute with the same name from the state by activating `:auto_wire`, afterwards, when the validation runs, the contract will already have the user name available.
442
442
 
443
443
  Mind you, this option is `false` by default, so be sure to set it to `true` at `Pathway::Operation` if you'd rather have it enabled for all your operations.
444
444
 
@@ -8,6 +8,7 @@ module Pathway
8
8
 
9
9
  def _callable(callable)
10
10
  if callable.is_a?(Symbol) && @operation.respond_to?(callable, true) &&
11
+ @operation.method(callable).arity != 0 &&
11
12
  @operation.method(callable).parameters.all? { _1 in [:key|:keyreq|:keyrest|:block,*] }
12
13
 
13
14
  -> state { @operation.send(callable, **state) }
@@ -6,7 +6,10 @@ module Pathway
6
6
  module V0_11
7
7
  module ClassMethods
8
8
  attr_reader :form_class, :form_options
9
- attr_accessor :auto_wire_options
9
+ attr_accessor :auto_wire
10
+
11
+ alias_method :auto_wire_options, :auto_wire
12
+ alias_method :auto_wire_options=, :auto_wire=
10
13
 
11
14
  def form(base = nil, **opts, &block)
12
15
  if block_given?
@@ -32,7 +35,7 @@ module Pathway
32
35
  def inherited(subclass)
33
36
  super
34
37
  subclass.form_class = form_class
35
- subclass.auto_wire_options = auto_wire_options
38
+ subclass.auto_wire = auto_wire
36
39
  end
37
40
 
38
41
  private
@@ -58,10 +61,11 @@ module Pathway
58
61
  extend Forwardable
59
62
 
60
63
  delegate %i[build_form form_options auto_wire_options] => 'self.class'
61
- alias :form :build_form
64
+ delegate %i[build_form form_options auto_wire_options auto_wire] => 'self.class'
65
+ alias_method :form, :build_form
62
66
 
63
67
  def validate(state, with: nil)
64
- if auto_wire_options && form_options.any?
68
+ if auto_wire && form_options.any?
65
69
  with ||= form_options.zip(form_options).to_h
66
70
  end
67
71
  opts = Hash(with).map { |opt, key| [opt, state[key]] }.to_h
@@ -76,9 +80,15 @@ module Pathway
76
80
  end
77
81
  end
78
82
 
79
- def self.apply(operation, auto_wire_options: false)
83
+ def self.apply(operation, auto_wire_options: (auto_wire_options_was_not_used=true; false), auto_wire: auto_wire_options)
84
+ #:nocov:
85
+ unless auto_wire_options_was_not_used
86
+ warn "[DEPRECATION] `auto_wire_options` is deprecated. Please use `auto_wire` instead"
87
+ end
88
+ #:nocov:
89
+
90
+ operation.auto_wire = auto_wire
80
91
  operation.form_class = Dry::Validation::Schema::Form
81
- operation.auto_wire_options = auto_wire_options
82
92
  end
83
93
  end
84
94
  end
@@ -6,7 +6,10 @@ module Pathway
6
6
  module V0_12
7
7
  module ClassMethods
8
8
  attr_reader :form_class, :form_options
9
- attr_accessor :auto_wire_options
9
+ attr_accessor :auto_wire
10
+
11
+ alias_method :auto_wire_options, :auto_wire
12
+ alias_method :auto_wire_options=, :auto_wire=
10
13
 
11
14
  def form(base = nil, **opts, &block)
12
15
  if block_given?
@@ -32,7 +35,7 @@ module Pathway
32
35
  def inherited(subclass)
33
36
  super
34
37
  subclass.form_class = form_class
35
- subclass.auto_wire_options = auto_wire_options
38
+ subclass.auto_wire = auto_wire
36
39
  end
37
40
 
38
41
  private
@@ -57,11 +60,11 @@ module Pathway
57
60
  module InstanceMethods
58
61
  extend Forwardable
59
62
 
60
- delegate %i[build_form form_options auto_wire_options] => 'self.class'
61
- alias :form :build_form
63
+ delegate %i[build_form form_options auto_wire_options auto_wire] => 'self.class'
64
+ alias_method :form, :build_form
62
65
 
63
66
  def validate(state, with: nil)
64
- if auto_wire_options && form_options.any?
67
+ if auto_wire && form_options.any?
65
68
  with ||= form_options.zip(form_options).to_h
66
69
  end
67
70
  opts = Hash(with).map { |opt, key| [opt, state[key]] }.to_h
@@ -76,9 +79,15 @@ module Pathway
76
79
  end
77
80
  end
78
81
 
79
- def self.apply(operation, auto_wire_options: false)
82
+ def self.apply(operation, auto_wire_options: (auto_wire_options_was_not_used=true; false), auto_wire: auto_wire_options)
83
+ #:nocov:
84
+ unless auto_wire_options_was_not_used
85
+ warn "[DEPRECATION] `auto_wire_options` is deprecated. Please use `auto_wire` instead"
86
+ end
87
+ #:nocov:
88
+
89
+ operation.auto_wire = auto_wire
80
90
  operation.form_class = Dry::Validation::Schema::Params
81
- operation.auto_wire_options = auto_wire_options
82
91
  end
83
92
  end
84
93
  end
@@ -6,7 +6,10 @@ module Pathway
6
6
  module V1_0
7
7
  module ClassMethods
8
8
  attr_reader :contract_class, :contract_options
9
- attr_accessor :auto_wire_options
9
+ attr_accessor :auto_wire
10
+
11
+ alias_method :auto_wire_options, :auto_wire
12
+ alias_method :auto_wire_options=, :auto_wire=
10
13
 
11
14
  def contract(base = nil, &block)
12
15
  if block_given?
@@ -24,7 +27,7 @@ module Pathway
24
27
  end
25
28
 
26
29
  def contract_class= klass
27
- @contract_class = klass
30
+ @contract_class = klass
28
31
  @contract_options = (klass.dry_initializer.options - Dry::Validation::Contract.dry_initializer.options).map(&:target)
29
32
  @builded_contract = @contract_options.empty? && klass.schema ? klass.new : nil
30
33
  end
@@ -35,8 +38,8 @@ module Pathway
35
38
 
36
39
  def inherited(subclass)
37
40
  super
41
+ subclass.auto_wire = auto_wire
38
42
  subclass.contract_class = contract_class
39
- subclass.auto_wire_options = auto_wire_options
40
43
  end
41
44
 
42
45
  private
@@ -49,11 +52,11 @@ module Pathway
49
52
  module InstanceMethods
50
53
  extend Forwardable
51
54
 
52
- delegate %i[build_contract contract_options auto_wire_options] => 'self.class'
53
- alias :contract :build_contract
55
+ delegate %i[build_contract contract_options auto_wire_options auto_wire] => 'self.class'
56
+ alias_method :contract, :build_contract
54
57
 
55
58
  def validate(state, with: nil)
56
- if auto_wire_options && contract_options.any?
59
+ if auto_wire && contract_options.any?
57
60
  with ||= contract_options.zip(contract_options).to_h
58
61
  end
59
62
  opts = Hash(with).map { |to, from| [to, state[from]] }.to_h
@@ -68,9 +71,15 @@ module Pathway
68
71
  end
69
72
  end
70
73
 
71
- def self.apply(operation, auto_wire_options: false)
74
+ def self.apply(operation, auto_wire_options: (auto_wire_options_was_not_used=true; false), auto_wire: auto_wire_options)
75
+ #:nocov:
76
+ unless auto_wire_options_was_not_used
77
+ warn "[DEPRECATION] `auto_wire_options` is deprecated. Please use `auto_wire` instead"
78
+ end
79
+ #:nocov:
80
+
81
+ operation.auto_wire = auto_wire
72
82
  operation.contract_class = Dry::Validation::Contract
73
- operation.auto_wire_options = auto_wire_options
74
83
  end
75
84
  end
76
85
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pathway
4
- VERSION = '0.12.1'
4
+ VERSION = '0.12.3'
5
5
  end
data/lib/pathway.rb CHANGED
@@ -83,7 +83,27 @@ module Pathway
83
83
  @hash
84
84
  end
85
85
 
86
- alias :to_h :to_hash
86
+ def use(&bl)
87
+ raise ArgumentError, 'a block must be provided' if !block_given?
88
+ if bl.parameters.any? {|(type,_)| type == :keyrest || type == :rest }
89
+ raise ArgumentError, 'rest arguments are not supported'
90
+ end
91
+
92
+ keys = bl.parameters.select {|(type,_)| type == :key || type == :keyreq }.map(&:last)
93
+ names = bl.parameters.select {|(type,_)| type == :req || type == :opt }.map(&:last)
94
+
95
+ if keys.any? && names.any?
96
+ raise ArgumentError, 'cannot mix positional and keyword arguments'
97
+ elsif keys.any?
98
+ bl.call(**to_hash.slice(*keys))
99
+ else
100
+ bl.call(*to_hash.values_at(*names))
101
+ end
102
+ end
103
+
104
+ alias_method :to_h, :to_hash
105
+ alias_method :u, :use
106
+ alias_method :unwrap, :use
87
107
  end
88
108
 
89
109
  module Plugins
data/pathway.gemspec CHANGED
@@ -43,4 +43,5 @@ Gem::Specification.new do |spec|
43
43
  spec.add_development_dependency "pry"
44
44
  spec.add_development_dependency "pry-byebug"
45
45
  spec.add_development_dependency "pry-doc"
46
+ spec.add_development_dependency "pry-stack"
46
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pathway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.12.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Herrero
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-23 00:00:00.000000000 Z
11
+ date: 2024-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-inflector
@@ -192,6 +192,20 @@ dependencies:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: pry-stack
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
195
209
  description: Define your business logic in simple steps.
196
210
  email:
197
211
  - pablodherrero@gmail.com