sinclair 1.3.2 → 1.3.3
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/README.md +33 -1
- data/lib/sinclair/config_factory.rb +6 -0
- data/lib/sinclair/configurable.rb +80 -28
- data/lib/sinclair/version.rb +1 -1
- data/scripts/rubycritic.sh +1 -1
- data/spec/integration/readme/sinclair/configurable_spec.rb +55 -23
- data/spec/integration/yard/sinclair/configurable_spec.rb +55 -21
- data/spec/lib/sinclair/configurable_spec.rb +101 -0
- data/spec/support/models/client.rb +9 -0
- data/spec/support/models/my_server_config.rb +11 -0
- data/spec/support/models/server_config.rb +5 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46aae0be813637d70c6060f5ac9a14537d19eb2d5e4275a31e864625b396c038
|
4
|
+
data.tar.gz: '08f41f83267f7f017b036e4fd806e336a17932ae4f93eadae0e08dd4341c51cb'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61deac1e3f21b5f238f33fd900ffadacd478b48cdaa3387ac7c272c28edb6d810af1609ec0d76b670861339c9de13600c8c39538c5be0199d5175fe6ed899434
|
7
|
+
data.tar.gz: 3681a6b3f56c9380e6bcc19bde499c0f4afc593075d8e23144ecc3d0168f0c89bf5352f351b1b87930fc2ba937f313a94292498157e75e6e4e7d56b12bd2efac
|
data/README.md
CHANGED
@@ -14,7 +14,7 @@ methods
|
|
14
14
|
|
15
15
|
Yard Documentation
|
16
16
|
-------------------
|
17
|
-
https://www.rubydoc.info/gems/sinclair/1.3.
|
17
|
+
https://www.rubydoc.info/gems/sinclair/1.3.3
|
18
18
|
|
19
19
|
Installation
|
20
20
|
---------------
|
@@ -332,6 +332,38 @@ the `configurable#configure` method
|
|
332
332
|
MyConfigurable.config.port # returns 80
|
333
333
|
```
|
334
334
|
|
335
|
+
Configurations can also be done through custom classes
|
336
|
+
|
337
|
+
```ruby
|
338
|
+
class MyServerConfig
|
339
|
+
def url
|
340
|
+
if @port
|
341
|
+
"http://#{@host}:#{@port}"
|
342
|
+
else
|
343
|
+
"http://#{@host}"
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
class Client
|
349
|
+
extend Sinclair::Configurable
|
350
|
+
|
351
|
+
configurable_by MyServerConfig, with: %i[host port]
|
352
|
+
end
|
353
|
+
|
354
|
+
Client.configure do
|
355
|
+
host 'interstella.com'
|
356
|
+
end
|
357
|
+
|
358
|
+
Client.config.url # returns 'http://interstella.com'
|
359
|
+
|
360
|
+
Client.configure do |config|
|
361
|
+
config.port 8080
|
362
|
+
end
|
363
|
+
|
364
|
+
Client.config.url # returns 'http://interstella.com:8080'
|
365
|
+
```
|
366
|
+
|
335
367
|
RSspec matcher
|
336
368
|
---------------
|
337
369
|
|
@@ -25,6 +25,8 @@ class Sinclair
|
|
25
25
|
@config_attributes = config_attributes.dup
|
26
26
|
end
|
27
27
|
|
28
|
+
# @api public
|
29
|
+
#
|
28
30
|
# Returns current instance of config
|
29
31
|
#
|
30
32
|
# the method returns the same instance until +reset_config+
|
@@ -41,6 +43,8 @@ class Sinclair
|
|
41
43
|
@config ||= config_class.new
|
42
44
|
end
|
43
45
|
|
46
|
+
# @api public
|
47
|
+
#
|
44
48
|
# Cleans the current config instance
|
45
49
|
#
|
46
50
|
# After cleaning it, {#config} will generate a new
|
@@ -87,6 +91,8 @@ class Sinclair
|
|
87
91
|
config_attributes.concat(builder.config_names.map(&:to_sym))
|
88
92
|
end
|
89
93
|
|
94
|
+
# @api public
|
95
|
+
#
|
90
96
|
# Set the values in the config
|
91
97
|
#
|
92
98
|
# The block given is evaluated by the {ConfigBuilder}
|
@@ -8,37 +8,14 @@ class Sinclair
|
|
8
8
|
# By extending Configurable, class receives the methods public
|
9
9
|
# {ConfigFactory#config .config}, {ConfigFactory#reset_config .reset_config}
|
10
10
|
# and {ConfigFactory#configure .configure}
|
11
|
-
# and the private {#configurable_with .configurable_with}
|
11
|
+
# and the private methods {#configurable_with .configurable_with}
|
12
|
+
# and {#configurable_by .configurable_by}
|
12
13
|
#
|
13
14
|
# @see ConfigFactory
|
14
15
|
# @see ConfigBuilder
|
15
16
|
#
|
16
|
-
# @example
|
17
|
-
#
|
18
|
-
# extend Sinclair::Configurable
|
19
|
-
#
|
20
|
-
# # port is defaulted to 80
|
21
|
-
# configurable_with :host, port: 80
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# MyConfigurable.configure do
|
25
|
-
# host 'interstella.com'
|
26
|
-
# port 5555
|
27
|
-
# end
|
28
|
-
#
|
29
|
-
# MyConfigurable.config.host
|
30
|
-
# # returns 'interstella.com'
|
31
|
-
#
|
32
|
-
# MyConfigurable.config.port
|
33
|
-
# # returns 5555
|
34
|
-
#
|
35
|
-
# MyConfigurable.reset_config
|
36
|
-
#
|
37
|
-
# MyConfigurable.config.host
|
38
|
-
# # returns nil
|
39
|
-
#
|
40
|
-
# MyConfigurable.config.port
|
41
|
-
# # returns 80
|
17
|
+
# @example (see #configurable_with)
|
18
|
+
# @example (see #configurable_by)
|
42
19
|
module Configurable
|
43
20
|
# (see ConfigFactory#config)
|
44
21
|
# @see ConfigFactory#config
|
@@ -93,9 +70,84 @@ class Sinclair
|
|
93
70
|
#
|
94
71
|
# @see ConfigFactory#add_configs
|
95
72
|
#
|
96
|
-
# @example
|
73
|
+
# @example Configuring with common {Sinclair::Config} class
|
74
|
+
# class MyConfigurable
|
75
|
+
# extend Sinclair::Configurable
|
76
|
+
#
|
77
|
+
# # port is defaulted to 80
|
78
|
+
# configurable_with :host, port: 80
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# MyConfigurable.configure do
|
82
|
+
# host 'interstella.com'
|
83
|
+
# port 5555
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# MyConfigurable.config.host
|
87
|
+
# # returns 'interstella.com'
|
88
|
+
#
|
89
|
+
# MyConfigurable.config.port
|
90
|
+
# # returns 5555
|
91
|
+
#
|
92
|
+
# MyConfigurable.reset_config
|
93
|
+
#
|
94
|
+
# MyConfigurable.config.host
|
95
|
+
# # returns nil
|
96
|
+
#
|
97
|
+
# MyConfigurable.config.port
|
98
|
+
# # returns 80
|
97
99
|
def configurable_with(*attributes)
|
98
100
|
config_factory.add_configs(*attributes)
|
99
101
|
end
|
102
|
+
|
103
|
+
# @!visibility public
|
104
|
+
#
|
105
|
+
# Allows configuration to happen through custom config class
|
106
|
+
#
|
107
|
+
# @param config_class [Class] custom configuration class
|
108
|
+
# @param with [Array<Symbol,String>] List of all
|
109
|
+
# configuration attributes expected to be found on
|
110
|
+
# +config_class+
|
111
|
+
#
|
112
|
+
# configurable_with does not add methods to config_class.
|
113
|
+
# If needed, those can be added by a subsequent call to
|
114
|
+
# {#configurable_with}
|
115
|
+
#
|
116
|
+
# @return [ConfigFactory]
|
117
|
+
#
|
118
|
+
# @example Configured by custom config class
|
119
|
+
# class MyServerConfig
|
120
|
+
# def url
|
121
|
+
# if @port
|
122
|
+
# "http://#{@host}:#{@port}"
|
123
|
+
# else
|
124
|
+
# "http://#{@host}"
|
125
|
+
# end
|
126
|
+
# end
|
127
|
+
# end
|
128
|
+
#
|
129
|
+
# class Client
|
130
|
+
# extend Sinclair::Configurable
|
131
|
+
#
|
132
|
+
# configurable_by MyServerConfig, with: %i[host port]
|
133
|
+
# end
|
134
|
+
#
|
135
|
+
# Client.configure do
|
136
|
+
# host 'interstella.com'
|
137
|
+
# end
|
138
|
+
#
|
139
|
+
# Client.config.url # returns 'http://interstella.com'
|
140
|
+
#
|
141
|
+
# Client.configure do |config|
|
142
|
+
# config.port 8080
|
143
|
+
# end
|
144
|
+
#
|
145
|
+
# Client.config.url # returns 'http://interstella.com:8080'
|
146
|
+
def configurable_by(config_class, with: [])
|
147
|
+
@config_factory = ConfigFactory.new(
|
148
|
+
config_class: config_class,
|
149
|
+
config_attributes: with.map(&:to_sym)
|
150
|
+
)
|
151
|
+
end
|
100
152
|
end
|
101
153
|
end
|
data/lib/sinclair/version.rb
CHANGED
data/scripts/rubycritic.sh
CHANGED
@@ -4,7 +4,7 @@ DIFF_LIST=$(git diff --name-only $CIRCLE_SHA1 $(git merge-base $CIRCLE_SHA1 orig
|
|
4
4
|
|
5
5
|
if [ ! -z "$DIFF_LIST" ]; then
|
6
6
|
mkdir -p tmp/rubycritic/compare
|
7
|
-
bundle exec rubycritic --format console --branch origin/master -t 0 $DIFF_LIST
|
7
|
+
bundle exec rubycritic --format console --branch origin/master -t 0 --maximum-decrease 1 $DIFF_LIST
|
8
8
|
else
|
9
9
|
echo "No changes detected. Skipping rubycritic..."
|
10
10
|
fi
|
@@ -3,40 +3,72 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe Sinclair::Configurable do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
describe 'README' do
|
7
|
+
describe 'Configured with' do
|
8
|
+
before do
|
9
|
+
MyConfigurable.configure do |config|
|
10
|
+
config.host 'interstella.art'
|
11
|
+
config.port 5555
|
12
|
+
end
|
11
13
|
end
|
12
|
-
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
after do
|
16
|
+
MyConfigurable.reset_config
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
it 'sets configuration host' do
|
20
|
+
expect(MyConfigurable.config.host)
|
21
|
+
.to eq('interstella.art')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sets configuration port' do
|
25
|
+
expect(MyConfigurable.config.port)
|
26
|
+
.to eq(5555)
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when #rest_config is called' do
|
30
|
+
before do
|
31
|
+
MyConfigurable.reset_config
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'resets configuration host' do
|
35
|
+
expect(MyConfigurable.config.host)
|
36
|
+
.to be_nil
|
37
|
+
end
|
22
38
|
|
23
|
-
|
24
|
-
|
25
|
-
|
39
|
+
it 'resets configuration port' do
|
40
|
+
expect(MyConfigurable.config.port).to eq(80)
|
41
|
+
end
|
42
|
+
end
|
26
43
|
end
|
27
44
|
|
28
|
-
|
45
|
+
describe 'Configured by' do
|
29
46
|
before do
|
30
|
-
|
47
|
+
Client.configure do
|
48
|
+
host 'interstella.com'
|
49
|
+
end
|
31
50
|
end
|
32
51
|
|
33
|
-
|
34
|
-
|
35
|
-
|
52
|
+
after do
|
53
|
+
Client.reset_config
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'sets host' do
|
57
|
+
expect(Client.config.url)
|
58
|
+
.to eq('http://interstella.com')
|
36
59
|
end
|
37
60
|
|
38
|
-
|
39
|
-
|
61
|
+
context 'when setting the port' do
|
62
|
+
before do
|
63
|
+
Client.configure do |config|
|
64
|
+
config.port 8080
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'sets host and port' do
|
69
|
+
expect(Client.config.url)
|
70
|
+
.to eq('http://interstella.com:8080')
|
71
|
+
end
|
40
72
|
end
|
41
73
|
end
|
42
74
|
end
|
@@ -1,37 +1,71 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'spec_helper'
|
4
|
+
|
3
5
|
describe Sinclair::Configurable do
|
4
6
|
describe '#yard' do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
describe '#configurable_with' do
|
8
|
+
before do
|
9
|
+
MyConfigurable.configure do
|
10
|
+
host 'interstella.com'
|
11
|
+
port 5555
|
12
|
+
end
|
9
13
|
end
|
10
|
-
end
|
11
14
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
+
after do
|
16
|
+
MyConfigurable.reset_config
|
17
|
+
end
|
15
18
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
it 'sets right value for config host' do
|
20
|
+
expect(MyConfigurable.config.host)
|
21
|
+
.to eq('interstella.com')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sets right value for config port' do
|
25
|
+
expect(MyConfigurable.config.port)
|
26
|
+
.to eq(5555)
|
27
|
+
end
|
20
28
|
|
21
|
-
|
22
|
-
|
23
|
-
|
29
|
+
context 'when reset_config is called' do
|
30
|
+
before { MyConfigurable.reset_config }
|
31
|
+
|
32
|
+
it 'returns initial value for host' do
|
33
|
+
expect(MyConfigurable.config.host).to be_nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'returns initial value for port' do
|
37
|
+
expect(MyConfigurable.config.port).to eq(80)
|
38
|
+
end
|
39
|
+
end
|
24
40
|
end
|
25
41
|
|
26
|
-
|
27
|
-
before
|
42
|
+
describe '#configurable_by' do
|
43
|
+
before do
|
44
|
+
Client.configure do
|
45
|
+
host 'interstella.com'
|
46
|
+
end
|
47
|
+
end
|
28
48
|
|
29
|
-
|
30
|
-
|
49
|
+
after do
|
50
|
+
Client.reset_config
|
31
51
|
end
|
32
52
|
|
33
|
-
it '
|
34
|
-
expect(
|
53
|
+
it 'sets host' do
|
54
|
+
expect(Client.config.url)
|
55
|
+
.to eq('http://interstella.com')
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when setting the port' do
|
59
|
+
before do
|
60
|
+
Client.configure do |config|
|
61
|
+
config.port 8080
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'sets host and port' do
|
66
|
+
expect(Client.config.url)
|
67
|
+
.to eq('http://interstella.com:8080')
|
68
|
+
end
|
35
69
|
end
|
36
70
|
end
|
37
71
|
end
|
@@ -42,6 +42,11 @@ describe Sinclair::Configurable do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
describe '.configurable_with' do
|
45
|
+
it do
|
46
|
+
expect(configurable.send(:configurable_with, :name, 'host'))
|
47
|
+
.to all(be_a(Symbol))
|
48
|
+
end
|
49
|
+
|
45
50
|
it 'adds reader to config' do
|
46
51
|
expect { configurable.send(:configurable_with, :name) }
|
47
52
|
.to add_method(:name).to(configurable.config)
|
@@ -70,6 +75,64 @@ describe Sinclair::Configurable do
|
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
78
|
+
describe '#configurable_by' do
|
79
|
+
let(:config_class) { ServerConfig }
|
80
|
+
|
81
|
+
it do
|
82
|
+
expect(configurable.send(:configurable_by, config_class))
|
83
|
+
.to be_a(Sinclair::ConfigFactory)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'changes config class' do
|
87
|
+
expect { configurable.send(:configurable_by, config_class) }
|
88
|
+
.to change { configurable.config.class }
|
89
|
+
.to(ServerConfig)
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'when config attributes are not given' do
|
93
|
+
it 'raises error with any configuration' do
|
94
|
+
expect { configurable.configure { host 'myhost' } }
|
95
|
+
.to raise_error(NoMethodError)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when config attributes are given' do
|
100
|
+
let(:attributes) { [:host, 'port'] }
|
101
|
+
|
102
|
+
let(:block) do
|
103
|
+
proc do
|
104
|
+
configurable.send(
|
105
|
+
:configurable_by, config_class, with: attributes
|
106
|
+
)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'does not add symbol methods config object' do
|
111
|
+
expect(&block)
|
112
|
+
.not_to add_method(:host).to(configurable.config)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'does not add string methods config object' do
|
116
|
+
expect(&block)
|
117
|
+
.not_to add_method(:port).to(configurable.config)
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'does not raises error on configuration of given symbol attributes' do
|
121
|
+
block.call
|
122
|
+
|
123
|
+
expect { configurable.configure { host 'myhost' } }
|
124
|
+
.not_to raise_error
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'does not raises error on configuration of given string attributes' do
|
128
|
+
block.call
|
129
|
+
|
130
|
+
expect { configurable.configure { port 90 } }
|
131
|
+
.not_to raise_error
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
73
136
|
describe '.configure' do
|
74
137
|
let(:config) { configurable.config }
|
75
138
|
|
@@ -93,5 +156,43 @@ describe Sinclair::Configurable do
|
|
93
156
|
.to raise_error(NoMethodError)
|
94
157
|
end
|
95
158
|
end
|
159
|
+
|
160
|
+
context 'when it was configured by custom class' do
|
161
|
+
let(:config_class) { ServerConfig }
|
162
|
+
|
163
|
+
before do
|
164
|
+
configurable.send(
|
165
|
+
:configurable_by, config_class, with: [:host, 'port']
|
166
|
+
)
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'when config class has the methods' do
|
170
|
+
it do
|
171
|
+
expect { configurable.configure { |c| c.host 'myhost' } }
|
172
|
+
.not_to raise_error
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'sets variable' do
|
176
|
+
expect { configurable.configure { |c| c.host 'myhost' } }
|
177
|
+
.to change(config, :host)
|
178
|
+
.from(nil).to('myhost')
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'when config class does not have the methods' do
|
183
|
+
let(:config_class) { Class.new(Sinclair::Config) }
|
184
|
+
|
185
|
+
it do
|
186
|
+
expect { configurable.configure { |c| c.host 'myhost' } }
|
187
|
+
.not_to raise_error
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'sets variable' do
|
191
|
+
expect { configurable.configure { |c| c.host 'myhost' } }
|
192
|
+
.to change { config.instance_variable_get(:@host) }
|
193
|
+
.from(nil).to('myhost')
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
96
197
|
end
|
97
198
|
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.3.
|
4
|
+
version: 1.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DarthJee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -234,6 +234,7 @@ files:
|
|
234
234
|
- spec/lib/sinclair_spec.rb
|
235
235
|
- spec/spec_helper.rb
|
236
236
|
- spec/support/fixture_helpers.rb
|
237
|
+
- spec/support/models/client.rb
|
237
238
|
- spec/support/models/default_value.rb
|
238
239
|
- spec/support/models/default_value_builder.rb
|
239
240
|
- spec/support/models/default_valueable.rb
|
@@ -250,9 +251,11 @@ files:
|
|
250
251
|
- spec/support/models/my_config.rb
|
251
252
|
- spec/support/models/my_configurable.rb
|
252
253
|
- spec/support/models/my_model.rb
|
254
|
+
- spec/support/models/my_server_config.rb
|
253
255
|
- spec/support/models/person.rb
|
254
256
|
- spec/support/models/purchase.rb
|
255
257
|
- spec/support/models/server.rb
|
258
|
+
- spec/support/models/server_config.rb
|
256
259
|
- spec/support/models/validator_builder.rb
|
257
260
|
- spec/support/shared_examples/config_factory.rb
|
258
261
|
- spec/support/shared_examples/method_definition.rb
|