prefab-cloud-ruby 0.6.0 → 0.7.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.
@@ -6,17 +6,46 @@ class TestConfigResolver < Minitest::Test
6
6
  @loader = MockConfigLoader.new
7
7
 
8
8
  loaded_values = {
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")
9
+ "key" => Prefab::ConfigDelta.new(
10
+ key: "key",
11
+ default: Prefab::ConfigValue.new(string: "value_no_env_default"),
12
+ envs: [{
13
+ environment: "test",
14
+ default: Prefab::ConfigValue.new(string: "value_none"),
15
+ namespace_values: [
16
+ {
17
+ namespace: "projectA",
18
+ config_value: Prefab::ConfigValue.new(string: "valueA")
19
+ },
20
+ {
21
+ namespace: "projectB",
22
+ config_value: Prefab::ConfigValue.new(string: "valueB")
23
+ },
24
+ {
25
+ namespace: "projectB.subprojectX",
26
+ config_value: Prefab::ConfigValue.new(string: "projectB.subprojectX")
27
+ },
28
+ {
29
+ namespace: "projectB.subprojectY",
30
+ config_value: Prefab::ConfigValue.new(string: "projectB.subprojectY")
31
+ },
32
+ ]
33
+ }]
34
+ ),
35
+ "key2" => Prefab::ConfigDelta.new(
36
+ key: "key2",
37
+ default: Prefab::ConfigValue.new(string: "valueB2"),
38
+ )
15
39
  }
16
40
 
17
41
  @loader.stub :calc_config, loaded_values do
18
- @resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
19
- assert_equal "value_none", @resolver.get("key")
42
+
43
+ @resolverA = resolver_for_namespace("", @loader, environment: "some_other_env")
44
+ assert_equal "value_no_env_default", @resolverA.get("key")
45
+
46
+ ## below here in the test env
47
+ @resolverA = resolver_for_namespace("", @loader)
48
+ assert_equal "value_none", @resolverA.get("key")
20
49
 
21
50
  @resolverA = resolver_for_namespace("projectA", @loader)
22
51
  assert_equal "valueA", @resolverA.get("key")
@@ -27,7 +56,10 @@ class TestConfigResolver < Minitest::Test
27
56
  @resolverBX = resolver_for_namespace("projectB.subprojectX", @loader)
28
57
  assert_equal "projectB.subprojectX", @resolverBX.get("key")
29
58
 
30
- @resolverUndefinedSubProject = resolver_for_namespace("projectB.subprojectX:subsubQ", @loader)
59
+ @resolverBX = resolver_for_namespace("projectB.subprojectX", @loader)
60
+ assert_equal "valueB2", @resolverBX.get("key2")
61
+
62
+ @resolverUndefinedSubProject = resolver_for_namespace("projectB.subprojectX.subsubQ", @loader)
31
63
  assert_equal "projectB.subprojectX", @resolverBX.get("key")
32
64
 
33
65
  @resolverBX = resolver_for_namespace("projectC", @loader)
@@ -40,30 +72,69 @@ class TestConfigResolver < Minitest::Test
40
72
  @loader = MockConfigLoader.new
41
73
  @loader.stub :calc_config, {} do
42
74
  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")
75
+ assert_equal [true, 0], resolver.send(:starts_with_ns?, "", "a")
76
+ assert_equal [true, 1], resolver.send(:starts_with_ns?, "a", "a")
77
+ assert_equal [true, 1], resolver.send(:starts_with_ns?, "a", "a.b")
78
+ assert_equal [false, 2], resolver.send(:starts_with_ns?, "a.b", "a")
79
+
80
+ assert_equal [true, 1], resolver.send(:starts_with_ns?, "corp", "corp.proj.proja")
81
+ assert_equal [true, 2], resolver.send(:starts_with_ns?, "corp.proj", "corp.proj.proja")
82
+ assert_equal [true, 3], resolver.send(:starts_with_ns?, "corp.proj.proja", "corp.proj.proja")
83
+ assert_equal [false, 3], resolver.send(:starts_with_ns?, "corp.proj.projb", "corp.proj.proja")
84
+
85
+ # corp_equal [true, 1:,a:b is not a real delimited namespace[0
86
+ assert_equal [false, 1], resolver.send(:starts_with_ns?, "corp", "corp:a:b")
87
+ assert_equal [true, 1], resolver.send(:starts_with_ns?, "foo", "foo.baz")
88
+ assert_equal [true, 2], resolver.send(:starts_with_ns?, "foo.baz", "foo.baz")
89
+ assert_equal [false, 2], resolver.send(:starts_with_ns?, "foo.baz", "foo.bazz")
90
+ end
91
+ end
92
+
93
+ def test_special_ff_variant_copying
94
+ @loader = MockConfigLoader.new
95
+ loaded_values = {
96
+ "ff" => Prefab::ConfigDelta.new(
97
+ key: "ff",
98
+ default: Prefab::ConfigValue.new(feature_flag: Prefab::FeatureFlag.new(
99
+ variants: [
100
+ Prefab::FeatureFlagVariant.new(string: "inactive"),
101
+ Prefab::FeatureFlagVariant.new(string: "default"),
102
+ Prefab::FeatureFlagVariant.new(string: "env"),
103
+ ],
104
+ inactive_variant_idx: 0,
105
+ default: Prefab::VariantDistribution.new(variant_idx: 1)
106
+ )),
107
+ envs: [
108
+ Prefab::EnvironmentValues.new(
109
+ environment: "test",
110
+ default: Prefab::ConfigValue.new(feature_flag: Prefab::FeatureFlag.new(
111
+ inactive_variant_idx: 0,
112
+ default: Prefab::VariantDistribution.new(variant_idx: 2)))
113
+ )
114
+ ]
115
+ )
116
+ }
117
+ @loader.stub :calc_config, loaded_values do
118
+ resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
119
+ ff = resolver.get("ff")
120
+ assert_equal 3, ff.variants.size
121
+ assert_equal %w(inactive default env), ff.variants.map(&:string)
58
122
  end
59
123
  end
60
124
 
61
125
  # colons are not allowed in keys, but verify behavior anyway
62
- def test_keys_with_colons
126
+ def test_key_and_namespaces_with_colons
63
127
  @loader = MockConfigLoader.new
128
+
64
129
  loaded_values = {
65
- "Key:With:Colons" => Prefab::ConfigValue.new(string: "value"),
66
- "proj:apikey" => Prefab::ConfigValue.new(string: "v2")
130
+ "Key:With:Colons" => Prefab::ConfigDelta.new(
131
+ key: "Key:With:Colons",
132
+ default: Prefab::ConfigValue.new(string: "value"),
133
+ ),
134
+ "proj:apikey" => Prefab::ConfigDelta.new(
135
+ key: "proj:apikey",
136
+ default: Prefab::ConfigValue.new(string: "v2"),
137
+ )
67
138
  }
68
139
 
69
140
  @loader.stub :calc_config, loaded_values do
@@ -72,37 +143,36 @@ class TestConfigResolver < Minitest::Test
72
143
  assert_nil r.get("apikey")
73
144
 
74
145
  r = resolver_for_namespace("proj", @loader)
75
- assert_equal "v2", r.get("apikey")
146
+ assert_nil r.get("apikey")
76
147
 
77
148
  r = resolver_for_namespace("", @loader)
78
149
  assert_nil r.get("apikey")
79
150
 
80
-
81
151
  @resolverKeyWith = resolver_for_namespace("Ket:With", @loader)
82
152
  assert_nil @resolverKeyWith.get("Colons")
83
153
  assert_nil @resolverKeyWith.get("With:Colons")
84
- assert_nil @resolverKeyWith.get("Key:With:Colons")
154
+ assert_equal "value", @resolverKeyWith.get("Key:With:Colons")
85
155
 
86
156
  @resolverKeyWithExtra = resolver_for_namespace("Key:With:Extra", @loader)
87
157
  puts @resolverKeyWithExtra.to_s
88
158
  assert_nil @resolverKeyWithExtra.get("Colons")
89
159
  assert_nil @resolverKeyWithExtra.get("With:Colons")
90
- assert_nil @resolverKeyWithExtra.get("Key:With:Colons")
160
+ assert_equal "value", @resolverKeyWithExtra.get("Key:With:Colons")
91
161
 
92
162
  @resolverKey = resolver_for_namespace("Key", @loader)
93
- assert_equal "value", @resolverKey.get("With:Colons")
163
+ assert_nil @resolverKey.get("With:Colons")
94
164
  assert_nil @resolverKey.get("Colons")
95
- assert_nil @resolverKey.get("Key:With:Colons")
165
+ assert_equal "value", @resolverKey.get("Key:With:Colons")
96
166
 
97
167
  @resolverWithProperlySegmentedNamespace = resolver_for_namespace("Key.With.Extra", @loader)
98
168
  assert_nil @resolverWithProperlySegmentedNamespace.get("Colons")
99
- assert_equal "value", @resolverWithProperlySegmentedNamespace.get("With:Colons")
100
- assert_nil @resolverWithProperlySegmentedNamespace.get("Key:With:Colons")
169
+ assert_nil @resolverWithProperlySegmentedNamespace.get("With:Colons")
170
+ assert_equal "value", @resolverWithProperlySegmentedNamespace.get("Key:With:Colons")
101
171
  end
102
172
  end
103
173
 
104
- def resolver_for_namespace(namespace, loader)
105
- Prefab::ConfigResolver.new(MockBaseClient.new(namespace: namespace), loader)
174
+ def resolver_for_namespace(namespace, loader, environment: "test")
175
+ Prefab::ConfigResolver.new(MockBaseClient.new(namespace: namespace, environment: environment), loader)
106
176
  end
107
177
 
108
178
  end
@@ -2,63 +2,219 @@ require 'test_helper'
2
2
 
3
3
  class TestFeatureFlagClient < Minitest::Test
4
4
 
5
+ def setup
6
+ super
7
+ @mock_base_client = MockBaseClient.new
8
+ @client = Prefab::FeatureFlagClient.new(@mock_base_client)
9
+ Prefab::FeatureFlagClient.send(:public, :is_on?) #publicize for testing
10
+ Prefab::FeatureFlagClient.send(:public, :segment_match?) #publicize for testing
11
+ end
12
+
5
13
  def test_pct
6
- client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
7
- Prefab::FeatureFlagClient.send(:public, :is_on?)
8
14
  feature = "FlagName"
9
- flag = Prefab::FeatureFlag.new( pct: 0.5)
15
+
16
+ flag = Prefab::FeatureFlag.new(
17
+ active: true,
18
+ variants: [
19
+ Prefab::FeatureFlagVariant.new(bool: false),
20
+ Prefab::FeatureFlagVariant.new(bool: true)
21
+ ],
22
+ inactive_variant_idx: 0,
23
+ default: Prefab::VariantDistribution.new(variant_weights:
24
+ Prefab::VariantWeights.new(weights: [
25
+ Prefab::VariantWeight.new(weight: 500,
26
+ variant_idx: 1),
27
+ Prefab::VariantWeight.new(weight: 500,
28
+ variant_idx: 0),
29
+ ]
30
+ )
31
+ )
32
+ )
10
33
 
11
34
  assert_equal false,
12
- client.is_on?(feature, "hashes high", [], flag)
35
+ @client.evaluate(feature, "hashes high", [], flag)
36
+ assert_equal true,
37
+ @client.evaluate(feature, "hashes low", [], flag)
38
+ end
13
39
 
40
+ def test_basic_active_inactive
41
+ feature = "FlagName"
42
+ flag = Prefab::FeatureFlag.new(
43
+ active: true,
44
+ variants: [
45
+ Prefab::FeatureFlagVariant.new(bool: false),
46
+ Prefab::FeatureFlagVariant.new(bool: true)
47
+ ],
48
+ inactive_variant_idx: 0,
49
+ default: Prefab::VariantDistribution.new(variant_idx: 1)
50
+ )
51
+ assert_equal true,
52
+ @client.evaluate(feature, "hashes high", [], flag)
14
53
  assert_equal true,
15
- client.is_on?(feature, "hashes low", [], flag)
54
+ @client.evaluate(feature, "hashes low", [], flag)
55
+
56
+ flag = Prefab::FeatureFlag.new(
57
+ active: false,
58
+ variants: [
59
+ Prefab::FeatureFlagVariant.new(bool: false),
60
+ Prefab::FeatureFlagVariant.new(bool: true)
61
+ ],
62
+ inactive_variant_idx: 0,
63
+ default: Prefab::VariantDistribution.new(variant_idx: 1)
64
+ )
65
+ assert_equal false,
66
+ @client.evaluate(feature, "hashes high", [], flag)
67
+ assert_equal false,
68
+ @client.evaluate(feature, "hashes low", [], flag)
16
69
  end
17
70
 
71
+ def test_user_targets
18
72
 
19
- def test_off
20
- client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
21
- Prefab::FeatureFlagClient.send(:public, :is_on?)
22
73
  feature = "FlagName"
23
- flag = Prefab::FeatureFlag.new(pct: 0)
74
+ flag = Prefab::FeatureFlag.new(
75
+ active: true,
76
+ variants: [
77
+ Prefab::FeatureFlagVariant.new(string: "inactive"),
78
+ Prefab::FeatureFlagVariant.new(string: "user target"),
79
+ Prefab::FeatureFlagVariant.new(string: "default"),
80
+ ],
81
+ inactive_variant_idx: 0,
82
+ user_targets: [
83
+ variant_idx: 1,
84
+ identifiers: ["user:1", "user:3"]
85
+ ],
86
+ default: Prefab::VariantDistribution.new(variant_idx: 2)
87
+ )
24
88
 
25
- assert_equal false,
26
- client.is_on?(feature, "hashes high", [], flag)
89
+ assert_equal "user target",
90
+ @client.evaluate(feature, "user:1", [], flag)
91
+ assert_equal "default",
92
+ @client.evaluate(feature, "user:2", [], flag)
93
+ assert_equal "user target",
94
+ @client.evaluate(feature, "user:3", [], flag)
95
+ end
96
+
97
+ def test_inclusion_rule
98
+ feature = "FlagName"
99
+ flag = Prefab::FeatureFlag.new(
100
+ active: true,
101
+ variants: [
102
+ Prefab::FeatureFlagVariant.new(string: "inactive"),
103
+ Prefab::FeatureFlagVariant.new(string: "rule target"),
104
+ Prefab::FeatureFlagVariant.new(string: "default"),
105
+ ],
106
+ inactive_variant_idx: 0,
107
+ rules: [Prefab::Rule.new(
108
+ distribution: Prefab::VariantDistribution.new(variant_idx: 1),
109
+ criteria: Prefab::Criteria.new(
110
+ operator: "IN",
111
+ values: ["user:1"]
112
+ )
113
+ )],
114
+ default: Prefab::VariantDistribution.new(variant_idx: 2)
115
+ )
116
+
117
+ assert_equal "rule target",
118
+ @client.evaluate(feature, "user:1", [], flag)
119
+ assert_equal "default",
120
+ @client.evaluate(feature, "user:2", [], flag)
27
121
 
28
- assert_equal false,
29
- client.is_on?(feature, "hashes low", [], flag)
30
122
  end
31
123
 
124
+ def test_segment_match?
125
+ segment = Prefab::Segment.new(
126
+ name: "Beta Group",
127
+ includes: ["user:1", "user:5"],
128
+ excludes: ["user:1", "user:2"]
129
+ )
130
+ assert_equal false, @client.segment_match?(segment, "user:0", {})
131
+ assert_equal false, @client.segment_match?(segment, "user:1", {})
132
+ assert_equal false, @client.segment_match?(segment, "user:2", {})
133
+ assert_equal true, @client.segment_match?(segment, "user:5", {})
134
+ end
135
+
136
+ def test_segments
137
+ segment_key = "prefab-segment-beta-group"
138
+ @mock_base_client.mock_this_config(segment_key,
139
+ Prefab::Segment.new(
140
+ name: "Beta Group",
141
+ includes: ["user:1"]
142
+ )
143
+ )
32
144
 
33
- def test_on
34
- client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
35
- Prefab::FeatureFlagClient.send(:public, :is_on?)
36
145
  feature = "FlagName"
37
- flag = Prefab::FeatureFlag.new(pct: 1)
146
+ flag = Prefab::FeatureFlag.new(
147
+ active: true,
148
+ variants: [
149
+ Prefab::FeatureFlagVariant.new(string: "inactive"),
150
+ Prefab::FeatureFlagVariant.new(string: "rule target"),
151
+ Prefab::FeatureFlagVariant.new(string: "default"),
152
+ ],
153
+ inactive_variant_idx: 0,
154
+ rules: [Prefab::Rule.new(
155
+ distribution: Prefab::VariantDistribution.new(variant_idx: 1),
156
+ criteria: Prefab::Criteria.new(
157
+ operator: "IN_SEG",
158
+ values: [segment_key]
159
+ )
160
+ )],
161
+ default: Prefab::VariantDistribution.new(variant_idx: 2)
162
+ )
38
163
 
39
- assert_equal true,
40
- client.is_on?(feature, "hashes high", [], flag)
164
+ assert_equal "rule target",
165
+ @client.evaluate(feature, "user:1", [], flag)
166
+ assert_equal "default",
167
+ @client.evaluate(feature, "user:2", [], flag)
41
168
 
42
- assert_equal true,
43
- client.is_on?(feature, "hashes low", [], flag)
44
169
  end
45
170
 
46
- def test_whitelist
47
- client = Prefab::FeatureFlagClient.new(MockBaseClient.new)
48
- Prefab::FeatureFlagClient.send(:public, :is_on?)
171
+ def test_in_multiple_segments_has_or_behavior
172
+ segment_key_one = "prefab-segment-segment-1"
173
+ @mock_base_client.mock_this_config(segment_key_one,
174
+ Prefab::Segment.new(
175
+ name: "Segment-1",
176
+ includes: ["user:1", "user:2"],
177
+ excludes: ["user:3"]
178
+ )
179
+ )
180
+ segment_key_two = "prefab-segment-segment-2"
181
+ @mock_base_client.mock_this_config(segment_key_two,
182
+ Prefab::Segment.new(
183
+ name: "Segment-2",
184
+ includes: ["user:3", "user:4"],
185
+ excludes: ["user:2"]
186
+ )
187
+ )
188
+
49
189
  feature = "FlagName"
50
- flag = Prefab::FeatureFlag.new(pct: 0, whitelisted: ["beta", "user:1", "user:3"])
190
+ flag = Prefab::FeatureFlag.new(
191
+ active: true,
192
+ variants: [
193
+ Prefab::FeatureFlagVariant.new(string: "inactive"),
194
+ Prefab::FeatureFlagVariant.new(string: "rule target"),
195
+ Prefab::FeatureFlagVariant.new(string: "default"),
196
+ ],
197
+ inactive_variant_idx: 0,
198
+ rules: [Prefab::Rule.new(
199
+ distribution: Prefab::VariantDistribution.new(variant_idx: 1),
200
+ criteria: Prefab::Criteria.new(
201
+ operator: "IN_SEG",
202
+ values: [segment_key_one, segment_key_two]
203
+ )
204
+ )],
205
+ default: Prefab::VariantDistribution.new(variant_idx: 2)
206
+ )
51
207
 
52
- assert_equal false,
53
- client.is_on?(feature, "anything", [], flag)
54
- assert_equal true,
55
- client.is_on?(feature, "anything", ["beta"], flag)
56
- assert_equal true,
57
- client.is_on?(feature, "anything", ["alpha", "beta"], flag)
58
- assert_equal true,
59
- client.is_on?(feature, "anything", ["alpha", "user:1"], flag)
60
- assert_equal false,
61
- client.is_on?(feature, "anything", ["alpha", "user:2"], flag)
208
+ assert_equal "rule target",
209
+ @client.evaluate(feature, "user:1", [], flag)
210
+ assert_equal "rule target",
211
+ @client.evaluate(feature, "user:2", [], flag), "matches segment 1"
212
+ assert_equal "rule target",
213
+ @client.evaluate(feature, "user:3", [], flag)
214
+ assert_equal "rule target",
215
+ @client.evaluate(feature, "user:4", [], flag)
216
+ assert_equal "default",
217
+ @client.evaluate(feature, "user:5", [], flag)
62
218
 
63
219
  end
64
220
  end
data/test/test_helper.rb CHANGED
@@ -2,19 +2,29 @@ require 'minitest/autorun'
2
2
  require 'prefab-cloud-ruby'
3
3
 
4
4
  class MockBaseClient
5
- attr_reader :namespace, :logger
5
+ attr_reader :namespace, :logger, :environment
6
6
 
7
- def initialize(namespace: "")
7
+ def initialize(environment: "test", namespace: "")
8
+ @environment = environment
8
9
  @namespace = namespace
9
10
  @logger = Logger.new($stdout)
11
+ @config_values = {}
10
12
  end
11
13
 
12
- def account_id
14
+ def project_id
13
15
  1
14
16
  end
15
17
 
16
18
  def log_internal level, message
17
19
  end
20
+
21
+ def mock_this_config key, config_value
22
+ @config_values[key] = config_value
23
+ end
24
+
25
+ def get(key)
26
+ @config_values[key]
27
+ end
18
28
  end
19
29
 
20
30
  class MockConfigLoader
metadata CHANGED
@@ -1,37 +1,65 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prefab-cloud-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.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: 2021-03-23 00:00:00.000000000 Z
11
+ date: 2022-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
17
20
  - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: 1.0.5
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
20
27
  - - "~>"
21
28
  - !ruby/object:Gem::Version
22
29
  version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.5
33
+ - !ruby/object:Gem::Dependency
34
+ name: faraday
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
23
40
  type: :runtime
24
41
  prerelease: false
25
42
  version_requirements: !ruby/object:Gem::Requirement
26
43
  requirements:
27
44
  - - ">="
28
45
  - !ruby/object:Gem::Version
29
- version: 1.0.5
30
- - - "~>"
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: grpc
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
31
52
  - !ruby/object:Gem::Version
32
- version: '1.0'
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
33
61
  - !ruby/object:Gem::Dependency
34
- name: faraday
62
+ name: google-protobuf
35
63
  requirement: !ruby/object:Gem::Requirement
36
64
  requirements:
37
65
  - - ">="
@@ -45,7 +73,7 @@ dependencies:
45
73
  - !ruby/object:Gem::Version
46
74
  version: '0'
47
75
  - !ruby/object:Gem::Dependency
48
- name: grpc
76
+ name: googleapis-common-protos-types
49
77
  requirement: !ruby/object:Gem::Requirement
50
78
  requirements:
51
79
  - - ">="
@@ -62,16 +90,16 @@ dependencies:
62
90
  name: grpc-tools
63
91
  requirement: !ruby/object:Gem::Requirement
64
92
  requirements:
65
- - - "~>"
93
+ - - ">="
66
94
  - !ruby/object:Gem::Version
67
- version: 1.17.1
95
+ version: '0'
68
96
  type: :development
69
97
  prerelease: false
70
98
  version_requirements: !ruby/object:Gem::Requirement
71
99
  requirements:
72
- - - "~>"
100
+ - - ">="
73
101
  - !ruby/object:Gem::Version
74
- version: 1.17.1
102
+ version: '0'
75
103
  - !ruby/object:Gem::Dependency
76
104
  name: shoulda
77
105
  requirement: !ruby/object:Gem::Requirement
@@ -104,16 +132,16 @@ dependencies:
104
132
  name: bundler
105
133
  requirement: !ruby/object:Gem::Requirement
106
134
  requirements:
107
- - - "~>"
135
+ - - ">="
108
136
  - !ruby/object:Gem::Version
109
- version: '1.0'
137
+ version: '0'
110
138
  type: :development
111
139
  prerelease: false
112
140
  version_requirements: !ruby/object:Gem::Requirement
113
141
  requirements:
114
- - - "~>"
142
+ - - ">="
115
143
  - !ruby/object:Gem::Version
116
- version: '1.0'
144
+ version: '0'
117
145
  - !ruby/object:Gem::Dependency
118
146
  name: juwelier
119
147
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +170,20 @@ dependencies:
142
170
  - - ">="
143
171
  - !ruby/object:Gem::Version
144
172
  version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: thin
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
145
187
  description: RateLimits & Config as a service
146
188
  email: jdwyer@prefab.cloud
147
189
  executables: []
@@ -151,7 +193,8 @@ extra_rdoc_files:
151
193
  - README.md
152
194
  files:
153
195
  - ".envrc"
154
- - ".ruby-version"
196
+ - ".tool-versions"
197
+ - CODEOWNERS
155
198
  - Gemfile
156
199
  - Gemfile.lock
157
200
  - LICENSE.txt
@@ -164,6 +207,7 @@ files:
164
207
  - lib/prefab/cancellable_interceptor.rb
165
208
  - lib/prefab/client.rb
166
209
  - lib/prefab/config_client.rb
210
+ - lib/prefab/config_helper.rb
167
211
  - lib/prefab/config_loader.rb
168
212
  - lib/prefab/config_resolver.rb
169
213
  - lib/prefab/feature_flag_client.rb
@@ -175,7 +219,9 @@ files:
175
219
  - lib/prefab_pb.rb
176
220
  - lib/prefab_services_pb.rb
177
221
  - prefab-cloud-ruby.gemspec
222
+ - run_test_harness_server.sh
178
223
  - test/.prefab.test.config.yaml
224
+ - test/harness_server.rb
179
225
  - test/test_config_loader.rb
180
226
  - test/test_config_resolver.rb
181
227
  - test/test_feature_flag_client.rb
@@ -200,8 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
246
  - !ruby/object:Gem::Version
201
247
  version: '0'
202
248
  requirements: []
203
- rubyforge_project:
204
- rubygems_version: 2.6.14
249
+ rubygems_version: 3.2.32
205
250
  signing_key:
206
251
  specification_version: 4
207
252
  summary: Prefab Ruby Infrastructure
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.4.2