kameleoon-client-ruby 1.0.10 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kameleoon/client.rb +81 -55
- data/lib/kameleoon/request.rb +37 -1
- data/lib/kameleoon/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a985a05999f2b8caeba131919f70ae77a1e6df7d125b82bf040a1056b300c1e5
|
4
|
+
data.tar.gz: d603f64d8801a3945236de7891ccde5c9a2c6747f18cb704954591a43abc5a99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89a04fd8440e3d2f3c17a6878df42088f6258979d1ec384ea8e2eaf7a3bd60c8e99624bb424bf925f86177ea9d58a98df2ddbf5adcc60871833140df600fc3d1
|
7
|
+
data.tar.gz: a61ec90742b861ce596e8526d32bef2186f722e0d2524250c470fcb5bc8de3a90711c391edbf9e8f64d4bad6b5fccb00cc3f8dd4d874cfd6f45268775defecf8
|
data/lib/kameleoon/client.rb
CHANGED
@@ -9,6 +9,8 @@ require 'rufus/scheduler'
|
|
9
9
|
require 'yaml'
|
10
10
|
require 'json'
|
11
11
|
require 'em-synchrony'
|
12
|
+
require 'em-synchrony/em-http'
|
13
|
+
require 'em-synchrony/fiber_iterator'
|
12
14
|
require 'objspace'
|
13
15
|
require 'time'
|
14
16
|
|
@@ -29,8 +31,10 @@ module Kameleoon
|
|
29
31
|
@site_code = site_code
|
30
32
|
@blocking = blocking
|
31
33
|
@default_timeout = config['default_timeout'] || default_timeout # in ms
|
32
|
-
|
34
|
+
refresh_interval = config['actions_configuration_refresh_interval']
|
35
|
+
@interval = refresh_interval.nil? ? interval : "#{refresh_interval}m"
|
33
36
|
@tracking_url = config['tracking_url'] || "https://api-ssx.kameleoon.com"
|
37
|
+
@api_data_url = "https://api-data.kameleoon.com"
|
34
38
|
@client_id = client_id || config['client_id']
|
35
39
|
@client_secret = client_secret || config['client_secret']
|
36
40
|
@data_maximum_size = config['visitor_data_maximum_size'] || 500 # mb
|
@@ -100,8 +104,7 @@ module Kameleoon
|
|
100
104
|
variation_id = nil
|
101
105
|
EM.synchrony do
|
102
106
|
connexion_options = { :connect_timeout => (timeout.to_f / 1000.0) }
|
103
|
-
body =
|
104
|
-
.join("\n") || ""
|
107
|
+
body = (data_not_sent(visitor_code).map { |data| data.obtain_full_post_text_line }.join("\n") || "").encode("UTF-8")
|
105
108
|
path = get_experiment_register_url(visitor_code, experiment_id)
|
106
109
|
request_options = { :path => path, :body => body }
|
107
110
|
log "Trigger experiment request: " + request_options.inspect
|
@@ -199,7 +202,11 @@ module Kameleoon
|
|
199
202
|
#
|
200
203
|
def flush(visitor_code = nil)
|
201
204
|
check_visitor_code(visitor_code) unless visitor_code.nil?
|
202
|
-
|
205
|
+
if !visitor_code.nil?
|
206
|
+
track_data(visitor_code)
|
207
|
+
else
|
208
|
+
@data.select { |_, values| values.any? { |data| !data.sent } }.each_key { |key| flush(key) }
|
209
|
+
end
|
203
210
|
end
|
204
211
|
|
205
212
|
##
|
@@ -250,7 +257,7 @@ module Kameleoon
|
|
250
257
|
connexion_options = { :connect_timeout => (timeout.to_f / 1000.0) }
|
251
258
|
request_options = {
|
252
259
|
:path => get_experiment_register_url(visitor_code, id),
|
253
|
-
:body => (data_not_sent(visitor_code).
|
260
|
+
:body => (data_not_sent(visitor_code).map { |data| data.obtain_full_post_text_line }.join("\n") || "").encode("UTF-8")
|
254
261
|
}
|
255
262
|
log "Activate feature request: " + request_options.inspect
|
256
263
|
log "Activate feature connexion:" + connexion_options.inspect
|
@@ -293,7 +300,7 @@ module Kameleoon
|
|
293
300
|
# A feature variable can be changed easily via our web application.
|
294
301
|
#
|
295
302
|
# @param [String | Integer] feature_key
|
296
|
-
# @param [String
|
303
|
+
# @param [String] variable_key
|
297
304
|
#
|
298
305
|
# @raise [Kameleoon::Exception::FeatureConfigurationNotFound]
|
299
306
|
# @raise [Kameleoon::Exception::FeatureVariableNotFound]
|
@@ -318,6 +325,30 @@ module Kameleoon
|
|
318
325
|
end
|
319
326
|
end
|
320
327
|
|
328
|
+
##
|
329
|
+
# The retrieved_data_from_remote_source method allows you to retrieve data (according to a key passed as argument)
|
330
|
+
# stored on a remote Kameleoon server. Usually data will be stored on our remote servers via the use of our Data API.
|
331
|
+
# This method, along with the availability of our highly scalable servers for this purpose, provides a convenient way
|
332
|
+
# to quickly store massive amounts of data that can be later retrieved for each of your visitors / users.
|
333
|
+
#
|
334
|
+
# @param [String] key Key you want to retrieve data. This field is mandatory.
|
335
|
+
# @param [Int] timeout Timeout for request. Equals default_timeout in a config file. This field is optional.
|
336
|
+
#
|
337
|
+
# @return [Hash] Hash object of the json object.
|
338
|
+
#
|
339
|
+
#
|
340
|
+
def retrieve_data_from_remote_source(key, timeout = @default_timeout)
|
341
|
+
connexion_options = { connect_timeout: (timeout.to_f / 1000.0) }
|
342
|
+
path = get_api_data_request_url(key)
|
343
|
+
log "Retrieve API Data connexion: #{connexion_options.inspect}"
|
344
|
+
response = get_sync(@api_data_url + path, connexion_options)
|
345
|
+
if is_successful_sync(response)
|
346
|
+
JSON.parse(response.body) unless response.nil?
|
347
|
+
else
|
348
|
+
return nil
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
321
352
|
private
|
322
353
|
|
323
354
|
API_SSX_URL = 'https://api-ssx.kameleoon.com'
|
@@ -582,6 +613,14 @@ module Kameleoon
|
|
582
613
|
"/dataTracking?" + URI.encode_www_form(get_common_ssx_parameters(visitor_code))
|
583
614
|
end
|
584
615
|
|
616
|
+
def get_api_data_request_url(key)
|
617
|
+
mapKey = {
|
618
|
+
siteCode: site_code,
|
619
|
+
key: key
|
620
|
+
}
|
621
|
+
"/data?#{URI.encode_www_form(mapKey)}"
|
622
|
+
end
|
623
|
+
|
585
624
|
def get_feature_flag(feature_key)
|
586
625
|
if feature_key.is_a?(String)
|
587
626
|
feature_flag = @feature_flags.select { |ff| ff['identificationKey'] == feature_key}.first
|
@@ -616,67 +655,58 @@ module Kameleoon
|
|
616
655
|
data_not_sent = data_not_sent(visitor_code)
|
617
656
|
options = {
|
618
657
|
:path => get_experiment_register_url(visitor_code, experiment_id, variation_id, none_variation),
|
619
|
-
:body => (
|
658
|
+
:body => (data_not_sent.map{ |it| it.obtain_full_post_text_line }.join("\n") || "").encode("UTF-8"),
|
620
659
|
:head => { "Content-Type" => "text/plain"}
|
621
660
|
}
|
622
661
|
trial = 0
|
623
662
|
success = false
|
624
663
|
log "Start post tracking experiment: " + data_not_sent.inspect
|
625
664
|
Thread.new do
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
break
|
635
|
-
end
|
636
|
-
trial += 1
|
665
|
+
while trial < 10
|
666
|
+
log "Send Experiment Tracking " + options.inspect
|
667
|
+
response = post_sync(options, @tracking_url)
|
668
|
+
log "Response " + response.inspect
|
669
|
+
if is_successful_sync(response)
|
670
|
+
data_not_sent.each { |it| it.sent = true }
|
671
|
+
success = true
|
672
|
+
break
|
637
673
|
end
|
638
|
-
|
674
|
+
trial += 1
|
639
675
|
end
|
640
676
|
if success
|
641
677
|
log "Post to experiment tracking is done after " + (trial + 1).to_s + " trials"
|
642
|
-
|
678
|
+
else
|
643
679
|
log "Post to experiment tracking is failed after " + trial.to_s + " trials"
|
644
680
|
end
|
645
|
-
Thread.exit
|
646
681
|
end
|
647
682
|
end
|
648
683
|
|
649
|
-
def track_data(visitor_code
|
684
|
+
def track_data(visitor_code)
|
650
685
|
Thread.new do
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
entry.last.each { |data| data.sent = true }
|
668
|
-
end
|
669
|
-
iter.return(request)
|
670
|
-
}
|
671
|
-
request.errback { iter.return(request) }
|
672
|
-
end
|
673
|
-
data_not_sent = data_not_sent(visitor_code)
|
674
|
-
trials -= 1
|
686
|
+
trials = 0
|
687
|
+
data_not_sent = data_not_sent(visitor_code)
|
688
|
+
log "Start post tracking data: " + data_not_sent.inspect
|
689
|
+
while trials < 10 && !data_not_sent.empty?
|
690
|
+
options = {
|
691
|
+
:path => get_data_register_url(visitor_code),
|
692
|
+
:body => (data_not_sent.map{ |it| it.obtain_full_post_text_line }.join("\n") || "").encode("UTF-8"),
|
693
|
+
:head => { "Content-Type" => "text/plain" }
|
694
|
+
}
|
695
|
+
log "Post tracking data for visitor_code: " + visitor_code + " with options: " + options.inspect
|
696
|
+
response = post_sync(options, @tracking_url)
|
697
|
+
log "Response " + response.inspect
|
698
|
+
if is_successful_sync(response)
|
699
|
+
data_not_sent.each { |it| it.sent = true }
|
700
|
+
success = true
|
701
|
+
break
|
675
702
|
end
|
676
|
-
|
677
|
-
|
703
|
+
trials += 1
|
704
|
+
end
|
705
|
+
if success
|
706
|
+
log "Post to data tracking is done after " + (trials + 1).to_s + " trials"
|
707
|
+
else
|
708
|
+
log "Post to data tracking is failed after " + trials.to_s + " trials"
|
678
709
|
end
|
679
|
-
Thread.exit
|
680
710
|
end
|
681
711
|
end
|
682
712
|
|
@@ -686,12 +716,8 @@ module Kameleoon
|
|
686
716
|
end
|
687
717
|
end
|
688
718
|
|
689
|
-
def data_not_sent(visitor_code
|
690
|
-
|
691
|
-
@data.select {|key, values| values.any? {|data| !data.sent}}
|
692
|
-
else
|
693
|
-
@data.select { |key, values| key == visitor_code && values.any? {|data| !data.sent} }
|
694
|
-
end
|
719
|
+
def data_not_sent(visitor_code)
|
720
|
+
@data.key?(visitor_code) ? @data[visitor_code].reject(&:sent) : []
|
695
721
|
end
|
696
722
|
|
697
723
|
def log(text)
|
data/lib/kameleoon/request.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "em-synchrony/em-http"
|
2
2
|
require "kameleoon/version"
|
3
|
+
require 'net/http'
|
3
4
|
|
4
5
|
module Kameleoon
|
5
6
|
# @api private
|
@@ -20,6 +21,14 @@ module Kameleoon
|
|
20
21
|
request(Method::POST, request_options, url, connexion_options)
|
21
22
|
end
|
22
23
|
|
24
|
+
def get_sync(url = API_URL, connexion_options = {})
|
25
|
+
request_sync(Method::GET, url, connexion_options, {})
|
26
|
+
end
|
27
|
+
|
28
|
+
def post_sync(request_options, url = API_URL, connexion_options = {})
|
29
|
+
request_sync(Method::POST, url, connexion_options, request_options)
|
30
|
+
end
|
31
|
+
|
23
32
|
private
|
24
33
|
|
25
34
|
def request(method, request_options, url, connexion_options)
|
@@ -29,7 +38,30 @@ module Kameleoon
|
|
29
38
|
when Method::POST then
|
30
39
|
return EventMachine::HttpRequest.new(url, connexion_options).apost request_options
|
31
40
|
when Method::GET then
|
32
|
-
return EventMachine::HttpRequest.new(url, connexion_options).
|
41
|
+
return EventMachine::HttpRequest.new(url, connexion_options).get request_options
|
42
|
+
else
|
43
|
+
print "Unknown request type"
|
44
|
+
return false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def request_sync(method, url, connexion_options, request_options)
|
49
|
+
request_options = {} if request_options.nil?
|
50
|
+
add_user_agent(request_options)
|
51
|
+
case method
|
52
|
+
when Method::GET then
|
53
|
+
uri = URI(url)
|
54
|
+
request = Net::HTTP.new(url)
|
55
|
+
response = Net::HTTP.get_response(uri)
|
56
|
+
response
|
57
|
+
when Method::POST then
|
58
|
+
uri = URI.parse(url)
|
59
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
60
|
+
http.use_ssl = true
|
61
|
+
request = Net::HTTP::Post.new(request_options[:path], initheader = request_options[:head])
|
62
|
+
request.body = request_options[:body]
|
63
|
+
response = http.request(request)
|
64
|
+
response
|
33
65
|
else
|
34
66
|
print "Unknown request type"
|
35
67
|
return false
|
@@ -40,6 +72,10 @@ module Kameleoon
|
|
40
72
|
!request.nil? && request != false && /20\d/.match(request.response_header.status.to_s)
|
41
73
|
end
|
42
74
|
|
75
|
+
def is_successful_sync(response)
|
76
|
+
!response.nil? && response != false && response.is_a?(Net::HTTPSuccess)
|
77
|
+
end
|
78
|
+
|
43
79
|
def add_user_agent(request_options)
|
44
80
|
if request_options[:head].nil?
|
45
81
|
request_options[:head] = {'Kameleoon-Client' => 'sdk/ruby/' + Kameleoon::VERSION}
|
data/lib/kameleoon/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kameleoon-client-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kameleoon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-http-request
|