prefab-cloud-ruby 0 → 0.0.1
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 +5 -5
- data/.ruby-version +1 -0
- data/Gemfile +9 -22
- data/Gemfile.lock +88 -160
- data/LICENSE.txt +1 -1
- data/Rakefile +14 -14
- data/VERSION +1 -1
- data/lib/prefab/auth_interceptor.rb +25 -0
- data/lib/prefab/client.rb +34 -139
- data/lib/prefab/config_client.rb +23 -275
- data/lib/prefab/config_loader.rb +27 -60
- data/lib/prefab/config_resolver.rb +40 -53
- data/lib/prefab/noop_cache.rb +13 -0
- data/lib/prefab/noop_stats.rb +8 -0
- data/lib/prefab/prefab_pb.rb +39 -0
- data/lib/prefab/prefab_services_pb.rb +37 -0
- data/lib/prefab/ratelimit_client.rb +58 -0
- data/lib/prefab/ratelimit_pb.rb +125 -0
- data/lib/prefab/store.rb +29 -0
- data/lib/prefab_client.rb +35 -0
- metadata +36 -198
- data/.envrc.sample +0 -3
- data/.github/workflows/ruby.yml +0 -46
- data/.gitmodules +0 -3
- data/.rubocop.yml +0 -13
- data/.tool-versions +0 -1
- data/CHANGELOG.md +0 -169
- data/CODEOWNERS +0 -1
- data/README.md +0 -94
- data/bin/console +0 -21
- data/compile_protos.sh +0 -18
- data/lib/prefab/config_client_presenter.rb +0 -18
- data/lib/prefab/config_value_unwrapper.rb +0 -115
- data/lib/prefab/config_value_wrapper.rb +0 -18
- data/lib/prefab/context.rb +0 -179
- data/lib/prefab/context_shape.rb +0 -20
- data/lib/prefab/context_shape_aggregator.rb +0 -65
- data/lib/prefab/criteria_evaluator.rb +0 -136
- data/lib/prefab/encryption.rb +0 -65
- data/lib/prefab/error.rb +0 -6
- data/lib/prefab/errors/env_var_parse_error.rb +0 -11
- 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/errors/missing_env_var_error.rb +0 -11
- data/lib/prefab/errors/uninitialized_error.rb +0 -13
- data/lib/prefab/evaluation.rb +0 -52
- data/lib/prefab/evaluation_summary_aggregator.rb +0 -87
- data/lib/prefab/example_contexts_aggregator.rb +0 -78
- data/lib/prefab/exponential_backoff.rb +0 -21
- data/lib/prefab/feature_flag_client.rb +0 -42
- data/lib/prefab/http_connection.rb +0 -41
- data/lib/prefab/internal_logger.rb +0 -16
- data/lib/prefab/local_config_parser.rb +0 -151
- data/lib/prefab/log_path_aggregator.rb +0 -69
- data/lib/prefab/logger_client.rb +0 -264
- data/lib/prefab/murmer3.rb +0 -50
- data/lib/prefab/options.rb +0 -208
- data/lib/prefab/periodic_sync.rb +0 -69
- data/lib/prefab/prefab.rb +0 -56
- data/lib/prefab/rate_limit_cache.rb +0 -41
- data/lib/prefab/resolved_config_presenter.rb +0 -86
- data/lib/prefab/time_helpers.rb +0 -7
- data/lib/prefab/weighted_value_resolver.rb +0 -42
- data/lib/prefab/yaml_config_parser.rb +0 -34
- data/lib/prefab-cloud-ruby.rb +0 -57
- data/lib/prefab_pb.rb +0 -93
- data/prefab-cloud-ruby.gemspec +0 -155
- data/test/.prefab.default.config.yaml +0 -2
- data/test/.prefab.unit_tests.config.yaml +0 -28
- data/test/integration_test.rb +0 -150
- data/test/integration_test_helpers.rb +0 -151
- data/test/support/common_helpers.rb +0 -180
- data/test/support/mock_base_client.rb +0 -42
- data/test/support/mock_config_client.rb +0 -19
- data/test/support/mock_config_loader.rb +0 -1
- data/test/test_client.rb +0 -444
- data/test/test_config_client.rb +0 -109
- data/test/test_config_loader.rb +0 -117
- data/test/test_config_resolver.rb +0 -430
- data/test/test_config_value_unwrapper.rb +0 -224
- data/test/test_config_value_wrapper.rb +0 -42
- data/test/test_context.rb +0 -203
- data/test/test_context_shape.rb +0 -50
- data/test/test_context_shape_aggregator.rb +0 -147
- data/test/test_criteria_evaluator.rb +0 -726
- data/test/test_encryption.rb +0 -16
- data/test/test_evaluation_summary_aggregator.rb +0 -162
- data/test/test_example_contexts_aggregator.rb +0 -238
- data/test/test_exponential_backoff.rb +0 -18
- data/test/test_feature_flag_client.rb +0 -48
- data/test/test_helper.rb +0 -17
- data/test/test_integration.rb +0 -58
- data/test/test_local_config_parser.rb +0 -147
- data/test/test_log_path_aggregator.rb +0 -62
- data/test/test_logger.rb +0 -621
- data/test/test_logger_initialization.rb +0 -12
- data/test/test_options.rb +0 -75
- data/test/test_prefab.rb +0 -12
- data/test/test_rate_limit_cache.rb +0 -44
- data/test/test_weighted_value_resolver.rb +0 -71
data/test/test_options.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class TestOptions < Minitest::Test
|
6
|
-
API_KEY = 'abcdefg'
|
7
|
-
|
8
|
-
def test_prefab_api_url
|
9
|
-
assert_equal 'https://api.prefab.cloud', Prefab::Options.new.prefab_api_url
|
10
|
-
|
11
|
-
with_env 'PREFAB_API_URL', 'https://api.prefab.cloud' do
|
12
|
-
assert_equal 'https://api.prefab.cloud', Prefab::Options.new.prefab_api_url
|
13
|
-
end
|
14
|
-
|
15
|
-
with_env 'PREFAB_API_URL', 'https://api.prefab.cloud/' do
|
16
|
-
assert_equal 'https://api.prefab.cloud', Prefab::Options.new.prefab_api_url
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_works_with_named_arguments
|
21
|
-
assert_equal API_KEY, Prefab::Options.new(api_key: API_KEY).api_key
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_works_with_hash
|
25
|
-
assert_equal API_KEY, Prefab::Options.new({ api_key: API_KEY }).api_key
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_collect_max_paths
|
29
|
-
assert_equal 1000, Prefab::Options.new.collect_max_paths
|
30
|
-
assert_equal 100, Prefab::Options.new(collect_max_paths: 100).collect_max_paths
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_collect_max_paths_with_local_only
|
34
|
-
options = Prefab::Options.new(collect_max_paths: 100,
|
35
|
-
prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY)
|
36
|
-
assert_equal 0, options.collect_max_paths
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_collect_max_paths_with_collect_logger_counts_false
|
40
|
-
options = Prefab::Options.new(collect_max_paths: 100,
|
41
|
-
collect_logger_counts: false)
|
42
|
-
assert_equal 0, options.collect_max_paths
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_collect_max_evaluation_summaries
|
46
|
-
assert_equal 100_000, Prefab::Options.new.collect_max_evaluation_summaries
|
47
|
-
assert_equal 0, Prefab::Options.new(collect_evaluation_summaries: false).collect_max_evaluation_summaries
|
48
|
-
assert_equal 3,
|
49
|
-
Prefab::Options.new(collect_max_evaluation_summaries: 3).collect_max_evaluation_summaries
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_context_upload_mode_periodic
|
53
|
-
options = Prefab::Options.new(context_upload_mode: :periodic_example, context_max_size: 100)
|
54
|
-
assert_equal 100, options.collect_max_example_contexts
|
55
|
-
|
56
|
-
options = Prefab::Options.new(context_upload_mode: :none)
|
57
|
-
assert_equal 0, options.collect_max_example_contexts
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_context_upload_mode_shape_only
|
61
|
-
options = Prefab::Options.new(context_upload_mode: :shape_only, context_max_size: 100)
|
62
|
-
assert_equal 100, options.collect_max_shapes
|
63
|
-
|
64
|
-
options = Prefab::Options.new(context_upload_mode: :none)
|
65
|
-
assert_equal 0, options.collect_max_shapes
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_context_upload_mode_none
|
69
|
-
options = Prefab::Options.new(context_upload_mode: :none)
|
70
|
-
assert_equal 0, options.collect_max_example_contexts
|
71
|
-
|
72
|
-
options = Prefab::Options.new(context_upload_mode: :none)
|
73
|
-
assert_equal 0, options.collect_max_shapes
|
74
|
-
end
|
75
|
-
end
|
data/test/test_prefab.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class TestPrefab < Minitest::Test
|
6
|
-
def test_get
|
7
|
-
Prefab.init(prefab_options)
|
8
|
-
assert_equal 'default', Prefab.get('does.not.exist', 'default')
|
9
|
-
assert_equal 'test sample value', Prefab.get('sample')
|
10
|
-
assert_equal 123, Prefab.get('sample_int')
|
11
|
-
end
|
12
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
require 'timecop'
|
5
|
-
|
6
|
-
class RateLimitCacheTest < Minitest::Test
|
7
|
-
def test_set_and_fresh
|
8
|
-
cache = Prefab::RateLimitCache.new(5)
|
9
|
-
cache.set('key')
|
10
|
-
assert cache.fresh?('key')
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_fresh_with_no_set
|
14
|
-
cache = Prefab::RateLimitCache.new(5)
|
15
|
-
refute cache.fresh?('key')
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_get_after_expiration
|
19
|
-
cache = Prefab::RateLimitCache.new(5)
|
20
|
-
|
21
|
-
Timecop.freeze(Time.now - 6) do
|
22
|
-
cache.set('key')
|
23
|
-
assert cache.fresh?('key')
|
24
|
-
end
|
25
|
-
|
26
|
-
refute cache.fresh?('key')
|
27
|
-
|
28
|
-
# but the data is still there
|
29
|
-
assert cache.data.get('key')
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_prune
|
33
|
-
cache = Prefab::RateLimitCache.new(5)
|
34
|
-
|
35
|
-
Timecop.freeze(Time.now - 6) do
|
36
|
-
cache.set('key')
|
37
|
-
assert cache.fresh?('key')
|
38
|
-
end
|
39
|
-
|
40
|
-
cache.prune
|
41
|
-
|
42
|
-
refute cache.fresh?('key')
|
43
|
-
end
|
44
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
|
5
|
-
class TestWeightedValueResolver < Minitest::Test
|
6
|
-
KEY = 'config_key'
|
7
|
-
|
8
|
-
def test_resolving_single_value
|
9
|
-
values = weighted_values([['abc', 1]])
|
10
|
-
resolver = Prefab::WeightedValueResolver.new(values, KEY, nil)
|
11
|
-
assert_equal 'abc', resolver.resolve[0].value.string
|
12
|
-
assert_equal 0, resolver.resolve[1]
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_resolving_multiple_values_evenly_distributed
|
16
|
-
values = weighted_values([['abc', 1], ['def', 1]])
|
17
|
-
|
18
|
-
resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:001')
|
19
|
-
assert_equal 'abc', resolver.resolve[0].value.string
|
20
|
-
assert_equal 0, resolver.resolve[1]
|
21
|
-
|
22
|
-
resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:456')
|
23
|
-
assert_equal 'def', resolver.resolve[0].value.string
|
24
|
-
assert_equal 1, resolver.resolve[1]
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_resolving_multiple_values_unevenly_distributed
|
28
|
-
values = weighted_values([['abc', 1], ['def', 98], ['ghi', 1]])
|
29
|
-
|
30
|
-
resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:456')
|
31
|
-
assert_equal 'def', resolver.resolve[0].value.string
|
32
|
-
assert_equal 1, resolver.resolve[1]
|
33
|
-
|
34
|
-
resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:103')
|
35
|
-
assert_equal 'ghi', resolver.resolve[0].value.string
|
36
|
-
assert_equal 2, resolver.resolve[1]
|
37
|
-
|
38
|
-
resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:119')
|
39
|
-
assert_equal 'abc', resolver.resolve[0].value.string
|
40
|
-
assert_equal 0, resolver.resolve[1]
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_resolving_multiple_values_with_simulation
|
44
|
-
values = weighted_values([['abc', 1], ['def', 98], ['ghi', 1]])
|
45
|
-
results = {}
|
46
|
-
|
47
|
-
10_000.times do |i|
|
48
|
-
result = Prefab::WeightedValueResolver.new(values, KEY, "user:#{i}").resolve[0].value.string
|
49
|
-
results[result] ||= 0
|
50
|
-
results[result] += 1
|
51
|
-
end
|
52
|
-
|
53
|
-
assert_in_delta 100, results['abc'], 20
|
54
|
-
assert_in_delta 9800, results['def'], 50
|
55
|
-
assert_in_delta 100, results['ghi'], 20
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def weighted_values(values_and_weights)
|
61
|
-
values_and_weights.map do |value, weight|
|
62
|
-
weighted_value(value, weight)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def weighted_value(string, weight)
|
67
|
-
PrefabProto::WeightedValue.new(
|
68
|
-
value: PrefabProto::ConfigValue.new(string: string), weight: weight
|
69
|
-
)
|
70
|
-
end
|
71
|
-
end
|