kameleoon-client-ruby 1.0.10 → 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.
- 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
|