marameters 0.0.0 → 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
  SHA256:
3
- metadata.gz: 0a92d21f1146d77f296e63cf36db2f70a2b71318c6d117bb962fc4d4ac34616c
4
- data.tar.gz: 102690432048fb246e14f6bce38ed34d1ac6415ed82a7356ac3f43313bf78eeb
3
+ metadata.gz: 832b6f5bce93dd251a0e1972c9e4ef234237dc1d1e94f6b8ca15814dec7ddc00
4
+ data.tar.gz: 23c459d6e85fa64da272f5c9b319084f188c31d0360856be9826a92f59b619d9
5
5
  SHA512:
6
- metadata.gz: 91efba790017f9d67f5de1513027455a34915822346b6e0e4502dfb6d4e1d0bb4e638342b364108caac35a8598cd18344f6df7d68743107db355cf36eb9470cd
7
- data.tar.gz: 7931c8990397233aac682ca43701b5b90c4d045263abde99c3d52ac800050acbaabea5b96d02e5f0fae687d635894d3d1681d9f0eb856a1cd5f27219c0e8b6cb
6
+ metadata.gz: '0338c575983adaff7b72af01ddc941ba2084b095f073992e853c740ac2aac70f8c4f3eaff9cea4001802240393e52b0a6cceb00ac3d20b47eda320591546e7b7'
7
+ data.tar.gz: 9bddaf3365b3b3d60f766479a036d754f6323082d606a1120a99343145858ba92436177236bf6f1cb6901b810bba55184ff0512262061fe25d58cf3db36a3663
checksums.yaml.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -4,23 +4,23 @@
4
4
 
5
5
  = Marameters
6
6
 
7
- Marameters is short for method parameters (i.e. [m]ethod + p[arameters] = marameters) which is
8
- designed to provide additional insight and diagnostics to method parameters. For context, the
9
- difference between a method's parameters and arguments is:
7
+ Marameters is a portmanteau (i.e. `[m]ethod + p[arameters] = marameters`) which is designed to
8
+ provide additional insight and diagnostics to method parameters. For context, the difference between
9
+ a method's parameters and arguments is:
10
10
 
11
- * *Parameters*: Represents the _expected_ values to be passed to a method when messaged as defined
12
- when the method is implemented. Example: `def demo(one, two: nil)`.
11
+ * *Parameters*: Represents the _expected_ values to be passed to a method when
12
+ messaged as defined when the method is implemented. Example: `def demo(one, two: nil)`.
13
13
  * *Arguments*: Represents the _actual_ values passed to the method when messaged.
14
- Example: `demo 1, two :2`.
14
+ Example: `demo 1, two: 2`.
15
15
 
16
16
  This gem will help you debug methods or -- more importantly -- aid your workflow when
17
- metaprogramming and architecting more sophisticated applications.
17
+ metaprogramming, as used in the link:https://www.alchemists.io/projects/auto_injector[Auto Injector]
18
+ gem, when architecting more sophisticated applications.
18
19
 
19
20
  toc::[]
20
21
 
21
22
  == Features
22
23
 
23
- * Provides a core object as a primary interface.
24
24
  * Provides specialized objects for keyword, positional, and splatted parameters.
25
25
 
26
26
  == Requirements
@@ -45,50 +45,172 @@ gem "marameters"
45
45
 
46
46
  == Usage
47
47
 
48
- The primary object you'll most likely want to interact with is the `Marameters::Core` class. The
49
- following code snippet will help demonstrate the Object API:
48
+ There are two main objects you'll want to interact with:
49
+
50
+ * *Marameters::Probe*: Allows you to analyze a method's parameters.
51
+ * *Marameters::Signature*: Allows you to dynamically build a method signature from raw parameters.
52
+
53
+ Both of these objects are meant to serve as building blocks to more complex architectures.
54
+
55
+ === Probe
56
+
57
+ To understand how to analyze a method's parameters, consider the following demonstration class:
50
58
 
51
59
  [source,ruby]
52
60
  ----
53
61
  class Demo
54
- def example one, two = nil, *three, four:, five: nil, **six, &seven
55
- [one, two, three, four, five, six, seven]
62
+ def initialize logger: Logger.new(STDOUT)
63
+ @logger = logger
64
+ end
65
+
66
+ def all one, two = nil, *three, four:, five: nil, **six, &seven
67
+ logger.debug [one, two, three, four, five, six, seven]
56
68
  end
69
+
70
+ def none = logger.debug "Nothing to see here."
71
+
72
+ private
73
+
74
+ attr_reader :logger
57
75
  end
76
+ ----
58
77
 
59
- marameters = Marameters::Core.new Demo.instance_method(:example).parameters
78
+ You can then probe the `#all` method's parameters as follows:
60
79
 
61
- marameters.empty? # false
62
- marameters.keyword? :one # false
63
- marameters.keyword? :four # true
64
- marameters.keywords # [:four, :five]
65
- marameters.kinds # [:req, :opt, :keyreq, :key, :rest, :keyrest]
66
- marameters.named_single_splat_only? # false
67
- marameters.names # [:one, :two, :four, :five, :three, :six]
68
- marameters.positional? # true
69
- marameters.positionals # [:one, :two]
70
- marameters.to_a # [[:req, :one], [:opt, :two], [:rest, :three], [:keyreq, :four], [:key, :five], [:keyrest, :six], [:block, :seven]]
71
- marameters.unnamed_splats_only? # false
80
+ [source,ruby]
81
+ ----
82
+ probe = Marameters::Probe.new Demo.instance_method(:all).parameters
83
+
84
+ probe.block # :seven
85
+ probe.block? # true
86
+ probe.empty? # false
87
+ probe.keywords # [:four, :five]
88
+ probe.keywords? # true
89
+ probe.kind?(:keyrest) # true
90
+ probe.kinds # [:req, :opt, :rest, :keyreq, :key, :keyrest, :block]
91
+ probe.name?(:three) # true
92
+ probe.names # [:one, :two, :three, :four, :five, :six, :seven]
93
+ probe.only_bare_splats? # false
94
+ probe.only_double_splats? # false
95
+ probe.only_single_splats? # false
96
+ probe.positionals # [:one, :two]
97
+ probe.positionals? # true
98
+ probe.splats # [:three, :six]
99
+ probe.splats? # true
100
+ probe.to_a # [[:req, :one], [:opt, :two], [:rest, :three], [:keyreq, :four], [:key, :five], [:keyrest, :six], [:block, :seven]]
101
+ probe.to_h # {:req=>:one, :opt=>:two, :rest=>:three, :keyreq=>:four, :key=>:five, :keyrest=>:six, :block=>:seven}
72
102
  ----
73
103
 
74
- The `Marameters::Core` delegates to the following classes which you can use individually as well:
104
+ In contrast the above, we can also probe the `#none` method which has no parameters for a completely
105
+ different result:
75
106
 
76
107
  [source,ruby]
77
108
  ----
78
- class Demo
79
- def example one, two = nil, *three, four:, five: nil, **six, &seven
80
- [one, two, three, four, five, six, seven]
81
- end
82
- end
109
+ probe = Marameters::Probe.new Demo.instance_method(:none).parameters
110
+
111
+ probe.block # nil
112
+ probe.block? # false
113
+ probe.empty? # true
114
+ probe.keywords # []
115
+ probe.keywords? # false
116
+ probe.kind?(:req) # true
117
+ probe.kinds # []
118
+ probe.name?(:three) # false
119
+ probe.names # []
120
+ probe.only_bare_splats? # false
121
+ probe.only_double_splats? # false
122
+ probe.only_single_splats? # false
123
+ probe.positionals # []
124
+ probe.positionals? # false
125
+ probe.splats # []
126
+ probe.splats? # false
127
+ probe.to_a # []
128
+ probe.to_h # {}
129
+ ----
130
+
131
+ === Signature
132
+
133
+ The signature class is the opposite of the probe in that you want to feed it parameters for turning
134
+ into a method signature. This is useful when dynamically building method signatures or using the
135
+ same signature when metaprogramming multiple methods.
83
136
 
84
- # Specializes in positional method parameters only.
85
- positional = Marameters::Positional.new Demo.instance_method(:example).parameters
137
+ The following demonstrates how you might construct a method signature with all possible parameters:
138
+
139
+ [source,ruby]
140
+ ----
141
+ signature = Marameters::Signature.new(
142
+ {
143
+ req: :one,
144
+ opt: [:two, 2],
145
+ rest: :three,
146
+ keyreq: :four,
147
+ key: [:five, 5],
148
+ keyrest: :six,
149
+ block: :seven
150
+ }
151
+ )
152
+
153
+ puts signature
154
+ # one, two = 2, *three, four:, five: 5, **six, &seven
155
+ ----
156
+
157
+ You'll notice that the parameters are a hash _and_ some values can be tuples. The reason is that
158
+ it's easier to write a hash than a double nested array as normally produced by the probe or directly
159
+ from `Method#parameters`. The optional positional and keyword parameters use tuples because you
160
+ might want to supply a default value and this provides a way for you to do that with minimal syntax.
161
+ This can be demonstrated further by using optional keywords (same applies for optional positionals):
162
+
163
+ [source,ruby]
164
+ ----
165
+ # With no default
166
+ puts Marameters::Signature.new({key: :demo})
167
+ # demo: nil
168
+
169
+ # With explicit nil as default
170
+ puts Marameters::Signature.new({key: [:demo, nil]})
171
+ # demo: nil
172
+
173
+ # With string as default
174
+ puts Marameters::Signature.new({key: [:demo, "test"]})
175
+ # demo: "test"
176
+
177
+ # With symbol as default
178
+ puts Marameters::Signature.new({key: [:demo, :test]})
179
+ # demo: :test
180
+
181
+ # With object(dependency) as default
182
+ puts Marameters::Signature.new({key: [:demo, "*Object.new"]})
183
+ # demo: Object.new
184
+ ----
185
+
186
+ In the case of object dependencies, you need to wrap these in a string _and_ prefix them with a star
187
+ (`*`) so the signature builder won't confuse them as normal strings. There are two reasons why this
188
+ is important:
189
+
190
+ * The star (`*`) signifies you want an object to be passed through without further processing while
191
+ also not being confused as a normal string.
192
+ * Objects wrapped as strings allows your dependency to be lazy loaded. Otherwise, if `Object.new`
193
+ was pass in directly, you'd be passing the evaluated instance (i.e.
194
+ `#<Object:0x0000000107df4028>`) which is not what you want until much later when your method is
195
+ defined.
196
+
197
+ When you put all of this together, you can dynamically build a method as follows:
198
+
199
+ [source,ruby]
200
+ ----
201
+ signature = Marameters::Signature.new({opt: [:text, "This is a test."]})
202
+
203
+ Example = Module.new do
204
+ module_eval <<~DEFINITION, __FILE__, __LINE__ + 1
205
+ def self.say(#{signature}) = text
206
+ DEFINITION
207
+ end
86
208
 
87
- # Specializes in keyword method parameters only.
88
- keyword = Marameters::Keyword.new Demo.instance_method(:example).parameters
209
+ puts Example.say
210
+ # This is a test.
89
211
 
90
- # Specializes in splatted method parameters only.
91
- splat = Marameters::Splat.new Demo.instance_method(:example).parameters
212
+ puts Example.say "Hello"
213
+ # Hello
92
214
  ----
93
215
 
94
216
  == Development
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Marameters
4
+ # Builds a single parameter of a method's parameter signature.
5
+ class Builder
6
+ def initialize defaulter: Defaulter
7
+ @defaulter = defaulter
8
+ end
9
+
10
+ # :reek:DuplicateMethodCall
11
+ def call kind, name, default: nil
12
+ case kind
13
+ when :req then name
14
+ when :opt then "#{name} = #{defaulter.call default}"
15
+ when :rest then "*#{name}"
16
+ when :keyreq then "#{name}:"
17
+ when :key then "#{name}: #{defaulter.call default}"
18
+ when :keyrest then "**#{name}"
19
+ when :block then "&#{name}"
20
+ else fail ArgumentError, "Wrong kind (#{kind}), name (#{name}), or default (#{default})."
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :defaulter
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Marameters
4
+ # Calculates the default for a given value when used within a method's parameter.
5
+ class Defaulter
6
+ PASSTHROUGH = "*"
7
+
8
+ def self.call(...) = new(...).call
9
+
10
+ def initialize value, passthrough: PASSTHROUGH
11
+ @value = value
12
+ @passthrough = passthrough
13
+ end
14
+
15
+ def call
16
+ case value
17
+ when nil then "nil"
18
+ when /\A#{Regexp.escape passthrough}/ then value.delete_prefix passthrough
19
+ when String then value.dump
20
+ when Symbol then value.inspect
21
+ else value
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :value, :passthrough
28
+ end
29
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "refinements/arrays"
4
+
5
+ module Marameters
6
+ # Provides insight into a method's parameters.
7
+ class Probe
8
+ using Refinements::Arrays
9
+
10
+ # :reek:TooManyStatements
11
+ def self.of klass, name, collection: []
12
+ method = klass.instance_method name
13
+
14
+ return collection unless method
15
+
16
+ collection << new(method.parameters)
17
+ super_method = method.super_method
18
+ of super_method.owner, super_method.name, collection:
19
+ rescue NameError
20
+ collection
21
+ end
22
+
23
+ def initialize parameters
24
+ @parameters = parameters
25
+ @items = parameters.reduce({}) { |all, (kind, name)| all.merge kind => name }
26
+ end
27
+
28
+ def block = items[:block]
29
+
30
+ def block? = items.key? :block
31
+
32
+ def empty? = items.empty?
33
+
34
+ def keyword_slice collection, keys:
35
+ collection.select { |key| !keys.include?(key) || keywords.include?(key) }
36
+ end
37
+
38
+ def keywords = items.values_at(:keyreq, :key).compress!
39
+
40
+ def keywords? = keywords.any?
41
+
42
+ def kind?(kind) = items.key? kind
43
+
44
+ def kinds = items.keys
45
+
46
+ def name?(name) = items.value? name
47
+
48
+ def names = items.values
49
+
50
+ def only_bare_splats? = (parameters in [[:rest]] | [[:keyrest]] | [[:rest], [:keyrest]])
51
+
52
+ def only_double_splats? = (parameters in [[:keyrest, *]])
53
+
54
+ def only_single_splats? = (parameters in [[:rest, *]])
55
+
56
+ def positionals = items.values_at(:req, :opt).compress!
57
+
58
+ def positionals? = positionals.any?
59
+
60
+ def splats = items.values_at(:rest, :keyrest).compress!
61
+
62
+ def splats? = splats.any?
63
+
64
+ def to_a = parameters
65
+
66
+ def to_h = items
67
+
68
+ private
69
+
70
+ attr_reader :parameters, :items
71
+ end
72
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Marameters
4
+ # Produces a method signature for given parameters.
5
+ class Signature
6
+ def initialize parameters, builder: Builder.new
7
+ @parameters = parameters
8
+ @builder = builder
9
+ end
10
+
11
+ def to_s = build.join ", "
12
+
13
+ alias to_str to_s
14
+
15
+ private
16
+
17
+ attr_reader :parameters, :builder
18
+
19
+ def build
20
+ parameters.reduce [] do |signature, (kind, (name, default))|
21
+ signature << builder.call(kind, name, default:)
22
+ end
23
+ end
24
+ end
25
+ end
data/lib/marameters.rb CHANGED
@@ -6,8 +6,4 @@ Zeitwerk::Loader.for_gem.setup
6
6
 
7
7
  # Main namespace.
8
8
  module Marameters
9
- TRANSFORMER = lambda do |parameters, pattern|
10
- parameters.select { |kind, _name| pattern.include? kind }
11
- .reduce({}) { |collection, (kind, name)| collection.merge kind => name }
12
- end
13
9
  end
data/marameters.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "marameters"
5
- spec.version = "0.0.0"
5
+ spec.version = "0.3.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://www.alchemists.io/projects/marameters"
9
- spec.summary = "Provides method parameter introspection."
9
+ spec.summary = "Provides dynamic method parameter construction and deconstruction."
10
10
  spec.license = "Hippocratic-2.1"
11
11
 
12
12
  spec.metadata = {
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marameters
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -10,9 +10,9 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIC/jCCAeagAwIBAgIBBDANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
- a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMTAzMTkxMjQ4MDZaFw0yMjAzMTkx
15
- MjQ4MDZaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
13
+ MIIC/jCCAeagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
+ a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMjAzMTkxNzI0MzJaFw0yMzAzMTkx
15
+ NzI0MzJaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
16
16
  IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
17
17
  xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
18
18
  brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
@@ -20,15 +20,15 @@ cert_chain:
20
20
  D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
21
21
  3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
22
22
  AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
23
- 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAEjpaOXHHp8s/7GL2qCb
24
- YAs7urOLv9VHSPfQWAwaTMVnSsIf3Sw4xzISOP/mmfEPBPXtz61K5esrE/uTFtgb
25
- FyjxQk2H0sEWgrRXGGNHBWQRhhEs7LP/TByoC15A0br++xLxRz4r7HBLGAWQQDpg
26
- 66BJ2TBVjxS6K64tKbq7+ACyrOZGgTfNHACh4M076y0x0oRf/rwBrU39/KRfuhbb
27
- cm+nNCEtO35gTmZ2bVDHLGvWazi3gJt6+huQjfXTCUUG2YYBxwhu+GPdAGQPxpf9
28
- lkHilIrX69jq8wMPpBhlaw2mRmeSL50Wv5u6xVBvOHhXFSP1crXM95vfLhLyRYod
29
- W2A=
23
+ 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAJbbNyWzFjqUNVPPCUCo
24
+ IMrhDa9xf1xkORXNYYbmXgoxRy/KyNbUr+jgEEoWJAm9GXlcqxxWAUI6pK/i4/Qi
25
+ X6rPFEFmeObDOHNvuqy8Hd6AYsu+kP94U/KJhe9wnWGMmGoNKJNU3EkW3jM/osSl
26
+ +JRxiH5t4WtnDiVyoYl5nYC02rYdjJkG6VMxDymXTqn7u6HhYgZkGujq1UPar8x2
27
+ hNIWJblDKKSu7hA2d6+kUthuYo13o1sg1Da/AEDg0hoZSUvhqDEF5Hy232qb3pDt
28
+ CxDe2+VuChj4I1nvIHdu+E6XoEVlanUPKmSg6nddhkKn2gC45Kyzh6FZqnzH/CRp
29
+ RFE=
30
30
  -----END CERTIFICATE-----
31
- date: 2022-03-06 00:00:00.000000000 Z
31
+ date: 2022-04-07 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: refinements
@@ -70,10 +70,10 @@ files:
70
70
  - LICENSE.adoc
71
71
  - README.adoc
72
72
  - lib/marameters.rb
73
- - lib/marameters/core.rb
74
- - lib/marameters/keyword.rb
75
- - lib/marameters/positional.rb
76
- - lib/marameters/splat.rb
73
+ - lib/marameters/builder.rb
74
+ - lib/marameters/defaulter.rb
75
+ - lib/marameters/probe.rb
76
+ - lib/marameters/signature.rb
77
77
  - marameters.gemspec
78
78
  homepage: https://www.alchemists.io/projects/marameters
79
79
  licenses:
@@ -100,8 +100,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
102
  requirements: []
103
- rubygems_version: 3.3.8
103
+ rubygems_version: 3.3.10
104
104
  signing_key:
105
105
  specification_version: 4
106
- summary: Provides method parameter introspection.
106
+ summary: Provides dynamic method parameter construction and deconstruction.
107
107
  test_files: []
metadata.gz.sig CHANGED
Binary file
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Marameters
4
- # Provides access to method arguments for meta-programming and/or debugging purposes.
5
- class Core
6
- # Order matters.
7
- DELEGATES = {positional: Positional, keyword: Keyword, splat: Splat}.freeze
8
-
9
- # :reek:TooManyStatements
10
- def self.of klass, name, collection: []
11
- method = klass.instance_method name
12
-
13
- return collection unless method
14
-
15
- collection << new(method.parameters)
16
- super_method = method.super_method
17
- of super_method.owner, super_method.name, collection:
18
- rescue NameError
19
- collection
20
- end
21
-
22
- def initialize parameters, delegates: DELEGATES
23
- @parameters = parameters
24
-
25
- @delegates = delegates.reduce({}) do |accumulator, (key, klass)|
26
- accumulator.merge key => klass.new(parameters)
27
- end
28
- end
29
-
30
- def empty? = parameters.empty?
31
-
32
- def keyword?(name) = keyword.name? name
33
-
34
- def keywords = keyword.names
35
-
36
- def kinds = delegates.values.reduce([]) { |collection, delegate| collection + delegate.kinds }
37
-
38
- def named_single_splat_only? = splat.named_single_only?
39
-
40
- def names = delegates.values.reduce([]) { |collection, delegate| collection + delegate.names }
41
-
42
- def positional? = !positional.empty?
43
-
44
- def positionals = positional.names
45
-
46
- def slice collection, keys:
47
- collection.select { |key| !keys.include?(key) || keyword.names.include?(key) }
48
- end
49
-
50
- def to_a = parameters
51
-
52
- def unnamed_splats_only? = splat.unnamed_only?
53
-
54
- private
55
-
56
- attr_reader :parameters, :delegates
57
-
58
- def keyword = delegates.fetch(__method__)
59
-
60
- def splat = delegates.fetch(__method__)
61
-
62
- def positional = delegates.fetch(__method__)
63
- end
64
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Marameters
4
- # Specializes in providing keyword method parameter information only.
5
- class Keyword
6
- PATTERN = %i[key keyreq].freeze
7
-
8
- def initialize parameters, pattern: PATTERN, transformer: TRANSFORMER
9
- @parameters = parameters
10
- @collection = transformer.call parameters, pattern
11
- end
12
-
13
- def empty? = collection.empty?
14
-
15
- def kinds = collection.keys
16
-
17
- def name?(name) = collection.value? name
18
-
19
- def names = collection.values
20
-
21
- private
22
-
23
- attr_reader :parameters, :collection
24
- end
25
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Marameters
4
- # Specializes in providing positional method paratemer information only.
5
- class Positional
6
- PATTERN = %i[req opt].freeze
7
-
8
- def initialize parameters, pattern: PATTERN, transformer: TRANSFORMER
9
- @parameters = parameters
10
- @collection = transformer.call parameters, pattern
11
- end
12
-
13
- def empty? = collection.empty?
14
-
15
- def kinds = collection.keys
16
-
17
- def names = collection.values
18
-
19
- private
20
-
21
- attr_reader :parameters, :collection
22
- end
23
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Marameters
4
- # Specializes in providing passthrough method parameter information only.
5
- class Splat
6
- PATTERN = %i[rest keyrest].freeze
7
-
8
- def initialize parameters, pattern: PATTERN, transformer: TRANSFORMER
9
- @parameters = parameters
10
- @collection = transformer.call parameters, pattern
11
- end
12
-
13
- def empty? = collection.empty?
14
-
15
- def kinds = collection.keys
16
-
17
- def names = collection.values
18
-
19
- def named_double_only? = (parameters in [[:keyrest, *]])
20
-
21
- def named_single_only? = (parameters in [[:rest, *]])
22
-
23
- def unnamed_only? = (parameters in [[:rest]] | [[:keyrest]] | [[:rest], [:keyrest]])
24
-
25
- private
26
-
27
- attr_reader :parameters, :collection
28
- end
29
- end