quonfig 0.0.9 → 0.0.11
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/CHANGELOG.md +43 -0
- data/README.md +4 -4
- data/lib/quonfig/evaluation_details.rb +60 -0
- data/lib/quonfig/options.rb +37 -16
- data/lib/quonfig/sse_config_client.rb +1 -1
- data/lib/quonfig/version.rb +5 -0
- data/lib/quonfig.rb +2 -1
- data/quonfig.gemspec +30 -163
- metadata +29 -182
- data/.claude/rules/constitution.md +0 -81
- data/.claude/rules/git-safety.md +0 -11
- data/.claude/rules/issue-tracking.md +0 -13
- data/.claude/rules/testing-workflow.md +0 -28
- data/.envrc.sample +0 -3
- data/.github/CODEOWNERS +0 -2
- data/.github/pull_request_template.md +0 -8
- data/.github/workflows/release.yml +0 -49
- data/.github/workflows/ruby.yml +0 -60
- data/.github/workflows/test.yaml +0 -40
- data/.rubocop.yml +0 -13
- data/.tool-versions +0 -1
- data/CLAUDE.md +0 -29
- data/CODEOWNERS +0 -1
- data/Gemfile +0 -26
- data/Gemfile.lock +0 -177
- data/Rakefile +0 -64
- data/VERSION +0 -1
- data/dev/allocation_stats +0 -60
- data/dev/benchmark +0 -40
- data/dev/console +0 -12
- data/dev/script_setup.rb +0 -18
- data/test/fixtures/datafile.json +0 -87
- data/test/integration/test_context_precedence.rb +0 -112
- data/test/integration/test_datadir_environment.rb +0 -54
- data/test/integration/test_dev_overrides.rb +0 -40
- data/test/integration/test_enabled.rb +0 -478
- data/test/integration/test_enabled_with_contexts.rb +0 -64
- data/test/integration/test_get.rb +0 -136
- data/test/integration/test_get_feature_flag.rb +0 -28
- data/test/integration/test_get_or_raise.rb +0 -60
- data/test/integration/test_get_weighted_values.rb +0 -34
- data/test/integration/test_helpers.rb +0 -667
- data/test/integration/test_helpers_test.rb +0 -73
- data/test/integration/test_post.rb +0 -44
- data/test/integration/test_telemetry.rb +0 -170
- data/test/support/common_helpers.rb +0 -106
- data/test/support/mock_base_client.rb +0 -27
- data/test/support/mock_config_loader.rb +0 -1
- data/test/test_bound_client.rb +0 -109
- data/test/test_caching_http_connection.rb +0 -218
- data/test/test_client.rb +0 -255
- data/test/test_client_network_mode.rb +0 -136
- data/test/test_client_telemetry.rb +0 -175
- data/test/test_config_loader.rb +0 -70
- data/test/test_context.rb +0 -139
- data/test/test_context_shape.rb +0 -37
- data/test/test_context_shape_aggregator.rb +0 -126
- data/test/test_datadir.rb +0 -203
- data/test/test_dev_context.rb +0 -163
- data/test/test_duration.rb +0 -37
- data/test/test_encryption.rb +0 -16
- data/test/test_evaluation_summaries_aggregator.rb +0 -180
- data/test/test_evaluator.rb +0 -285
- data/test/test_example_contexts_aggregator.rb +0 -119
- data/test/test_exponential_backoff.rb +0 -44
- data/test/test_fixed_size_hash.rb +0 -119
- data/test/test_helper.rb +0 -17
- data/test/test_http_connection.rb +0 -79
- data/test/test_internal_logger.rb +0 -34
- data/test/test_options.rb +0 -167
- data/test/test_rate_limit_cache.rb +0 -44
- data/test/test_reason.rb +0 -79
- data/test/test_rename.rb +0 -65
- data/test/test_resolver.rb +0 -291
- data/test/test_semantic_logger_filter.rb +0 -144
- data/test/test_semver.rb +0 -108
- data/test/test_should_log.rb +0 -186
- data/test/test_sse_config_client.rb +0 -297
- data/test/test_stdlib_formatter.rb +0 -195
- data/test/test_telemetry_reporter.rb +0 -209
- data/test/test_typed_getters.rb +0 -131
- data/test/test_types.rb +0 -141
- data/test/test_weighted_value_resolver.rb +0 -84
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
#
|
|
3
|
-
# AUTO-GENERATED from integration-test-data/tests/eval/get.yaml.
|
|
4
|
-
# Regenerate with:
|
|
5
|
-
# cd integration-test-data/generators && npm run generate -- --target=ruby
|
|
6
|
-
# Source: integration-test-data/generators/src/targets/ruby.ts
|
|
7
|
-
# Do NOT edit by hand — changes will be overwritten.
|
|
8
|
-
|
|
9
|
-
require 'test_helper'
|
|
10
|
-
require 'integration/test_helpers'
|
|
11
|
-
|
|
12
|
-
class TestGet < Minitest::Test
|
|
13
|
-
def setup
|
|
14
|
-
@store = IntegrationTestHelpers.build_store("get")
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# get returns a found value for key
|
|
18
|
-
def test_get_returns_a_found_value_for_key
|
|
19
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
20
|
-
IntegrationTestHelpers.assert_resolved(resolver, "my-test-key", {}, "my-test-value")
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# get returns nil if value not found
|
|
24
|
-
def test_get_returns_nil_if_value_not_found
|
|
25
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
26
|
-
IntegrationTestHelpers.assert_resolved(resolver, "my-missing-key", {}, nil)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# get returns a default for a missing value if a default is given
|
|
30
|
-
def test_get_returns_a_default_for_a_missing_value_if_a_default_is_given
|
|
31
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
32
|
-
IntegrationTestHelpers.assert_get_with_default(@store, "my-missing-key", {}, "DEFAULT", "DEFAULT")
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# get ignores a provided default if the key is found
|
|
36
|
-
def test_get_ignores_a_provided_default_if_the_key_is_found
|
|
37
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
38
|
-
IntegrationTestHelpers.assert_get_with_default(@store, "my-test-key", {}, "DEFAULT", "my-test-value")
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# get can return a double
|
|
42
|
-
def test_get_can_return_a_double
|
|
43
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
44
|
-
IntegrationTestHelpers.assert_resolved(resolver, "my-double-key", {}, 9.95)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# get can return a string list
|
|
48
|
-
def test_get_can_return_a_string_list
|
|
49
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
50
|
-
IntegrationTestHelpers.assert_resolved(resolver, "my-string-list-key", {}, ["a", "b", "c"])
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# can return a value provided by an environment variable
|
|
54
|
-
def test_can_return_a_value_provided_by_an_environment_variable
|
|
55
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
56
|
-
IntegrationTestHelpers.assert_resolved(resolver, "prefab.secrets.encryption.key", {}, "c87ba22d8662282abe8a0e4651327b579cb64a454ab0f4c170b45b15f049a221")
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# can return a value provided by an environment variable after type coercion
|
|
60
|
-
def test_can_return_a_value_provided_by_an_environment_variable_after_type_coercion
|
|
61
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
62
|
-
IntegrationTestHelpers.assert_resolved(resolver, "provided.a.number", {}, 1234)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# can decrypt and return a secret value (with decryption key in in env var)
|
|
66
|
-
def test_can_decrypt_and_return_a_secret_value_with_decryption_key_in_in_env_var
|
|
67
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
68
|
-
IntegrationTestHelpers.assert_resolved(resolver, "a.secret.config", {}, "hello.world")
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# duration 200 ms
|
|
72
|
-
def test_duration_200_ms
|
|
73
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
74
|
-
IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT0.2S", {}, 200)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# duration 90S
|
|
78
|
-
def test_duration_90s
|
|
79
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
80
|
-
IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT90S", {}, 90000)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# duration 1.5M
|
|
84
|
-
def test_duration_1_5m
|
|
85
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
86
|
-
IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT1.5M", {}, 90000)
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# duration 0.5H
|
|
90
|
-
def test_duration_0_5h
|
|
91
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
92
|
-
IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT0.5H", {}, 1800000)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# duration test.duration.P1DT6H2M1.5S
|
|
96
|
-
def test_duration_test_duration_p1dt6h2m1_5s
|
|
97
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
98
|
-
IntegrationTestHelpers.assert_resolved(resolver, "test.duration.P1DT6H2M1.5S", {}, 108121500)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# json test
|
|
102
|
-
def test_json_test
|
|
103
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
104
|
-
IntegrationTestHelpers.assert_resolved(resolver, "test.json", {}, {"a" => 1, "b" => "c"})
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# get returns a native json object (not a stringified payload)
|
|
108
|
-
def test_get_returns_a_native_json_object_not_a_stringified_payload
|
|
109
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
110
|
-
IntegrationTestHelpers.assert_resolved(resolver, "test.json", {}, {"a" => 1, "b" => "c"})
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# list on left side test (1)
|
|
114
|
-
def test_list_on_left_side_test_1
|
|
115
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
116
|
-
IntegrationTestHelpers.assert_resolved(resolver, "left.hand.list.test", {"user" => {"name" => "james", "aka" => ["happy", "sleepy"]}}, "correct")
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# list on left side test (2)
|
|
120
|
-
def test_list_on_left_side_test_2
|
|
121
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
122
|
-
IntegrationTestHelpers.assert_resolved(resolver, "left.hand.list.test", {"user" => {"name" => "james", "aka" => ["a", "b"]}}, "default")
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
# list on left side test opposite (1)
|
|
126
|
-
def test_list_on_left_side_test_opposite_1
|
|
127
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
128
|
-
IntegrationTestHelpers.assert_resolved(resolver, "left.hand.test.opposite", {"user" => {"name" => "james", "aka" => ["happy", "sleepy"]}}, "default")
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# list on left side test (3)
|
|
132
|
-
def test_list_on_left_side_test_3
|
|
133
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
134
|
-
IntegrationTestHelpers.assert_resolved(resolver, "left.hand.test.opposite", {"user" => {"name" => "james", "aka" => ["a", "b"]}}, "correct")
|
|
135
|
-
end
|
|
136
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
#
|
|
3
|
-
# AUTO-GENERATED from integration-test-data/tests/eval/get_feature_flag.yaml.
|
|
4
|
-
# Regenerate with:
|
|
5
|
-
# cd integration-test-data/generators && npm run generate -- --target=ruby
|
|
6
|
-
# Source: integration-test-data/generators/src/targets/ruby.ts
|
|
7
|
-
# Do NOT edit by hand — changes will be overwritten.
|
|
8
|
-
|
|
9
|
-
require 'test_helper'
|
|
10
|
-
require 'integration/test_helpers'
|
|
11
|
-
|
|
12
|
-
class TestGetFeatureFlag < Minitest::Test
|
|
13
|
-
def setup
|
|
14
|
-
@store = IntegrationTestHelpers.build_store("get_feature_flag")
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# get returns the underlying value for a feature flag
|
|
18
|
-
def test_get_returns_the_underlying_value_for_a_feature_flag
|
|
19
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
20
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.integer", {}, 3)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# get returns the underlying value for a feature flag that matches the highest precedent rule
|
|
24
|
-
def test_get_returns_the_underlying_value_for_a_feature_flag_that_matches_the_highest_precedent_rule
|
|
25
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
26
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.integer", {"user" => {"key" => "michael"}}, 5)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
#
|
|
3
|
-
# AUTO-GENERATED from integration-test-data/tests/eval/get_or_raise.yaml.
|
|
4
|
-
# Regenerate with:
|
|
5
|
-
# cd integration-test-data/generators && npm run generate -- --target=ruby
|
|
6
|
-
# Source: integration-test-data/generators/src/targets/ruby.ts
|
|
7
|
-
# Do NOT edit by hand — changes will be overwritten.
|
|
8
|
-
|
|
9
|
-
require 'test_helper'
|
|
10
|
-
require 'integration/test_helpers'
|
|
11
|
-
|
|
12
|
-
class TestGetOrRaise < Minitest::Test
|
|
13
|
-
def setup
|
|
14
|
-
@store = IntegrationTestHelpers.build_store("get_or_raise")
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# get_or_raise can raise an error if value not found
|
|
18
|
-
def test_get_or_raise_can_raise_an_error_if_value_not_found
|
|
19
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
20
|
-
ctx = Quonfig::Context.new({})
|
|
21
|
-
assert_raises(Quonfig::Errors::MissingDefaultError) { resolver.get("my-missing-key", ctx) }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# get_or_raise returns a default value instead of raising
|
|
25
|
-
def test_get_or_raise_returns_a_default_value_instead_of_raising
|
|
26
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
27
|
-
IntegrationTestHelpers.assert_get_with_default(@store, "my-missing-key", {}, "DEFAULT", "DEFAULT")
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# get_or_raise raises the correct error if it doesn't raise on init timeout
|
|
31
|
-
def test_get_or_raise_raises_the_correct_error_if_it_doesn_t_raise_on_init_timeout
|
|
32
|
-
IntegrationTestHelpers.assert_client_construction_raises("any-key", 0.01, "https://app.staging-prefab.cloud", "return", "get_or_raise", Quonfig::Errors::MissingDefaultError)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# get_or_raise can raise an error if the client does not initialize in time
|
|
36
|
-
def test_get_or_raise_can_raise_an_error_if_the_client_does_not_initialize_in_time
|
|
37
|
-
IntegrationTestHelpers.assert_initialization_timeout_error("any-key", 0.01, "https://app.staging-prefab.cloud", "raise")
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# raises an error if a config is provided by a missing environment variable
|
|
41
|
-
def test_raises_an_error_if_a_config_is_provided_by_a_missing_environment_variable
|
|
42
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
43
|
-
ctx = Quonfig::Context.new({})
|
|
44
|
-
assert_raises(Quonfig::Errors::MissingEnvVarError) { resolver.get("provided.by.missing.env.var", ctx) }
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# raises an error if an env-var-provided config cannot be coerced to configured type
|
|
48
|
-
def test_raises_an_error_if_an_env_var_provided_config_cannot_be_coerced_to_configured_type
|
|
49
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
50
|
-
ctx = Quonfig::Context.new({})
|
|
51
|
-
assert_raises(Quonfig::Errors::EnvVarParseError) { resolver.get("provided.not.a.number", ctx) }
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# raises an error for decryption failure
|
|
55
|
-
def test_raises_an_error_for_decryption_failure
|
|
56
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
57
|
-
ctx = Quonfig::Context.new({})
|
|
58
|
-
assert_raises(Quonfig::Errors::DecryptionError) { resolver.get("a.broken.secret.config", ctx) }
|
|
59
|
-
end
|
|
60
|
-
end
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
#
|
|
3
|
-
# AUTO-GENERATED from integration-test-data/tests/eval/get_weighted_values.yaml.
|
|
4
|
-
# Regenerate with:
|
|
5
|
-
# cd integration-test-data/generators && npm run generate -- --target=ruby
|
|
6
|
-
# Source: integration-test-data/generators/src/targets/ruby.ts
|
|
7
|
-
# Do NOT edit by hand — changes will be overwritten.
|
|
8
|
-
|
|
9
|
-
require 'test_helper'
|
|
10
|
-
require 'integration/test_helpers'
|
|
11
|
-
|
|
12
|
-
class TestGetWeightedValues < Minitest::Test
|
|
13
|
-
def setup
|
|
14
|
-
@store = IntegrationTestHelpers.build_store("get_weighted_values")
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# weighted value is consistent 1
|
|
18
|
-
def test_weighted_value_is_consistent_1
|
|
19
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
20
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.weighted", {"user" => {"tracking_id" => "a72c15f5"}}, 1)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# weighted value is consistent 2
|
|
24
|
-
def test_weighted_value_is_consistent_2
|
|
25
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
26
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.weighted", {"user" => {"tracking_id" => "92a202f2"}}, 2)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# weighted value is consistent 3
|
|
30
|
-
def test_weighted_value_is_consistent_3
|
|
31
|
-
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
32
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.weighted", {"user" => {"tracking_id" => "8f414100"}}, 3)
|
|
33
|
-
end
|
|
34
|
-
end
|