verifly 0.1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f523cb22087d0d7c74367fd62024dcdfb54304e
4
+ data.tar.gz: 3d6c1a22923b9e3c2878cbed2dd6df65295a0405
5
+ SHA512:
6
+ metadata.gz: eb92359f062778ff644ccd41576b4023fcfcfe0af935b0c6edcf549ec4f9e5ea439bb24f617a0003935431313762925620f2e10366bffcad860d48873862ebf7
7
+ data.tar.gz: 033ac456b04c5cfec227311a83ba3f16f32790632ee9966e103c8ea2d2d09fb36ce83642ec7ccefd9316e32ce65166188014cd613c7997b230d900b924be1ab6
data/lib/verifly.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Verifly provides several usefull classes, but most important
4
+ # is Verifier. Other provided classes are it's dependency.
5
+ # See README.md or their own documentation for more info about usage
6
+ module Verifly
7
+ autoload :VERSION, 'verifly/version'
8
+
9
+ autoload :Applicator, 'verifly/applicator'
10
+ autoload :ApplicatorWithOptions, 'verifly/applicator_with_options'
11
+ autoload :ClassBuilder, 'verifly/class_builder'
12
+ autoload :Verifier, 'verifly/verifier'
13
+ end
@@ -0,0 +1,205 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Verifly
4
+ # @abstract implement `#call`
5
+ # Applies "applicable" objects to given bindings
6
+ # (applicable objects are named based on their use,
7
+ # currently any object is applicable).
8
+ #
9
+ # This class uses ClassBuilder system.
10
+ # When reading the code, we suggest starting from '.call' method
11
+ # @see ClassBuilder
12
+ # @attr applicable [applicable] wrapped applicable object
13
+ class Applicator
14
+ # Proxy is used when applicable itself is an instance of Applicator.
15
+ # It just delegates #call method to applicable
16
+ # @example
17
+ # Applicator.call(Applicator.build(:foo), binding_, context)
18
+ # # => Applicator.call(:foo, binding_, context)
19
+ class Proxy < self
20
+ # @param applicable [Applicator]
21
+ # @return Proxy if applicable is an instance of Applicator
22
+ # @return [nil] otherwise
23
+ def self.build_class(applicable)
24
+ self if applicable.is_a?(Applicator)
25
+ end
26
+
27
+ # @param binding_ [#instance_exec] target to apply applicable
28
+ # @param context additional info to send it to applicable
29
+ # @return application result
30
+ def call(binding_, context)
31
+ applicable.call(binding_, context)
32
+ end
33
+ end
34
+
35
+ # MethodExtractor is used when applicable is a symbol.
36
+ # It extracts extracts method from binding_ and executes it on binding_
37
+ # (so it works just like send except it sends nothing
38
+ # when method arity is zero).
39
+ # @example
40
+ # Applicator.call(Applicator.build(:foo), User.new, context)
41
+ # # => User.new.foo(context)
42
+ # # or => User.new.foo, if it does not accept context
43
+ class MethodExtractor < self
44
+ # @param applicable [Symbol]
45
+ # @return MethodExtractor if applicable is Symbol
46
+ # @return [nil] otherwise
47
+ def self.build_class(applicable)
48
+ self if applicable.is_a?(Symbol)
49
+ end
50
+
51
+ # @param binding_ [#instance_exec] target to apply applicable
52
+ # @param context additional info to send it to applicable
53
+ # @return application result
54
+ def call(binding_, context)
55
+ if binding_.is_a?(Binding)
56
+ call_on_binding(binding_, context)
57
+ else
58
+ invoke_lambda(binding_.method(applicable), binding_, context)
59
+ end
60
+ end
61
+
62
+ private
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 it to applicable
67
+ # @return application result
68
+ def call_on_binding(binding_, context)
69
+ if binding_.receiver.respond_to?(applicable)
70
+ invoke_lambda(binding_.receiver.method(applicable), binding_, context)
71
+ else
72
+ binding_.local_variable_get(applicable)
73
+ end
74
+ end
75
+ end
76
+
77
+ # InstanceEvaluator is used for string. It works like instance_eval or
78
+ # Binding#eval depending on binding_ class
79
+ # @example
80
+ # Applicator.call('foo if context[:foo]', binding_, context)
81
+ # # => foo if context[:foo]
82
+ class InstanceEvaluator < self
83
+ # @param applicable [String]
84
+ # @return InstanceEvaluator if applicable is String
85
+ # @return [nil] otherwise
86
+ def self.build_class(applicable)
87
+ self if applicable.is_a?(String)
88
+ end
89
+
90
+ # @param binding_ [#instance_exec] target to apply applicable
91
+ # @param context additional info to send it to applicable
92
+ # @return application result
93
+ def call(binding_, context)
94
+ if binding_.is_a?(Binding)
95
+ binding_ = binding_.dup
96
+ binding_.local_variable_set(:context, context)
97
+ binding_.eval(applicable, *caller_line)
98
+ else
99
+ binding_.instance_eval(applicable, *caller_line)
100
+ end
101
+ end
102
+
103
+ # @return [String, Integer]
104
+ # file and line where `Applicator.call` was called
105
+ def caller_line
106
+ offset = 2
107
+ backtace_line = caller(offset..offset)[0]
108
+ _, file, line = backtace_line.match(/\A(.+):(\d+):[^:]+\z/).to_a
109
+ [file, Integer(line)]
110
+ end
111
+ end
112
+
113
+ # ProcApplicatior is used when #to_proc is available.
114
+ # It works not just with procs, but also with hashes etc
115
+ # @example with proc
116
+ # Applicator.call(-> { foo }, binding_, context) # => foo
117
+ # @example with hash
118
+ # Applicator.call(Hash[foo: true], binding_, :foo) # => true
119
+ # Applicator.call(Hash[foo: true], binding_, :bar) # => nil
120
+ class ProcApplicatior < self
121
+ # @param applicable [#to_proc]
122
+ # @return ProcApplicatior if applicable accepts #to_proc
123
+ # @return [nil] otherwise
124
+ def self.build_class(applicable)
125
+ self if applicable.respond_to?(:to_proc)
126
+ end
127
+
128
+ # @param binding_ [#instance_exec] target to apply applicable
129
+ # @param context additional info to send it to applicable
130
+ # @return application result
131
+ def call(binding_, context)
132
+ invoke_lambda(applicable.to_proc, binding_, context)
133
+ end
134
+ end
135
+
136
+ # Quoter is used when there is no other way to apply applicatable.
137
+ # @example
138
+ # Applicator.call(true, binding_, context) # => true
139
+ class Quoter < self
140
+ # @return applicable without changes
141
+ def call(*)
142
+ applicable
143
+ end
144
+ end
145
+
146
+ extend ClassBuilder::Mixin
147
+
148
+ self.buildable_classes =
149
+ [Proxy, MethodExtractor, InstanceEvaluator, ProcApplicatior, Quoter]
150
+
151
+ attr_accessor :applicable
152
+
153
+ # Applies applicable on binding_ with context
154
+ # @todo add @see #initialize when it's todo done
155
+ # @param applicable [applicable]
156
+ # see examples in defenitions of sublcasses
157
+ # @param binding_ [#instance_exec]
158
+ # where should applicable be applied. It could be either a generic object,
159
+ # where it would be `instance_exec`uted, or a binding_
160
+ # @param context
161
+ # geneneric data you want to pass to applicable function.
162
+ # If applicable cannot accept params, context will not be sent
163
+ # @return application result
164
+ def self.call(applicable, binding_, context)
165
+ build(applicable).call(binding_, context)
166
+ end
167
+
168
+ # Always use build instead of new
169
+ # @todo add more examples right here
170
+ # @param applicable [applicable]
171
+ # see examples in sublcasses defenitions
172
+ # @api private
173
+ def initialize(applicable)
174
+ self.applicable = applicable
175
+ end
176
+
177
+ # @param [Applicator] other
178
+ # @return [Boolean] true if applicable matches, false otherwise
179
+ def ==(other)
180
+ applicable == other.applicable
181
+ end
182
+
183
+ # @!method call(binding_, context)
184
+ # @abstract
185
+ # Applies applicable on binding_ with context
186
+ # @param binding_ [#instance_exec] binding to be used for applying
187
+ # @param context param that will be passed if requested
188
+ # @return application result
189
+
190
+ private
191
+
192
+ # invokes lambda respecting it's arity
193
+ # @param [Proc] lambda
194
+ # @param binding_ [#instance_exec] binding_ would be used in application
195
+ # @param context param would be passed if lambda arity > 0
196
+ # @return invocation result
197
+ def invoke_lambda(lambda, binding_, context)
198
+ if lambda.arity.zero?
199
+ binding_.instance_exec(&lambda)
200
+ else
201
+ binding_.instance_exec(context, &lambda)
202
+ end
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Verifly
4
+ # An applicator with useful options
5
+ # @example if
6
+ # ApplicatorWithOptions.new(action, if: true)
7
+ # @example unless
8
+ # ApplicatorWithOptions.new(action, unless: false)
9
+ # @attr action [Applicator]
10
+ # main action to apply on call
11
+ # @attr if_condition [Applicator]
12
+ # main action only apply if this applies to truthy value
13
+ # @attr unless_condition [Applicator]
14
+ # main action only apply if this applies to falsey value
15
+ class ApplicatorWithOptions
16
+ attr_accessor :action, :if_condition, :unless_condition
17
+
18
+ # @param action [applicable] main action
19
+ # @option options [applicable] :if
20
+ # main action only apply if this applies to truthy value
21
+ # @option options [applicable] :unless
22
+ # main action only apply if this applies to falsey value
23
+ def initialize(action, **options)
24
+ self.action = Applicator.build(action)
25
+ self.if_condition = Applicator.build(options.fetch(:if, true))
26
+ self.unless_condition = Applicator.build(options.fetch(:unless, false))
27
+ end
28
+
29
+ # Applies main action if if_condition applyd to truthy value
30
+ # and unless_condition applyd to falsey value
31
+ # @param binding_ [#instance_exec]
32
+ # binding to apply (see Applicator)
33
+ # @param context
34
+ # generic context to apply (see Applicator)
35
+ # @return main action application result
36
+ # @return [nil] if condition checks failed
37
+ def call(binding_, context)
38
+ return unless if_condition.call(binding_, context)
39
+ return if unless_condition.call(binding_, context)
40
+ action.call(binding_, context)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Verifly
4
+ # ClassBuilder is something like Uber::Builder, but it
5
+ # allows the child classes to decide whether they will be used.
6
+ # I find it much more OOPish
7
+ # @attr klasses [Array(Class)]
8
+ # classes to iterate during search of most suitable
9
+ class ClassBuilder
10
+ # Mixin provides useful methods to integrate builder subsystem.
11
+ # Feel free to override or just never include it.
12
+ # @attr_writer [Array(Class)] buildable_classes
13
+ # Array of classes which will be checked if they
14
+ # suite constructor arguments. Order matters
15
+ module Mixin
16
+ # Array of classes which would be checked if they
17
+ # suite constructor arguments. Order matters
18
+ # @param klasses [Array(Class)]
19
+ def buildable_classes=(klasses)
20
+ @class_builder = ClassBuilder.new(klasses).freeze
21
+ end
22
+
23
+ # Default implementation of build_class. Feel free to change
24
+ # You also have to override it in buildable_classes
25
+ def build_class(*args, &block)
26
+ if @class_builder
27
+ @class_builder.call(*args, &block)
28
+ else
29
+ self
30
+ end
31
+ end
32
+
33
+ # Default implementation.
34
+ # This method should be used instead of new in all cases
35
+ def build(*arguments, &block)
36
+ build_class(*arguments, &block).new(*arguments, &block)
37
+ end
38
+ end
39
+
40
+ attr_accessor :klasses
41
+
42
+ # @param klasses [Array(Classes)]
43
+ def initialize(klasses)
44
+ self.klasses = klasses
45
+ end
46
+
47
+ # @return [Class] first nonzero class returned by .build_class
48
+ def call(*arguments, &block)
49
+ klasses.each do |klass|
50
+ result = klass.build_class(*arguments, &block)
51
+ return result if result
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Verifly
4
+ # Verifier is a proto-validator class, which allows to
5
+ # use generic messages formats (instead of errors, which are raw text)
6
+ # @abstract
7
+ # implement `#message!` method in terms of super
8
+ # @attr model
9
+ # Generic object to be verified
10
+ # @attr messages [Array]
11
+ # Array with all messages yielded by the verifier
12
+ class Verifier
13
+ autoload :ApplicatorWithOptionsBuilder,
14
+ 'verifly/verifier/applicator_with_options_builder'
15
+
16
+ attr_accessor :model, :messages
17
+
18
+ # @example with block
19
+ # verify { |context| message!() if context[:foo] }
20
+ # @example with proc
21
+ # verify -> (context) { message!() if context[:foo] }
22
+ # @example with hash
23
+ # verify -> { message!() } if: { foo: true }
24
+ # @example cotnext could be ommited from lambda params
25
+ # verify -> { message!() }, if: -> (context) { context[:foo] }
26
+ # @example with symbol
27
+ # verify :foo, if: :bar
28
+ # # calls #foo if #bar is true
29
+ # # bar could either accept context or not
30
+ # @example with string
31
+ # verify 'message!() if context[:foo]'
32
+ # verify 'message!()', if: 'context[:foo]'
33
+ # @example with descedant
34
+ # verify DescendantClass
35
+ # # calls DescendantClass.call(model, context) and merges it's messages
36
+ # @param verifier [#to_proc|Symbol|String|Class|nil]
37
+ # verifier defenition, see examples
38
+ # @option options [#to_proc|Symbol|String|nil] if (true)
39
+ # call verifier if only block invocation result is truthy
40
+ # @option options [#to_proc|Symbol|String|nil] unless (false)
41
+ # call verifier if only block invocation result is falsey
42
+ # @yield context on `#verfify!` calls
43
+ # @return [Array] list of all verifiers already defined
44
+ def self.verify(*args, &block)
45
+ bound_applicators <<
46
+ ApplicatorWithOptionsBuilder.call(self, *args, &block)
47
+ end
48
+
49
+ # @return [Array(ApplicatorWithOptions)]
50
+ # List of applicators, bound by .verify
51
+ def self.bound_applicators
52
+ @bound_applicators ||= []
53
+ end
54
+
55
+ # @param model generic model to validate
56
+ # @param context context in which it would be valdiated
57
+ # @return [Array] list of messages yielded by verifier
58
+ def self.call(model, context = {})
59
+ new(model).verify!(context)
60
+ end
61
+
62
+ # @param model generic model to validate
63
+ def initialize(model)
64
+ self.model = model
65
+ self.messages = []
66
+ end
67
+
68
+ # @param context context in which model would be valdiated
69
+ # @return [Array] list of messages yielded by verifier
70
+ def verify!(context = {})
71
+ self.messages = []
72
+
73
+ self.class.bound_applicators.each do |bound_applicator|
74
+ bound_applicator.call(self, context)
75
+ end
76
+
77
+ messages
78
+ end
79
+
80
+ private
81
+
82
+ # @abstract
83
+ # implement it like `super { Message.new(status, text, description) }`
84
+ # @return new message (yield result)
85
+ def message!(*)
86
+ new_message = yield
87
+ @messages << new_message
88
+ new_message
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,74 @@
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
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Verifly
4
+ # Specifies Verifly version
5
+ #
6
+ # Semantical naming: 0.a.b.c where
7
+ # * 0 is for unreleased
8
+ # * a is for public api changes
9
+ # * b is for private api changes
10
+ # * c is for changes, not changing private api
11
+ VERSION = '0.1.0.0'
12
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: verifly
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Smirnov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.14'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.48'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.48'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.9.8
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.9.8
97
+ - !ruby/object:Gem::Dependency
98
+ name: launchy
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.4'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.4'
111
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.8.19
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.8.19
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.15'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.15'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec-its
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.1'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.1'
153
+ description: ''
154
+ email:
155
+ - begdory4@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - lib/verifly.rb
161
+ - lib/verifly/applicator.rb
162
+ - lib/verifly/applicator_with_options.rb
163
+ - lib/verifly/class_builder.rb
164
+ - lib/verifly/verifier.rb
165
+ - lib/verifly/verifier/applicator_with_options_builder.rb
166
+ - lib/verifly/version.rb
167
+ homepage: http://example.com
168
+ licenses: []
169
+ metadata: {}
170
+ post_install_message:
171
+ rdoc_options: []
172
+ require_paths:
173
+ - lib
174
+ required_ruby_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ requirements: []
185
+ rubyforge_project:
186
+ rubygems_version: 2.5.2
187
+ signing_key:
188
+ specification_version: 4
189
+ summary: ''
190
+ test_files: []