verifly 0.1.0.0 → 0.2.0.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 +4 -4
- data/lib/verifly.rb +3 -3
- data/lib/verifly/applicator.rb +20 -20
- data/lib/verifly/applicator_with_options.rb +14 -7
- data/lib/verifly/class_builder.rb +8 -7
- data/lib/verifly/verifier.rb +40 -20
- data/lib/verifly/version.rb +6 -6
- metadata +14 -13
- data/lib/verifly/verifier/applicator_with_options_builder.rb +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb480769ef6ceb801e8d09f52eb9eab8a31bd356
|
4
|
+
data.tar.gz: fb911427e5d26cb1f10ae5142af217aae51110fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e22e09f78908ed3e451c3ce90d1e1c7d439cb1c69c8c356c4fd858ea2bbd3a071713c62666d6c74e364bc57faa61207cd3425e897b76fc834a1394f2bbe8bcb5
|
7
|
+
data.tar.gz: c5f4a1fd4a51b470cc12c5b4f57086a0e526919abbbbb949ef6781d3efb2e2b6645b879a14a4866ebeecb9ffaf4bb504ab2607e6f4258d0f61aa642ef1016c39
|
data/lib/verifly.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Verifly provides several
|
4
|
-
#
|
5
|
-
# See README.md or
|
3
|
+
# Verifly provides several useful classes, but Verifier is the most
|
4
|
+
# important one, while others depend on it.
|
5
|
+
# See README.md or in-code documentation for more info.
|
6
6
|
module Verifly
|
7
7
|
autoload :VERSION, 'verifly/version'
|
8
8
|
|
data/lib/verifly/applicator.rb
CHANGED
@@ -33,7 +33,7 @@ module Verifly
|
|
33
33
|
end
|
34
34
|
|
35
35
|
# MethodExtractor is used when applicable is a symbol.
|
36
|
-
# It extracts
|
36
|
+
# It extracts a method from binding_ and executes it on binding_
|
37
37
|
# (so it works just like send except it sends nothing
|
38
38
|
# when method arity is zero).
|
39
39
|
# @example
|
@@ -42,14 +42,14 @@ module Verifly
|
|
42
42
|
# # or => User.new.foo, if it does not accept context
|
43
43
|
class MethodExtractor < self
|
44
44
|
# @param applicable [Symbol]
|
45
|
-
# @return MethodExtractor if applicable is Symbol
|
45
|
+
# @return MethodExtractor if applicable is a Symbol
|
46
46
|
# @return [nil] otherwise
|
47
47
|
def self.build_class(applicable)
|
48
48
|
self if applicable.is_a?(Symbol)
|
49
49
|
end
|
50
50
|
|
51
|
-
# @param binding_ [#instance_exec] target to apply applicable
|
52
|
-
# @param context additional info to send
|
51
|
+
# @param binding_ [#instance_exec] target to apply applicable to
|
52
|
+
# @param context additional info to send to applicable
|
53
53
|
# @return application result
|
54
54
|
def call(binding_, context)
|
55
55
|
if binding_.is_a?(Binding)
|
@@ -61,9 +61,9 @@ module Verifly
|
|
61
61
|
|
62
62
|
private
|
63
63
|
|
64
|
-
# When Binding is target, we have to respect both methods and variables
|
65
|
-
# @param binding_ [Binding] target to apply applicable
|
66
|
-
# @param context additional info to send
|
64
|
+
# When Binding is a target, we have to respect both methods and variables
|
65
|
+
# @param binding_ [Binding] target to apply applicable to
|
66
|
+
# @param context additional info to send to applicable
|
67
67
|
# @return application result
|
68
68
|
def call_on_binding(binding_, context)
|
69
69
|
if binding_.receiver.respond_to?(applicable)
|
@@ -74,21 +74,21 @@ module Verifly
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
# InstanceEvaluator is used for
|
77
|
+
# InstanceEvaluator is used for strings. It works like instance_eval or
|
78
78
|
# Binding#eval depending on binding_ class
|
79
79
|
# @example
|
80
80
|
# Applicator.call('foo if context[:foo]', binding_, context)
|
81
81
|
# # => foo if context[:foo]
|
82
82
|
class InstanceEvaluator < self
|
83
83
|
# @param applicable [String]
|
84
|
-
# @return InstanceEvaluator if applicable is String
|
84
|
+
# @return InstanceEvaluator if applicable is a String
|
85
85
|
# @return [nil] otherwise
|
86
86
|
def self.build_class(applicable)
|
87
87
|
self if applicable.is_a?(String)
|
88
88
|
end
|
89
89
|
|
90
|
-
# @param binding_ [#instance_exec] target to apply applicable
|
91
|
-
# @param context additional info to send
|
90
|
+
# @param binding_ [#instance_exec] target to apply applicable to
|
91
|
+
# @param context additional info to send to applicable
|
92
92
|
# @return application result
|
93
93
|
def call(binding_, context)
|
94
94
|
if binding_.is_a?(Binding)
|
@@ -111,10 +111,10 @@ module Verifly
|
|
111
111
|
end
|
112
112
|
|
113
113
|
# ProcApplicatior is used when #to_proc is available.
|
114
|
-
# It works not
|
115
|
-
# @example with proc
|
114
|
+
# It works not only with procs, but also with hashes etc
|
115
|
+
# @example with a proc
|
116
116
|
# Applicator.call(-> { foo }, binding_, context) # => foo
|
117
|
-
# @example with hash
|
117
|
+
# @example with a hash
|
118
118
|
# Applicator.call(Hash[foo: true], binding_, :foo) # => true
|
119
119
|
# Applicator.call(Hash[foo: true], binding_, :bar) # => nil
|
120
120
|
class ProcApplicatior < self
|
@@ -125,8 +125,8 @@ module Verifly
|
|
125
125
|
self if applicable.respond_to?(:to_proc)
|
126
126
|
end
|
127
127
|
|
128
|
-
# @param binding_ [#instance_exec] target to apply applicable
|
129
|
-
# @param context additional info to send
|
128
|
+
# @param binding_ [#instance_exec] target to apply applicable to
|
129
|
+
# @param context additional info to send to applicable
|
130
130
|
# @return application result
|
131
131
|
def call(binding_, context)
|
132
132
|
invoke_lambda(applicable.to_proc, binding_, context)
|
@@ -151,9 +151,9 @@ module Verifly
|
|
151
151
|
attr_accessor :applicable
|
152
152
|
|
153
153
|
# Applies applicable on binding_ with context
|
154
|
-
# @todo add @see #initialize when
|
154
|
+
# @todo add @see #initialize when its todo is done
|
155
155
|
# @param applicable [applicable]
|
156
|
-
# see examples in
|
156
|
+
# see examples in definitions of subclasses
|
157
157
|
# @param binding_ [#instance_exec]
|
158
158
|
# where should applicable be applied. It could be either a generic object,
|
159
159
|
# where it would be `instance_exec`uted, or a binding_
|
@@ -168,7 +168,7 @@ module Verifly
|
|
168
168
|
# Always use build instead of new
|
169
169
|
# @todo add more examples right here
|
170
170
|
# @param applicable [applicable]
|
171
|
-
# see examples in
|
171
|
+
# see examples in definitions of sublclasses
|
172
172
|
# @api private
|
173
173
|
def initialize(applicable)
|
174
174
|
self.applicable = applicable
|
@@ -189,7 +189,7 @@ module Verifly
|
|
189
189
|
|
190
190
|
private
|
191
191
|
|
192
|
-
# invokes lambda respecting
|
192
|
+
# invokes lambda respecting its arity
|
193
193
|
# @param [Proc] lambda
|
194
194
|
# @param binding_ [#instance_exec] binding_ would be used in application
|
195
195
|
# @param context param would be passed if lambda arity > 0
|
@@ -9,25 +9,32 @@ module Verifly
|
|
9
9
|
# @attr action [Applicator]
|
10
10
|
# main action to apply on call
|
11
11
|
# @attr if_condition [Applicator]
|
12
|
-
# main action only apply if
|
12
|
+
# main action only apply if condition evaluates to truthy value
|
13
13
|
# @attr unless_condition [Applicator]
|
14
|
-
# main action only apply if
|
14
|
+
# main action only apply if condition evaluates to falsey value
|
15
15
|
class ApplicatorWithOptions
|
16
16
|
attr_accessor :action, :if_condition, :unless_condition
|
17
17
|
|
18
|
+
# @!method initialize(action = block, options = {}, &block)
|
18
19
|
# @param action [applicable] main action
|
19
20
|
# @option options [applicable] :if
|
20
|
-
# main action only
|
21
|
+
# main action is only applied if this evaluates to truthy value
|
21
22
|
# @option options [applicable] :unless
|
22
|
-
# main action only
|
23
|
-
|
23
|
+
# main action is only applied if this evaluates to falsey value
|
24
|
+
# @raise [ArgumentError] if there is more than two arguments and block
|
25
|
+
# @raise [ArgumentError] if there is zero arguments and no block
|
26
|
+
def initialize(*args, &block)
|
27
|
+
action, options, *rest = block ? [block, *args] : args
|
28
|
+
options ||= {}
|
29
|
+
raise ArgumentError unless action && rest.empty?
|
30
|
+
|
24
31
|
self.action = Applicator.build(action)
|
25
32
|
self.if_condition = Applicator.build(options.fetch(:if, true))
|
26
33
|
self.unless_condition = Applicator.build(options.fetch(:unless, false))
|
27
34
|
end
|
28
35
|
|
29
|
-
# Applies main action if if_condition
|
30
|
-
# and unless_condition
|
36
|
+
# Applies main action if if_condition is evaluated to truthy value
|
37
|
+
# and unless_condition is evaluated to falsey value
|
31
38
|
# @param binding_ [#instance_exec]
|
32
39
|
# binding to apply (see Applicator)
|
33
40
|
# @param context
|
@@ -1,27 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Verifly
|
4
|
-
# ClassBuilder is
|
5
|
-
# allows
|
6
|
-
# I find it much more
|
4
|
+
# ClassBuilder is similar to Uber::Builder, but it
|
5
|
+
# allows child classes to decide whether they will be used.
|
6
|
+
# I find it much more object-oriented
|
7
7
|
# @attr klasses [Array(Class)]
|
8
8
|
# classes to iterate during search of most suitable
|
9
9
|
class ClassBuilder
|
10
|
-
# Mixin provides useful methods to integrate builder subsystem.
|
10
|
+
# Mixin provides useful methods to integrate into builder subsystem.
|
11
11
|
# Feel free to override or just never include it.
|
12
12
|
# @attr_writer [Array(Class)] buildable_classes
|
13
13
|
# Array of classes which will be checked if they
|
14
14
|
# suite constructor arguments. Order matters
|
15
15
|
module Mixin
|
16
|
-
# Array of classes which
|
16
|
+
# Array of classes which will be checked if they
|
17
17
|
# suite constructor arguments. Order matters
|
18
18
|
# @param klasses [Array(Class)]
|
19
19
|
def buildable_classes=(klasses)
|
20
20
|
@class_builder = ClassBuilder.new(klasses).freeze
|
21
21
|
end
|
22
22
|
|
23
|
-
# Default implementation of build_class.
|
24
|
-
#
|
23
|
+
# Default implementation of build_class.
|
24
|
+
# Feel free to change it, but you'll have to override it in
|
25
|
+
# buildable_classes
|
25
26
|
def build_class(*args, &block)
|
26
27
|
if @class_builder
|
27
28
|
@class_builder.call(*args, &block)
|
data/lib/verifly/verifier.rb
CHANGED
@@ -15,35 +15,54 @@ module Verifly
|
|
15
15
|
|
16
16
|
attr_accessor :model, :messages
|
17
17
|
|
18
|
-
#
|
18
|
+
# @!method self.verify(action = block, options = {}, &block)
|
19
|
+
# @example with a block
|
19
20
|
# verify { |context| message!() if context[:foo] }
|
20
|
-
# @example with proc
|
21
|
+
# @example with a proc
|
21
22
|
# verify -> (context) { message!() if context[:foo] }
|
22
|
-
# @example with hash
|
23
|
+
# @example with a hash
|
23
24
|
# verify -> { message!() } if: { foo: true }
|
24
|
-
# @example
|
25
|
+
# @example context can be provided as a lambda param
|
25
26
|
# verify -> { message!() }, if: -> (context) { context[:foo] }
|
26
|
-
# @example with symbol
|
27
|
+
# @example with a symbol
|
27
28
|
# verify :foo, if: :bar
|
28
29
|
# # calls #foo if #bar is true
|
29
|
-
# # bar
|
30
|
-
# @example with string
|
30
|
+
# # bar can accept context if desired
|
31
|
+
# @example with a string
|
31
32
|
# verify 'message!() if context[:foo]'
|
32
33
|
# verify 'message!()', if: 'context[:foo]'
|
33
|
-
# @
|
34
|
-
# verify DescendantClass
|
35
|
-
# # calls DescendantClass.call(model, context) and merges it's messages
|
36
|
-
# @param verifier [#to_proc|Symbol|String|Class|nil]
|
34
|
+
# @param action [#to_proc|Symbol|String|nil]
|
37
35
|
# verifier defenition, see examples
|
38
36
|
# @option options [#to_proc|Symbol|String|nil] if (true)
|
37
|
+
# call verifier only if block invocation result is truthy
|
38
|
+
# @option options [#to_proc|Symbol|String|nil] unless (false)
|
39
|
+
# call verifier only if block invocation result is falsey
|
40
|
+
# @yield [context] yields on `#verfify!` calls
|
41
|
+
# @raise [ArgumentError] if there is more than two arguments and block
|
42
|
+
# @raise [ArgumentError] if there is zero arguments and no block
|
43
|
+
# @return [Array] list of all defined verifiers
|
44
|
+
def self.verify(*args, &block)
|
45
|
+
bound_applicators << ApplicatorWithOptions.new(*args, &block)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Calls DescendantClass.call(model, context) and merges its messages.
|
49
|
+
# DescendantClass should be a descendant of current class
|
50
|
+
# @param name [String, Class]
|
51
|
+
# name of descendant class or descendant class itself
|
52
|
+
# @option options [#to_proc|Symbol|String|nil] if (true)
|
39
53
|
# call verifier if only block invocation result is truthy
|
40
54
|
# @option options [#to_proc|Symbol|String|nil] unless (false)
|
41
55
|
# call verifier if only block invocation result is falsey
|
42
|
-
# @yield context on `#verfify!` calls
|
43
56
|
# @return [Array] list of all verifiers already defined
|
44
|
-
def self.
|
45
|
-
|
46
|
-
|
57
|
+
def self.verify_with(name, options = {})
|
58
|
+
verify(options) do |context|
|
59
|
+
verifier = name.is_a?(String) ? Object.const_get(name, false) : name
|
60
|
+
raise ArgumentError, <<~ERROR unless verifier < self.class
|
61
|
+
Nested verifiers should be inherited from verifier they nested are in
|
62
|
+
ERROR
|
63
|
+
|
64
|
+
messages.concat(verifier.call(model, context))
|
65
|
+
end
|
47
66
|
end
|
48
67
|
|
49
68
|
# @return [Array(ApplicatorWithOptions)]
|
@@ -53,8 +72,8 @@ module Verifly
|
|
53
72
|
end
|
54
73
|
|
55
74
|
# @param model generic model to validate
|
56
|
-
# @param context context in which it
|
57
|
-
# @return [Array] list of messages yielded by verifier
|
75
|
+
# @param context context in which it is valdiated
|
76
|
+
# @return [Array] list of messages yielded by the verifier
|
58
77
|
def self.call(model, context = {})
|
59
78
|
new(model).verify!(context)
|
60
79
|
end
|
@@ -65,8 +84,8 @@ module Verifly
|
|
65
84
|
self.messages = []
|
66
85
|
end
|
67
86
|
|
68
|
-
# @param context context in which model
|
69
|
-
# @return [Array] list of messages yielded by verifier
|
87
|
+
# @param context context in which model is valdiated
|
88
|
+
# @return [Array] list of messages yielded by the verifier
|
70
89
|
def verify!(context = {})
|
71
90
|
self.messages = []
|
72
91
|
|
@@ -80,7 +99,8 @@ module Verifly
|
|
80
99
|
private
|
81
100
|
|
82
101
|
# @abstract
|
83
|
-
#
|
102
|
+
# implementation example:
|
103
|
+
# `super { Message.new(status, text, description) }`
|
84
104
|
# @return new message (yield result)
|
85
105
|
def message!(*)
|
86
106
|
new_message = yield
|
data/lib/verifly/version.rb
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
module Verifly
|
4
4
|
# Specifies Verifly version
|
5
5
|
#
|
6
|
-
#
|
7
|
-
# * 0
|
8
|
-
# * a
|
9
|
-
# * b
|
10
|
-
# * c
|
11
|
-
VERSION = '0.
|
6
|
+
# Semantic versioning: 0.a.b.c where
|
7
|
+
# * 0 stands for unreleased
|
8
|
+
# * a stands for public api changes
|
9
|
+
# * b stands for private api changes
|
10
|
+
# * c stands for patch changes (not touching public or private api)
|
11
|
+
VERSION = '0.2.0.0'
|
12
12
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: verifly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Smirnov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '0.10'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '0.10'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,7 +150,7 @@ dependencies:
|
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '1.1'
|
153
|
-
description: ''
|
153
|
+
description: 'See more info at http://www.rubydoc.info/gems/verifly/0.2.0.0 '
|
154
154
|
email:
|
155
155
|
- begdory4@gmail.com
|
156
156
|
executables: []
|
@@ -162,10 +162,10 @@ files:
|
|
162
162
|
- lib/verifly/applicator_with_options.rb
|
163
163
|
- lib/verifly/class_builder.rb
|
164
164
|
- lib/verifly/verifier.rb
|
165
|
-
- lib/verifly/verifier/applicator_with_options_builder.rb
|
166
165
|
- lib/verifly/version.rb
|
167
|
-
homepage:
|
168
|
-
licenses:
|
166
|
+
homepage: https://github.com/umbrellio/verifly
|
167
|
+
licenses:
|
168
|
+
- MIT
|
169
169
|
metadata: {}
|
170
170
|
post_install_message:
|
171
171
|
rdoc_options: []
|
@@ -173,9 +173,9 @@ require_paths:
|
|
173
173
|
- lib
|
174
174
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
175
|
requirements:
|
176
|
-
- - "
|
176
|
+
- - "~>"
|
177
177
|
- !ruby/object:Gem::Version
|
178
|
-
version: '
|
178
|
+
version: '2.3'
|
179
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
180
|
requirements:
|
181
181
|
- - ">="
|
@@ -186,5 +186,6 @@ rubyforge_project:
|
|
186
186
|
rubygems_version: 2.5.2
|
187
187
|
signing_key:
|
188
188
|
specification_version: 4
|
189
|
-
summary: ''
|
189
|
+
summary: An api to run sequential checks like 'ActiveModel::Validations' do, but with
|
190
|
+
generic messages instead of errors
|
190
191
|
test_files: []
|
@@ -1,74 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Verifly
|
4
|
-
class Verifier
|
5
|
-
# Builds ApplicatorWithOptions from different invocation styles.
|
6
|
-
# @api private
|
7
|
-
# @attr base [Class]
|
8
|
-
# class for which applicator_with_options should be built
|
9
|
-
# @attr args [Array]
|
10
|
-
# array of arguments Verifier.verify invoked with
|
11
|
-
# @attr block [Proc]
|
12
|
-
# block Verifier.verify invoked with
|
13
|
-
ApplicatorWithOptionsBuilder = Struct.new(:base, :args, :block)
|
14
|
-
class ApplicatorWithOptionsBuilder
|
15
|
-
# @!method self.call(base)
|
16
|
-
# transforms `verify` arguments to class attributes
|
17
|
-
# and invokes calculation
|
18
|
-
# @raise [ArgumentError]
|
19
|
-
# @return [ApplicatorWithOptions] resulting applicator_with_options
|
20
|
-
def self.call(base, *args, &block)
|
21
|
-
new(base, args, block).call
|
22
|
-
end
|
23
|
-
|
24
|
-
# Tries different invocation styles until one matches
|
25
|
-
# @see #try_block
|
26
|
-
# @see #try_nesting
|
27
|
-
# @see #default
|
28
|
-
# @raise [ArgumentError]
|
29
|
-
# @return [ApplicatorWithOptions] resulting applicator_with_options
|
30
|
-
def call
|
31
|
-
try_block || try_nesting || default
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
# @example with options
|
37
|
-
# verify(if: true) { ... }
|
38
|
-
# @example without options
|
39
|
-
# verify { ... }
|
40
|
-
# @return [ApplicatorWithOptions]
|
41
|
-
def try_block
|
42
|
-
ApplicatorWithOptions.new(block, *args) if block
|
43
|
-
end
|
44
|
-
|
45
|
-
# @example correct
|
46
|
-
# verify SubVerifier
|
47
|
-
# @example incorrect
|
48
|
-
# verify Class
|
49
|
-
# @raise [ArgumentError]
|
50
|
-
# @return [ApplicatorWithOptions]
|
51
|
-
def try_nesting
|
52
|
-
verifier, *rest = args
|
53
|
-
return unless verifier.is_a?(Class)
|
54
|
-
raise ArgumentError, <<~ERROR unless verifier < base
|
55
|
-
Nested verifiers should be inherited from verifier they nested are in
|
56
|
-
ERROR
|
57
|
-
|
58
|
-
applicable = lambda do |context|
|
59
|
-
messages.concat(verifier.call(model, context))
|
60
|
-
end
|
61
|
-
|
62
|
-
ApplicatorWithOptions.new(applicable, *rest)
|
63
|
-
end
|
64
|
-
|
65
|
-
# Simply passes args to ApplicatorWithOptions
|
66
|
-
# @example
|
67
|
-
# verify(:foo, unless: false)
|
68
|
-
# @return [ApplicatorWithOptions]
|
69
|
-
def default
|
70
|
-
ApplicatorWithOptions.new(*args)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|