sinclair 1.6.5 → 1.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82dceb39442cd887b9188fd91bc0b225aedae2504e180a61ba3f5ec6d18b6de3
4
- data.tar.gz: '09dafbb7642c1021c47c7ab4db0732f5f514c881d61adba3a7d1cc3c6ac620ca'
3
+ metadata.gz: 3c38de6f509924f2b5b98eff6492718504c2f83111360e4985c67e421a2cebc5
4
+ data.tar.gz: 9210a66214f8fa11a6c42496b00f1045bf2268adde7c049b1481d47b21aba6cd
5
5
  SHA512:
6
- metadata.gz: 794343fe9272e52bd35a9b0a23c3b2e5e64d45a291f29b75d94335b6ff0f65e6d117585ca75562e9fad94b186d5cc1d66126caec9df3d06a4497cee5d6fe3fa8
7
- data.tar.gz: ac6e7f371357b46111d9eceaf0b5d6a06816d1bd537665d4824d96713762e59ce7eb986048ac18d4219d9fd860e165f200c8d5cbfea34e62f04a0d7e7c641959
6
+ metadata.gz: 7536c4b9bc1198fd23777b4bd73d20479d0c94d6ef03444e48e4c05687623d0c4f2cdcdb8ad6bfef4a20832307f04021d14bdd628bd3ff2cbf6e1c611c5be7ad
7
+ data.tar.gz: f0c246aa85bd9989337240ded4aa36634b80dcf1042f8776663b05ebea81220dd13b60f45f8c12ee4aa95064be096094c68d9fe6619d517fa36a879ffe897011
data/README.md CHANGED
@@ -15,7 +15,7 @@ methods
15
15
 
16
16
  Yard Documentation
17
17
  -------------------
18
- [https://www.rubydoc.info/gems/sinclair/1.6.5](https://www.rubydoc.info/gems/sinclair/1.6.5)
18
+ [https://www.rubydoc.info/gems/sinclair/1.6.6](https://www.rubydoc.info/gems/sinclair/1.6.6)
19
19
 
20
20
  Installation
21
21
  ---------------
@@ -452,6 +452,8 @@ Options allows projects to have an easy to configure option object
452
452
  ```ruby
453
453
  class ConnectionOptions < Sinclair::Options
454
454
  with_options :timeout, :retries, port: 443, protocol: 'https'
455
+
456
+ # skip_validation if you dont want to validate intialization arguments
455
457
  end
456
458
 
457
459
  options = ConnectionOptions.new(
@@ -20,64 +20,10 @@ class Sinclair
20
20
  # options.port # returns 8080
21
21
  # options.protocol # returns 'https'
22
22
  class Options
23
- autoload :Builder, 'sinclair/options/builder'
23
+ autoload :Builder, 'sinclair/options/builder'
24
+ autoload :ClassMethods, 'sinclair/options/class_methods'
24
25
 
25
- class << self
26
- # @api private
27
- #
28
- # returns invalid options
29
- #
30
- # @return [Array<Symbol>]
31
- def invalid_options_in(names)
32
- names.map(&:to_sym) - allowed_options.to_a
33
- end
34
-
35
- # @api private
36
- #
37
- # Allow new option
38
- #
39
- # This does not create the method
40
- #
41
- # @param name [String,Symbol] options to be allowed
42
- #
43
- # @return [Set<Symbol>]
44
- def allow(name)
45
- allowed_options << name.to_sym
46
- end
47
-
48
- # @api private
49
- # @private
50
- #
51
- # Options allowed when initializing options
52
- #
53
- # @return [Set<Symbol>]
54
- def allowed_options
55
- @allowed_options ||= superclass.try(:allowed_options).dup || Set.new
56
- end
57
-
58
- private
59
-
60
- # @api public
61
- # @!visibility public
62
- #
63
- # Add available options
64
- #
65
- # @example (see Options)
66
- #
67
- # @return (see Sinclair#build)
68
- #
69
- # @overload with_options(*options)
70
- # @param options [Array<Symbol>] list of accepted
71
- # options
72
- # @overload with_options(*options, **defaults)
73
- # @param options [Array<Symbol>] list of accepted
74
- # options
75
- # @param defaults [Hash<Symbol,Object>] default options
76
- # hash
77
- def with_options(*options)
78
- Builder.new(self, *options).build
79
- end
80
- end
26
+ extend ClassMethods
81
27
 
82
28
  # @param options [Hash] hash with options (see {.options}, {.with_options})
83
29
  # @example (see Options)
@@ -108,7 +54,7 @@ class Sinclair
108
54
  # # protocol: 'https'
109
55
  # # }
110
56
  def to_h
111
- self.class.allowed_options.inject({}) do |hash, option|
57
+ allowed_options.inject({}) do |hash, option|
112
58
  hash.merge(option => public_send(option))
113
59
  end
114
60
  end
@@ -121,13 +67,15 @@ class Sinclair
121
67
  def ==(other)
122
68
  return false unless self.class == other.class
123
69
 
124
- self.class.allowed_options.all? do |name|
70
+ allowed_options.all? do |name|
125
71
  public_send(name) == other.public_send(name)
126
72
  end
127
73
  end
128
74
 
129
75
  private
130
76
 
77
+ delegate :allowed_options, :skip_validation?, :invalid_options_in, to: :class
78
+
131
79
  # @private
132
80
  # @api private
133
81
  #
@@ -137,7 +85,9 @@ class Sinclair
137
85
  #
138
86
  # @return [NilClass]
139
87
  def check_options(options)
140
- invalid_keys = self.class.invalid_options_in(options.keys)
88
+ return if skip_validation?
89
+
90
+ invalid_keys = invalid_options_in(options.keys)
141
91
 
142
92
  return if invalid_keys.empty?
143
93
 
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ class Sinclair
6
+ class Options
7
+ # Class Methods for {Sinclai::Options}
8
+ module ClassMethods
9
+ # @api private
10
+ #
11
+ # returns invalid options
12
+ #
13
+ # @return [Array<Symbol>]
14
+ def invalid_options_in(names)
15
+ names.map(&:to_sym) - allowed_options.to_a
16
+ end
17
+
18
+ # @api private
19
+ #
20
+ # Allow new option
21
+ #
22
+ # This does not create the method
23
+ #
24
+ # @param name [String,Symbol] options to be allowed
25
+ #
26
+ # @return [Set<Symbol>]
27
+ def allow(name)
28
+ allowed_options << name.to_sym
29
+ end
30
+
31
+ # @api private
32
+ # @private
33
+ #
34
+ # Options allowed when initializing options
35
+ #
36
+ # @return [Set<Symbol>]
37
+ def allowed_options
38
+ @allowed_options ||= superclass.try(:allowed_options).dup || Set.new
39
+ end
40
+
41
+ # @api private
42
+ #
43
+ # checks if class skips initialization validation
44
+ #
45
+ # @return [TrueClass,FalseClass]
46
+ def skip_validation?
47
+ @skip_validation ||= superclass.try(:skip_validation?) || false
48
+ end
49
+
50
+ private
51
+
52
+ # @api public
53
+ # @!visibility public
54
+ #
55
+ # Add available options
56
+ #
57
+ # @example (see Options)
58
+ #
59
+ # @return (see Sinclair#build)
60
+ #
61
+ # @overload with_options(*options)
62
+ # @param options [Array<Symbol>] list of accepted
63
+ # options
64
+ # @overload with_options(*options, **defaults)
65
+ # @param options [Array<Symbol>] list of accepted
66
+ # options
67
+ # @param defaults [Hash<Symbol,Object>] default options
68
+ # hash
69
+ def with_options(*options)
70
+ Builder.new(self, *options).build
71
+ end
72
+
73
+ # @api public
74
+ # @!visibility public
75
+ #
76
+ # Changes class to skip attributes validation
77
+ #
78
+ # when initializing options, options
79
+ # will accept any arguments when validation
80
+ # is skipped
81
+ #
82
+ # @return [TrueClass]
83
+ #
84
+ # @example
85
+ # class BuilderOptions < Sinclair::Options
86
+ # with_options :name
87
+ #
88
+ # skip_validation
89
+ # end
90
+ # options = BuilderOptions.new(name: 'Joe', age: 10)
91
+ #
92
+ # options.name # returns 'Joe'
93
+ # options.try(:age) # returns nil
94
+ def skip_validation
95
+ @skip_validation = true
96
+ end
97
+ end
98
+ end
99
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Sinclair
4
- VERSION = '1.6.5'
4
+ VERSION = '1.6.6'
5
5
  end
@@ -13,5 +13,14 @@ describe Sinclair::OptionsParser do
13
13
  expect(model.the_method).to eq('The value is not 10 but 20')
14
14
  end
15
15
  end
16
+
17
+ describe '.skip_validation' do
18
+ it 'accepts options' do
19
+ options = BuilderOptions.new(name: 'Joe', age: 10)
20
+
21
+ expect(options.name).to eq('Joe')
22
+ expect(options.try(:age)).to be_nil
23
+ end
24
+ end
16
25
  end
17
26
  end
@@ -0,0 +1,255 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Sinclair::Options::ClassMethods do
6
+ subject(:options) { klass.new }
7
+
8
+ describe '.with_options' do
9
+ let(:klass) { Class.new(Sinclair::Options) }
10
+ let(:test_keys) { %i[timeout retries invalid] }
11
+
12
+ context 'when calling with keys' do
13
+ it 'add first method' do
14
+ expect { klass.send(:with_options, :timeout, 'retries') }
15
+ .to add_method(:timeout).to(klass)
16
+ end
17
+
18
+ it 'add second method' do
19
+ expect { klass.send(:with_options, :timeout, 'retries') }
20
+ .to add_method(:retries).to(klass)
21
+ end
22
+
23
+ it 'adds options to allowed' do
24
+ expect { klass.send(:with_options, :timeout, 'retries') }
25
+ .to change { klass.invalid_options_in(test_keys) }
26
+ .from(%i[timeout retries invalid])
27
+ .to([:invalid])
28
+ end
29
+
30
+ it do
31
+ expect { klass.send(:with_options, :timeout, 'retries') }
32
+ .not_to change {
33
+ Sinclair::Options.invalid_options_in(%i[timeout retries invalid])
34
+ }
35
+ end
36
+
37
+ context 'when when calling method after building' do
38
+ before { klass.send(:with_options, :timeout, 'retries') }
39
+
40
+ it { expect(options.timeout).to be_nil }
41
+ end
42
+
43
+ context 'when calling method twice' do
44
+ before { klass.send(:with_options, :timeout, retries: 10) }
45
+
46
+ it do
47
+ expect { klass.send(:with_options, :timeout, :retries) }
48
+ .not_to change {
49
+ klass.invalid_options_in(%i[timeout retries invalid])
50
+ }
51
+ end
52
+ end
53
+ end
54
+
55
+ context 'when calling with a hash' do
56
+ it 'adds method' do
57
+ expect { klass.send(:with_options, timeout_sec: 10, 'retries' => 20) }
58
+ .to add_method(:timeout_sec).to(klass)
59
+ end
60
+
61
+ context 'when when calling method after building' do
62
+ before { klass.send(:with_options, timeout_sec: 10, 'retries' => 20) }
63
+
64
+ it 'returns default value' do
65
+ expect(options.retries).to eq(20)
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'when calling on subclass' do
71
+ let(:super_class) { Class.new(Sinclair::Options) }
72
+ let(:klass) { Class.new(super_class) }
73
+
74
+ let(:test_keys) do
75
+ %i[timeout retries name protocol port invalid]
76
+ end
77
+
78
+ before { super_class.send(:with_options, :timeout, 'retries', name: 'My Connector') }
79
+
80
+ it 'add first method' do
81
+ expect { klass.send(:with_options, :protocol, 'port' => 443) }
82
+ .to add_method(:protocol).to(klass)
83
+ end
84
+
85
+ it 'add second method' do
86
+ expect { klass.send(:with_options, :protocol, 'port' => 443) }
87
+ .to add_method(:port).to(klass)
88
+ end
89
+
90
+ it do
91
+ expect { klass.send(:with_options, 'protocol', port: 443) }
92
+ .to change {
93
+ klass.invalid_options_in(test_keys)
94
+ }.from(%i[protocol port invalid])
95
+ .to([:invalid])
96
+ end
97
+
98
+ it do
99
+ expect { klass.send(:with_options, 'protocol', port: 443) }
100
+ .not_to change {
101
+ super_class.invalid_options_in(%i[protocol port])
102
+ }
103
+ end
104
+
105
+ context 'when overriding a method' do
106
+ it do
107
+ expect { klass.send(:with_options, :name, timeout: 10) }
108
+ .not_to change { klass.invalid_options_in(%i[name timeout]) }
109
+ end
110
+
111
+ it 'change methods to return new default' do
112
+ expect { klass.send(:with_options, :name, timeout: 10) }
113
+ .to change { klass.new.timeout }
114
+ .from(nil).to(10)
115
+ end
116
+
117
+ it 'change methods to return without default' do
118
+ expect { klass.send(:with_options, :name, timeout: 10) }
119
+ .to change { klass.new.name }
120
+ .from('My Connector').to(nil)
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ describe '.invalid_options_in' do
127
+ let(:klass) { Class.new(Sinclair::Options) }
128
+ let(:test_keys) { %i[timeout invalid] }
129
+
130
+ it 'returns alls keys as invalid' do
131
+ expect(klass.invalid_options_in(test_keys))
132
+ .to eq(test_keys)
133
+ end
134
+
135
+ context 'when allowed options was never set' do
136
+ before { klass.allow(:timeout) }
137
+
138
+ it 'returns keys that are not allowed by the input' do
139
+ expect(klass.invalid_options_in(test_keys))
140
+ .to eq([:invalid])
141
+ end
142
+ end
143
+
144
+ context 'when calling on subclass' do
145
+ let(:super_class) { Class.new(Sinclair::Options) }
146
+ let(:klass) { Class.new(super_class) }
147
+ let(:test_keys) { %i[timeout invalid] }
148
+
149
+ before { super_class.allow(:timeout) }
150
+
151
+ context 'when not adding allowed options' do
152
+ it 'returns keys that are not allowed by the input' do
153
+ expect(klass.invalid_options_in(test_keys))
154
+ .to eq([:invalid])
155
+ end
156
+ end
157
+
158
+ context 'when adding keys' do
159
+ before { super_class.allow(:retries) }
160
+
161
+ it 'returns keys that are not allowed by the input' do
162
+ expect(klass.invalid_options_in(test_keys))
163
+ .to eq([:invalid])
164
+ end
165
+
166
+ it 'adds new key to accepted' do
167
+ expect(klass.invalid_options_in([:retries]))
168
+ .to be_empty
169
+ end
170
+ end
171
+ end
172
+ end
173
+
174
+ describe '.allow' do
175
+ let(:klass) { Class.new(Sinclair::Options) }
176
+ let(:test_keys) { %i[timeout retries invalid] }
177
+
178
+ it 'adds options to allowed' do
179
+ expect { klass.allow(:timeout) }
180
+ .to change { klass.invalid_options_in(test_keys) }
181
+ .from(%i[timeout retries invalid])
182
+ .to(%i[retries invalid])
183
+ end
184
+
185
+ context 'when calling on subclass' do
186
+ let(:super_class) { Class.new(Sinclair::Options) }
187
+ let(:klass) { Class.new(super_class) }
188
+
189
+ before { super_class.allow(:timeout) }
190
+
191
+ it 'adds options to allowed' do
192
+ expect { klass.allow(:retries) }
193
+ .to change { klass.invalid_options_in(test_keys) }
194
+ .from(%i[retries invalid])
195
+ .to(%i[invalid])
196
+ end
197
+ end
198
+ end
199
+
200
+ describe '.allowed_options' do
201
+ let(:klass) { Class.new(Sinclair::Options) }
202
+
203
+ context 'when class has not been changed' do
204
+ it { expect(klass.allowed_options).to be_a(Set) }
205
+ end
206
+
207
+ context 'when initializing with with options' do
208
+ let(:expected) do
209
+ Set.new %i[timeout retries port protocol]
210
+ end
211
+
212
+ before do
213
+ klass.send(
214
+ :with_options,
215
+ :timeout, :retries, port: 443, protocol: 'https'
216
+ )
217
+ end
218
+
219
+ it do
220
+ expect(klass.allowed_options)
221
+ .to eq(expected)
222
+ end
223
+
224
+ context 'when class is descendent' do
225
+ let(:descendent_class) { Class.new(klass) }
226
+ let(:expected) do
227
+ Set.new %i[timeout retries port protocol name]
228
+ end
229
+
230
+ before do
231
+ descendent_class.send(
232
+ :with_options,
233
+ :name
234
+ )
235
+ end
236
+
237
+ it do
238
+ expect(descendent_class.allowed_options)
239
+ .to eq(expected)
240
+ end
241
+ end
242
+ end
243
+ end
244
+
245
+ describe '.skip_validation' do
246
+ let(:klass) { Class.new(Sinclair::Options) }
247
+
248
+ it 'skip initialization validation' do
249
+ klass.send(:skip_validation)
250
+
251
+ expect { klass.new(invalid: 10) }
252
+ .not_to raise_error
253
+ end
254
+ end
255
+ end
@@ -5,243 +5,6 @@ require 'spec_helper'
5
5
  describe Sinclair::Options do
6
6
  subject(:options) { klass.new }
7
7
 
8
- describe '.with_options' do
9
- let(:klass) { Class.new(described_class) }
10
- let(:test_keys) { %i[timeout retries invalid] }
11
-
12
- context 'when calling with keys' do
13
- it 'add first method' do
14
- expect { klass.send(:with_options, :timeout, 'retries') }
15
- .to add_method(:timeout).to(klass)
16
- end
17
-
18
- it 'add second method' do
19
- expect { klass.send(:with_options, :timeout, 'retries') }
20
- .to add_method(:retries).to(klass)
21
- end
22
-
23
- it 'adds options to allowed' do
24
- expect { klass.send(:with_options, :timeout, 'retries') }
25
- .to change { klass.invalid_options_in(test_keys) }
26
- .from(%i[timeout retries invalid])
27
- .to([:invalid])
28
- end
29
-
30
- it do
31
- expect { klass.send(:with_options, :timeout, 'retries') }
32
- .not_to change {
33
- described_class.invalid_options_in(%i[timeout retries invalid])
34
- }
35
- end
36
-
37
- context 'when when calling method after building' do
38
- before { klass.send(:with_options, :timeout, 'retries') }
39
-
40
- it { expect(options.timeout).to be_nil }
41
- end
42
-
43
- context 'when calling method twice' do
44
- before { klass.send(:with_options, :timeout, retries: 10) }
45
-
46
- it do
47
- expect { klass.send(:with_options, :timeout, :retries) }
48
- .not_to change {
49
- klass.invalid_options_in(%i[timeout retries invalid])
50
- }
51
- end
52
- end
53
- end
54
-
55
- context 'when calling with a hash' do
56
- it 'adds method' do
57
- expect { klass.send(:with_options, timeout_sec: 10, 'retries' => 20) }
58
- .to add_method(:timeout_sec).to(klass)
59
- end
60
-
61
- context 'when when calling method after building' do
62
- before { klass.send(:with_options, timeout_sec: 10, 'retries' => 20) }
63
-
64
- it 'returns default value' do
65
- expect(options.retries).to eq(20)
66
- end
67
- end
68
- end
69
-
70
- context 'when calling on subclass' do
71
- let(:super_class) { Class.new(described_class) }
72
- let(:klass) { Class.new(super_class) }
73
-
74
- let(:test_keys) do
75
- %i[timeout retries name protocol port invalid]
76
- end
77
-
78
- before { super_class.send(:with_options, :timeout, 'retries', name: 'My Connector') }
79
-
80
- it 'add first method' do
81
- expect { klass.send(:with_options, :protocol, 'port' => 443) }
82
- .to add_method(:protocol).to(klass)
83
- end
84
-
85
- it 'add second method' do
86
- expect { klass.send(:with_options, :protocol, 'port' => 443) }
87
- .to add_method(:port).to(klass)
88
- end
89
-
90
- it do
91
- expect { klass.send(:with_options, 'protocol', port: 443) }
92
- .to change {
93
- klass.invalid_options_in(test_keys)
94
- }.from(%i[protocol port invalid])
95
- .to([:invalid])
96
- end
97
-
98
- it do
99
- expect { klass.send(:with_options, 'protocol', port: 443) }
100
- .not_to change {
101
- super_class.invalid_options_in(%i[protocol port])
102
- }
103
- end
104
-
105
- context 'when overriding a method' do
106
- it do
107
- expect { klass.send(:with_options, :name, timeout: 10) }
108
- .not_to change { klass.invalid_options_in(%i[name timeout]) }
109
- end
110
-
111
- it 'change methods to return new default' do
112
- expect { klass.send(:with_options, :name, timeout: 10) }
113
- .to change { klass.new.timeout }
114
- .from(nil).to(10)
115
- end
116
-
117
- it 'change methods to return without default' do
118
- expect { klass.send(:with_options, :name, timeout: 10) }
119
- .to change { klass.new.name }
120
- .from('My Connector').to(nil)
121
- end
122
- end
123
- end
124
- end
125
-
126
- describe '.invalid_options_in' do
127
- let(:klass) { Class.new(described_class) }
128
- let(:test_keys) { %i[timeout invalid] }
129
-
130
- it 'returns alls keys as invalid' do
131
- expect(klass.invalid_options_in(test_keys))
132
- .to eq(test_keys)
133
- end
134
-
135
- context 'when allowed options was never set' do
136
- before { klass.allow(:timeout) }
137
-
138
- it 'returns keys that are not allowed by the input' do
139
- expect(klass.invalid_options_in(test_keys))
140
- .to eq([:invalid])
141
- end
142
- end
143
-
144
- context 'when calling on subclass' do
145
- let(:super_class) { Class.new(described_class) }
146
- let(:klass) { Class.new(super_class) }
147
- let(:test_keys) { %i[timeout invalid] }
148
-
149
- before { super_class.allow(:timeout) }
150
-
151
- context 'when not adding allowed options' do
152
- it 'returns keys that are not allowed by the input' do
153
- expect(klass.invalid_options_in(test_keys))
154
- .to eq([:invalid])
155
- end
156
- end
157
-
158
- context 'when adding keys' do
159
- before { super_class.allow(:retries) }
160
-
161
- it 'returns keys that are not allowed by the input' do
162
- expect(klass.invalid_options_in(test_keys))
163
- .to eq([:invalid])
164
- end
165
-
166
- it 'adds new key to accepted' do
167
- expect(klass.invalid_options_in([:retries]))
168
- .to be_empty
169
- end
170
- end
171
- end
172
- end
173
-
174
- describe '.allow' do
175
- let(:klass) { Class.new(described_class) }
176
- let(:test_keys) { %i[timeout retries invalid] }
177
-
178
- it 'adds options to allowed' do
179
- expect { klass.allow(:timeout) }
180
- .to change { klass.invalid_options_in(test_keys) }
181
- .from(%i[timeout retries invalid])
182
- .to(%i[retries invalid])
183
- end
184
-
185
- context 'when calling on subclass' do
186
- let(:super_class) { Class.new(described_class) }
187
- let(:klass) { Class.new(super_class) }
188
-
189
- before { super_class.allow(:timeout) }
190
-
191
- it 'adds options to allowed' do
192
- expect { klass.allow(:retries) }
193
- .to change { klass.invalid_options_in(test_keys) }
194
- .from(%i[retries invalid])
195
- .to(%i[invalid])
196
- end
197
- end
198
- end
199
-
200
- describe '.allowed_options' do
201
- let(:klass) { Class.new(described_class) }
202
-
203
- context 'when class has not been changed' do
204
- it { expect(klass.allowed_options).to be_a(Set) }
205
- end
206
-
207
- context 'when initializing with with options' do
208
- let(:expected) do
209
- Set.new %i[timeout retries port protocol]
210
- end
211
-
212
- before do
213
- klass.send(
214
- :with_options,
215
- :timeout, :retries, port: 443, protocol: 'https'
216
- )
217
- end
218
-
219
- it do
220
- expect(klass.allowed_options)
221
- .to eq(expected)
222
- end
223
-
224
- context 'when class is descendent' do
225
- let(:descendent_class) { Class.new(klass) }
226
- let(:expected) do
227
- Set.new %i[timeout retries port protocol name]
228
- end
229
-
230
- before do
231
- descendent_class.send(
232
- :with_options,
233
- :name
234
- )
235
- end
236
-
237
- it do
238
- expect(descendent_class.allowed_options)
239
- .to eq(expected)
240
- end
241
- end
242
- end
243
- end
244
-
245
8
  describe '#initialize' do
246
9
  let(:klass) { ConnectionOptions }
247
10
 
@@ -323,6 +86,34 @@ describe Sinclair::Options do
323
86
  end
324
87
  end
325
88
 
89
+ context 'when initializing with invalid args a class that skips validation' do
90
+ let(:klass) { OpenOptions }
91
+
92
+ it do
93
+ expect { klass.new(valid_option: 20, invalid: 10) }
94
+ .not_to raise_error
95
+ end
96
+
97
+ it 'initialize option' do
98
+ expect(klass.new(valid_option: 20, invalid: 10).valid_option)
99
+ .to eq(20)
100
+ end
101
+
102
+ context 'when initializing a subclass' do
103
+ let(:klass) { Class.new(OpenOptions) }
104
+
105
+ it do
106
+ expect { klass.new(valid_option: 20, invalid: 10) }
107
+ .not_to raise_error
108
+ end
109
+
110
+ it 'initialize option' do
111
+ expect(klass.new(valid_option: 20, invalid: 10).valid_option)
112
+ .to eq(20)
113
+ end
114
+ end
115
+ end
116
+
326
117
  context 'when initializing with string or symbol keys' do
327
118
  it do
328
119
  expect { klass.new('timeout' => 20, retries: 30) }
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class BuilderOptions < Sinclair::Options
4
+ with_options :name
5
+
6
+ skip_validation
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class OpenOptions < Sinclair::Options
4
+ with_options :valid_option
5
+
6
+ skip_validation
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinclair
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.5
4
+ version: 1.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - DarthJee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-17 00:00:00.000000000 Z
11
+ date: 2020-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -300,6 +300,7 @@ files:
300
300
  - lib/sinclair/method_definitions.rb
301
301
  - lib/sinclair/options.rb
302
302
  - lib/sinclair/options/builder.rb
303
+ - lib/sinclair/options/class_methods.rb
303
304
  - lib/sinclair/options_parser.rb
304
305
  - lib/sinclair/version.rb
305
306
  - sinclair.gemspec
@@ -350,6 +351,7 @@ files:
350
351
  - spec/lib/sinclair/method_definition_spec.rb
351
352
  - spec/lib/sinclair/method_definitions_spec.rb
352
353
  - spec/lib/sinclair/options/builder_spec.rb
354
+ - spec/lib/sinclair/options/class_methods_spec.rb
353
355
  - spec/lib/sinclair/options_parser_spec.rb
354
356
  - spec/lib/sinclair/options_spec.rb
355
357
  - spec/lib/sinclair_spec.rb
@@ -357,6 +359,7 @@ files:
357
359
  - spec/support/fixture_helpers.rb
358
360
  - spec/support/models/app_client.rb
359
361
  - spec/support/models/app_config.rb
362
+ - spec/support/models/builder_options.rb
360
363
  - spec/support/models/client.rb
361
364
  - spec/support/models/connection_options.rb
362
365
  - spec/support/models/default_value.rb
@@ -381,6 +384,7 @@ files:
381
384
  - spec/support/models/my_configurable.rb
382
385
  - spec/support/models/my_model.rb
383
386
  - spec/support/models/my_server_config.rb
387
+ - spec/support/models/open_options.rb
384
388
  - spec/support/models/person.rb
385
389
  - spec/support/models/purchase.rb
386
390
  - spec/support/models/random_generator.rb