configurate 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/Changelog.md +7 -0
- data/README.md +5 -4
- data/lib/configurate/lookup_chain.rb +8 -8
- data/lib/configurate/provider/dynamic.rb +9 -2
- data/lib/configurate/proxy.rb +25 -12
- data/lib/configurate/setting_path.rb +10 -5
- data/spec/configurate/provider/dynamic_spec.rb +6 -0
- data/spec/configurate/proxy_spec.rb +27 -2
- data/spec/configurate/setting_path_spec.rb +28 -10
- metadata +2 -2
- metadata.gz.asc +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 996d3e9be532044af0c5ab4597eb547661683c3b
|
4
|
+
data.tar.gz: 2e9b90ac7a188be0c8624fcd5e52619b7f267b53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c51c9bc229cff96e092dee805cb4f4517cdc315831b79f65b46253687b692a2db562278bb7831178433ff2768d403a4eb7c7151c9859b8884dd8e1413b08157
|
7
|
+
data.tar.gz: e3af9cf48b009e97fe81cd7fcbee2d5e55586d6aff33a45be88b562d9115c69a4b1157af12d52d525dc6e06d866b49586ba04576b72613e37b1a9b39649c69c5
|
checksums.yaml.gz.asc
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
-----BEGIN PGP SIGNATURE-----
|
2
2
|
Version: GnuPG v2
|
3
3
|
|
4
|
-
|
5
|
-
/
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
iQEcBAABAgAGBQJULyg7AAoJEPNH4OtHrHDWLzkIAIwwqTjkZlNOPS2D7tUOcNJY
|
5
|
+
ZF/zxymbrSL9yjzXwvYExgKy2i1xV5LrWpWP/mCiX9RX2eLxv8LcQGlWKupCwMc9
|
6
|
+
2ca/yy1wziXLhLY6zJhWF5j6WNOfRlJTGaAUPSHtbCeT9WOjbpnDWfWTDZKNuonb
|
7
|
+
i1HPUCZPx+YAXb6Gzgl39FcCH1UgEZy3D3ijc3FCSHigfnwSEDcjCwQtQuMedwNu
|
8
|
+
l1/V5UdTPDiWPBxeGMucyZLBKdN8r70wfgNKvDZ1XHolO+9HUOsmcS6St1P5OpUp
|
9
|
+
dJ25Tm3ACv+uydyQLr/e2bPJs+Lm901rKUMb+gIozoQCYMTRnpAoNMVNqK+KRBI=
|
10
|
+
=+ZIR
|
11
11
|
-----END PGP SIGNATURE-----
|
data.tar.gz.asc
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
-----BEGIN PGP SIGNATURE-----
|
2
2
|
Version: GnuPG v2
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
+
|
9
|
-
|
10
|
-
=
|
4
|
+
iQEcBAABAgAGBQJULyg7AAoJEPNH4OtHrHDWgO0H/jLKCQPi2kguHzfJU/k4hII8
|
5
|
+
VITtYbNZb4ZBbHecgiam4mI+m5EvDCfQu3KEzSN3w06czUoVFW0uCABJkAqb43He
|
6
|
+
EvITE2z36GKFb8GqfA5EXnRPjmsGTvH8EnUG8DetTRNjFkERvNSi6t3RxgfNQ8yw
|
7
|
+
UFwtascrsmM5vjzCvgRlJ0cm1HA3LZFqoEyw/MovOLDviLTz1ECKqxNmaEULdhp9
|
8
|
+
Fb10e5Y9XalRbbF6wSOKWp06owiEcTVY/lqNOZBJ+ZIG1RQUD73yhAGW2b7bM6rg
|
9
|
+
tiBEAal1Tt6c5v5SvucCcMrKxd3R8CXCtwETQVFl4rxB4eYhSgx0PkFiQ3OPicY=
|
10
|
+
=hJkd
|
11
11
|
-----END PGP SIGNATURE-----
|
data/Changelog.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# 0.2.0
|
2
|
+
|
3
|
+
* Dynamic provider listens to reset_dynamic! message and forgets all settings on it.
|
4
|
+
* Calls ending in ! call the providers directly.
|
5
|
+
* Added SettingPath#action?, remove is_ prefix from SettingPath methods.
|
6
|
+
* Add implicit converters to Proxy that call the explicit converters.
|
7
|
+
|
1
8
|
# 0.1.0
|
2
9
|
|
3
10
|
* Dynamic provider resolves nested assignments
|
data/README.md
CHANGED
@@ -80,7 +80,7 @@ Ruby does not allow to metaprogram `false`, thus something like
|
|
80
80
|
puts "yep" if Config.enable_stuff
|
81
81
|
```
|
82
82
|
|
83
|
-
always outputs `yep`. The workaround is to append `.get
|
83
|
+
always outputs `yep`. The workaround is to append `.get`, or `?` to get the
|
84
84
|
real value:
|
85
85
|
|
86
86
|
```ruby
|
@@ -156,14 +156,15 @@ the following optional parameters, as a hash:
|
|
156
156
|
|
157
157
|
### Configurate::Provider::Dynamic
|
158
158
|
|
159
|
-
A provider which stores the first
|
160
|
-
return it later. This is mainly useful for testing but can be useful to temporarily
|
161
|
-
too. To clarify a small example:
|
159
|
+
A provider which stores the first additional parameter if the query string ends with an equal sign and can
|
160
|
+
return it later. This is mainly useful for testing but can be useful to temporarily override stuff too. To clarify a small example:
|
162
161
|
|
163
162
|
```ruby
|
164
163
|
Config.foo.bar # => nil
|
165
164
|
Config.foo.bar = "baz"
|
166
165
|
Config.foo.bar # => "baz"
|
166
|
+
Config.reset_dynamic!
|
167
|
+
Config.foo.bar # => nil
|
167
168
|
```
|
168
169
|
|
169
170
|
## Writing a provider
|
@@ -5,7 +5,7 @@ module Configurate
|
|
5
5
|
def initialize
|
6
6
|
@provider = []
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
# Adds a provider to the chain. Providers are tried in the order
|
10
10
|
# they are added, so the order is important.
|
11
11
|
#
|
@@ -17,11 +17,11 @@ module Configurate
|
|
17
17
|
unless provider.respond_to?(:instance_methods) && provider.instance_methods.include?(:lookup)
|
18
18
|
raise ArgumentError, "the given provider does not respond to lookup"
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
@provider << provider.new(*args)
|
22
22
|
end
|
23
|
-
|
24
|
-
|
23
|
+
|
24
|
+
|
25
25
|
# Tries all providers in the order they were added to provide a response
|
26
26
|
# for setting.
|
27
27
|
#
|
@@ -37,13 +37,13 @@ module Configurate
|
|
37
37
|
return special_value_or_string(provider.lookup(setting.clone, *args))
|
38
38
|
rescue SettingNotFoundError; end
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
nil
|
42
42
|
end
|
43
43
|
alias_method :[], :lookup
|
44
|
-
|
45
|
-
private
|
46
|
-
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
47
|
def special_value_or_string(value)
|
48
48
|
if [TrueClass, FalseClass, NilClass, Array, Hash].include?(value.class)
|
49
49
|
return value
|
@@ -2,14 +2,21 @@ module Configurate; module Provider
|
|
2
2
|
# This provider knows nothing upon initialization, however if you access
|
3
3
|
# a setting ending with +=+ and give one argument to that call it remembers
|
4
4
|
# that setting, stripping the +=+ and will return it on the next call
|
5
|
-
# without +=+.
|
5
|
+
# without +=+. Sending +reset_dynamic!+ to it will make it forget all
|
6
|
+
# settings. Also assigning nil will have the effect of it forgetting
|
7
|
+
# a setting.
|
6
8
|
class Dynamic < Base
|
7
9
|
def initialize
|
8
10
|
@settings = {}
|
9
11
|
end
|
10
12
|
|
11
13
|
def lookup_path(setting_path, *args)
|
12
|
-
if setting_path.
|
14
|
+
if setting_path.to_s == "reset_dynamic!"
|
15
|
+
@settings = {}
|
16
|
+
return
|
17
|
+
end
|
18
|
+
|
19
|
+
if setting_path.setter? && args.length > 0
|
13
20
|
value = args.first
|
14
21
|
value = value.get if value.respond_to?(:_proxy?) && value._proxy?
|
15
22
|
*root, key = setting_path.to_a
|
data/lib/configurate/proxy.rb
CHANGED
@@ -18,40 +18,53 @@ module Configurate
|
|
18
18
|
@lookup_chain = lookup_chain
|
19
19
|
@setting_path = SettingPath.new
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def !
|
23
23
|
!target
|
24
24
|
end
|
25
|
-
|
26
|
-
[:!=, :==, :eql
|
25
|
+
|
26
|
+
[:!=, :==, :eql?, :coerce].each do |method|
|
27
27
|
define_method method do |other|
|
28
28
|
target.public_send method, target_or_object(other)
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
|
+
{
|
33
|
+
:to_int => :to_i,
|
34
|
+
:to_hash => :to_h,
|
35
|
+
:to_str => :to_s,
|
36
|
+
:to_ary => :to_a
|
37
|
+
}.each do |method, converter|
|
38
|
+
define_method method do
|
39
|
+
value = target
|
40
|
+
return value.public_send converter if value.respond_to? converter
|
41
|
+
value.public_send method
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
32
45
|
def _proxy?
|
33
46
|
true
|
34
47
|
end
|
35
|
-
|
48
|
+
|
36
49
|
def respond_to? method, include_private=false
|
37
50
|
method == :_proxy? || target_respond_to?(method, include_private)
|
38
51
|
end
|
39
|
-
|
52
|
+
|
40
53
|
def send *args, &block
|
41
54
|
__send__(*args, &block)
|
42
55
|
end
|
43
56
|
alias_method :public_send, :send
|
44
|
-
|
57
|
+
|
45
58
|
def method_missing setting, *args, &block
|
46
59
|
return target.public_send(setting, *args, &block) if target_respond_to? setting
|
47
60
|
|
48
61
|
@setting_path << setting
|
49
|
-
|
50
|
-
return target(*args) if @setting_path.
|
51
|
-
|
62
|
+
|
63
|
+
return target(*args) if @setting_path.question_action_or_setter?
|
64
|
+
|
52
65
|
self
|
53
66
|
end
|
54
|
-
|
67
|
+
|
55
68
|
# Get the setting at the current path, if found.
|
56
69
|
# (see LookupChain#lookup)
|
57
70
|
def target *args
|
@@ -60,7 +73,7 @@ module Configurate
|
|
60
73
|
@lookup_chain.lookup @setting_path, *args
|
61
74
|
end
|
62
75
|
alias_method :get, :target
|
63
|
-
|
76
|
+
|
64
77
|
private
|
65
78
|
COMMON_KEY_NAMES = [:key, :method]
|
66
79
|
|
@@ -19,17 +19,22 @@ module Configurate
|
|
19
19
|
def_delegators :@path, :empty?, :length, :size, :hsh
|
20
20
|
|
21
21
|
# Whether the current path looks like a question or setter method
|
22
|
-
def
|
23
|
-
|
22
|
+
def question_action_or_setter?
|
23
|
+
question? || action? || setter?
|
24
24
|
end
|
25
25
|
|
26
26
|
# Whether the current path looks like a question method
|
27
|
-
def
|
27
|
+
def question?
|
28
28
|
@path.last.to_s.end_with?("?")
|
29
29
|
end
|
30
30
|
|
31
|
+
# Whether the current path looks like an action method
|
32
|
+
def action?
|
33
|
+
@path.last.to_s.end_with?("!")
|
34
|
+
end
|
35
|
+
|
31
36
|
# Whether the current path looks like a setter method
|
32
|
-
def
|
37
|
+
def setter?
|
33
38
|
@path.last.to_s.end_with?("=")
|
34
39
|
end
|
35
40
|
|
@@ -61,7 +66,7 @@ module Configurate
|
|
61
66
|
end
|
62
67
|
|
63
68
|
def inspect
|
64
|
-
"<SettingPath:#{object_id.to_s(16)} path=#{to_s}:#{@path.object_id.to_s(16)}
|
69
|
+
"<SettingPath:#{object_id.to_s(16)} path=#{to_s}:#{@path.object_id.to_s(16)} question=#{question?} action=#{action?} setter=#{setter?}>"
|
65
70
|
end
|
66
71
|
|
67
72
|
private
|
@@ -23,5 +23,11 @@ describe Configurate::Provider::Dynamic do
|
|
23
23
|
subject.lookup_path Configurate::SettingPath.new(["find_me", "later="]), {"a" => "b"}
|
24
24
|
expect(subject.lookup_path Configurate::SettingPath.new(["find_me", "later", "a"])).to eq "b"
|
25
25
|
end
|
26
|
+
|
27
|
+
it "clears out all overrides on reset_dynamic!" do
|
28
|
+
subject.lookup_path Configurate::SettingPath.new(["find_me", "later="]), "there"
|
29
|
+
subject.lookup_path Configurate::SettingPath.new(["reset_dynamic!"])
|
30
|
+
expect(subject.lookup_path Configurate::SettingPath.new(["find_me", "later"]) ).to_not eq "there"
|
31
|
+
end
|
26
32
|
end
|
27
33
|
end
|
@@ -6,7 +6,7 @@ describe Configurate::Proxy do
|
|
6
6
|
|
7
7
|
describe "in case statements" do
|
8
8
|
it "acts like the target" do
|
9
|
-
pending "If anyone knows a way to overwrite
|
9
|
+
pending "If anyone knows a sane way to overwrite Module#===, please tell me :P"
|
10
10
|
result = case proxy
|
11
11
|
when String
|
12
12
|
"string"
|
@@ -23,6 +23,11 @@ describe Configurate::Proxy do
|
|
23
23
|
proxy.method_missing(:enable?)
|
24
24
|
end
|
25
25
|
|
26
|
+
it "calls #target if the method ends with a !" do
|
27
|
+
expect(lookup_chain).to receive(:lookup).and_return(false)
|
28
|
+
proxy.method_missing(:do_it!)
|
29
|
+
end
|
30
|
+
|
26
31
|
it "calls #target if the method ends with a =" do
|
27
32
|
expect(lookup_chain).to receive(:lookup).and_return(false)
|
28
33
|
proxy.method_missing(:url=)
|
@@ -49,7 +54,7 @@ describe Configurate::Proxy do
|
|
49
54
|
end
|
50
55
|
|
51
56
|
describe "#target" do
|
52
|
-
[:
|
57
|
+
[:to_s, :to_xml, :respond_to?, :present?, :!=, :eql?,
|
53
58
|
:each, :try, :size, :length, :count, :==, :=~, :gsub, :blank?, :chop,
|
54
59
|
:start_with?, :end_with?].each do |method|
|
55
60
|
it "is called for accessing #{method} on the proxy" do
|
@@ -72,5 +77,25 @@ describe Configurate::Proxy do
|
|
72
77
|
it "returns nil if no setting is given" do
|
73
78
|
expect(proxy.target).to be_nil
|
74
79
|
end
|
80
|
+
|
81
|
+
it "converts to a string" do
|
82
|
+
allow(lookup_chain).to receive(:lookup).and_return("bar")
|
83
|
+
expect("foo"+proxy.something).to eq "foobar"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "converts to a number" do
|
87
|
+
allow(lookup_chain).to receive(:lookup).and_return(1)
|
88
|
+
expect(2+proxy.something).to eq 3
|
89
|
+
end
|
90
|
+
|
91
|
+
it "converts to an array" do
|
92
|
+
allow(lookup_chain).to receive(:lookup).and_return([1, 2])
|
93
|
+
expect([:a, :b].zip(proxy.something)).to eq [[:a, 1], [:b, 2]]
|
94
|
+
end
|
95
|
+
|
96
|
+
it "converts to a hash" do
|
97
|
+
allow(lookup_chain).to receive(:lookup).and_return({:a => :b})
|
98
|
+
expect({c: :d}.merge(proxy.something)).to eq({:a => :b, :c => :d})
|
99
|
+
end
|
75
100
|
end
|
76
101
|
end
|
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Configurate::SettingPath do
|
4
4
|
let(:normal_path) { described_class.new([:foo]) }
|
5
5
|
let(:question_path) { described_class.new([:foo?]) }
|
6
|
+
let(:action_path) { described_class.new([:foo!]) }
|
6
7
|
let(:setter_path) { described_class.new([:foo=]) }
|
7
8
|
let(:long_path) { described_class.new(["foo", "bar?"]) }
|
8
9
|
|
@@ -14,26 +15,38 @@ describe Configurate::SettingPath do
|
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
|
-
describe "#
|
18
|
+
describe "#question?" do
|
18
19
|
context "with a question signature as setting" do
|
19
|
-
subject { question_path.
|
20
|
+
subject { question_path.question? }
|
20
21
|
it { should be_truthy }
|
21
22
|
end
|
22
23
|
|
23
24
|
context "with a normal path as setting" do
|
24
|
-
subject { normal_path.
|
25
|
+
subject { normal_path.question? }
|
25
26
|
it { should be_falsey }
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
|
-
describe "#
|
30
|
+
describe "#action?" do
|
31
|
+
context "with a action signature as setting" do
|
32
|
+
subject { action_path.action? }
|
33
|
+
it { should be_truthy }
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with a normal path as setting" do
|
37
|
+
subject { normal_path.action? }
|
38
|
+
it { should be_falsey }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#setter?" do
|
30
43
|
context "with a setter signature as setting" do
|
31
|
-
subject { setter_path.
|
44
|
+
subject { setter_path.setter? }
|
32
45
|
it { should be_truthy }
|
33
46
|
end
|
34
47
|
|
35
48
|
context "with a normal path as setting" do
|
36
|
-
subject { normal_path.
|
49
|
+
subject { normal_path.setter? }
|
37
50
|
it { should be_falsey }
|
38
51
|
end
|
39
52
|
end
|
@@ -49,19 +62,24 @@ describe Configurate::SettingPath do
|
|
49
62
|
end
|
50
63
|
|
51
64
|
|
52
|
-
describe "#
|
65
|
+
describe "#question_action_or_setter?" do
|
53
66
|
context "with a question signature as setting" do
|
54
|
-
subject { question_path.
|
67
|
+
subject { question_path.question_action_or_setter? }
|
68
|
+
it { should be_truthy }
|
69
|
+
end
|
70
|
+
|
71
|
+
context "with an action signature as setting" do
|
72
|
+
subject { action_path.question_action_or_setter? }
|
55
73
|
it { should be_truthy }
|
56
74
|
end
|
57
75
|
|
58
76
|
context "with a setter signature as setting" do
|
59
|
-
subject { setter_path.
|
77
|
+
subject { setter_path.question_action_or_setter? }
|
60
78
|
it { should be_truthy }
|
61
79
|
end
|
62
80
|
|
63
81
|
context "with a normal path as setting" do
|
64
|
-
subject { normal_path.
|
82
|
+
subject { normal_path.question_action_or_setter? }
|
65
83
|
it { should be_falsey }
|
66
84
|
end
|
67
85
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: configurate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonne Haß
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
metadata.gz.asc
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
-----BEGIN PGP SIGNATURE-----
|
2
2
|
Version: GnuPG v2
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
=
|
4
|
+
iQEcBAABAgAGBQJULyg7AAoJEPNH4OtHrHDWD0IH/0e90hWnDOQqWhUnKY3JM+gf
|
5
|
+
wOdHXiyB4p7cPIoO6QFsZq0Mm4t+bYLADI3adDq9kQAtIjo6s3jUJzK84QNjnsNS
|
6
|
+
8Sc1OWNFYLrMVi/7rkJfyjiV6rMHYyB9O76vxH3w7/CZAl7fscadF4BW1PTqcti8
|
7
|
+
z4IoXtBs5KVxk1U3vtpPLaYitYIx/mc2voL0Z5wEuMeBhTYHjx4XraLrNzuSh6yN
|
8
|
+
cRnItaD70Z2uIvRF6bSyazDLWEO2cUfH/kTjsjHja4xwa4yYm3/ZkFZ2YZAXJNvU
|
9
|
+
P5mtnv5cCcJKZy1uNKV5DRj9zATL+yrzgSaSKV1O9BPW7zL3eHeu156TOxIRW48=
|
10
|
+
=sUo3
|
11
11
|
-----END PGP SIGNATURE-----
|