ldclient-rb 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f00287e6e246a9644375d4945034f25ee7ff7df2
4
- data.tar.gz: 6899db722f33a0ca552998a0fd4a738576e353f2
3
+ metadata.gz: 33eb7dda18b6978902b85844e4eeb2a6aeb78cbd
4
+ data.tar.gz: a14cdb94a462d9ba7892dbaac4b98eb29977fca3
5
5
  SHA512:
6
- metadata.gz: 9642d199535a1805364241d7bfdef403355583ac0bedf9cee0df09b472baf67c8724a5f7c4293152ace3d7b970319e2bccd9b32761ebbbc230c9528bc0afd149
7
- data.tar.gz: f6730d8bddbe1eda1cb271ecb4ba39e4d47050fc3d5119d1a7c037bdd4f3fd50a58b3031f6cb1de61cd7de2817def0ecd99baee1e8ef1e1a42289d76d677e18e
6
+ metadata.gz: f9ffd77abc85bd1275ed2a626a074d057a96648f29cd59c98ba59485dad33b552a9e1da1f7699f7c0ec909dca0447b6ac4098e48512e62ee955c2b0754fd5234
7
+ data.tar.gz: 3c8f4cbdc179df8803da79cf76c0205af931908b79d9c043bc2115c77249e4a6816665f1d997a8fa148ea8d1f52b70d683cbff349a16b28489f91520999c03a6
@@ -134,6 +134,7 @@ module LaunchDarkly
134
134
  @config.logger.error("[LDClient] Must specify user")
135
135
  return default
136
136
  end
137
+ sanitize_user(user)
137
138
 
138
139
  if @config.stream? && !@stream_processor.started?
139
140
  @stream_processor.start
@@ -176,6 +177,7 @@ module LaunchDarkly
176
177
  # @param [Hash] The user to register
177
178
  #
178
179
  def identify(user)
180
+ sanitize_user(user)
179
181
  add_event(kind: "identify", key: user[:key], user: user)
180
182
  end
181
183
 
@@ -200,29 +202,45 @@ module LaunchDarkly
200
202
  #
201
203
  # @return [void]
202
204
  def track(event_name, user, data)
205
+ sanitize_user(user)
203
206
  add_event(kind: "custom", key: event_name, user: user, data: data)
204
207
  end
205
208
 
206
209
  #
207
- # Returns the key of every feature
210
+ # Returns the key of every feature flag
208
211
  #
209
- def feature_keys
210
- get_features.map { |feature| feature[:key] }
212
+ def all_keys
213
+ all_flags.keys
211
214
  end
212
215
 
213
216
  #
214
- # Returns all features
217
+ # Returns all feature flags
215
218
  #
216
- def get_features
217
- res = make_request "/api/features"
219
+ def all_flags
220
+ return Hash.new if @offline
218
221
 
219
- if res.status / 100 == 2
220
- return JSON.parse(res.body, symbolize_names: true)[:items]
222
+ if @config.stream? && !@stream_processor.started?
223
+ @stream_processor.start
224
+ end
225
+
226
+ if @config.stream? && @stream_processor.initialized?
227
+ @stream_processor.get_all_features
221
228
  else
222
- @config.logger.error("[LDClient] Unexpected status code #{res.status}")
229
+ res = make_request "/api/eval/features"
230
+
231
+ if res.status / 100 == 2
232
+ JSON.parse(res.body, symbolize_names: true)
233
+ else
234
+ @config.logger.error("[LDClient] Unexpected status code #{res.status}")
235
+ Hash.new
236
+ end
223
237
  end
224
238
  end
225
239
 
240
+ def get_user_settings(user)
241
+ Hash[all_flags.map { |key, feature| [key, evaluate(feature, user)]}]
242
+ end
243
+
226
244
  def get_streamed_flag(key)
227
245
  feature = get_flag_stream(key)
228
246
  if @config.debug_stream?
@@ -391,9 +409,15 @@ module LaunchDarkly
391
409
  @config.logger.error(error)
392
410
  end
393
411
 
412
+ def sanitize_user(user)
413
+ if user[:key]
414
+ user[:key] = user[:key].to_s
415
+ end
416
+ end
417
+
394
418
  private :post_flushed_events, :add_event, :get_streamed_flag,
395
419
  :get_flag_stream, :get_flag_int, :make_request, :param_for_user,
396
420
  :match_target?, :match_user?, :match_variation?, :evaluate,
397
- :create_worker, :log_timings, :log_exception
421
+ :create_worker, :log_timings, :log_exception, :sanitize_user
398
422
  end
399
423
  end
@@ -80,6 +80,13 @@ module LaunchDarkly
80
80
  @started.value
81
81
  end
82
82
 
83
+ def get_all_features
84
+ if not initialized?
85
+ throw :uninitialized
86
+ end
87
+ @store.all
88
+ end
89
+
83
90
  def get_feature(key)
84
91
  if not initialized?
85
92
  throw :uninitialized
@@ -125,7 +132,7 @@ module LaunchDarkly
125
132
  source.on(PATCH) { |message| process_message(message, PATCH) }
126
133
  source.on(DELETE) { |message| process_message(message, DELETE) }
127
134
  source.error do |error|
128
- @config.logger.info("[LDClient] Error subscribing to stream API: #{error}")
135
+ @config.logger.info("[LDClient] Stream connection: #{error}")
129
136
  set_disconnected
130
137
  end
131
138
  source.inactivity_timeout = 0
@@ -1,3 +1,3 @@
1
1
  module LaunchDarkly
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -0,0 +1,9 @@
1
+ {
2
+ "key": 33,
3
+ "custom":{
4
+ "groups":[
5
+ "microsoft",
6
+ "google"
7
+ ]
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "key": "33",
3
+ "custom":{
4
+ "groups":[
5
+ "microsoft",
6
+ "google"
7
+ ]
8
+ }
9
+ }
@@ -14,6 +14,14 @@ describe LaunchDarkly::LDClient do
14
14
  data = File.read(File.join("spec", "fixtures", "user.json"))
15
15
  JSON.parse(data, symbolize_names: true)
16
16
  end
17
+ let(:numeric_key_user) do
18
+ data = File.read(File.join("spec", "fixtures", "numeric_key_user.json"))
19
+ JSON.parse(data, symbolize_names: true)
20
+ end
21
+ let(:sanitized_numeric_key_user) do
22
+ data = File.read(File.join("spec", "fixtures", "sanitized_numeric_key_user.json"))
23
+ JSON.parse(data, symbolize_names: true)
24
+ end
17
25
 
18
26
  context 'user flag settings' do
19
27
  describe '#update_user_flag_setting' do
@@ -85,6 +93,10 @@ describe LaunchDarkly::LDClient do
85
93
  result = client.toggle?(feature[:key], nil, "default")
86
94
  expect(result).to eq "default"
87
95
  end
96
+ it "sanitizes the user in the event" do
97
+ expect(client).to receive(:add_event).with(hash_including(user: sanitized_numeric_key_user))
98
+ client.toggle?(feature[:key], numeric_key_user, "default")
99
+ end
88
100
  it "returns value from streamed flag if available" do
89
101
  expect(client.instance_variable_get(:@config)).to receive(:stream?).and_return(true).twice
90
102
  expect(client.instance_variable_get(:@stream_processor)).to receive(:started?).and_return true
@@ -103,6 +115,28 @@ describe LaunchDarkly::LDClient do
103
115
  end
104
116
  end
105
117
 
118
+ describe '#identify' do
119
+ it "queues up an identify event" do
120
+ expect(client).to receive(:add_event).with(hash_including(kind: "identify", key: user[:key], user: user))
121
+ client.identify(user)
122
+ end
123
+ it "sanitizes the user in the event" do
124
+ expect(client).to receive(:add_event).with(hash_including(user: sanitized_numeric_key_user))
125
+ client.identify(numeric_key_user)
126
+ end
127
+ end
128
+
129
+ describe '#track' do
130
+ it "queues up an custom event" do
131
+ expect(client).to receive(:add_event).with(hash_including(kind: "custom", key: "custom_event_name", user: user, data: 42))
132
+ client.track("custom_event_name", user, 42)
133
+ end
134
+ it "sanitizes the user in the event" do
135
+ expect(client).to receive(:add_event).with(hash_including(user: sanitized_numeric_key_user))
136
+ client.track("custom_event_name", numeric_key_user, nil)
137
+ end
138
+ end
139
+
106
140
  describe '#get_streamed_flag' do
107
141
  it "will not check the polled flag normally" do
108
142
  expect(client).to receive(:get_flag_stream).and_return true
@@ -120,18 +154,18 @@ describe LaunchDarkly::LDClient do
120
154
  end
121
155
  end
122
156
 
123
- describe '#get_features' do
157
+ describe '#all_flags' do
124
158
  it "will parse and return the features list" do
125
- result = double("Faraday::Response", status: 200, body: '{"items": ["asdf"]}')
126
- expect(client).to receive(:make_request).with("/api/features").and_return(result)
127
- data = client.send(:get_features)
128
- expect(data).to eq ["asdf"]
159
+ result = double("Faraday::Response", status: 200, body: '{"asdf":"qwer"}')
160
+ expect(client).to receive(:make_request).with("/api/eval/features").and_return(result)
161
+ data = client.send(:all_flags)
162
+ expect(data).to eq(asdf: "qwer")
129
163
  end
130
164
  it "will log errors" do
131
165
  result = double("Faraday::Response", status: 418)
132
- expect(client).to receive(:make_request).with("/api/features").and_return(result)
166
+ expect(client).to receive(:make_request).with("/api/eval/features").and_return(result)
133
167
  expect(client.instance_variable_get(:@config).logger).to receive(:error)
134
- client.send(:get_features)
168
+ client.send(:all_flags)
135
169
  end
136
170
  end
137
171
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ldclient-rb
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
  - LaunchDarkly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-09 00:00:00.000000000 Z
11
+ date: 2016-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -207,6 +207,8 @@ files:
207
207
  - lib/ldclient-rb/version.rb
208
208
  - spec/config_spec.rb
209
209
  - spec/fixtures/feature.json
210
+ - spec/fixtures/numeric_key_user.json
211
+ - spec/fixtures/sanitized_numeric_key_user.json
210
212
  - spec/fixtures/user.json
211
213
  - spec/ldclient_spec.rb
212
214
  - spec/newrelic_spec.rb
@@ -241,6 +243,8 @@ summary: LaunchDarkly SDK for Ruby
241
243
  test_files:
242
244
  - spec/config_spec.rb
243
245
  - spec/fixtures/feature.json
246
+ - spec/fixtures/numeric_key_user.json
247
+ - spec/fixtures/sanitized_numeric_key_user.json
244
248
  - spec/fixtures/user.json
245
249
  - spec/ldclient_spec.rb
246
250
  - spec/newrelic_spec.rb