splitclient-rb 3.2.4 → 3.3.0.pre.rc1

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
  SHA1:
3
- metadata.gz: 34298f62d2d0164b2706510f10e72dd4217d17d2
4
- data.tar.gz: ba8aecd65f0c9e2df7a098e3866f6723865e8c78
3
+ metadata.gz: 8341508fbe2e85f51f48b68830a173dff7f8b87f
4
+ data.tar.gz: 6d199d8c2369cd469aba09869614009a38d6723a
5
5
  SHA512:
6
- metadata.gz: 78ae2f847f2f3ff814aa68078436708a61f2060322e13bd2b622ab473cfc674bff77f86085fd6fa78569752f5b1521f276fd1d873775eeec04235ee7ea0b3029
7
- data.tar.gz: 812807e946bac737c30033887eab25323f11f001c7d380c3e2a8796c8c5933bc74790e8fce4f118b9b086bcc5e0661ec9ea19d4b878e0f038156418e20214247
6
+ metadata.gz: 00372ba9e41399940663fc1ef0a8bb0128f5a1cc4dd0e178c619cf83c57446eb025983f7973b278e18b96e2abf15421aa5ffb056445a78584c50df07d290116e
7
+ data.tar.gz: 110fce581be2047a48453e336e26bb0125fb2f5753b5cab70fb313f522d061fa1599375887313162778266ad2562fa5d602e4b3b97ac8115fd73e365b29c3863
data/CHANGES.txt CHANGED
@@ -1,3 +1,6 @@
1
+ 3.3.0
2
+ - Add support for traffic allocation
3
+
1
4
  3.2.4
2
5
  - Fix Faraday compability issue (now compatible with Faraday 0.8.9)
3
6
  - Provide an interface to run SplitAdapter(start and resume), can be used to resurrect threads in Unicorn and Passenger servers
data/NEWS CHANGED
@@ -1,3 +1,7 @@
1
+ 3.3.0
2
+
3
+ Add support for traffic allocation
4
+
1
5
  3.1.0
2
6
 
3
7
  Now supporting Redis as a cache adapter
@@ -2,10 +2,11 @@ module SplitIoClient
2
2
  module Engine
3
3
  module Models
4
4
  class Label
5
- ARCHIVED = 'archived'
6
- NO_RULE_MATCHED = 'no rule matched'
7
- EXCEPTION = 'exception'
8
- KILLED = 'killed'
5
+ ARCHIVED = 'archived'.freeze
6
+ NO_RULE_MATCHED = 'no rule matched'.freeze
7
+ EXCEPTION = 'exception'.freeze
8
+ KILLED = 'killed'.freeze
9
+ NOT_IN_SPLIT = 'not in split'.freeze
9
10
  end
10
11
  end
11
12
  end
@@ -3,6 +3,8 @@ module SplitIoClient
3
3
  # acts as dto for a condition structure
4
4
  #
5
5
  class Condition < NoMethodError
6
+ TYPE_ROLLOUT = 'ROLLOUT'.freeze
7
+ TYPE_WHITELIST = 'WHITELIST'.freeze
6
8
  #
7
9
  # definition of the condition
8
10
  #
@@ -36,6 +38,12 @@ module SplitIoClient
36
38
  @data[:matcherGroup][:matchers]
37
39
  end
38
40
 
41
+ #
42
+ # @return [string] condition type
43
+ def type
44
+ @data[:conditionType]
45
+ end
46
+
39
47
  def negation_matcher(matcher)
40
48
  NegationMatcher.new(matcher)
41
49
  end
@@ -1,5 +1,4 @@
1
1
  module SplitIoClient
2
-
3
2
  #
4
3
  # acts as dto for a partition structure
5
4
  #
@@ -30,8 +29,7 @@ module SplitIoClient
30
29
  #
31
30
  # @return [boolean] true if the partition is empty false otherwise
32
31
  def is_empty?
33
- @data.empty? ? true : false
32
+ @data.empty?
34
33
  end
35
34
  end
36
-
37
- end
35
+ end
@@ -21,13 +21,27 @@ module SplitIoClient
21
21
  private
22
22
 
23
23
  def match(split, keys, attributes)
24
+ in_rollout = false
25
+ key = keys[:bucketing_key] ? keys[:bucketing_key] : keys[:matching_key]
26
+
24
27
  split[:conditions].each do |c|
25
28
  condition = SplitIoClient::Condition.new(c)
26
29
 
27
30
  next if condition.empty?
28
31
 
32
+ if !in_rollout && condition.type == SplitIoClient::Condition::TYPE_ROLLOUT
33
+ if split[:trafficAllocation] < 100
34
+ bucket = Splitter.bucket(Splitter.hash(key, split[:trafficAllocationSeed].to_i))
35
+
36
+ if bucket >= split[:trafficAllocation]
37
+ return treatment(Models::Label::NOT_IN_SPLIT, @default_treatment, split[:changeNumber])
38
+ end
39
+ end
40
+
41
+ in_rollout = true
42
+ end
43
+
29
44
  if matcher_type(condition).match?(keys[:matching_key], attributes)
30
- key = keys[:bucketing_key] ? keys[:bucketing_key] : keys[:matching_key]
31
45
  result = Splitter.get_treatment(key, split[:seed], condition.partitions)
32
46
 
33
47
  if result.nil?
@@ -77,34 +77,50 @@ module SplitIoClient
77
77
  rescue StandardError => error
78
78
  @config.log_found_exception(__method__.to_s, error)
79
79
 
80
+ store_impression(
81
+ split_name, matching_key, bucketing_key,
82
+ { treatment: SplitIoClient::Treatments::CONTROL, label: Models::Label::EXCEPTION },
83
+ store_impressions
84
+ )
85
+
80
86
  return parsed_treatment(multiple, treatment_label_change_number)
81
87
  end
82
88
 
83
89
  begin
84
90
  latency = (Time.now - start) * 1000.0
85
- if @config.impressions_queue_size > 0 && store_impressions && split
86
- # Disable impressions if @config.impressions_queue_size == -1
87
- @impressions_repository.add(split_name,
88
- 'keyName' => matching_key,
89
- 'bucketingKey' => bucketing_key,
90
- 'treatment' => treatment_label_change_number[:treatment],
91
- 'label' => @config.labels_enabled ? treatment_label_change_number[:label] : nil,
92
- 'time' => (Time.now.to_f * 1000.0).to_i,
93
- 'changeNumber' => treatment_label_change_number[:change_number]
94
- )
95
- end
91
+ # Disable impressions if @config.impressions_queue_size == -1
92
+ split && store_impression(split_name, matching_key, bucketing_key, treatment_label_change_number, store_impressions)
96
93
 
97
94
  # Measure
98
95
  @adapter.metrics.time('sdk.get_treatment', latency)
99
96
  rescue StandardError => error
100
97
  @config.log_found_exception(__method__.to_s, error)
101
98
 
99
+ store_impression(
100
+ split_name, matching_key, bucketing_key,
101
+ { treatment: SplitIoClient::Treatments::CONTROL, label: Models::Label::EXCEPTION },
102
+ store_impressions
103
+ )
104
+
102
105
  return parsed_treatment(multiple, treatment_label_change_number)
103
106
  end
104
107
 
105
108
  parsed_treatment(multiple, treatment_label_change_number)
106
109
  end
107
110
 
111
+ def store_impression(split_name, matching_key, bucketing_key, treatment, store_impressions)
112
+ return if @config.impressions_queue_size <= 0 || !store_impressions
113
+
114
+ @impressions_repository.add(split_name,
115
+ 'keyName' => matching_key,
116
+ 'bucketingKey' => bucketing_key,
117
+ 'treatment' => treatment[:treatment],
118
+ 'label' => @config.labels_enabled ? treatment[:label] : nil,
119
+ 'time' => (Time.now.to_f * 1000.0).to_i,
120
+ 'changeNumber' => treatment[:change_number]
121
+ )
122
+ end
123
+
108
124
  def keys_from_key(key)
109
125
  case key.class.to_s
110
126
  when 'Hash'
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '3.2.4'
2
+ VERSION = '3.3.0-rc1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splitclient-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.4
4
+ version: 3.3.0.pre.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-24 00:00:00.000000000 Z
11
+ date: 2017-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -330,9 +330,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
330
330
  version: '0'
331
331
  required_rubygems_version: !ruby/object:Gem::Requirement
332
332
  requirements:
333
- - - ">="
333
+ - - ">"
334
334
  - !ruby/object:Gem::Version
335
- version: '0'
335
+ version: 1.3.1
336
336
  requirements: []
337
337
  rubyforge_project:
338
338
  rubygems_version: 2.5.2