prefab-cloud-ruby 0.13.0 → 0.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/Gemfile +4 -11
- data/Gemfile.lock +32 -52
- data/README.md +1 -19
- data/Rakefile +0 -1
- data/VERSION +1 -1
- data/compile_protos.sh +0 -3
- data/lib/prefab/auth_interceptor.rb +0 -1
- data/lib/prefab/cancellable_interceptor.rb +0 -1
- data/lib/prefab/client.rb +36 -49
- data/lib/prefab/config_client.rb +73 -145
- data/lib/prefab/config_loader.rb +13 -98
- data/lib/prefab/config_resolver.rb +49 -56
- data/lib/prefab/feature_flag_client.rb +11 -129
- data/lib/prefab/logger_client.rb +8 -10
- data/lib/prefab/murmer3.rb +0 -1
- data/lib/prefab/noop_cache.rb +0 -1
- data/lib/prefab/noop_stats.rb +0 -1
- data/lib/prefab/ratelimit_client.rb +0 -1
- data/lib/prefab-cloud-ruby.rb +0 -10
- data/lib/prefab_pb.rb +132 -214
- data/lib/prefab_services_pb.rb +6 -35
- data/prefab-cloud-ruby.gemspec +11 -30
- data/test/.prefab.test.config.yaml +1 -27
- data/test/test_config_loader.rb +25 -39
- data/test/test_config_resolver.rb +38 -134
- data/test/test_feature_flag_client.rb +35 -277
- data/test/test_helper.rb +4 -70
- data/test/test_logger.rb +29 -23
- metadata +15 -70
- data/.github/workflows/ruby.yml +0 -39
- data/.tool-versions +0 -1
- data/CODEOWNERS +0 -1
- data/lib/prefab/config_helper.rb +0 -29
- data/lib/prefab/error.rb +0 -6
- data/lib/prefab/errors/initialization_timeout_error.rb +0 -13
- data/lib/prefab/errors/invalid_api_key_error.rb +0 -19
- data/lib/prefab/errors/missing_default_error.rb +0 -13
- data/lib/prefab/internal_logger.rb +0 -29
- data/lib/prefab/options.rb +0 -82
- data/run_test_harness_server.sh +0 -8
- data/test/harness_server.rb +0 -64
- data/test/test_client.rb +0 -91
- data/test/test_config_client.rb +0 -56
data/lib/prefab_services_pb.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
2
|
# Source: prefab.proto for package 'prefab'
|
4
3
|
|
@@ -9,13 +8,13 @@ module Prefab
|
|
9
8
|
module RateLimitService
|
10
9
|
class Service
|
11
10
|
|
12
|
-
include
|
11
|
+
include GRPC::GenericService
|
13
12
|
|
14
13
|
self.marshal_class_method = :encode
|
15
14
|
self.unmarshal_class_method = :decode
|
16
15
|
self.service_name = 'prefab.RateLimitService'
|
17
16
|
|
18
|
-
rpc :LimitCheck,
|
17
|
+
rpc :LimitCheck, LimitRequest, LimitResponse
|
19
18
|
end
|
20
19
|
|
21
20
|
Stub = Service.rpc_stub_class
|
@@ -23,43 +22,15 @@ module Prefab
|
|
23
22
|
module ConfigService
|
24
23
|
class Service
|
25
24
|
|
26
|
-
include
|
25
|
+
include GRPC::GenericService
|
27
26
|
|
28
27
|
self.marshal_class_method = :encode
|
29
28
|
self.unmarshal_class_method = :decode
|
30
29
|
self.service_name = 'prefab.ConfigService'
|
31
30
|
|
32
|
-
rpc :GetConfig,
|
33
|
-
rpc :GetAllConfig,
|
34
|
-
rpc :Upsert,
|
35
|
-
end
|
36
|
-
|
37
|
-
Stub = Service.rpc_stub_class
|
38
|
-
end
|
39
|
-
module IdService
|
40
|
-
class Service
|
41
|
-
|
42
|
-
include ::GRPC::GenericService
|
43
|
-
|
44
|
-
self.marshal_class_method = :encode
|
45
|
-
self.unmarshal_class_method = :decode
|
46
|
-
self.service_name = 'prefab.IdService'
|
47
|
-
|
48
|
-
rpc :GetBlock, ::Prefab::IdBlockRequest, ::Prefab::IdBlock
|
49
|
-
end
|
50
|
-
|
51
|
-
Stub = Service.rpc_stub_class
|
52
|
-
end
|
53
|
-
module ClientService
|
54
|
-
class Service
|
55
|
-
|
56
|
-
include ::GRPC::GenericService
|
57
|
-
|
58
|
-
self.marshal_class_method = :encode
|
59
|
-
self.unmarshal_class_method = :decode
|
60
|
-
self.service_name = 'prefab.ClientService'
|
61
|
-
|
62
|
-
rpc :GetAll, ::Prefab::Identity, ::Prefab::ConfigEvaluations
|
31
|
+
rpc :GetConfig, ConfigServicePointer, stream(ConfigDeltas)
|
32
|
+
rpc :GetAllConfig, ConfigServicePointer, ConfigDeltas
|
33
|
+
rpc :Upsert, UpsertRequest, ConfigServicePointer
|
63
34
|
end
|
64
35
|
|
65
36
|
Stub = Service.rpc_stub_class
|
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.13.
|
5
|
+
# stub: prefab-cloud-ruby 0.13.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "prefab-cloud-ruby".freeze
|
9
|
-
s.version = "0.13.
|
9
|
+
s.version = "0.13.1"
|
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 = "2022-08-
|
14
|
+
s.date = "2022-08-12"
|
15
15
|
s.description = "RateLimits & Config as a service".freeze
|
16
16
|
s.email = "jdwyer@prefab.cloud".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -20,9 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
]
|
21
21
|
s.files = [
|
22
22
|
".envrc",
|
23
|
-
".
|
24
|
-
".tool-versions",
|
25
|
-
"CODEOWNERS",
|
23
|
+
".ruby-version",
|
26
24
|
"Gemfile",
|
27
25
|
"Gemfile.lock",
|
28
26
|
"LICENSE.txt",
|
@@ -35,29 +33,18 @@ Gem::Specification.new do |s|
|
|
35
33
|
"lib/prefab/cancellable_interceptor.rb",
|
36
34
|
"lib/prefab/client.rb",
|
37
35
|
"lib/prefab/config_client.rb",
|
38
|
-
"lib/prefab/config_helper.rb",
|
39
36
|
"lib/prefab/config_loader.rb",
|
40
37
|
"lib/prefab/config_resolver.rb",
|
41
|
-
"lib/prefab/error.rb",
|
42
|
-
"lib/prefab/errors/initialization_timeout_error.rb",
|
43
|
-
"lib/prefab/errors/invalid_api_key_error.rb",
|
44
|
-
"lib/prefab/errors/missing_default_error.rb",
|
45
38
|
"lib/prefab/feature_flag_client.rb",
|
46
|
-
"lib/prefab/internal_logger.rb",
|
47
39
|
"lib/prefab/logger_client.rb",
|
48
40
|
"lib/prefab/murmer3.rb",
|
49
41
|
"lib/prefab/noop_cache.rb",
|
50
42
|
"lib/prefab/noop_stats.rb",
|
51
|
-
"lib/prefab/options.rb",
|
52
43
|
"lib/prefab/ratelimit_client.rb",
|
53
44
|
"lib/prefab_pb.rb",
|
54
45
|
"lib/prefab_services_pb.rb",
|
55
46
|
"prefab-cloud-ruby.gemspec",
|
56
|
-
"run_test_harness_server.sh",
|
57
47
|
"test/.prefab.test.config.yaml",
|
58
|
-
"test/harness_server.rb",
|
59
|
-
"test/test_client.rb",
|
60
|
-
"test/test_config_client.rb",
|
61
48
|
"test/test_config_loader.rb",
|
62
49
|
"test/test_config_resolver.rb",
|
63
50
|
"test/test_feature_flag_client.rb",
|
@@ -66,7 +53,7 @@ Gem::Specification.new do |s|
|
|
66
53
|
]
|
67
54
|
s.homepage = "http://github.com/prefab-cloud/prefab-cloud-ruby".freeze
|
68
55
|
s.licenses = ["MIT".freeze]
|
69
|
-
s.rubygems_version = "3.
|
56
|
+
s.rubygems_version = "3.1.6".freeze
|
70
57
|
s.summary = "Prefab Ruby Infrastructure".freeze
|
71
58
|
|
72
59
|
if s.respond_to? :specification_version then
|
@@ -76,29 +63,23 @@ Gem::Specification.new do |s|
|
|
76
63
|
if s.respond_to? :add_runtime_dependency then
|
77
64
|
s.add_runtime_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
|
78
65
|
s.add_runtime_dependency(%q<faraday>.freeze, [">= 0"])
|
79
|
-
s.add_runtime_dependency(%q<ld-eventsource>.freeze, [">= 0"])
|
80
66
|
s.add_runtime_dependency(%q<grpc>.freeze, [">= 0"])
|
81
|
-
s.
|
82
|
-
s.
|
83
|
-
s.add_development_dependency(%q<grpc-tools>.freeze, [">= 0"])
|
67
|
+
s.add_development_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
|
68
|
+
s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
|
84
69
|
s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
85
|
-
s.add_development_dependency(%q<bundler>.freeze, ["
|
70
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
|
86
71
|
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
|
87
72
|
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
88
|
-
s.add_development_dependency(%q<thin>.freeze, [">= 0"])
|
89
73
|
else
|
90
74
|
s.add_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0", ">= 1.0.5"])
|
91
75
|
s.add_dependency(%q<faraday>.freeze, [">= 0"])
|
92
|
-
s.add_dependency(%q<ld-eventsource>.freeze, [">= 0"])
|
93
76
|
s.add_dependency(%q<grpc>.freeze, [">= 0"])
|
94
|
-
s.add_dependency(%q<
|
95
|
-
s.add_dependency(%q<
|
96
|
-
s.add_dependency(%q<grpc-tools>.freeze, [">= 0"])
|
77
|
+
s.add_dependency(%q<grpc-tools>.freeze, ["~> 1.17.1"])
|
78
|
+
s.add_dependency(%q<shoulda>.freeze, [">= 0"])
|
97
79
|
s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
98
|
-
s.add_dependency(%q<bundler>.freeze, ["
|
80
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
|
99
81
|
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4.9"])
|
100
82
|
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
101
|
-
s.add_dependency(%q<thin>.freeze, [">= 0"])
|
102
83
|
end
|
103
84
|
end
|
104
85
|
|
@@ -1,32 +1,6 @@
|
|
1
|
-
sample:
|
1
|
+
sample: OneTwoThree
|
2
2
|
sample_int: 123
|
3
3
|
sample_double: 12.12
|
4
4
|
sample_bool: true
|
5
|
-
false_value: false
|
6
|
-
zero_value: 0
|
7
5
|
sample_to_override: Foo
|
8
6
|
prefab.log_level: debug
|
9
|
-
unit_tests:
|
10
|
-
sample: test sample value
|
11
|
-
enabled_flag: true
|
12
|
-
disabled_flag: false
|
13
|
-
flag_with_a_value:
|
14
|
-
feature_flag: true
|
15
|
-
value: "all-features"
|
16
|
-
in_lookup_key:
|
17
|
-
feature_flag: true
|
18
|
-
value: true
|
19
|
-
criteria:
|
20
|
-
operator: LOOKUP_KEY_IN
|
21
|
-
values:
|
22
|
-
- abc123
|
23
|
-
- xyz987
|
24
|
-
just_my_domain:
|
25
|
-
feature_flag: true
|
26
|
-
value: new-version
|
27
|
-
criteria:
|
28
|
-
operator: PROP_IS_ONE_OF
|
29
|
-
property: domain
|
30
|
-
values: ["prefab.cloud", "example.com"]
|
31
|
-
ignored_env:
|
32
|
-
sample: ignored value
|
data/test/test_config_loader.rb
CHANGED
@@ -1,56 +1,41 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
require 'test_helper'
|
3
2
|
|
4
3
|
class TestConfigLoader < Minitest::Test
|
5
4
|
def setup
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
defaults_env: "unit_tests"
|
10
|
-
)
|
11
|
-
@loader = Prefab::ConfigLoader.new(MockBaseClient.new(options))
|
5
|
+
ENV['PREFAB_CONFIG_OVERRIDE_DIR'] = "none"
|
6
|
+
ENV['PREFAB_CONFIG_CLASSPATH_DIR'] = "test"
|
7
|
+
@loader = Prefab::ConfigLoader.new(MockBaseClient.new)
|
12
8
|
end
|
13
9
|
|
14
10
|
def test_load
|
15
11
|
should_be :int, 123, "sample_int"
|
16
|
-
should_be :string, "
|
12
|
+
should_be :string, "OneTwoThree", "sample"
|
17
13
|
should_be :bool, true, "sample_bool"
|
18
14
|
should_be :double, 12.12, "sample_double"
|
19
15
|
end
|
20
16
|
|
21
|
-
def test_load_in_no_default_env
|
22
|
-
options = Prefab::Options.new(
|
23
|
-
prefab_config_override_dir: "none",
|
24
|
-
prefab_config_classpath_dir: "test",
|
25
|
-
# no defaults_env
|
26
|
-
)
|
27
|
-
@loader = Prefab::ConfigLoader.new(MockBaseClient.new(options))
|
28
|
-
should_be :string, "default sample value", "sample"
|
29
|
-
should_be :bool, true, "sample_bool"
|
30
|
-
end
|
31
|
-
|
32
17
|
def test_highwater
|
33
18
|
assert_equal 0, @loader.highwater_mark
|
34
|
-
@loader.set(Prefab::
|
19
|
+
@loader.set(Prefab::ConfigDelta.new(id: 1, key: "sample_int", value: Prefab::ConfigValue.new(int: 456)))
|
35
20
|
assert_equal 1, @loader.highwater_mark
|
36
21
|
|
37
|
-
@loader.set(Prefab::
|
22
|
+
@loader.set(Prefab::ConfigDelta.new(id: 5, key: "sample_int", value: Prefab::ConfigValue.new(int: 456)))
|
38
23
|
assert_equal 5, @loader.highwater_mark
|
39
|
-
@loader.set(Prefab::
|
24
|
+
@loader.set(Prefab::ConfigDelta.new(id: 2, key: "sample_int", value: Prefab::ConfigValue.new(int: 456)))
|
40
25
|
assert_equal 5, @loader.highwater_mark
|
41
26
|
end
|
42
27
|
|
43
28
|
def test_keeps_most_recent
|
44
29
|
assert_equal 0, @loader.highwater_mark
|
45
|
-
@loader.set(Prefab::
|
30
|
+
@loader.set(Prefab::ConfigDelta.new(id: 1, key: "sample_int", value: Prefab::ConfigValue.new(int: 1)))
|
46
31
|
assert_equal 1, @loader.highwater_mark
|
47
32
|
should_be :int, 1, "sample_int"
|
48
33
|
|
49
|
-
@loader.set(Prefab::
|
34
|
+
@loader.set(Prefab::ConfigDelta.new(id: 4, key: "sample_int", value: Prefab::ConfigValue.new(int: 4)))
|
50
35
|
assert_equal 4, @loader.highwater_mark
|
51
36
|
should_be :int, 4, "sample_int"
|
52
37
|
|
53
|
-
@loader.set(Prefab::
|
38
|
+
@loader.set(Prefab::ConfigDelta.new(id: 2, key: "sample_int", value: Prefab::ConfigValue.new(int: 2)))
|
54
39
|
assert_equal 4, @loader.highwater_mark
|
55
40
|
should_be :int, 4, "sample_int"
|
56
41
|
end
|
@@ -58,36 +43,37 @@ class TestConfigLoader < Minitest::Test
|
|
58
43
|
def test_api_precedence
|
59
44
|
should_be :int, 123, "sample_int"
|
60
45
|
|
61
|
-
@loader.set(Prefab::
|
46
|
+
@loader.set(Prefab::ConfigDelta.new(key: "sample_int", value: Prefab::ConfigValue.new(int: 456)))
|
62
47
|
should_be :int, 456, "sample_int"
|
63
48
|
end
|
64
49
|
|
65
50
|
def test_api_deltas
|
66
51
|
val = Prefab::ConfigValue.new(int: 456)
|
67
|
-
|
68
|
-
@loader.set(
|
52
|
+
delta = Prefab::ConfigDelta.new(key: "sample_int", value: val)
|
53
|
+
@loader.set(delta)
|
69
54
|
|
70
|
-
|
71
|
-
|
72
|
-
assert_equal
|
55
|
+
deltas = Prefab::ConfigDeltas.new
|
56
|
+
deltas.deltas << delta
|
57
|
+
assert_equal deltas, @loader.get_api_deltas
|
73
58
|
end
|
74
59
|
|
75
60
|
def test_loading_tombstones_removes_entries
|
76
61
|
val = Prefab::ConfigValue.new(int: 456)
|
77
|
-
|
78
|
-
@loader.set(
|
62
|
+
delta = Prefab::ConfigDelta.new(key: "sample_int", value: val)
|
63
|
+
@loader.set(delta)
|
79
64
|
|
80
|
-
|
81
|
-
@loader.set(
|
65
|
+
delta = Prefab::ConfigDelta.new(key: "sample_int", value: nil)
|
66
|
+
@loader.set(delta)
|
82
67
|
|
83
|
-
|
84
|
-
assert_equal
|
68
|
+
deltas = Prefab::ConfigDeltas.new
|
69
|
+
assert_equal deltas, @loader.get_api_deltas
|
85
70
|
end
|
86
71
|
|
87
72
|
private
|
88
73
|
|
89
74
|
def should_be(type, value, key)
|
90
|
-
assert_equal type, @loader.calc_config[key]
|
91
|
-
assert_equal value, @loader.calc_config[key]
|
75
|
+
assert_equal type, @loader.calc_config[key].type
|
76
|
+
assert_equal value, @loader.calc_config[key].send(type)
|
92
77
|
end
|
78
|
+
|
93
79
|
end
|
@@ -1,66 +1,22 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
require 'test_helper'
|
3
2
|
|
4
3
|
class TestConfigResolver < Minitest::Test
|
5
4
|
|
6
|
-
STAGING_ENV_ID = 1
|
7
|
-
PRODUCTION_ENV_ID = 2
|
8
|
-
TEST_ENV_ID = 3
|
9
|
-
|
10
5
|
def test_resolution
|
11
6
|
@loader = MockConfigLoader.new
|
12
7
|
|
13
8
|
loaded_values = {
|
14
|
-
"key" =>
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
Prefab::ConfigRow.new(
|
21
|
-
project_env_id: TEST_ENV_ID,
|
22
|
-
value: Prefab::ConfigValue.new(string: "value_none"),
|
23
|
-
),
|
24
|
-
Prefab::ConfigRow.new(
|
25
|
-
project_env_id: TEST_ENV_ID,
|
26
|
-
namespace: "projectA",
|
27
|
-
value: Prefab::ConfigValue.new(string: "valueA"),
|
28
|
-
),
|
29
|
-
Prefab::ConfigRow.new(
|
30
|
-
project_env_id: TEST_ENV_ID,
|
31
|
-
namespace: "projectB",
|
32
|
-
value: Prefab::ConfigValue.new(string: "valueB"),
|
33
|
-
),
|
34
|
-
Prefab::ConfigRow.new(
|
35
|
-
project_env_id: TEST_ENV_ID,
|
36
|
-
namespace: "projectB.subprojectX",
|
37
|
-
value: Prefab::ConfigValue.new(string: "projectB.subprojectX"),
|
38
|
-
),
|
39
|
-
Prefab::ConfigRow.new(
|
40
|
-
project_env_id: TEST_ENV_ID,
|
41
|
-
namespace: "projectB.subprojectY",
|
42
|
-
value: Prefab::ConfigValue.new(string: "projectB.subprojectY"),
|
43
|
-
),
|
44
|
-
|
45
|
-
]
|
46
|
-
) },
|
47
|
-
"key2" => { config: Prefab::Config.new(
|
48
|
-
key: "key2",
|
49
|
-
rows: [
|
50
|
-
value: Prefab::ConfigValue.new(string: "valueB2"),
|
51
|
-
]
|
52
|
-
) }
|
53
|
-
|
9
|
+
"projectA:key" => Prefab::ConfigValue.new(string: "valueA"),
|
10
|
+
"key" => Prefab::ConfigValue.new(string: "value_none"),
|
11
|
+
"projectB:key" => Prefab::ConfigValue.new(string: "valueB"),
|
12
|
+
"projectB.subprojectX:key" => Prefab::ConfigValue.new(string: "projectB.subprojectX"),
|
13
|
+
"projectB.subprojectY:key" => Prefab::ConfigValue.new(string: "projectB.subprojectY"),
|
14
|
+
"projectB:key2" => Prefab::ConfigValue.new(string: "valueB2")
|
54
15
|
}
|
55
16
|
|
56
17
|
@loader.stub :calc_config, loaded_values do
|
57
|
-
|
58
|
-
|
59
|
-
assert_equal "value_no_env_default", @resolverA.get("key")
|
60
|
-
|
61
|
-
## below here in the test env
|
62
|
-
@resolverA = resolver_for_namespace("", @loader)
|
63
|
-
assert_equal "value_none", @resolverA.get("key")
|
18
|
+
@resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
|
19
|
+
assert_equal "value_none", @resolver.get("key")
|
64
20
|
|
65
21
|
@resolverA = resolver_for_namespace("projectA", @loader)
|
66
22
|
assert_equal "valueA", @resolverA.get("key")
|
@@ -71,10 +27,7 @@ class TestConfigResolver < Minitest::Test
|
|
71
27
|
@resolverBX = resolver_for_namespace("projectB.subprojectX", @loader)
|
72
28
|
assert_equal "projectB.subprojectX", @resolverBX.get("key")
|
73
29
|
|
74
|
-
@
|
75
|
-
assert_equal "valueB2", @resolverBX.get("key2")
|
76
|
-
|
77
|
-
@resolverUndefinedSubProject = resolver_for_namespace("projectB.subprojectX.subsubQ", @loader)
|
30
|
+
@resolverUndefinedSubProject = resolver_for_namespace("projectB.subprojectX:subsubQ", @loader)
|
78
31
|
assert_equal "projectB.subprojectX", @resolverBX.get("key")
|
79
32
|
|
80
33
|
@resolverBX = resolver_for_namespace("projectC", @loader)
|
@@ -87,75 +40,30 @@ class TestConfigResolver < Minitest::Test
|
|
87
40
|
@loader = MockConfigLoader.new
|
88
41
|
@loader.stub :calc_config, {} do
|
89
42
|
resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
#
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_special_ff_variant_copying
|
109
|
-
|
110
|
-
@loader = MockConfigLoader.new
|
111
|
-
loaded_values = {
|
112
|
-
"ff" => { source: 'test',
|
113
|
-
config: Prefab::Config.new(
|
114
|
-
key: "ff",
|
115
|
-
variants: [
|
116
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
117
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
118
|
-
Prefab::FeatureFlagVariant.new(string: "env"),
|
119
|
-
],
|
120
|
-
rows: [
|
121
|
-
{ value: Prefab::ConfigValue.new(feature_flag: Prefab::FeatureFlag.new(
|
122
|
-
inactive_variant_idx: 0,
|
123
|
-
rules: default_ff_rule(1),
|
124
|
-
)) },
|
125
|
-
{ project_env_id: TEST_ENV_ID,
|
126
|
-
value: Prefab::ConfigValue.new(feature_flag: Prefab::FeatureFlag.new(
|
127
|
-
inactive_variant_idx: 0,
|
128
|
-
rules: default_ff_rule(2),
|
129
|
-
)) }
|
130
|
-
]
|
131
|
-
)
|
132
|
-
}
|
133
|
-
}
|
134
|
-
@loader.stub :calc_config, loaded_values do
|
135
|
-
resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
|
136
|
-
config = resolver.get_config("ff")
|
137
|
-
assert_equal 3, config.variants.size
|
138
|
-
assert_equal %w(inactive default env), config.variants.map(&:string)
|
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")
|
139
58
|
end
|
140
59
|
end
|
141
60
|
|
142
61
|
# colons are not allowed in keys, but verify behavior anyway
|
143
|
-
def
|
62
|
+
def test_keys_with_colons
|
144
63
|
@loader = MockConfigLoader.new
|
145
|
-
|
146
64
|
loaded_values = {
|
147
|
-
"Key:With:Colons" =>
|
148
|
-
|
149
|
-
rows: [Prefab::ConfigRow.new(
|
150
|
-
value: Prefab::ConfigValue.new(string: "value")
|
151
|
-
)]
|
152
|
-
) },
|
153
|
-
"proj:apikey" => { config: Prefab::Config.new(
|
154
|
-
key: "proj:apikey",
|
155
|
-
rows: [Prefab::ConfigRow.new(
|
156
|
-
value: Prefab::ConfigValue.new(string: "v2")
|
157
|
-
)]
|
158
|
-
) }
|
65
|
+
"Key:With:Colons" => Prefab::ConfigValue.new(string: "value"),
|
66
|
+
"proj:apikey" => Prefab::ConfigValue.new(string: "v2")
|
159
67
|
}
|
160
68
|
|
161
69
|
@loader.stub :calc_config, loaded_values do
|
@@ -164,41 +72,37 @@ class TestConfigResolver < Minitest::Test
|
|
164
72
|
assert_nil r.get("apikey")
|
165
73
|
|
166
74
|
r = resolver_for_namespace("proj", @loader)
|
167
|
-
|
75
|
+
assert_equal "v2", r.get("apikey")
|
168
76
|
|
169
77
|
r = resolver_for_namespace("", @loader)
|
170
78
|
assert_nil r.get("apikey")
|
171
79
|
|
80
|
+
|
172
81
|
@resolverKeyWith = resolver_for_namespace("Ket:With", @loader)
|
173
82
|
assert_nil @resolverKeyWith.get("Colons")
|
174
83
|
assert_nil @resolverKeyWith.get("With:Colons")
|
175
|
-
|
84
|
+
assert_nil @resolverKeyWith.get("Key:With:Colons")
|
176
85
|
|
177
86
|
@resolverKeyWithExtra = resolver_for_namespace("Key:With:Extra", @loader)
|
87
|
+
puts @resolverKeyWithExtra.to_s
|
178
88
|
assert_nil @resolverKeyWithExtra.get("Colons")
|
179
89
|
assert_nil @resolverKeyWithExtra.get("With:Colons")
|
180
|
-
|
90
|
+
assert_nil @resolverKeyWithExtra.get("Key:With:Colons")
|
181
91
|
|
182
92
|
@resolverKey = resolver_for_namespace("Key", @loader)
|
183
|
-
|
93
|
+
assert_equal "value", @resolverKey.get("With:Colons")
|
184
94
|
assert_nil @resolverKey.get("Colons")
|
185
|
-
|
95
|
+
assert_nil @resolverKey.get("Key:With:Colons")
|
186
96
|
|
187
97
|
@resolverWithProperlySegmentedNamespace = resolver_for_namespace("Key.With.Extra", @loader)
|
188
98
|
assert_nil @resolverWithProperlySegmentedNamespace.get("Colons")
|
189
|
-
|
190
|
-
|
99
|
+
assert_equal "value", @resolverWithProperlySegmentedNamespace.get("With:Colons")
|
100
|
+
assert_nil @resolverWithProperlySegmentedNamespace.get("Key:With:Colons")
|
191
101
|
end
|
192
102
|
end
|
193
103
|
|
194
|
-
def resolver_for_namespace(namespace, loader
|
195
|
-
|
196
|
-
namespace: namespace
|
197
|
-
)
|
198
|
-
resolver = Prefab::ConfigResolver.new(MockBaseClient.new(options), loader)
|
199
|
-
resolver.project_env_id = project_env_id
|
200
|
-
resolver.update
|
201
|
-
resolver
|
104
|
+
def resolver_for_namespace(namespace, loader)
|
105
|
+
Prefab::ConfigResolver.new(MockBaseClient.new(namespace: namespace), loader)
|
202
106
|
end
|
203
107
|
|
204
108
|
end
|