absmartly-sdk 1.0.7 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 501e8c25499e39a409d85cd289c1c43b174393ba0b5818a661eaed8e4f0b2dcb
4
- data.tar.gz: 427a41600e58f77116f5e06f4b551520438f7d7d099416eb2d2762b1f1ddc4c7
3
+ metadata.gz: 2a63e1c39032b6a7427c760d5b657d69bcee386e66f9bf4f809e1638d0224251
4
+ data.tar.gz: e8e2acb8a335ce2705aa22e72d000cde80e9a089daa16a4f096ebb3a4bdee88a
5
5
  SHA512:
6
- metadata.gz: 86b51d1fab78caf285e489cb2b4175ea4314cc6ae50fb5bba6ce6cbaf5aeb1da9f7abf2a0fbc3a853ec1c052dbcd176811986826d4634c8e59b08c34ca9b0bc3
7
- data.tar.gz: aa3673e076dcc922e7ec049e97afe6810bf1cd347ce96179c639dd2bb4be5d5ef14588d9c908637290911d12b35d5cb5c44f4bef0c7c37f474c7539ee05ea384
6
+ metadata.gz: 8d7876ef4191d0da54a36aabb7b1c0da583182316ba618bb13cd5674c75063aae212d25cfd35761c29966c8d58c91187466fbab04e50cdabd6f051d5443dba97
7
+ data.tar.gz: 2fff9f84a10749f2bd9a65a505590e029364a21a20ea2622fd6a8de41c4b91cf11105b5a4aa5c42a163474ddbd7ea4d82aa768c6eeac39dbf73ffc23723293d6
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- absmartly-sdk (1.0.7)
4
+ absmartly-sdk (1.1.0)
5
5
  arraybuffer (~> 0.0.6)
6
- faraday (~> 1.10.3)
6
+ faraday (~> 2.0)
7
+ faraday-retry (~> 2.0)
7
8
  murmurhash3 (~> 0.1.7)
8
9
 
9
10
  GEM
@@ -13,34 +14,16 @@ GEM
13
14
  ast (2.4.2)
14
15
  byebug (11.1.3)
15
16
  diff-lcs (1.5.0)
16
- faraday (1.10.3)
17
- faraday-em_http (~> 1.0)
18
- faraday-em_synchrony (~> 1.0)
19
- faraday-excon (~> 1.1)
20
- faraday-httpclient (~> 1.0)
21
- faraday-multipart (~> 1.0)
22
- faraday-net_http (~> 1.0)
23
- faraday-net_http_persistent (~> 1.0)
24
- faraday-patron (~> 1.0)
25
- faraday-rack (~> 1.0)
26
- faraday-retry (~> 1.0)
17
+ faraday (2.7.4)
18
+ faraday-net_http (>= 2.0, < 3.1)
27
19
  ruby2_keywords (>= 0.0.4)
28
- faraday-em_http (1.0.0)
29
- faraday-em_synchrony (1.0.0)
30
- faraday-excon (1.1.0)
31
- faraday-httpclient (1.0.1)
32
- faraday-multipart (1.0.4)
33
- multipart-post (~> 2)
34
- faraday-net_http (1.0.1)
35
- faraday-net_http_persistent (1.2.0)
36
- faraday-patron (1.0.0)
37
- faraday-rack (1.0.0)
38
- faraday-retry (1.0.3)
20
+ faraday-net_http (3.0.2)
21
+ faraday-retry (2.1.0)
22
+ faraday (~> 2.0)
39
23
  io-console (0.5.6)
40
24
  irb (1.2.6)
41
25
  reline (>= 0.1.5)
42
26
  json (2.6.2)
43
- multipart-post (2.1.1)
44
27
  murmurhash3 (0.1.7)
45
28
  parallel (1.22.1)
46
29
  parser (3.1.2.0)
data/absmartly.gemspec CHANGED
@@ -32,7 +32,8 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ["lib"]
34
34
 
35
- spec.add_dependency "faraday", "~> 1.10.3"
35
+ spec.add_dependency "faraday", "~> 2.0"
36
+ spec.add_dependency "faraday-retry", "~> 2.0"
36
37
  spec.add_dependency "murmurhash3", "~> 0.1.7"
37
38
  spec.add_dependency "arraybuffer", "~> 0.0.6"
38
39
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Absmartly
4
- VERSION = "1.0.7"
4
+ VERSION = "1.1.0"
5
5
  end
data/lib/context.rb CHANGED
@@ -21,6 +21,7 @@ class Context
21
21
  def initialize(clock, config, data_future, data_provider,
22
22
  event_handler, event_logger, variable_parser, audience_matcher)
23
23
  @index = []
24
+ @context_custom_fields = {}
24
25
  @achievements = []
25
26
  @assignment_cache = {}
26
27
  @assignments = {}
@@ -203,6 +204,52 @@ class Context
203
204
  default_value
204
205
  end
205
206
 
207
+ def custom_field_keys
208
+ check_ready?(true)
209
+ keys = []
210
+
211
+ @data.experiments.each do |experiment|
212
+ custom_field_values = experiment.custom_field_values
213
+ if custom_field_values != nil
214
+ custom_field_values.each do |custom_field|
215
+ keys.append(custom_field.name)
216
+ end
217
+ end
218
+ end
219
+
220
+ return keys.sort.uniq
221
+ end
222
+
223
+ def custom_field_value(experimentName, key)
224
+ check_ready?(true)
225
+
226
+ experiment_custom_fields = @context_custom_fields[experimentName]
227
+
228
+ if experiment_custom_fields != nil
229
+ field = experiment_custom_fields[key]
230
+ if field != nil
231
+ return field.value
232
+ end
233
+ end
234
+
235
+ return nil
236
+ end
237
+
238
+ def custom_field_type(experimentName, key)
239
+ check_ready?(true)
240
+
241
+ experiment_custom_fields = @context_custom_fields[experimentName]
242
+
243
+ if experiment_custom_fields != nil
244
+ field = experiment_custom_fields[key]
245
+ if field != nil
246
+ return field.type
247
+ end
248
+ end
249
+
250
+ return nil
251
+ end
252
+
206
253
  def peek_variable_value(key, default_value)
207
254
  check_ready?(true)
208
255
 
@@ -451,8 +498,11 @@ class Context
451
498
  @data = data
452
499
  @index = {}
453
500
  @index_variables = {}
501
+
454
502
  if data && !data.experiments.nil? && !data.experiments.empty?
455
503
  data.experiments.each do |experiment|
504
+ @experimentCustomFieldValues = {}
505
+
456
506
  experiment_variables = ExperimentVariables.new
457
507
  experiment_variables.data = experiment
458
508
  experiment_variables.variables ||= []
@@ -467,7 +517,36 @@ class Context
467
517
  end
468
518
  end
469
519
 
520
+ if !experiment.custom_field_values.nil?
521
+ experiment.custom_field_values.each do |custom_field_value|
522
+ value = ContextCustomFieldValues.new
523
+ value.type = custom_field_value.type
524
+
525
+ if !custom_field_value.value.nil?
526
+ custom_value = custom_field_value.value
527
+
528
+ if custom_field_value.type.start_with?("json")
529
+ value.value = @variable_parser.parse(self, experiment.name, custom_field_value.name, custom_value)
530
+
531
+ elsif custom_field_value.type.start_with?("boolean")
532
+ value.value = custom_value.to_bool
533
+
534
+ elsif custom_field_value.type.start_with?("number")
535
+ value.value = custom_value.to_i
536
+
537
+ else
538
+ value.value = custom_field_value.value
539
+ end
540
+
541
+ @experimentCustomFieldValues[custom_field_value.name] = value
542
+
543
+ end
544
+
545
+ end
546
+ end
547
+
470
548
  @index[experiment.name] = experiment_variables
549
+ @context_custom_fields[experiment.name] = @experimentCustomFieldValues
471
550
  end
472
551
  end
473
552
  end
@@ -544,5 +623,9 @@ class ExperimentVariables
544
623
  attr_accessor :data, :variables
545
624
  end
546
625
 
626
+ class ContextCustomFieldValues
627
+ attr_accessor :type, :value
628
+ end
629
+
547
630
  class IllegalStateException < StandardError
548
631
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "faraday"
4
+ require 'faraday/retry'
4
5
  require "uri"
5
6
  require_relative "http_client"
6
7
 
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CustomFieldValue
4
+ attr_accessor :name, :type, :value
5
+
6
+ def initialize(name, value, type)
7
+ @name = name
8
+ @type = type
9
+ @value = value
10
+ end
11
+
12
+ def ==(o)
13
+ return true if self.object_id == o.object_id
14
+ return false if o.nil? || self.class != o.class
15
+
16
+ that = o
17
+ @name == that.name && @type == that.type && @value == that.value
18
+ end
19
+
20
+ def hash_code
21
+ { name: @name, type: @type, value: @value }
22
+ end
23
+
24
+ def to_s
25
+ "CustomFieldValue{" +
26
+ "name='#{@name}'" +
27
+ ", type='#{@type}'" +
28
+ ", value='#{@value}'" +
29
+ "}"
30
+ end
31
+ end
@@ -3,11 +3,12 @@
3
3
  require_relative "../string"
4
4
  require_relative "experiment_application"
5
5
  require_relative "experiment_variant"
6
+ require_relative "custom_field_value"
6
7
 
7
8
  class Experiment
8
9
  attr_accessor :id, :name, :unit_type, :iteration, :seed_hi, :seed_lo, :split,
9
10
  :traffic_seed_hi, :traffic_seed_lo, :traffic_split, :full_on_variant,
10
- :applications, :variants, :audience_strict, :audience
11
+ :applications, :variants, :audience_strict, :audience, :custom_field_values
11
12
 
12
13
  def initialize(args = {})
13
14
  args.each do |name, value|
@@ -15,6 +16,10 @@ class Experiment
15
16
  @applications = assign_to_klass(ExperimentApplication, value)
16
17
  elsif name == :variants
17
18
  @variants = assign_to_klass(ExperimentVariant, value)
19
+ elsif name == :customFieldValues
20
+ if value != nil
21
+ @custom_field_values = assign_to_klass(CustomFieldValue, value)
22
+ end
18
23
  else
19
24
  self.instance_variable_set("@#{name.to_s.underscore}", value)
20
25
  end
@@ -42,7 +47,7 @@ class Experiment
42
47
  @unit_type == that.unit_type && @split == that.split &&
43
48
  @traffic_split == that.traffic_split && @applications == that.applications &&
44
49
  @variants == that.variants && @audience_strict == that.audience_strict &&
45
- @audience == that.audience
50
+ @audience == that.audience && @custom_field_values == that.custom_field_values
46
51
  end
47
52
 
48
53
  def hash_code
@@ -57,7 +62,8 @@ class Experiment
57
62
  traffic_seed_lo: @traffic_seed_lo,
58
63
  full_on_variant: @full_on_variant,
59
64
  audience_strict: @audience_strict,
60
- audience: @audience
65
+ audience: @audience,
66
+ custom_field_values: @custom_field_values
61
67
  }
62
68
  end
63
69
 
@@ -78,6 +84,7 @@ class Experiment
78
84
  ", variants=#{@variants.join}" +
79
85
  ", audienceStrict=#{@audience_strict}" +
80
86
  ", audience='#{@audience}'" +
87
+ ", custom_field_values='#{@custom_field_values}'" +
81
88
  "}"
82
89
  end
83
90
  end
@@ -32,7 +32,7 @@ class ExprEvaluator < Evaluator
32
32
  def boolean_convert(x)
33
33
  if x.is_a?(TrueClass) || x.is_a?(FalseClass)
34
34
  return x
35
- elsif x.is_a?(Numeric) || !(x =~ NUMERIC_REGEX).nil?
35
+ elsif x.is_a?(Numeric) || !(x.to_s =~ NUMERIC_REGEX).nil?
36
36
  return !x.to_f.zero?
37
37
  elsif x.is_a?(String)
38
38
  return x != "false" && x != "0" && x != ""
@@ -44,7 +44,7 @@ class ExprEvaluator < Evaluator
44
44
  def number_convert(x)
45
45
  return if x.nil? || x.to_s.empty?
46
46
 
47
- if x.is_a?(Numeric) || !(x =~ NUMERIC_REGEX).nil?
47
+ if x.is_a?(Numeric) || !(x.to_s =~ NUMERIC_REGEX).nil?
48
48
  return x.to_f
49
49
  elsif x.is_a?(TrueClass) || x.is_a?(FalseClass)
50
50
  return x ? 1.0 : 0.0
@@ -57,7 +57,7 @@ class ExprEvaluator < Evaluator
57
57
  return x
58
58
  elsif x.is_a?(TrueClass) || x.is_a?(FalseClass)
59
59
  return x.to_s
60
- elsif x.is_a?(Numeric) || !(x =~ NUMERIC_REGEX).nil?
60
+ elsif x.is_a?(Numeric) || !(x.to_s =~ NUMERIC_REGEX).nil?
61
61
  return x == x.to_i ? x.to_i.to_s : x.to_s
62
62
  end
63
63
  nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: absmartly-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - absmartly
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-11 00:00:00.000000000 Z
11
+ date: 2023-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -16,14 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.10.3
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.10.3
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday-retry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: murmurhash3
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -102,6 +116,7 @@ files:
102
116
  - lib/http_client.rb
103
117
  - lib/json/attribute.rb
104
118
  - lib/json/context_data.rb
119
+ - lib/json/custom_field_value.rb
105
120
  - lib/json/experiment.rb
106
121
  - lib/json/experiment_application.rb
107
122
  - lib/json/experiment_variant.rb
@@ -142,7 +157,7 @@ metadata:
142
157
  homepage_uri: https://github.com/absmartly/ruby-sdk
143
158
  source_code_uri: https://github.com/absmartly/ruby-sdk
144
159
  changelog_uri: https://github.com/absmartly/ruby-sdk
145
- post_install_message:
160
+ post_install_message:
146
161
  rdoc_options: []
147
162
  require_paths:
148
163
  - lib
@@ -158,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
173
  version: '0'
159
174
  requirements: []
160
175
  rubygems_version: 3.4.10
161
- signing_key:
176
+ signing_key:
162
177
  specification_version: 4
163
178
  summary: Absmartly gem
164
179
  test_files: []