sinclair 1.6.0 → 1.6.1
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/.rubocop.yml +8 -23
- data/README.md +1 -1
- data/config/check_specs.yml +1 -0
- data/config/yardstick.yml +4 -0
- data/lib/sinclair/config/methods_builder.rb +4 -35
- data/lib/sinclair/env_settable/builder.rb +1 -3
- data/lib/sinclair/input_hash.rb +98 -0
- data/lib/sinclair/options/builder.rb +31 -4
- data/lib/sinclair/options.rb +54 -3
- data/lib/sinclair/version.rb +1 -1
- data/lib/sinclair.rb +1 -0
- data/spec/integration/yard/sinclair/input_hash_spec.rb +22 -0
- data/spec/integration/yard/sinclair/options_spec.rb +16 -0
- data/spec/lib/sinclair/input_hash_spec.rb +67 -0
- data/spec/lib/sinclair/options/builder_spec.rb +99 -0
- data/spec/lib/sinclair/options_spec.rb +96 -9
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9873a31c5a1ab56553a834bb0acdae13abeb3189b19a79789911d914c72f52c
|
4
|
+
data.tar.gz: cb209f36a4bd60319e6133e6526a4145a58649bc78a2fd68632e63ef0c157255
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cb67cbeb1032f090809daaebb92f57e9f3bb5db023e413f3101aa79415f319089ef22080a9086772c37ba03870553825be651c6ed1568cb21d9f39db398e47b
|
7
|
+
data.tar.gz: 2852f036aec1df4ecdd7be65497c83389fd481aecf0e9783f55258646fbb8e18d064e1cfa23b0b8f901e4bfa8a1e4b33ac9b114a2ebb5e8f268b945e9d37ba24
|
data/.rubocop.yml
CHANGED
@@ -20,35 +20,20 @@ Lint/AmbiguousBlockAssociation:
|
|
20
20
|
RSpec/AlignLeftLetBrace:
|
21
21
|
Enabled: true
|
22
22
|
|
23
|
-
|
23
|
+
|
24
|
+
RSpec/DescribedClass:
|
24
25
|
Exclude:
|
25
|
-
- spec/integration/yard
|
26
|
-
- spec/integration/yard/sinclair/method_definition/instance_block_definition_spec.rb
|
27
|
-
- spec/integration/yard/sinclair/method_definition/instance_method_definition_spec.rb
|
28
|
-
- spec/integration/yard/sinclair/method_definition/class_block_definition_spec.rb
|
29
|
-
- spec/integration/yard/sinclair/method_definition/class_method_definition_spec.rb
|
30
|
-
- spec/lib/sinclair/method_definition/instance_block_definition_spec.rb
|
31
|
-
- spec/lib/sinclair/method_definition/instance_method_definition_spec.rb
|
32
|
-
- spec/lib/sinclair/method_definition/class_block_definition_spec.rb
|
33
|
-
- spec/lib/sinclair/method_definition/class_method_definition_spec.rb
|
34
|
-
- spec/lib/sinclair/method_definition_spec.rb
|
35
|
-
- spec/lib/sinclair/method_definition/block_definition_spec.rb
|
36
|
-
- spec/integration/yard/sinclair/method_definition/block_definition_spec.rb
|
26
|
+
- 'spec/integration/yard/**/*_spec.rb'
|
37
27
|
|
28
|
+
RSpec/ExampleLength:
|
29
|
+
Exclude:
|
30
|
+
- 'spec/integration/yard/**/*_spec.rb'
|
38
31
|
|
39
32
|
RSpec/MultipleExpectations:
|
40
33
|
Exclude:
|
41
|
-
- spec/integration/yard
|
42
|
-
- spec/integration/
|
43
|
-
- spec/integration/yard/sinclair/method_definition/instance_string_definition_spec.rb
|
44
|
-
- spec/integration/yard/sinclair/method_definition/instance_method_definition_spec.rb
|
45
|
-
- spec/integration/yard/sinclair/method_definition/class_block_definition_spec.rb
|
46
|
-
- spec/integration/yard/sinclair/method_definition/class_string_definition_spec.rb
|
47
|
-
- spec/integration/yard/sinclair/method_definition/class_method_definition_spec.rb
|
34
|
+
- 'spec/integration/yard/**/*_spec.rb'
|
35
|
+
- 'spec/integration/readme/**/*_spec.rb'
|
48
36
|
- spec/lib/sinclair_spec.rb
|
49
|
-
- spec/integration/readme/my_model_spec.rb
|
50
|
-
- spec/integration/yard/sinclair/method_definition/block_definition_spec.rb
|
51
|
-
- spec/integration/yard/sinclair/method_definition/string_definition_spec.rb
|
52
37
|
|
53
38
|
RSpec/NestedGroups:
|
54
39
|
Max: 4
|
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.
|
18
|
+
[https://www.rubydoc.info/gems/sinclair/1.6.1](https://www.rubydoc.info/gems/sinclair/1.6.1)
|
19
19
|
|
20
20
|
Installation
|
21
21
|
---------------
|
data/config/check_specs.yml
CHANGED
data/config/yardstick.yml
CHANGED
@@ -33,6 +33,8 @@ rules:
|
|
33
33
|
- Sinclair::Config::MethodsBuilder#initialize
|
34
34
|
- Sinclair::ConfigFactory#initialize
|
35
35
|
- Sinclair::EnvSettable::Builder#initialize
|
36
|
+
- Sinclair::Exception::InvalidOptions#initialize
|
37
|
+
- Sinclair::InputHash#initialize
|
36
38
|
- Sinclair::Matchers::AddClassMethodTo#initialize
|
37
39
|
- Sinclair::Matchers::AddInstanceMethodTo#instance
|
38
40
|
- Sinclair::Matchers::AddMethod#initialize
|
@@ -42,6 +44,8 @@ rules:
|
|
42
44
|
- Sinclair::MethodDefinition#initialize
|
43
45
|
- Sinclair::MethodDefinition::BlockDefinition#initialize
|
44
46
|
- Sinclair::MethodDefinition::StringDefinition#initialize
|
47
|
+
- Sinclair::Options#initialize
|
48
|
+
- Sinclair::Options::Builder#initialize
|
45
49
|
Summary::Length:
|
46
50
|
enabled: true
|
47
51
|
exclude: []
|
@@ -33,9 +33,7 @@ class Sinclair
|
|
33
33
|
def initialize(klass, *names)
|
34
34
|
super(klass)
|
35
35
|
|
36
|
-
@
|
37
|
-
@defaults = names.find { |arg| arg.is_a?(Hash) } || {}
|
38
|
-
names.delete(defaults)
|
36
|
+
@config_hash = Sinclair::InputHash.input_hash(*names)
|
39
37
|
end
|
40
38
|
|
41
39
|
# Build the methods in config class
|
@@ -70,43 +68,14 @@ class Sinclair
|
|
70
68
|
|
71
69
|
private
|
72
70
|
|
73
|
-
attr_reader :
|
74
|
-
# @method
|
71
|
+
attr_reader :config_hash
|
72
|
+
# @method config_hash
|
75
73
|
# @private
|
76
74
|
# @api private
|
77
75
|
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
# @return [Array<Symbol,String>]
|
81
|
-
|
82
|
-
# @method defaults
|
83
|
-
# @private
|
84
|
-
# @api private
|
85
|
-
#
|
86
|
-
# Configurations that will receive a default value
|
87
|
-
#
|
88
|
-
# @return [Hash]
|
89
|
-
|
90
|
-
# @private
|
91
|
-
#
|
92
|
-
# Builds the final config hash
|
93
|
-
#
|
94
|
-
# Config hash merges defauls config hashs
|
95
|
-
# with {#name_as_hash}
|
76
|
+
# Configuration hash
|
96
77
|
#
|
97
78
|
# @return [Hash]
|
98
|
-
def config_hash
|
99
|
-
@config_hash ||= names_as_hash.merge!(defaults)
|
100
|
-
end
|
101
|
-
|
102
|
-
# @private
|
103
|
-
#
|
104
|
-
# Builds a hash with nil values from config names
|
105
|
-
#
|
106
|
-
# @return [Hash]
|
107
|
-
def names_as_hash
|
108
|
-
Hash[names.map { |*name| name }]
|
109
|
-
end
|
110
79
|
end
|
111
80
|
end
|
112
81
|
end
|
@@ -16,9 +16,7 @@ class Sinclair
|
|
16
16
|
def initialize(klass, prefix, *settings_name, **defaults)
|
17
17
|
super(klass, prefix: prefix)
|
18
18
|
|
19
|
-
@settings =
|
20
|
-
|
21
|
-
@settings.merge!(defaults)
|
19
|
+
@settings = Sinclair::InputHash.input_hash(*settings_name, **defaults)
|
22
20
|
|
23
21
|
add_all_methods
|
24
22
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Sinclair
|
4
|
+
# @api public
|
5
|
+
# @author Darthjee
|
6
|
+
#
|
7
|
+
# Class responsible to convert inputs into
|
8
|
+
# hash of default values
|
9
|
+
class InputHash
|
10
|
+
# @api public
|
11
|
+
#
|
12
|
+
# Converts args into Hash
|
13
|
+
#
|
14
|
+
# @overload input_hash(*args)
|
15
|
+
# @param args [Array] Names attributes
|
16
|
+
# @overload input_hash(*args, **hash))
|
17
|
+
# @param args [Array] Names attributes
|
18
|
+
# @param hash [Hash] already converted
|
19
|
+
# hahs
|
20
|
+
#
|
21
|
+
# @return [Hash]
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
# Sinclair::InputHash.input_hash(
|
25
|
+
# :key1, 'key2',
|
26
|
+
# key3: 10,
|
27
|
+
# 'key4' => 20
|
28
|
+
# )
|
29
|
+
#
|
30
|
+
# # returns
|
31
|
+
# # {
|
32
|
+
# # key1: nil,
|
33
|
+
# # 'key2' => nil,
|
34
|
+
# # key3: 10,
|
35
|
+
# # 'key4' => 20
|
36
|
+
# # }
|
37
|
+
def self.input_hash(*args)
|
38
|
+
new(*args).to_h
|
39
|
+
end
|
40
|
+
|
41
|
+
# @api private
|
42
|
+
# @private
|
43
|
+
#
|
44
|
+
# Returns hash from initialization arguments
|
45
|
+
#
|
46
|
+
# @return [Hahs]
|
47
|
+
def to_h
|
48
|
+
hash_from_attributes.merge!(hash)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
attr_reader :attributes, :hash
|
54
|
+
# @method attributes
|
55
|
+
# @api private
|
56
|
+
# @private
|
57
|
+
#
|
58
|
+
# Attribute list for creation of hash
|
59
|
+
#
|
60
|
+
# @return [Array<String,Symbol>]
|
61
|
+
|
62
|
+
# @method hash
|
63
|
+
# @api private
|
64
|
+
# @private
|
65
|
+
#
|
66
|
+
# Hash already in hash format
|
67
|
+
#
|
68
|
+
# @return [Hash]
|
69
|
+
|
70
|
+
# @api private
|
71
|
+
# @private
|
72
|
+
#
|
73
|
+
# @overload initialize(*arguments)
|
74
|
+
# @param arguments [String,Symbol] attributes to generate
|
75
|
+
# hash keys
|
76
|
+
# @overload initialize(*arguments, **hash)
|
77
|
+
# @param arguments [String,Symbol] attributes to generate
|
78
|
+
# hash keys
|
79
|
+
# @param hash [Hash] hash to be merged with final hash
|
80
|
+
# from attributes
|
81
|
+
def initialize(*arguments)
|
82
|
+
block = proc { |value| value.is_a?(Hash) }
|
83
|
+
|
84
|
+
@attributes = arguments.reject(&block)
|
85
|
+
@hash = arguments.find(&block) || {}
|
86
|
+
end
|
87
|
+
|
88
|
+
# @api private
|
89
|
+
# @private
|
90
|
+
#
|
91
|
+
# Creates a hash of nil values using attributes as keys
|
92
|
+
#
|
93
|
+
# @return [Hash]
|
94
|
+
def hash_from_attributes
|
95
|
+
Hash[attributes.map { |*attribute| attribute }]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -2,12 +2,29 @@
|
|
2
2
|
|
3
3
|
class Sinclair
|
4
4
|
class Options
|
5
|
+
# @api private
|
6
|
+
# @author Darthjee
|
7
|
+
#
|
8
|
+
# Option Class Builder
|
9
|
+
#
|
10
|
+
# This class builds methods for options objects
|
5
11
|
class Builder < Sinclair
|
6
|
-
|
12
|
+
# @overload initialize(klass, *options)
|
13
|
+
# @param klass [Class] options class to receive
|
14
|
+
# methods
|
15
|
+
# @param options [Array<Symbol>] list of accepted
|
16
|
+
# options
|
17
|
+
# @overload initialize(klass, *options, **defaults)
|
18
|
+
# @param klass [Class] options class to receive
|
19
|
+
# methods
|
20
|
+
# @param options [Array<Symbol>] list of accepted
|
21
|
+
# options
|
22
|
+
# @param defaults [Hash<Symbol,Object>] default options
|
23
|
+
# hash
|
24
|
+
def initialize(klass, *options)
|
7
25
|
super(klass)
|
8
26
|
|
9
|
-
@attributes =
|
10
|
-
@attributes.merge!(defaults)
|
27
|
+
@attributes = Sinclair::InputHash.input_hash(*options)
|
11
28
|
|
12
29
|
add_all_methods
|
13
30
|
end
|
@@ -15,11 +32,21 @@ class Sinclair
|
|
15
32
|
private
|
16
33
|
|
17
34
|
attr_reader :attributes
|
35
|
+
# @method attributes
|
36
|
+
# @api private
|
37
|
+
# @private
|
38
|
+
#
|
39
|
+
# Options attributes
|
40
|
+
#
|
41
|
+
# @return [Hash<Symbol.Object>]
|
18
42
|
|
43
|
+
# Add all methods for options
|
44
|
+
#
|
45
|
+
# @return [Array<MethodDefinition>]
|
19
46
|
def add_all_methods
|
20
47
|
attributes.each do |option, value|
|
21
48
|
add_method(option, cached: true) { value }
|
22
|
-
klass.
|
49
|
+
klass.allowed_options.push(option.to_sym)
|
23
50
|
end
|
24
51
|
end
|
25
52
|
end
|
data/lib/sinclair/options.rb
CHANGED
@@ -1,22 +1,72 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Sinclair
|
4
|
+
# @api public
|
5
|
+
# @author Darthjee
|
6
|
+
#
|
7
|
+
# Base options class
|
8
|
+
#
|
9
|
+
# @example Options usage
|
10
|
+
# class ConnectionOptions < Sinclair::Options
|
11
|
+
# with_options :timeout, :retries, port: 443, protocol: 'https'
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# options = ConnectionOptions.new(retries: 10, port: 8080)
|
15
|
+
#
|
16
|
+
# options.timeout # returns nil
|
17
|
+
# options.retries # returns 10
|
18
|
+
# options.port # returns 8080
|
19
|
+
# options.protocol # returns 'https'
|
4
20
|
class Options
|
5
21
|
autoload :Builder, 'sinclair/options/builder'
|
6
22
|
|
7
23
|
class << self
|
8
|
-
|
9
|
-
|
24
|
+
# @api private
|
25
|
+
# @private
|
26
|
+
#
|
27
|
+
# Options allowed when initializing options
|
28
|
+
#
|
29
|
+
# @return [Array<Symbol>]
|
30
|
+
def allowed_options
|
31
|
+
@allowed_options ||= (superclass.try(:allowed_options).dup || [])
|
32
|
+
end
|
33
|
+
|
34
|
+
# @api private
|
35
|
+
# @private
|
36
|
+
#
|
37
|
+
# returns invalid options
|
38
|
+
#
|
39
|
+
# @return [Array<Symbol>]
|
40
|
+
def invalid_options_in(names)
|
41
|
+
names.map(&:to_sym) - allowed_options
|
10
42
|
end
|
11
43
|
|
12
44
|
private
|
13
45
|
|
46
|
+
# @api public
|
47
|
+
# @!visibility public
|
48
|
+
#
|
49
|
+
# Add available options
|
50
|
+
#
|
51
|
+
# @example (see Options)
|
52
|
+
#
|
53
|
+
# @return (see Sinclair#build)
|
54
|
+
#
|
55
|
+
# @overload with_options(*options)
|
56
|
+
# @param options [Array<Symbol>] list of accepted
|
57
|
+
# options
|
58
|
+
# @overload with_options(*options, **defaults)
|
59
|
+
# @param options [Array<Symbol>] list of accepted
|
60
|
+
# options
|
61
|
+
# @param defaults [Hash<Symbol,Object>] default options
|
62
|
+
# hash
|
14
63
|
def with_options(*options)
|
15
64
|
Builder.new(self, *options).build
|
16
65
|
end
|
17
66
|
end
|
18
67
|
|
19
68
|
# @param options [Hash] hash with options (see {.options}, {.with_options})
|
69
|
+
# @example (see Options)
|
20
70
|
def initialize(options = {})
|
21
71
|
check_options(options)
|
22
72
|
|
@@ -28,6 +78,7 @@ class Sinclair
|
|
28
78
|
private
|
29
79
|
|
30
80
|
# @private
|
81
|
+
# @api private
|
31
82
|
#
|
32
83
|
# check if given options are allowed
|
33
84
|
#
|
@@ -35,7 +86,7 @@ class Sinclair
|
|
35
86
|
#
|
36
87
|
# @return [NilClass]
|
37
88
|
def check_options(options)
|
38
|
-
invalid_keys =
|
89
|
+
invalid_keys = self.class.invalid_options_in(options.keys)
|
39
90
|
|
40
91
|
return if invalid_keys.empty?
|
41
92
|
|
data/lib/sinclair/version.rb
CHANGED
data/lib/sinclair.rb
CHANGED
@@ -90,6 +90,7 @@ class Sinclair
|
|
90
90
|
autoload :Configurable, 'sinclair/configurable'
|
91
91
|
autoload :EnvSettable, 'sinclair/env_settable'
|
92
92
|
autoload :Exception, 'sinclair/exception'
|
93
|
+
autoload :InputHash, 'sinclair/input_hash'
|
93
94
|
autoload :MethodBuilder, 'sinclair/method_builder'
|
94
95
|
autoload :MethodDefinition, 'sinclair/method_definition'
|
95
96
|
autoload :MethodDefinitions, 'sinclair/method_definitions'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe Sinclair::InputHash do
|
4
|
+
describe 'yard' do
|
5
|
+
describe 'Regular usage' do
|
6
|
+
it do
|
7
|
+
expect(
|
8
|
+
Sinclair::InputHash.input_hash(
|
9
|
+
:key1, 'key2',
|
10
|
+
key3: 10,
|
11
|
+
'key4' => 20
|
12
|
+
)
|
13
|
+
).to eq(
|
14
|
+
key1: nil,
|
15
|
+
'key2' => nil,
|
16
|
+
key3: 10,
|
17
|
+
'key4' => 20
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Sinclair::Options do
|
6
|
+
describe 'yard' do
|
7
|
+
it 'creates options object' do
|
8
|
+
options = ConnectionOptions.new(retries: 10, port: 8080)
|
9
|
+
|
10
|
+
expect(options.timeout).to be_nil
|
11
|
+
expect(options.retries).to eq(10)
|
12
|
+
expect(options.port).to eq(8080)
|
13
|
+
expect(options.protocol).to eq('https')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Sinclair::InputHash do
|
6
|
+
describe '.input_hash' do
|
7
|
+
context 'when arguments are strings and symbols' do
|
8
|
+
let(:hash) do
|
9
|
+
described_class.input_hash(
|
10
|
+
:attribute1,
|
11
|
+
'attribute2'
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:expected_hash) do
|
16
|
+
{
|
17
|
+
attribute1: nil,
|
18
|
+
'attribute2' => nil
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'uses attributes as keys for the hash' do
|
23
|
+
expect(hash).to eq(expected_hash)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when arguments is a hash' do
|
28
|
+
let(:hash) do
|
29
|
+
described_class.input_hash(expected_hash)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:expected_hash) do
|
33
|
+
{
|
34
|
+
attribute1: 10,
|
35
|
+
'attribute2' => 20
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns same hash' do
|
40
|
+
expect(hash).to eq(expected_hash)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when arguments is a mix of names and hashes' do
|
45
|
+
let(:hash) do
|
46
|
+
described_class.input_hash(
|
47
|
+
:attribute1, 'attribute2',
|
48
|
+
attribute3: 10,
|
49
|
+
'attribute4' => 20
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
let(:expected_hash) do
|
54
|
+
{
|
55
|
+
attribute1: nil,
|
56
|
+
'attribute2' => nil,
|
57
|
+
attribute3: 10,
|
58
|
+
'attribute4' => 20
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'returns same hash' do
|
63
|
+
expect(hash).to eq(expected_hash)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Sinclair::Options::Builder do
|
6
|
+
describe '#build' do
|
7
|
+
subject(:builder) do
|
8
|
+
described_class.new(klass, *args)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:klass) { Class.new(Sinclair::Options) }
|
12
|
+
let(:options) { klass.new }
|
13
|
+
|
14
|
+
context 'when calling with keys' do
|
15
|
+
let(:args) { [:timeout, 'retries'] }
|
16
|
+
|
17
|
+
it 'add first method' do
|
18
|
+
expect { builder.build }
|
19
|
+
.to add_method(:timeout).to(klass)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'add second method' do
|
23
|
+
expect { builder.build }
|
24
|
+
.to add_method(:retries).to(klass)
|
25
|
+
end
|
26
|
+
|
27
|
+
it do
|
28
|
+
expect { builder.build }
|
29
|
+
.to change(klass, :allowed_options)
|
30
|
+
.from([])
|
31
|
+
.to(%i[timeout retries])
|
32
|
+
end
|
33
|
+
|
34
|
+
it do
|
35
|
+
expect { builder.build }
|
36
|
+
.not_to change(Sinclair::Options, :allowed_options)
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when when calling method after building' do
|
40
|
+
before { builder.build }
|
41
|
+
|
42
|
+
it { expect(options.timeout).to be_nil }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when calling with a hash' do
|
47
|
+
let(:args) { [{ timeout_sec: 10, 'retries' => 20 }] }
|
48
|
+
|
49
|
+
it 'adds method' do
|
50
|
+
expect { builder.build }
|
51
|
+
.to add_method(:timeout_sec).to(klass)
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when when calling method after building' do
|
55
|
+
before { builder.build }
|
56
|
+
|
57
|
+
it 'returns default value' do
|
58
|
+
expect(options.retries).to eq(20)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when calling on subclass' do
|
64
|
+
let(:super_class) { Class.new(Sinclair::Options) }
|
65
|
+
let(:klass) { Class.new(super_class) }
|
66
|
+
let(:args) do
|
67
|
+
[:protocol, { 'port' => 443 }]
|
68
|
+
end
|
69
|
+
|
70
|
+
let(:super_builder) do
|
71
|
+
described_class.new(super_class, :timeout, 'retries')
|
72
|
+
end
|
73
|
+
|
74
|
+
before { super_builder.build }
|
75
|
+
|
76
|
+
it 'add first method' do
|
77
|
+
expect { builder.build }
|
78
|
+
.to add_method(:protocol).to(klass)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'add second method' do
|
82
|
+
expect { builder.build }
|
83
|
+
.to add_method(:port).to(klass)
|
84
|
+
end
|
85
|
+
|
86
|
+
it do
|
87
|
+
expect { builder.build }
|
88
|
+
.to change(klass, :allowed_options)
|
89
|
+
.from(%i[timeout retries])
|
90
|
+
.to(%i[timeout retries protocol port])
|
91
|
+
end
|
92
|
+
|
93
|
+
it do
|
94
|
+
expect { builder.build }
|
95
|
+
.not_to change(super_class, :allowed_options)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -5,22 +5,34 @@ require 'spec_helper'
|
|
5
5
|
describe Sinclair::Options do
|
6
6
|
subject(:options) { klass.new }
|
7
7
|
|
8
|
-
let(:klass) { Class.new(described_class) }
|
9
|
-
|
10
8
|
describe '.with_options' do
|
9
|
+
let(:klass) { Class.new(described_class) }
|
10
|
+
|
11
11
|
context 'when calling with keys' do
|
12
12
|
it 'add first method' do
|
13
|
-
expect { klass.send(:with_options, :timeout,
|
13
|
+
expect { klass.send(:with_options, :timeout, 'retries') }
|
14
14
|
.to add_method(:timeout).to(klass)
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'add second method' do
|
18
|
-
expect { klass.send(:with_options, :timeout,
|
18
|
+
expect { klass.send(:with_options, :timeout, 'retries') }
|
19
19
|
.to add_method(:retries).to(klass)
|
20
20
|
end
|
21
21
|
|
22
|
+
it do
|
23
|
+
expect { klass.send(:with_options, :timeout, 'retries') }
|
24
|
+
.to change(klass, :allowed_options)
|
25
|
+
.from([])
|
26
|
+
.to(%i[timeout retries])
|
27
|
+
end
|
28
|
+
|
29
|
+
it do
|
30
|
+
expect { klass.send(:with_options, :timeout, 'retries') }
|
31
|
+
.not_to change(described_class, :allowed_options)
|
32
|
+
end
|
33
|
+
|
22
34
|
context 'when when calling method after building' do
|
23
|
-
before { klass.send(:with_options, :timeout,
|
35
|
+
before { klass.send(:with_options, :timeout, 'retries') }
|
24
36
|
|
25
37
|
it { expect(options.timeout).to be_nil }
|
26
38
|
end
|
@@ -28,14 +40,45 @@ describe Sinclair::Options do
|
|
28
40
|
|
29
41
|
context 'when calling with a hash' do
|
30
42
|
it 'adds method' do
|
31
|
-
expect { klass.send(:with_options,
|
32
|
-
.to add_method(:
|
43
|
+
expect { klass.send(:with_options, timeout_sec: 10, 'retries' => 20) }
|
44
|
+
.to add_method(:timeout_sec).to(klass)
|
33
45
|
end
|
34
46
|
|
35
47
|
context 'when when calling method after building' do
|
36
|
-
before { klass.send(:with_options,
|
48
|
+
before { klass.send(:with_options, timeout_sec: 10, 'retries' => 20) }
|
37
49
|
|
38
|
-
it
|
50
|
+
it 'returns default value' do
|
51
|
+
expect(options.retries).to eq(20)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when calling on subclass' do
|
57
|
+
let(:super_class) { Class.new(described_class) }
|
58
|
+
let(:klass) { Class.new(super_class) }
|
59
|
+
|
60
|
+
before { super_class.send(:with_options, :timeout, 'retries') }
|
61
|
+
|
62
|
+
it 'add first method' do
|
63
|
+
expect { klass.send(:with_options, :protocol, 'port' => 443) }
|
64
|
+
.to add_method(:protocol).to(klass)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'add second method' do
|
68
|
+
expect { klass.send(:with_options, :protocol, 'port' => 443) }
|
69
|
+
.to add_method(:port).to(klass)
|
70
|
+
end
|
71
|
+
|
72
|
+
it do
|
73
|
+
expect { klass.send(:with_options, 'protocol', port: 443) }
|
74
|
+
.to change(klass, :allowed_options)
|
75
|
+
.from(%i[timeout retries])
|
76
|
+
.to(%i[timeout retries protocol port])
|
77
|
+
end
|
78
|
+
|
79
|
+
it do
|
80
|
+
expect { klass.send(:with_options, 'protocol', port: 443) }
|
81
|
+
.not_to change(super_class, :allowed_options)
|
39
82
|
end
|
40
83
|
end
|
41
84
|
end
|
@@ -77,11 +120,55 @@ describe Sinclair::Options do
|
|
77
120
|
end
|
78
121
|
end
|
79
122
|
|
123
|
+
context 'when initializing subclass with valid args' do
|
124
|
+
subject(:options) do
|
125
|
+
klass.new(timeout: timeout, protocol: 'http')
|
126
|
+
end
|
127
|
+
|
128
|
+
let(:klass) { Class.new(ConnectionOptions) }
|
129
|
+
let(:timeout) { Random.rand(10..19) }
|
130
|
+
|
131
|
+
before do
|
132
|
+
klass.send(:with_options, :access_token, identifier: 'my client')
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'sets value of options attribute' do
|
136
|
+
expect(options.timeout).to eq(timeout)
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'sets value of options attribute that has default' do
|
140
|
+
expect(options.protocol).to eq('http')
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'does not mess with non initialized attributes' do
|
144
|
+
expect(options.retries).to be_nil
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'does not mess with non initialized attributes with defaults' do
|
148
|
+
expect(options.port).to eq(443)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'returns nil for new added option without default' do
|
152
|
+
expect(options.access_token).to be_nil
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'returns value for new added option with default' do
|
156
|
+
expect(options.identifier).to eq('my client')
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
80
160
|
context 'when initializing with invalid args' do
|
81
161
|
it do
|
82
162
|
expect { klass.new(invalid: 10) }
|
83
163
|
.to raise_error(Sinclair::Exception::InvalidOptions)
|
84
164
|
end
|
85
165
|
end
|
166
|
+
|
167
|
+
context 'when initializing with string or symbol keys' do
|
168
|
+
it do
|
169
|
+
expect { klass.new('timeout' => 20, retries: 30) }
|
170
|
+
.not_to raise_error
|
171
|
+
end
|
172
|
+
end
|
86
173
|
end
|
87
174
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinclair
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DarthJee
|
@@ -281,6 +281,7 @@ files:
|
|
281
281
|
- lib/sinclair/env_settable.rb
|
282
282
|
- lib/sinclair/env_settable/builder.rb
|
283
283
|
- lib/sinclair/exception.rb
|
284
|
+
- lib/sinclair/input_hash.rb
|
284
285
|
- lib/sinclair/matchers.rb
|
285
286
|
- lib/sinclair/matchers/add_class_method.rb
|
286
287
|
- lib/sinclair/matchers/add_class_method_to.rb
|
@@ -316,11 +317,13 @@ files:
|
|
316
317
|
- spec/integration/yard/sinclair/config_spec.rb
|
317
318
|
- spec/integration/yard/sinclair/configurable_spec.rb
|
318
319
|
- spec/integration/yard/sinclair/env_settable_spec.rb
|
320
|
+
- spec/integration/yard/sinclair/input_hash_spec.rb
|
319
321
|
- spec/integration/yard/sinclair/matchers/add_class_method_spec.rb
|
320
322
|
- spec/integration/yard/sinclair/matchers/add_class_method_to_spec.rb
|
321
323
|
- spec/integration/yard/sinclair/matchers/add_instance_method_spec.rb
|
322
324
|
- spec/integration/yard/sinclair/matchers/add_instance_method_to_spec.rb
|
323
325
|
- spec/integration/yard/sinclair/options_parser_spec.rb
|
326
|
+
- spec/integration/yard/sinclair/options_spec.rb
|
324
327
|
- spec/integration/yard/sinclair_spec.rb
|
325
328
|
- spec/lib/sinclair/config/methods_builder_spec.rb
|
326
329
|
- spec/lib/sinclair/config_builder_spec.rb
|
@@ -331,6 +334,7 @@ files:
|
|
331
334
|
- spec/lib/sinclair/env_settable/builder_spec.rb
|
332
335
|
- spec/lib/sinclair/env_settable_spec.rb
|
333
336
|
- spec/lib/sinclair/exception/invalid_options_spec.rb
|
337
|
+
- spec/lib/sinclair/input_hash_spec.rb
|
334
338
|
- spec/lib/sinclair/matchers/add_class_method_spec.rb
|
335
339
|
- spec/lib/sinclair/matchers/add_class_method_to_spec.rb
|
336
340
|
- spec/lib/sinclair/matchers/add_instance_method_spec.rb
|
@@ -344,6 +348,7 @@ files:
|
|
344
348
|
- spec/lib/sinclair/method_definition/string_definition_spec.rb
|
345
349
|
- spec/lib/sinclair/method_definition_spec.rb
|
346
350
|
- spec/lib/sinclair/method_definitions_spec.rb
|
351
|
+
- spec/lib/sinclair/options/builder_spec.rb
|
347
352
|
- spec/lib/sinclair/options_parser_spec.rb
|
348
353
|
- spec/lib/sinclair/options_spec.rb
|
349
354
|
- spec/lib/sinclair_spec.rb
|