airship-ruby 1.1.1 → 1.1.2

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/airship-ruby.gemspec +1 -1
  3. data/lib/airship-ruby.rb +184 -171
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 451b81bcd103d63b142bb998ce9cacc7b72acc79
4
- data.tar.gz: c9289079bc5ce81f7a440400e02c64ab0d3ca1af
3
+ metadata.gz: ac94177d71469e596c7ffb61a4c5c1eee838f196
4
+ data.tar.gz: 7d10788fa32c0e7cb90b797ef11dd77a3efd8a93
5
5
  SHA512:
6
- metadata.gz: 08ce0abb7d336a23571ef2bbc2c6ce1ad05099123d62ca5f3668e16f6adc9459ae4210cae4fb39527401974ebbf6d5f17f51bc5b1220625b3b14b00310c54d72
7
- data.tar.gz: 8be8a73b91a2278a48858cd7671d8dc2d79f3dcc5d23dcd3536654b4844dbbe2f440a6597a0e4c759418387517ad69fe2a2b573ceb8f2d8a7ed0a3bfc1217289
6
+ metadata.gz: 8b53ba8664daa2506ce385cf94465a18366bdfc3cb0cab132a457708ed81e46756878f358910765db60d08cdbb0d70163d39fd4167379eb5f4e06348860a9b23
7
+ data.tar.gz: 0c759743a09c30112e1f01ea942d222330641cd5b6993fdf81725f0d8e9763a7ac0705d18eeeb7630324a4d732a383c20d66bf499d43e2fbb8af7375d582503a
data/airship-ruby.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "airship-ruby"
3
- s.version = "1.1.1"
3
+ s.version = "1.1.2"
4
4
  s.licenses = ["MIT"]
5
5
  s.summary = "Airship Ruby SDK"
6
6
  s.description = "Ruby SDK"
data/lib/airship-ruby.rb CHANGED
@@ -169,6 +169,7 @@ class Airship
169
169
 
170
170
  @gating_info = nil
171
171
  @gating_info_downloader_task = nil
172
+ @gating_info_polling_interval = 60
172
173
 
173
174
  @gating_info_map = nil
174
175
 
@@ -182,12 +183,18 @@ class Airship
182
183
 
183
184
  @gate_stats_batch = []
184
185
 
186
+ @initialization_lock = Concurrent::Semaphore.new(1)
185
187
  @gate_stats_batch_lock = Concurrent::Semaphore.new(1)
186
188
  end
187
189
 
188
190
  def init
189
- # Not thread safe yet
191
+ @initialization_lock.acquire
190
192
  if @gating_info_downloader_task.nil?
193
+ self._poll
194
+ if @gating_info.nil?
195
+ @initialization_lock.release
196
+ raise Exception.new('Failed to connect to Airship server')
197
+ end
191
198
  @gating_info_downloader_task = self._create_poller
192
199
  @gating_info_downloader_task.execute
193
200
  end
@@ -196,9 +203,167 @@ class Airship
196
203
  @gate_stats_watcher = self._create_watcher
197
204
  @gate_stats_watcher.execute
198
205
  end
199
- # Thread safe after this point
206
+ @initialization_lock.release
207
+ end
208
+
209
+ def enabled?(control_short_name, object, default_value=false)
210
+ validation_errors = JSON::Validator.fully_validate(SCHEMA, object)
211
+ if validation_errors.size > 0
212
+ puts validation_errors[0]
213
+ return default_value
214
+ end
215
+
216
+ object = self._clone_object(object)
217
+
218
+ error = self._validate_nesting(object)
219
+
220
+ if !error.nil?
221
+ puts error
222
+ return default_value
223
+ end
224
+
225
+ if @gating_info_map.nil?
226
+ return default_value
227
+ end
228
+
229
+ gate_timestamp = Time.now.iso8601
230
+
231
+ start = Time.now
232
+
233
+ gate_values = self._get_gate_values(control_short_name, object)
234
+ is_enabled = gate_values['is_enabled']
235
+ variation = gate_values['variation']
236
+ is_eligible = gate_values['is_eligible']
237
+ _should_send_stats = gate_values['_should_send_stats']
238
+
239
+ finish = Time.now
240
+
241
+ if _should_send_stats
242
+ sdk_gate_timestamp = gate_timestamp
243
+ sdk_gate_latency = "#{(finish - start) * 1000 * 1000}us"
244
+ sdk_version = SDK_VERSION
245
+
246
+ stats = {}
247
+ stats['sdk_gate_control_short_name'] = control_short_name
248
+ stats['sdk_gate_timestamp'] = sdk_gate_timestamp
249
+ stats['sdk_gate_latency'] = sdk_gate_latency
250
+ stats['sdk_version'] = sdk_version
251
+ stats['sdk_id'] = @@sdk_id
252
+
253
+ object['stats'] = stats
254
+
255
+ self._upload_stats_async(object)
256
+ end
257
+
258
+ return is_enabled
259
+ end
260
+
261
+ def variation(control_short_name, object, default_value=nil)
262
+ validation_errors = JSON::Validator.fully_validate(SCHEMA, object)
263
+ if validation_errors.size > 0
264
+ puts validation_errors[0]
265
+ return default_value
266
+ end
267
+
268
+ object = self._clone_object(object)
269
+
270
+ error = self._validate_nesting(object)
271
+
272
+ if !error.nil?
273
+ puts error
274
+ return default_value
275
+ end
276
+
277
+ if @gating_info_map.nil?
278
+ return default_value
279
+ end
280
+
281
+ gate_timestamp = Time.now.iso8601
282
+
283
+ start = Time.now
284
+
285
+ gate_values = self._get_gate_values(control_short_name, object)
286
+ is_enabled = gate_values['is_enabled']
287
+ variation = gate_values['variation']
288
+ is_eligible = gate_values['is_eligible']
289
+ _should_send_stats = gate_values['_should_send_stats']
290
+
291
+ finish = Time.now
292
+
293
+ if _should_send_stats
294
+ sdk_gate_timestamp = gate_timestamp
295
+ sdk_gate_latency = "#{(finish - start) * 1000 * 1000}us"
296
+ sdk_version = SDK_VERSION
297
+
298
+ stats = {}
299
+ stats['sdk_gate_control_short_name'] = control_short_name
300
+ stats['sdk_gate_timestamp'] = sdk_gate_timestamp
301
+ stats['sdk_gate_latency'] = sdk_gate_latency
302
+ stats['sdk_version'] = sdk_version
303
+ stats['sdk_id'] = @@sdk_id
304
+
305
+ object['stats'] = stats
306
+
307
+ self._upload_stats_async(object)
308
+ end
309
+
310
+ return variation
311
+ end
312
+
313
+ def eligible?(control_short_name, object, default_value=false)
314
+ validation_errors = JSON::Validator.fully_validate(SCHEMA, object)
315
+ if validation_errors.size > 0
316
+ puts validation_errors[0]
317
+ return default_value
318
+ end
319
+
320
+ object = self._clone_object(object)
321
+
322
+ error = self._validate_nesting(object)
323
+
324
+ if !error.nil?
325
+ puts error
326
+ return default_value
327
+ end
328
+
329
+ if @gating_info_map.nil?
330
+ return default_value
331
+ end
332
+
333
+ gate_timestamp = Time.now.iso8601
334
+
335
+ start = Time.now
336
+
337
+ gate_values = self._get_gate_values(control_short_name, object)
338
+ is_enabled = gate_values['is_enabled']
339
+ variation = gate_values['variation']
340
+ is_eligible = gate_values['is_eligible']
341
+ _should_send_stats = gate_values['_should_send_stats']
342
+
343
+ finish = Time.now
344
+
345
+ if _should_send_stats
346
+ sdk_gate_timestamp = gate_timestamp
347
+ sdk_gate_latency = "#{(finish - start) * 1000 * 1000}us"
348
+ sdk_version = SDK_VERSION
349
+
350
+ stats = {}
351
+ stats['sdk_gate_control_short_name'] = control_short_name
352
+ stats['sdk_gate_timestamp'] = sdk_gate_timestamp
353
+ stats['sdk_gate_latency'] = sdk_gate_latency
354
+ stats['sdk_version'] = sdk_version
355
+ stats['sdk_id'] = @@sdk_id
356
+
357
+ object['stats'] = stats
358
+
359
+ self._upload_stats_async(object)
360
+ end
361
+
362
+ return is_eligible
200
363
  end
201
364
 
365
+ protected
366
+
202
367
  def _get_gating_info_map(gating_info)
203
368
  map = {}
204
369
 
@@ -236,24 +401,28 @@ class Airship
236
401
  map
237
402
  end
238
403
 
404
+ def _poll
405
+ conn = Faraday.new(url: "#{GATING_INFO_ENDPOINT}/#{@env_key}")
406
+ response = conn.get do |req|
407
+ req.options.timeout = 10
408
+ req.headers['api-key'] = @api_key
409
+ end
410
+ if response.status == 200
411
+ gating_info = JSON.parse(response.body)
412
+ gating_info_map = self._get_gating_info_map(gating_info)
413
+ @gating_info = gating_info
414
+ @gating_info_map = gating_info_map
415
+ end
416
+ end
417
+
239
418
  def _create_poller
240
- Concurrent::TimerTask.new(execution_interval: 60, timeout_interval: 10, run_now: true) do |task|
241
- conn = Faraday.new(url: "#{GATING_INFO_ENDPOINT}/#{@env_key}")
242
- response = conn.get do |req|
243
- req.options.timeout = 10
244
- req.headers['api-key'] = @api_key
245
- end
246
- if response.status == 200
247
- gating_info = JSON.parse(response.body)
248
- gating_info_map = self._get_gating_info_map(gating_info)
249
- @gating_info = gating_info
250
- @gating_info_map = gating_info_map
251
- end
419
+ Concurrent::TimerTask.new(execution_interval: @gating_info_polling_interval, timeout_interval: 10) do |task|
420
+ self._poll
252
421
  end
253
422
  end
254
423
 
255
424
  def _create_watcher
256
- Concurrent::TimerTask.new(execution_interval: @gate_stats_upload_batch_interval, timeout_interval: 10, run_now: true) do |task|
425
+ Concurrent::TimerTask.new(execution_interval: @gate_stats_upload_batch_interval, timeout_interval: 10) do |task|
257
426
  now = Time.now.utc.to_i
258
427
  if now - @gate_stats_last_task_scheduled_timestamp.value >= @gate_stats_upload_batch_interval
259
428
  processed = self._process_batch(0)
@@ -714,160 +883,4 @@ class Airship
714
883
  return 'A group cannot be nested inside another group'
715
884
  end
716
885
  end
717
-
718
- def enabled?(control_short_name, object)
719
- if @gating_info_map.nil?
720
- return false
721
- end
722
-
723
- validation_errors = JSON::Validator.fully_validate(SCHEMA, object)
724
- if validation_errors.size > 0
725
- puts validation_errors[0]
726
- return false
727
- end
728
-
729
- object = self._clone_object(object)
730
-
731
- error = self._validate_nesting(object)
732
-
733
- if !error.nil?
734
- puts error
735
- return false
736
- end
737
-
738
- gate_timestamp = Time.now.iso8601
739
-
740
- start = Time.now
741
-
742
- gate_values = self._get_gate_values(control_short_name, object)
743
- is_enabled = gate_values['is_enabled']
744
- variation = gate_values['variation']
745
- is_eligible = gate_values['is_eligible']
746
- _should_send_stats = gate_values['_should_send_stats']
747
-
748
- finish = Time.now
749
-
750
- if _should_send_stats
751
- sdk_gate_timestamp = gate_timestamp
752
- sdk_gate_latency = "#{(finish - start) * 1000 * 1000}us"
753
- sdk_version = SDK_VERSION
754
-
755
- stats = {}
756
- stats['sdk_gate_control_short_name'] = control_short_name
757
- stats['sdk_gate_timestamp'] = sdk_gate_timestamp
758
- stats['sdk_gate_latency'] = sdk_gate_latency
759
- stats['sdk_version'] = sdk_version
760
- stats['sdk_id'] = @@sdk_id
761
-
762
- object['stats'] = stats
763
-
764
- self._upload_stats_async(object)
765
- end
766
-
767
- return is_enabled
768
- end
769
-
770
- def variation(control_short_name, object)
771
- if @gating_info_map.nil?
772
- return nil
773
- end
774
-
775
- validation_errors = JSON::Validator.fully_validate(SCHEMA, object)
776
- if validation_errors.size > 0
777
- puts validation_errors[0]
778
- return nil
779
- end
780
-
781
- object = self._clone_object(object)
782
-
783
- error = self._validate_nesting(object)
784
-
785
- if !error.nil?
786
- puts error
787
- return nil
788
- end
789
-
790
- gate_timestamp = Time.now.iso8601
791
-
792
- start = Time.now
793
-
794
- gate_values = self._get_gate_values(control_short_name, object)
795
- is_enabled = gate_values['is_enabled']
796
- variation = gate_values['variation']
797
- is_eligible = gate_values['is_eligible']
798
- _should_send_stats = gate_values['_should_send_stats']
799
-
800
- finish = Time.now
801
-
802
- if _should_send_stats
803
- sdk_gate_timestamp = gate_timestamp
804
- sdk_gate_latency = "#{(finish - start) * 1000 * 1000}us"
805
- sdk_version = SDK_VERSION
806
-
807
- stats = {}
808
- stats['sdk_gate_control_short_name'] = control_short_name
809
- stats['sdk_gate_timestamp'] = sdk_gate_timestamp
810
- stats['sdk_gate_latency'] = sdk_gate_latency
811
- stats['sdk_version'] = sdk_version
812
- stats['sdk_id'] = @@sdk_id
813
-
814
- object['stats'] = stats
815
-
816
- self._upload_stats_async(object)
817
- end
818
-
819
- return variation
820
- end
821
-
822
- def eligible?(control_short_name, object)
823
- if @gating_info_map.nil?
824
- return false
825
- end
826
-
827
- validation_errors = JSON::Validator.fully_validate(SCHEMA, object)
828
- if validation_errors.size > 0
829
- puts validation_errors[0]
830
- return false
831
- end
832
-
833
- object = self._clone_object(object)
834
-
835
- error = self._validate_nesting(object)
836
-
837
- if !error.nil?
838
- puts error
839
- return false
840
- end
841
-
842
- gate_timestamp = Time.now.iso8601
843
-
844
- start = Time.now
845
-
846
- gate_values = self._get_gate_values(control_short_name, object)
847
- is_enabled = gate_values['is_enabled']
848
- variation = gate_values['variation']
849
- is_eligible = gate_values['is_eligible']
850
- _should_send_stats = gate_values['_should_send_stats']
851
-
852
- finish = Time.now
853
-
854
- if _should_send_stats
855
- sdk_gate_timestamp = gate_timestamp
856
- sdk_gate_latency = "#{(finish - start) * 1000 * 1000}us"
857
- sdk_version = SDK_VERSION
858
-
859
- stats = {}
860
- stats['sdk_gate_control_short_name'] = control_short_name
861
- stats['sdk_gate_timestamp'] = sdk_gate_timestamp
862
- stats['sdk_gate_latency'] = sdk_gate_latency
863
- stats['sdk_version'] = sdk_version
864
- stats['sdk_id'] = @@sdk_id
865
-
866
- object['stats'] = stats
867
-
868
- self._upload_stats_async(object)
869
- end
870
-
871
- return is_eligible
872
- end
873
886
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airship-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airship Dev Team