prefab-cloud-ruby 1.8.4 → 1.8.5
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/.github/workflows/ruby.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +2 -2
- data/VERSION +1 -1
- data/lib/prefab/config_value_unwrapper.rb +6 -2
- data/lib/prefab/javascript_stub.rb +20 -6
- data/lib/prefab/options.rb +8 -1
- data/prefab-cloud-ruby.gemspec +4 -3
- data/test/fixtures/datafile.json +87 -0
- data/test/test_client.rb +8 -0
- data/test/test_javascript_stub.rb +43 -6
- data/test/test_options.rb +5 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 221fd3505c561f550efb45c86fcdf1ea79a7afd442ef6d2c351d9f0ce433c391
|
4
|
+
data.tar.gz: e85a75665a06ed8350e9fe6d44bc5c7462eb1d5d698f2b58a8ae2890472740e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34a83eabd765201e831bc00d6b4472f1b67f6eb9271f5cd77f33de7a55571acbd323f2c6ee2c8df8a3df0602f577a3a30daebe983403d0e61870a14f6bcd7b74
|
7
|
+
data.tar.gz: fc6f2e0616a62dee54415d1290d163a055391afee5ba62f158aad5d19192ebd129507305dd6cda9735bf8b184e9c7e94657f1005384907150a0049c14cc8c6fe
|
data/.github/workflows/ruby.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -62,7 +62,7 @@ GEM
|
|
62
62
|
faraday (>= 0.8, < 2)
|
63
63
|
hashie (~> 3.5, >= 3.5.2)
|
64
64
|
oauth2 (~> 1.0)
|
65
|
-
google-protobuf (3.25.
|
65
|
+
google-protobuf (3.25.5)
|
66
66
|
googleapis-common-protos-types (1.14.0)
|
67
67
|
google-protobuf (~> 3.18)
|
68
68
|
hashie (3.6.0)
|
@@ -152,7 +152,7 @@ GEM
|
|
152
152
|
concurrent-ruby (~> 1.0)
|
153
153
|
uuid (2.3.9)
|
154
154
|
macaddr (~> 1.0)
|
155
|
-
webrick (1.8.
|
155
|
+
webrick (1.8.2)
|
156
156
|
|
157
157
|
PLATFORMS
|
158
158
|
ruby
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.8.
|
1
|
+
1.8.5
|
@@ -30,7 +30,7 @@ module Prefab
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# this will return the actual value of confidential, use reportable_value unless you need it
|
33
|
-
def unwrap
|
33
|
+
def unwrap(raw_json: false)
|
34
34
|
raw = case @config_value.type
|
35
35
|
when :int, :string, :double, :bool, :log_level
|
36
36
|
@config_value.public_send(@config_value.type)
|
@@ -39,7 +39,11 @@ module Prefab
|
|
39
39
|
when :duration
|
40
40
|
Prefab::Duration.new(@config_value.duration.definition)
|
41
41
|
when :json
|
42
|
-
|
42
|
+
if raw_json
|
43
|
+
@config_value.json.json
|
44
|
+
else
|
45
|
+
JSON.parse(@config_value.json.json)
|
46
|
+
end
|
43
47
|
else
|
44
48
|
LOG.error "Unknown type: #{@config_value.type}"
|
45
49
|
raise "Unknown type: #{@config_value.type}"
|
@@ -3,16 +3,17 @@
|
|
3
3
|
module Prefab
|
4
4
|
class JavaScriptStub
|
5
5
|
LOG = Prefab::InternalLogger.new(self)
|
6
|
+
CAMELS = {}
|
6
7
|
|
7
8
|
def initialize(client = nil)
|
8
9
|
@client = client || Prefab.instance
|
9
10
|
end
|
10
11
|
|
11
12
|
def bootstrap(context)
|
12
|
-
configs, warnings = data(context)
|
13
|
+
configs, warnings = data(context, :bootstrap)
|
13
14
|
<<~JS
|
14
15
|
window._prefabBootstrap = {
|
15
|
-
|
16
|
+
evaluations: #{JSON.dump(configs)},
|
16
17
|
context: #{JSON.dump(context)}
|
17
18
|
}
|
18
19
|
#{log_warnings(warnings)}
|
@@ -20,7 +21,7 @@ module Prefab
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def generate_stub(context, callback = nil)
|
23
|
-
configs, warnings = data(context)
|
24
|
+
configs, warnings = data(context, :stub)
|
24
25
|
<<~JS
|
25
26
|
window.prefab = window.prefab || {};
|
26
27
|
window.prefab.config = #{JSON.dump(configs)};
|
@@ -41,7 +42,7 @@ module Prefab
|
|
41
42
|
private
|
42
43
|
|
43
44
|
def underlying_value(value)
|
44
|
-
v = Prefab::ConfigValueUnwrapper.new(value, @client.resolver).unwrap
|
45
|
+
v = Prefab::ConfigValueUnwrapper.new(value, @client.resolver).unwrap(raw_json: true)
|
45
46
|
case v
|
46
47
|
when Google::Protobuf::RepeatedField
|
47
48
|
v.to_a
|
@@ -60,7 +61,7 @@ module Prefab
|
|
60
61
|
JS
|
61
62
|
end
|
62
63
|
|
63
|
-
def data(context)
|
64
|
+
def data(context, mode)
|
64
65
|
permitted = {}
|
65
66
|
warnings = []
|
66
67
|
resolver_keys = @client.resolver.keys
|
@@ -70,7 +71,12 @@ module Prefab
|
|
70
71
|
config = @client.resolver.raw(key)
|
71
72
|
|
72
73
|
if config.config_type == :FEATURE_FLAG || config.send_to_client_sdk || config.config_type == :LOG_LEVEL
|
73
|
-
|
74
|
+
value = @client.resolver.get(key, context).value
|
75
|
+
if mode == :bootstrap
|
76
|
+
permitted[key] = { value: { to_camel_case(value.type) => underlying_value(value) } }
|
77
|
+
else
|
78
|
+
permitted[key] = underlying_value(value)
|
79
|
+
end
|
74
80
|
end
|
75
81
|
rescue StandardError => e
|
76
82
|
LOG.warn("Could not resolve key #{key}: #{e}")
|
@@ -81,5 +87,13 @@ module Prefab
|
|
81
87
|
|
82
88
|
[permitted, warnings]
|
83
89
|
end
|
90
|
+
|
91
|
+
def to_camel_case(str)
|
92
|
+
CAMELS[str] ||= begin
|
93
|
+
str.to_s.split('_').map.with_index { |word, index|
|
94
|
+
index == 0 ? word : word.capitalize
|
95
|
+
}.join
|
96
|
+
end
|
97
|
+
end
|
84
98
|
end
|
85
99
|
end
|
data/lib/prefab/options.rb
CHANGED
@@ -66,6 +66,7 @@ module Prefab
|
|
66
66
|
collect_evaluation_summaries: true,
|
67
67
|
collect_max_evaluation_summaries: DEFAULT_MAX_EVAL_SUMMARIES,
|
68
68
|
allow_telemetry_in_local_mode: false,
|
69
|
+
datafile: ENV['PREFAB_DATAFILE'],
|
69
70
|
x_datafile: ENV['PREFAB_DATAFILE'],
|
70
71
|
x_use_local_cache: false,
|
71
72
|
global_context: {}
|
@@ -76,7 +77,13 @@ module Prefab
|
|
76
77
|
@initialization_timeout_sec = initialization_timeout_sec
|
77
78
|
@on_init_failure = on_init_failure
|
78
79
|
@prefab_datasources = prefab_datasources
|
79
|
-
|
80
|
+
|
81
|
+
@datafile = datafile || x_datafile
|
82
|
+
|
83
|
+
if !x_datafile.nil?
|
84
|
+
warn '[DEPRECATION] x_datafile is deprecated. Please provide `datafile` instead'
|
85
|
+
end
|
86
|
+
|
80
87
|
@prefab_config_classpath_dir = prefab_config_classpath_dir
|
81
88
|
@prefab_config_override_dir = prefab_config_override_dir
|
82
89
|
@prefab_envs = Array(prefab_envs)
|
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 1.8.
|
5
|
+
# stub: prefab-cloud-ruby 1.8.5 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "prefab-cloud-ruby".freeze
|
9
|
-
s.version = "1.8.
|
9
|
+
s.version = "1.8.5"
|
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 = "2024-09-
|
14
|
+
s.date = "2024-09-27"
|
15
15
|
s.description = "Feature Flags, Live Config, and Dynamic Log Levels as a service".freeze
|
16
16
|
s.email = "jdwyer@prefab.cloud".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -84,6 +84,7 @@ Gem::Specification.new do |s|
|
|
84
84
|
"prefab-cloud-ruby.gemspec",
|
85
85
|
"test/.prefab.default.config.yaml",
|
86
86
|
"test/.prefab.unit_tests.config.yaml",
|
87
|
+
"test/fixtures/datafile.json",
|
87
88
|
"test/integration_test.rb",
|
88
89
|
"test/integration_test_helpers.rb",
|
89
90
|
"test/support/common_helpers.rb",
|
@@ -0,0 +1,87 @@
|
|
1
|
+
{
|
2
|
+
"configs": [
|
3
|
+
{
|
4
|
+
"id": "16825372746571694",
|
5
|
+
"projectId": "202",
|
6
|
+
"key": "log-level",
|
7
|
+
"changedBy": {
|
8
|
+
"email": "jeffrey.chupp@prefab.cloud"
|
9
|
+
},
|
10
|
+
"configType": "DELETED"
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"id": "17271108409487302",
|
14
|
+
"projectId": "202",
|
15
|
+
"key": "flag.list.environments",
|
16
|
+
"changedBy": {
|
17
|
+
"email": "jeffrey.chupp@prefab.cloud"
|
18
|
+
},
|
19
|
+
"rows": [
|
20
|
+
{
|
21
|
+
"projectEnvId": "308",
|
22
|
+
"values": [
|
23
|
+
{
|
24
|
+
"criteria": [
|
25
|
+
{
|
26
|
+
"propertyName": "user.key",
|
27
|
+
"operator": "PROP_IS_ONE_OF",
|
28
|
+
"valueToMatch": {
|
29
|
+
"stringList": {
|
30
|
+
"values": [
|
31
|
+
"5905ecd1-9bbf-4711-a663-4f713628a78c"
|
32
|
+
]
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
],
|
37
|
+
"value": {
|
38
|
+
"bool": true
|
39
|
+
}
|
40
|
+
},
|
41
|
+
{
|
42
|
+
"value": {
|
43
|
+
"bool": true
|
44
|
+
}
|
45
|
+
}
|
46
|
+
]
|
47
|
+
}
|
48
|
+
],
|
49
|
+
"allowableValues": [
|
50
|
+
{
|
51
|
+
"bool": false
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"bool": true
|
55
|
+
}
|
56
|
+
],
|
57
|
+
"configType": "FEATURE_FLAG",
|
58
|
+
"valueType": "BOOL"
|
59
|
+
},
|
60
|
+
{
|
61
|
+
"id": "17271831941669987",
|
62
|
+
"projectId": "202",
|
63
|
+
"key": "my.test.string",
|
64
|
+
"changedBy": {
|
65
|
+
"userId": "3",
|
66
|
+
"apiKeyId": "481"
|
67
|
+
},
|
68
|
+
"rows": [
|
69
|
+
{
|
70
|
+
"values": [
|
71
|
+
{
|
72
|
+
"value": {
|
73
|
+
"string": "hello world"
|
74
|
+
}
|
75
|
+
}
|
76
|
+
]
|
77
|
+
}
|
78
|
+
],
|
79
|
+
"configType": "CONFIG",
|
80
|
+
"valueType": "STRING"
|
81
|
+
}
|
82
|
+
],
|
83
|
+
"configServicePointer": {
|
84
|
+
"projectId": "202",
|
85
|
+
"projectEnvId": "308"
|
86
|
+
}
|
87
|
+
}
|
data/test/test_client.rb
CHANGED
@@ -427,6 +427,14 @@ class TestClient < Minitest::Test
|
|
427
427
|
refute client.is_ff?('does_not_exist')
|
428
428
|
end
|
429
429
|
|
430
|
+
def test_with_datafile
|
431
|
+
datafile = "#{Dir.pwd}/test/fixtures/datafile.json"
|
432
|
+
client = new_client(datafile: datafile, prefab_datasources: :all)
|
433
|
+
|
434
|
+
assert client.get('flag.list.environments')
|
435
|
+
assert_equal "hello world", client.get('my.test.string')
|
436
|
+
end
|
437
|
+
|
430
438
|
private
|
431
439
|
|
432
440
|
def basic_value_config
|
@@ -48,6 +48,34 @@ class JavascriptStubTest < Minitest::Test
|
|
48
48
|
rows: [DEFAULT_ROW]
|
49
49
|
)
|
50
50
|
|
51
|
+
json_config = PrefabProto::Config.new(
|
52
|
+
id: 234,
|
53
|
+
key: 'json-config',
|
54
|
+
config_type: PrefabProto::ConfigType::CONFIG,
|
55
|
+
send_to_client_sdk: true,
|
56
|
+
rows: [
|
57
|
+
PrefabProto::ConfigRow.new(
|
58
|
+
values: [
|
59
|
+
PrefabProto::ConditionalValue.new(value: PrefabProto::ConfigValue.new(json: PrefabProto::Json.new(json: '{"key":"value"}')))
|
60
|
+
]
|
61
|
+
)
|
62
|
+
]
|
63
|
+
)
|
64
|
+
|
65
|
+
duration_config = PrefabProto::Config.new(
|
66
|
+
id: 236,
|
67
|
+
key: 'duration-config',
|
68
|
+
config_type: PrefabProto::ConfigType::CONFIG,
|
69
|
+
send_to_client_sdk: true,
|
70
|
+
rows: [
|
71
|
+
PrefabProto::ConfigRow.new(
|
72
|
+
values: [
|
73
|
+
PrefabProto::ConditionalValue.new(value: PrefabProto::ConfigValue.new(duration: PrefabProto::IsoDuration.new(definition: "P4DT12H30M5S")))
|
74
|
+
]
|
75
|
+
)
|
76
|
+
]
|
77
|
+
)
|
78
|
+
|
51
79
|
ff = PrefabProto::Config.new(
|
52
80
|
id: 456,
|
53
81
|
key: 'feature-flag',
|
@@ -72,7 +100,7 @@ class JavascriptStubTest < Minitest::Test
|
|
72
100
|
)
|
73
101
|
|
74
102
|
@client = new_client(
|
75
|
-
config: [log_level, config_for_sdk, config_not_for_sdk, ff],
|
103
|
+
config: [log_level, config_for_sdk, config_not_for_sdk, ff, json_config, duration_config],
|
76
104
|
project_env_id: PROJECT_ENV_ID,
|
77
105
|
collect_evaluation_summaries: true,
|
78
106
|
prefab_config_override_dir: '/tmp',
|
@@ -85,20 +113,29 @@ class JavascriptStubTest < Minitest::Test
|
|
85
113
|
def test_bootstrap
|
86
114
|
result = Prefab::JavaScriptStub.new(@client).bootstrap({})
|
87
115
|
|
116
|
+
|
117
|
+
File.open('/tmp/prefab_config.json', 'w') do |f|
|
118
|
+
f.write(result)
|
119
|
+
end
|
88
120
|
assert_equal %(
|
89
121
|
window._prefabBootstrap = {
|
90
|
-
|
122
|
+
evaluations: {"log-level":{"value":{"logLevel":"INFO"}},"basic-config":{"value":{"string":"default_value"}},"feature-flag":{"value":{"bool":false}},"json-config":{"value":{"json":"{\\"key\\":\\"value\\"}"}},"duration-config":{"value":{"duration":{"ms":390605000.0,"seconds":390605.0}}}},
|
91
123
|
context: {}
|
92
124
|
}
|
93
125
|
).strip, result.strip
|
94
126
|
|
95
127
|
result = Prefab::JavaScriptStub.new(@client).bootstrap({ user: { email: 'gmail.com' } })
|
96
128
|
|
129
|
+
File.open('/tmp/prefab_config.json', 'w') do |f|
|
130
|
+
f.write(result)
|
131
|
+
end
|
132
|
+
|
97
133
|
assert_equal %(
|
98
134
|
window._prefabBootstrap = {
|
99
|
-
|
135
|
+
evaluations: {"log-level":{"value":{"logLevel":"INFO"}},"basic-config":{"value":{"string":"default_value"}},"feature-flag":{"value":{"bool":true}},"json-config":{"value":{"json":"{\\"key\\":\\"value\\"}"}},"duration-config":{"value":{"duration":{"ms":390605000.0,"seconds":390605.0}}}},
|
100
136
|
context: {"user":{"email":"gmail.com"}}
|
101
137
|
}
|
138
|
+
|
102
139
|
).strip, result.strip
|
103
140
|
end
|
104
141
|
|
@@ -107,7 +144,7 @@ window._prefabBootstrap = {
|
|
107
144
|
|
108
145
|
assert_equal %(
|
109
146
|
window.prefab = window.prefab || {};
|
110
|
-
window.prefab.config = {"log-level":"INFO","basic-config":"default_value","feature-flag":false};
|
147
|
+
window.prefab.config = {"log-level":"INFO","basic-config":"default_value","feature-flag":false,"json-config":"{\\"key\\":\\"value\\"}","duration-config":{"ms":390605000.0,"seconds":390605.0}};
|
111
148
|
window.prefab.get = function(key) {
|
112
149
|
var value = window.prefab.config[key];
|
113
150
|
|
@@ -120,11 +157,11 @@ window.prefab.isEnabled = function(key) {
|
|
120
157
|
};
|
121
158
|
).strip, result.strip
|
122
159
|
|
123
|
-
result = Prefab::JavaScriptStub.new(@client).generate_stub({ user: { email: 'gmail.com' } },
|
160
|
+
result = Prefab::JavaScriptStub.new(@client).generate_stub({ user: { email: 'gmail.com' } }, 'myEvalCallback')
|
124
161
|
|
125
162
|
assert_equal %(
|
126
163
|
window.prefab = window.prefab || {};
|
127
|
-
window.prefab.config = {"log-level":"INFO","basic-config":"default_value","feature-flag":true};
|
164
|
+
window.prefab.config = {"log-level":"INFO","basic-config":"default_value","feature-flag":true,"json-config":"{\\"key\\":\\"value\\"}","duration-config":{"ms":390605000.0,"seconds":390605.0}};
|
128
165
|
window.prefab.get = function(key) {
|
129
166
|
var value = window.prefab.config[key];
|
130
167
|
myEvalCallback(key, value);
|
data/test/test_options.rb
CHANGED
@@ -85,4 +85,9 @@ class TestOptions < Minitest::Test
|
|
85
85
|
options = Prefab::Options.new(context_upload_mode: :none)
|
86
86
|
assert_equal 0, options.collect_max_shapes
|
87
87
|
end
|
88
|
+
|
89
|
+
def test_loading_a_datafile
|
90
|
+
options = Prefab::Options.new(datafile: "#{Dir.pwd}/test/fixtures/datafile.json")
|
91
|
+
assert_equal "#{Dir.pwd}/test/fixtures/datafile.json", options.datafile
|
92
|
+
end
|
88
93
|
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: 1.8.
|
4
|
+
version: 1.8.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
11
|
+
date: 2024-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -285,6 +285,7 @@ files:
|
|
285
285
|
- prefab-cloud-ruby.gemspec
|
286
286
|
- test/.prefab.default.config.yaml
|
287
287
|
- test/.prefab.unit_tests.config.yaml
|
288
|
+
- test/fixtures/datafile.json
|
288
289
|
- test/integration_test.rb
|
289
290
|
- test/integration_test_helpers.rb
|
290
291
|
- test/support/common_helpers.rb
|