prefab-cloud-ruby 0.3.0 → 0.4.0
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/VERSION +1 -1
- data/lib/prefab/config_client.rb +0 -1
- data/lib/prefab/config_resolver.rb +24 -9
- data/prefab-cloud-ruby.gemspec +3 -3
- data/test/test_config_loader.rb +0 -2
- data/test/test_config_resolver.rb +65 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c342824c82e95d283502c651dc00f331cf16d60
|
4
|
+
data.tar.gz: c0bd693c52c833155ba15b64fffe73addcb09786
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 369f79bd3bdec23b408b1d01dcba47e54b7ba72fdc8c4d0bc09032ec118cf18262839b0a9d8a1e7a220a593824bfac205ccec63498df940f1cfd8f54679f0d1d
|
7
|
+
data.tar.gz: 48a74a43324b96a9fe22c8d040ab69edf19285ee64ac2352b102eff70ec3777a89146f8a363e1fdf74ed5ee5c1fd3b19eea937396ac1f425c70297f33d668b01
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/prefab/config_client.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Prefab
|
2
2
|
class ConfigResolver
|
3
|
+
NAMESPACE_DELIMITER = ".".freeze
|
4
|
+
NAME_KEY_DELIMITER = ":".freeze
|
3
5
|
|
4
6
|
def initialize(base_client, config_loader)
|
5
7
|
@lock = Concurrent::ReadWriteLock.new
|
@@ -14,7 +16,7 @@ module Prefab
|
|
14
16
|
@lock.with_read_lock do
|
15
17
|
@local_store.each do |k, v|
|
16
18
|
value = v[:value]
|
17
|
-
str << "|#{k}| |#{value_of(value)}|#{value_of(value).class}\n"
|
19
|
+
str << "|#{k}| in #{v[:namespace]} |#{value_of(value)}|#{value_of(value).class}\n"
|
18
20
|
end
|
19
21
|
end
|
20
22
|
str
|
@@ -52,24 +54,37 @@ module Prefab
|
|
52
54
|
end
|
53
55
|
end
|
54
56
|
|
57
|
+
# Should client a.b.c see key in namespace a.b? yes
|
58
|
+
# Should client a.b.c see key in namespace a.b.c? yes
|
59
|
+
# Should client a.b.c see key in namespace a.b.d? no
|
60
|
+
# Should client a.b.c see key in namespace ""? yes
|
61
|
+
#
|
62
|
+
def starts_with_ns?(key_namespace, client_namespace)
|
63
|
+
zipped = key_namespace.split(NAMESPACE_DELIMITER).zip(client_namespace.split(NAMESPACE_DELIMITER))
|
64
|
+
zipped.map do |k, c|
|
65
|
+
(k.nil? || k.empty?) || c == k
|
66
|
+
end.all?
|
67
|
+
end
|
68
|
+
|
55
69
|
def make_local
|
56
70
|
store = {}
|
57
71
|
@config_loader.calc_config.each do |prop, value|
|
58
72
|
property = prop
|
59
|
-
|
60
|
-
|
73
|
+
key_namespace = ""
|
74
|
+
|
75
|
+
split = prop.split(NAME_KEY_DELIMITER)
|
61
76
|
|
62
77
|
if split.size > 1
|
63
|
-
property = split[1..-1].join
|
64
|
-
|
78
|
+
property = split[1..-1].join(NAME_KEY_DELIMITER)
|
79
|
+
key_namespace = split[0]
|
65
80
|
end
|
66
81
|
|
67
|
-
if (
|
82
|
+
if starts_with_ns?(key_namespace, @namespace)
|
68
83
|
existing = store[property]
|
69
84
|
if existing.nil?
|
70
|
-
store[property] = { namespace:
|
71
|
-
elsif existing[:namespace].split(
|
72
|
-
store[property] = { namespace:
|
85
|
+
store[property] = { namespace: key_namespace, value: value }
|
86
|
+
elsif existing[:namespace].split(NAMESPACE_DELIMITER).size < key_namespace.split(NAMESPACE_DELIMITER).size
|
87
|
+
store[property] = { namespace: key_namespace, value: value }
|
73
88
|
end
|
74
89
|
end
|
75
90
|
end
|
data/prefab-cloud-ruby.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: prefab-cloud-ruby 0.
|
5
|
+
# stub: prefab-cloud-ruby 0.4.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "prefab-cloud-ruby".freeze
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.4.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Jeff Dwyer".freeze]
|
14
|
-
s.date = "2019-
|
14
|
+
s.date = "2019-02-16"
|
15
15
|
s.description = "RateLimits & Config as a service".freeze
|
16
16
|
s.email = "jdwyer@prefab.cloud".freeze
|
17
17
|
s.extra_rdoc_files = [
|
data/test/test_config_loader.rb
CHANGED
@@ -25,8 +25,6 @@ class TestConfigLoader < Minitest::Test
|
|
25
25
|
assert_equal 5, @loader.highwater_mark
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
28
|
def test_keeps_most_recent
|
31
29
|
assert_equal 0, @loader.highwater_mark
|
32
30
|
@loader.set(Prefab::ConfigDelta.new(id: 1, key: "sample_int", value: Prefab::ConfigValue.new(int: 1)))
|
@@ -18,7 +18,6 @@ class TestConfigResolver < Minitest::Test
|
|
18
18
|
@resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
|
19
19
|
assert_equal "value_none", @resolver.get("key")
|
20
20
|
|
21
|
-
|
22
21
|
@resolverA = resolver_for_namespace("projectA", @loader)
|
23
22
|
assert_equal "valueA", @resolverA.get("key")
|
24
23
|
|
@@ -37,6 +36,71 @@ class TestConfigResolver < Minitest::Test
|
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
39
|
+
def test_starts_with_ns
|
40
|
+
@loader = MockConfigLoader.new
|
41
|
+
@loader.stub :calc_config, {} do
|
42
|
+
resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
|
43
|
+
assert resolver.send(:starts_with_ns?, "", "a")
|
44
|
+
assert resolver.send(:starts_with_ns?, "a", "a")
|
45
|
+
assert resolver.send(:starts_with_ns?, "a", "a.b")
|
46
|
+
assert !resolver.send(:starts_with_ns?, "a.b", "a")
|
47
|
+
|
48
|
+
assert resolver.send(:starts_with_ns?, "corp", "corp.proj.proja")
|
49
|
+
assert resolver.send(:starts_with_ns?, "corp.proj", "corp.proj.proja")
|
50
|
+
assert resolver.send(:starts_with_ns?, "corp.proj.proja", "corp.proj.proja")
|
51
|
+
assert !resolver.send(:starts_with_ns?, "corp.proj.projb", "corp.proj.proja")
|
52
|
+
|
53
|
+
# corp:a:b is not a real delimited namespace
|
54
|
+
assert !resolver.send(:starts_with_ns?, "corp", "corp:a:b")
|
55
|
+
assert resolver.send(:starts_with_ns?, "foo", "foo.baz")
|
56
|
+
assert resolver.send(:starts_with_ns?, "foo.baz", "foo.baz")
|
57
|
+
assert !resolver.send(:starts_with_ns?, "foo.baz", "foo.bazz")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# colons are not allowed in keys, but verify behavior anyway
|
62
|
+
def test_keys_with_colons
|
63
|
+
@loader = MockConfigLoader.new
|
64
|
+
loaded_values = {
|
65
|
+
"Key:With:Colons" => Prefab::ConfigValue.new(string: "value"),
|
66
|
+
"proj:apikey" => Prefab::ConfigValue.new(string: "v2")
|
67
|
+
}
|
68
|
+
|
69
|
+
@loader.stub :calc_config, loaded_values do
|
70
|
+
|
71
|
+
r = resolver_for_namespace("foo", @loader)
|
72
|
+
assert_nil r.get("apikey")
|
73
|
+
|
74
|
+
r = resolver_for_namespace("proj", @loader)
|
75
|
+
assert_equal "v2", r.get("apikey")
|
76
|
+
|
77
|
+
r = resolver_for_namespace("", @loader)
|
78
|
+
assert_nil r.get("apikey")
|
79
|
+
|
80
|
+
|
81
|
+
@resolverKeyWith = resolver_for_namespace("Ket:With", @loader)
|
82
|
+
assert_nil @resolverKeyWith.get("Colons")
|
83
|
+
assert_nil @resolverKeyWith.get("With:Colons")
|
84
|
+
assert_nil @resolverKeyWith.get("Key:With:Colons")
|
85
|
+
|
86
|
+
@resolverKeyWithExtra = resolver_for_namespace("Key:With:Extra", @loader)
|
87
|
+
puts @resolverKeyWithExtra.to_s
|
88
|
+
assert_nil @resolverKeyWithExtra.get("Colons")
|
89
|
+
assert_nil @resolverKeyWithExtra.get("With:Colons")
|
90
|
+
assert_nil @resolverKeyWithExtra.get("Key:With:Colons")
|
91
|
+
|
92
|
+
@resolverKey = resolver_for_namespace("Key", @loader)
|
93
|
+
assert_equal "value", @resolverKey.get("With:Colons")
|
94
|
+
assert_nil @resolverKey.get("Colons")
|
95
|
+
assert_nil @resolverKey.get("Key:With:Colons")
|
96
|
+
|
97
|
+
@resolverWithProperlySegmentedNamespace = resolver_for_namespace("Key.With.Extra", @loader)
|
98
|
+
assert_nil @resolverWithProperlySegmentedNamespace.get("Colons")
|
99
|
+
assert_equal "value", @resolverWithProperlySegmentedNamespace.get("With:Colons")
|
100
|
+
assert_nil @resolverWithProperlySegmentedNamespace.get("Key:With:Colons")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
40
104
|
def resolver_for_namespace(namespace, loader)
|
41
105
|
Prefab::ConfigResolver.new(MockBaseClient.new(namespace: namespace), loader)
|
42
106
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prefab-cloud-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|