splitclient-rb 1.0.2.wip → 8.11.1.pre.rc1-java

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 (210) hide show
  1. checksums.yaml +5 -5
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/pull_request_template.md +9 -0
  4. data/.github/workflows/ci.yml +90 -0
  5. data/.github/workflows/update-license-year.yml +45 -0
  6. data/.gitignore +20 -0
  7. data/.rubocop.yml +76 -0
  8. data/.simplecov +1 -0
  9. data/CHANGES.txt +361 -2
  10. data/CONTRIBUTORS-GUIDE.md +49 -0
  11. data/Gemfile +2 -0
  12. data/LICENSE +3 -36
  13. data/NOTICE.txt +5 -0
  14. data/README.md +59 -127
  15. data/Rakefile +27 -3
  16. data/ext/murmurhash/MurmurHash3.java +302 -0
  17. data/gemfiles/faraday_after_0.13.gemfile +7 -0
  18. data/gemfiles/faraday_before_0.13.gemfile +8 -0
  19. data/lib/murmurhash/base.rb +58 -0
  20. data/lib/murmurhash/murmurhash.jar +0 -0
  21. data/lib/murmurhash/murmurhash_mri.rb +3 -0
  22. data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +130 -0
  23. data/lib/splitclient-rb/cache/adapters/memory_adapter.rb +12 -0
  24. data/lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb +137 -0
  25. data/lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb +53 -0
  26. data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +178 -0
  27. data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +83 -0
  28. data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +70 -0
  29. data/lib/splitclient-rb/cache/filter/bloom_filter.rb +67 -0
  30. data/lib/splitclient-rb/cache/filter/filter_adapter.rb +32 -0
  31. data/lib/splitclient-rb/cache/filter/flag_set_filter.rb +40 -0
  32. data/lib/splitclient-rb/cache/hashers/impression_hasher.rb +34 -0
  33. data/lib/splitclient-rb/cache/observers/impression_observer.rb +22 -0
  34. data/lib/splitclient-rb/cache/observers/noop_impression_observer.rb +10 -0
  35. data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +45 -0
  36. data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +35 -0
  37. data/lib/splitclient-rb/cache/repositories/events_repository.rb +61 -0
  38. data/lib/splitclient-rb/cache/repositories/flag_sets/memory_repository.rb +40 -0
  39. data/lib/splitclient-rb/cache/repositories/flag_sets/redis_repository.rb +49 -0
  40. data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +56 -0
  41. data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +57 -0
  42. data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +23 -0
  43. data/lib/splitclient-rb/cache/repositories/repository.rb +24 -0
  44. data/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +136 -0
  45. data/lib/splitclient-rb/cache/repositories/segments_repository.rb +124 -0
  46. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +296 -0
  47. data/lib/splitclient-rb/cache/routers/impression_router.rb +60 -0
  48. data/lib/splitclient-rb/cache/senders/events_sender.rb +42 -0
  49. data/lib/splitclient-rb/cache/senders/impressions_adapter/memory_sender.rb +71 -0
  50. data/lib/splitclient-rb/cache/senders/impressions_adapter/redis_sender.rb +69 -0
  51. data/lib/splitclient-rb/cache/senders/impressions_count_sender.rb +43 -0
  52. data/lib/splitclient-rb/cache/senders/impressions_formatter.rb +95 -0
  53. data/lib/splitclient-rb/cache/senders/impressions_sender.rb +52 -0
  54. data/lib/splitclient-rb/cache/senders/impressions_sender_adapter.rb +21 -0
  55. data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +47 -0
  56. data/lib/splitclient-rb/cache/stores/localhost_split_builder.rb +95 -0
  57. data/lib/splitclient-rb/cache/stores/localhost_split_store.rb +110 -0
  58. data/lib/splitclient-rb/cache/stores/store_utils.rb +13 -0
  59. data/lib/splitclient-rb/clients/split_client.rb +530 -0
  60. data/lib/splitclient-rb/constants.rb +16 -0
  61. data/lib/splitclient-rb/engine/api/client.rb +87 -0
  62. data/lib/splitclient-rb/engine/api/events.rb +57 -0
  63. data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +58 -0
  64. data/lib/splitclient-rb/engine/api/impressions.rb +79 -0
  65. data/lib/splitclient-rb/engine/api/segments.rb +78 -0
  66. data/lib/splitclient-rb/engine/api/splits.rb +139 -0
  67. data/lib/splitclient-rb/engine/api/telemetry_api.rb +47 -0
  68. data/lib/splitclient-rb/engine/auth_api_client.rb +100 -0
  69. data/lib/splitclient-rb/engine/back_off.rb +26 -0
  70. data/lib/splitclient-rb/engine/common/impressions_counter.rb +45 -0
  71. data/lib/splitclient-rb/engine/common/impressions_manager.rb +165 -0
  72. data/lib/splitclient-rb/engine/common/noop_impressions_counter.rb +27 -0
  73. data/lib/{splitclient-engine → splitclient-rb/engine}/evaluator/splitter.rb +35 -22
  74. data/lib/splitclient-rb/engine/events/events_delivery.rb +20 -0
  75. data/lib/splitclient-rb/engine/events/events_manager.rb +194 -0
  76. data/lib/splitclient-rb/engine/events/events_manager_config.rb +96 -0
  77. data/lib/splitclient-rb/engine/events/events_task.rb +50 -0
  78. data/lib/splitclient-rb/engine/events/noop_events_queue.rb +13 -0
  79. data/lib/splitclient-rb/engine/fallback_treatment_calculator.rb +48 -0
  80. data/lib/splitclient-rb/engine/impressions/noop_unique_keys_tracker.rb +17 -0
  81. data/lib/splitclient-rb/engine/impressions/unique_keys_tracker.rb +144 -0
  82. data/lib/{splitclient-engine → splitclient-rb/engine}/matchers/all_keys_matcher.rb +10 -21
  83. data/lib/splitclient-rb/engine/matchers/between_matcher.rb +47 -0
  84. data/lib/splitclient-rb/engine/matchers/between_semver_matcher.rb +33 -0
  85. data/lib/{splitclient-engine → splitclient-rb/engine}/matchers/combiners.rb +4 -6
  86. data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +80 -0
  87. data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +20 -0
  88. data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +16 -0
  89. data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +43 -0
  90. data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +26 -0
  91. data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +42 -0
  92. data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +37 -0
  93. data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +44 -0
  94. data/lib/splitclient-rb/engine/matchers/equal_to_semver_matcher.rb +28 -0
  95. data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +16 -0
  96. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +43 -0
  97. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher.rb +28 -0
  98. data/lib/splitclient-rb/engine/matchers/in_list_semver_matcher.rb +36 -0
  99. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +43 -0
  100. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher.rb +28 -0
  101. data/lib/splitclient-rb/engine/matchers/matcher.rb +52 -0
  102. data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +29 -0
  103. data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +47 -0
  104. data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +22 -0
  105. data/lib/splitclient-rb/engine/matchers/prerequisites_matcher.rb +31 -0
  106. data/lib/splitclient-rb/engine/matchers/rule_based_segment_matcher.rb +78 -0
  107. data/lib/splitclient-rb/engine/matchers/semver.rb +201 -0
  108. data/lib/splitclient-rb/engine/matchers/set_matcher.rb +27 -0
  109. data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +40 -0
  110. data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +28 -0
  111. data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +66 -0
  112. data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +66 -0
  113. data/lib/splitclient-rb/engine/models/evaluation_options.rb +9 -0
  114. data/lib/splitclient-rb/engine/models/event_active_subscriptions.rb +14 -0
  115. data/lib/splitclient-rb/engine/models/events_metadata.rb +10 -0
  116. data/lib/splitclient-rb/engine/models/fallback_treatment.rb +11 -0
  117. data/lib/splitclient-rb/engine/models/fallback_treatments_configuration.rb +36 -0
  118. data/lib/splitclient-rb/engine/models/label.rb +10 -0
  119. data/lib/splitclient-rb/engine/models/sdk_event.rb +4 -0
  120. data/lib/splitclient-rb/engine/models/sdk_event_type.rb +4 -0
  121. data/lib/splitclient-rb/engine/models/sdk_internal_event.rb +8 -0
  122. data/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb +16 -0
  123. data/lib/splitclient-rb/engine/models/segment_type.rb +4 -0
  124. data/lib/splitclient-rb/engine/models/split.rb +17 -0
  125. data/lib/splitclient-rb/engine/models/split_http_response.rb +19 -0
  126. data/lib/splitclient-rb/engine/models/treatment.rb +3 -0
  127. data/lib/splitclient-rb/engine/models/valid_sdk_event.rb +14 -0
  128. data/lib/splitclient-rb/engine/parser/condition.rb +271 -0
  129. data/lib/splitclient-rb/engine/parser/evaluator.rb +112 -0
  130. data/lib/{splitclient-engine → splitclient-rb/engine}/parser/partition.rb +2 -4
  131. data/lib/splitclient-rb/engine/push_manager.rb +66 -0
  132. data/lib/splitclient-rb/engine/status_manager.rb +39 -0
  133. data/lib/splitclient-rb/engine/sync_manager.rb +183 -0
  134. data/lib/splitclient-rb/engine/synchronizer.rb +231 -0
  135. data/lib/splitclient-rb/exceptions.rb +26 -0
  136. data/lib/splitclient-rb/helpers/decryption_helper.rb +25 -0
  137. data/lib/splitclient-rb/helpers/evaluator_helper.rb +37 -0
  138. data/lib/splitclient-rb/helpers/repository_helper.rb +61 -0
  139. data/lib/splitclient-rb/helpers/thread_helper.rb +24 -0
  140. data/lib/splitclient-rb/helpers/util.rb +26 -0
  141. data/lib/splitclient-rb/managers/split_manager.rb +121 -0
  142. data/lib/splitclient-rb/spec.rb +9 -0
  143. data/lib/splitclient-rb/split_config.rb +591 -47
  144. data/lib/splitclient-rb/split_factory.rb +284 -0
  145. data/lib/splitclient-rb/split_factory_builder.rb +7 -0
  146. data/lib/splitclient-rb/split_factory_registry.rb +63 -0
  147. data/lib/splitclient-rb/split_logger.rb +23 -0
  148. data/lib/splitclient-rb/sse/event_source/client.rb +264 -0
  149. data/lib/splitclient-rb/sse/event_source/event_parser.rb +65 -0
  150. data/lib/splitclient-rb/sse/event_source/event_types.rb +15 -0
  151. data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
  152. data/lib/splitclient-rb/sse/notification_manager_keeper.rb +84 -0
  153. data/lib/splitclient-rb/sse/notification_processor.rb +48 -0
  154. data/lib/splitclient-rb/sse/sse_handler.rb +44 -0
  155. data/lib/splitclient-rb/sse/workers/segments_worker.rb +62 -0
  156. data/lib/splitclient-rb/sse/workers/splits_worker.rb +153 -0
  157. data/lib/splitclient-rb/telemetry/domain/constants.rb +48 -0
  158. data/lib/splitclient-rb/telemetry/domain/structs.rb +35 -0
  159. data/lib/splitclient-rb/telemetry/evaluation_consumer.rb +14 -0
  160. data/lib/splitclient-rb/telemetry/evaluation_producer.rb +21 -0
  161. data/lib/splitclient-rb/telemetry/init_consumer.rb +14 -0
  162. data/lib/splitclient-rb/telemetry/init_producer.rb +19 -0
  163. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_consumer.rb +32 -0
  164. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_producer.rb +24 -0
  165. data/lib/splitclient-rb/telemetry/memory/memory_init_consumer.rb +28 -0
  166. data/lib/splitclient-rb/telemetry/memory/memory_init_producer.rb +34 -0
  167. data/lib/splitclient-rb/telemetry/memory/memory_runtime_consumer.rb +119 -0
  168. data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +87 -0
  169. data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +213 -0
  170. data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +38 -0
  171. data/lib/splitclient-rb/telemetry/redis/redis_init_producer.rb +37 -0
  172. data/lib/splitclient-rb/telemetry/redis/redis_synchronizer.rb +27 -0
  173. data/lib/splitclient-rb/telemetry/runtime_consumer.rb +25 -0
  174. data/lib/splitclient-rb/telemetry/runtime_producer.rb +25 -0
  175. data/lib/splitclient-rb/telemetry/storages/memory.rb +159 -0
  176. data/lib/splitclient-rb/telemetry/sync_task.rb +36 -0
  177. data/lib/splitclient-rb/telemetry/synchronizer.rb +33 -0
  178. data/lib/splitclient-rb/utilitites.rb +49 -0
  179. data/lib/splitclient-rb/validators.rb +361 -0
  180. data/lib/splitclient-rb/version.rb +1 -1
  181. data/lib/splitclient-rb.rb +177 -25
  182. data/sonar-project.properties +6 -0
  183. data/splitclient-rb.gemspec +53 -26
  184. data/tasks/benchmark_get_treatment.rake +31 -17
  185. data/tasks/irb.rake +6 -0
  186. metadata +411 -86
  187. data/NEWS +0 -9
  188. data/lib/splitclient-cache/local_store.rb +0 -45
  189. data/lib/splitclient-engine/impressions/impressions.rb +0 -79
  190. data/lib/splitclient-engine/matchers/between_matcher.rb +0 -48
  191. data/lib/splitclient-engine/matchers/combining_matcher.rb +0 -94
  192. data/lib/splitclient-engine/matchers/equal_to_matcher.rb +0 -48
  193. data/lib/splitclient-engine/matchers/greater_than_or_equal_to_matcher.rb +0 -48
  194. data/lib/splitclient-engine/matchers/less_than_or_equal_to_matcher.rb +0 -48
  195. data/lib/splitclient-engine/matchers/negation_matcher.rb +0 -54
  196. data/lib/splitclient-engine/matchers/user_defined_segment_matcher.rb +0 -61
  197. data/lib/splitclient-engine/matchers/whitelist_matcher.rb +0 -64
  198. data/lib/splitclient-engine/metrics/binary_search_latency_tracker.rb +0 -122
  199. data/lib/splitclient-engine/metrics/metrics.rb +0 -158
  200. data/lib/splitclient-engine/parser/condition.rb +0 -143
  201. data/lib/splitclient-engine/parser/segment.rb +0 -84
  202. data/lib/splitclient-engine/parser/segment_parser.rb +0 -46
  203. data/lib/splitclient-engine/parser/split.rb +0 -68
  204. data/lib/splitclient-engine/parser/split_adapter.rb +0 -433
  205. data/lib/splitclient-engine/parser/split_parser.rb +0 -139
  206. data/lib/splitclient-engine/partitions/treatments.rb +0 -40
  207. data/lib/splitclient-rb/split_client.rb +0 -156
  208. data/lib/splitclient-rb_utilitites.rb +0 -26
  209. data/tasks/console.rake +0 -4
  210. data/tasks/rspec.rake +0 -3
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module SplitIoClient
6
+ class SetMatcher
7
+ def string_type?
8
+ false
9
+ end
10
+
11
+ protected
12
+
13
+ def initialize(attribute, remote_array, logger)
14
+ @attribute = attribute
15
+ @remote_set = remote_array.to_set
16
+ @logger = logger
17
+ end
18
+
19
+ def local_set(data, attribute)
20
+ data = data.fetch(attribute) { |a| data[a.to_s] || data[a.to_sym] }
21
+ # Allow user to pass individual elements as well
22
+ local_array = data.is_a?(Array) ? data : [data]
23
+
24
+ local_array.to_set
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ class StartsWithMatcher
5
+ MATCHER_TYPE = 'STARTS_WITH'
6
+
7
+ attr_reader :attribute
8
+
9
+ def initialize(attribute, prefix_list, logger)
10
+ @attribute = attribute
11
+ @prefix_list = prefix_list
12
+ @logger = logger
13
+ end
14
+
15
+ def match?(args)
16
+ if @prefix_list.empty?
17
+ @logger.log_if_debug('[StartsWithMatcher] Prefix List is empty.')
18
+ return false
19
+ end
20
+
21
+ value = get_value(args)
22
+
23
+ matches = @prefix_list.any? { |prefix| value.to_s.start_with? prefix }
24
+ @logger.log_if_debug("[StartsWithMatcher] #{value} matches any of #{@prefix_list} -> #{matches}")
25
+ matches
26
+ end
27
+
28
+ def string_type?
29
+ true
30
+ end
31
+
32
+ private
33
+
34
+ def get_value(args)
35
+ args[:value] || args[:attributes].fetch(@attribute) do |a|
36
+ args[:attributes][a.to_s] || args[:attributes][a.to_sym]
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ #
5
+ # class to implement the user defined matcher
6
+ #
7
+ class UserDefinedSegmentMatcher < Matcher
8
+ MATCHER_TYPE = 'IN_SEGMENT'
9
+
10
+ def initialize(segments_repository, segment_name, logger)
11
+ super(logger)
12
+ @segments_repository = segments_repository
13
+ @segment_name = segment_name
14
+ end
15
+
16
+ #
17
+ # evaluates if the key matches the matcher
18
+ #
19
+ # @param key [string] key value to be matched
20
+ #
21
+ # @return [boolean] evaluation of the key against the segment
22
+ def match?(args)
23
+ matches = @segments_repository.in_segment?(@segment_name, args[:value] || args[:matching_key])
24
+ @logger.log_if_debug("[InSegmentMatcher] #{@segment_name} is in segment -> #{matches}")
25
+ matches
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ #
5
+ # class to implement the user defined matcher
6
+ #
7
+ class WhitelistMatcher < Matcher
8
+ MATCHER_TYPE = 'WHITELIST_MATCHER'
9
+
10
+ attr_reader :attribute
11
+
12
+ def initialize(whitelist_data, logger, validator)
13
+ super(logger)
14
+ @validator = validator
15
+ @whitelist = case whitelist_data
16
+ when Array
17
+ whitelist_data
18
+ when Hash
19
+ @matcher_type = 'ATTR_WHITELIST'
20
+ @attribute = whitelist_data[:attribute]
21
+
22
+ whitelist_data[:value]
23
+ else
24
+ []
25
+ end
26
+ end
27
+
28
+ def match?(args)
29
+ return matches_user_whitelist(args) unless @matcher_type == 'ATTR_WHITELIST'
30
+
31
+ @logger.log_if_debug('[WhitelistMatcher] evaluating value and attributes.')
32
+
33
+ return false unless @validator.valid_matcher_arguments(args)
34
+
35
+ matches_attr_whitelist(args)
36
+ end
37
+
38
+ def string_type?
39
+ true
40
+ end
41
+
42
+ #
43
+ # function to print string value for this matcher
44
+ #
45
+ # @return [string] string value of this matcher
46
+ def to_s
47
+ "in segment #{@whitelist}"
48
+ end
49
+
50
+ private
51
+
52
+ def matches_user_whitelist(args)
53
+ matches = @whitelist.include?(args[:value] || args[:matching_key])
54
+ @logger.log_if_debug("[WhitelistMatcher] #{@whitelist} include \
55
+ #{args[:value] || args[:matching_key]} -> #{matches}")
56
+ matches
57
+ end
58
+
59
+ def matches_attr_whitelist(args)
60
+ matches = @whitelist.include?(args[:value] || args[:attributes][@attribute.to_sym])
61
+ @logger.log_if_debug("[WhitelistMatcher] #{@whitelist} include \
62
+ #{args[:value] || args[:attributes][@attribute.to_sym]} -> #{matches}")
63
+ matches
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,66 @@
1
+ module SplitIoClient
2
+
3
+ #
4
+ # Tracks latencies pero bucket of time.
5
+ # Each bucket represent a latency greater than the one before
6
+ # and each number within each bucket is a number of calls in the range.
7
+ #
8
+ # (1) 1.00
9
+ # (2) 1.50
10
+ # (3) 2.25
11
+ # (4) 3.38
12
+ # (5) 5.06
13
+ # (6) 7.59
14
+ # (7) 11.39
15
+ # (8) 17.09
16
+ # (9) 25.63
17
+ # (10) 38.44
18
+ # (11) 57.67
19
+ # (12) 86.50
20
+ # (13) 129.75
21
+ # (14) 194.62
22
+ # (15) 291.93
23
+ # (16) 437.89
24
+ # (17) 656.84
25
+ # (18) 985.26
26
+ # (19) 1,477.89
27
+ # (20) 2,216.84
28
+ # (21) 3,325.26
29
+ # (22) 4,987.89
30
+ # (23) 7,481.83
31
+ #
32
+ # Created by fvitale on 2/17/16 based on java implementation by patricioe.
33
+ #
34
+
35
+ class BinarySearchLatencyTracker < NoMethodError
36
+
37
+ BUCKETS = [ 1000, 1500, 2250, 3375, 5063,
38
+ 7594, 11391, 17086, 25629, 38443,
39
+ 57665, 86498, 129746, 194620, 291929,
40
+ 437894, 656841, 985261, 1477892, 2216838,
41
+ 3325257, 4987885, 7481828 ].freeze
42
+
43
+ MAX_LATENCY = 7481828
44
+
45
+ def self.get_bucket(latency)
46
+ return find_bucket_index(latency * 1000)
47
+ end
48
+
49
+ private
50
+
51
+ def self.find_bucket_index(micros)
52
+ if (micros > MAX_LATENCY) then
53
+ return BUCKETS.length - 1
54
+ end
55
+
56
+ if (micros < 1500) then
57
+ return 0
58
+ end
59
+
60
+ index = BUCKETS.find_index(BUCKETS.bsearch {|x| x >= micros })
61
+
62
+ return index
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,9 @@
1
+ module SplitIoClient::Engine::Models
2
+ class EvaluationOptions
3
+ attr_accessor :properties
4
+
5
+ def initialize(properties)
6
+ @properties = properties
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: false
2
+
3
+ module SplitIoClient
4
+ module Engine::Models
5
+ class EventActiveSubscriptions
6
+ attr_accessor :triggered, :handler
7
+
8
+ def initialize(triggered, handler)
9
+ @triggered = triggered
10
+ @handler = handler
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module SplitIoClient::Engine::Models
2
+ class EventsMetadata
3
+ attr_accessor :type, :names
4
+
5
+ def initialize(type, names=nil)
6
+ @type = type
7
+ @names = names
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module SplitIoClient::Engine::Models
2
+ class FallbackTreatment
3
+ attr_accessor :treatment, :config, :label
4
+
5
+ def initialize(treatment, config=nil, label=nil)
6
+ @treatment = treatment
7
+ @config = config
8
+ @label = label
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ module SplitIoClient::Engine::Models
2
+ class FallbackTreatmentsConfiguration
3
+ attr_accessor :global_fallback_treatment, :by_flag_fallback_treatment
4
+
5
+ def initialize(global_fallback_treatment=nil, by_flag_fallback_treatment=nil)
6
+ @global_fallback_treatment = build_global_fallback_treatment(global_fallback_treatment)
7
+ @by_flag_fallback_treatment = build_by_flag_fallback_treatment(by_flag_fallback_treatment)
8
+ end
9
+
10
+ private
11
+
12
+ def build_global_fallback_treatment(global_fallback_treatment)
13
+ if global_fallback_treatment.is_a? String
14
+ return FallbackTreatment.new(global_fallback_treatment)
15
+ end
16
+
17
+ global_fallback_treatment
18
+ end
19
+
20
+ def build_by_flag_fallback_treatment(by_flag_fallback_treatment)
21
+ return nil unless by_flag_fallback_treatment.is_a?(Hash)
22
+ processed_by_flag_fallback_treatment = Hash.new
23
+
24
+ by_flag_fallback_treatment.each do |key, value|
25
+ if value.is_a? String
26
+ processed_by_flag_fallback_treatment[key] = FallbackTreatment.new(value)
27
+ next
28
+ end
29
+
30
+ processed_by_flag_fallback_treatment[key] = value
31
+ end
32
+
33
+ processed_by_flag_fallback_treatment
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,10 @@
1
+ class SplitIoClient::Engine::Models::Label
2
+ ARCHIVED = 'archived'.freeze
3
+ NO_RULE_MATCHED = 'default rule'.freeze
4
+ EXCEPTION = 'exception'.freeze
5
+ KILLED = 'killed'.freeze
6
+ NOT_IN_SPLIT = 'not in split'.freeze
7
+ NOT_READY = 'not ready'.freeze
8
+ NOT_FOUND = 'definition not found'.freeze
9
+ PREREQUISITES_NOT_MET = 'prerequisites not met'.freeze
10
+ end
@@ -0,0 +1,4 @@
1
+ class SplitIoClient::Engine::Models::SdkEvent
2
+ SDK_READY = 'SDK_READY'
3
+ SDK_UPDATE = 'SDK_UPDATE'
4
+ end
@@ -0,0 +1,4 @@
1
+ class SplitIoClient::Engine::Models::SdkEventType
2
+ FLAG_UPDATE = 'FLAG_UPDATE'
3
+ SEGMENTS_UPDATE = 'SEGMENTS_UPDATE'
4
+ end
@@ -0,0 +1,8 @@
1
+ class SplitIoClient::Engine::Models::SdkInternalEvent
2
+ SDK_READY = 'SDK_READY'
3
+ FLAGS_UPDATED = 'FLAGS_UPDATED'
4
+ FLAG_KILLED_NOTIFICATION = 'FLAG_KILLED_NOTIFICATION'
5
+ SEGMENTS_UPDATED = 'SEGMENTS_UPDATED'
6
+ RB_SEGMENTS_UPDATED = 'RB_SEGMENTS_UPDATED'
7
+ LARGE_SEGMENTS_UPDATED = 'LARGE_SEGMENTS_UPDATED'
8
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: false
2
+
3
+ module SplitIoClient
4
+ module Engine
5
+ module Models
6
+ class SdkInternalEventNotification
7
+ attr_reader :internal_event, :metadata
8
+
9
+ def initialize(internal_event, metadata)
10
+ @internal_event = internal_event
11
+ @metadata = metadata
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ class SplitIoClient::Engine::Models::SegmentType
2
+ STANDARD = 'standard'
3
+ RULE_BASED_SEGMENT = 'rule-based'
4
+ end
@@ -0,0 +1,17 @@
1
+ module SplitIoClient
2
+ module Engine
3
+ module Models
4
+ class Split
5
+ class << self
6
+ def matchable?(data)
7
+ data && data[:status] == 'ACTIVE' && data[:killed] == false
8
+ end
9
+
10
+ def archived?(data)
11
+ data && data[:status] == 'ARCHIVED'
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module SplitIoClient
2
+ module Engine
3
+ module Models
4
+ class SplitHttpResponse
5
+ attr_accessor :status, :body
6
+
7
+ def initialize(status, body, success)
8
+ @status = status
9
+ @body = body
10
+ @success = success
11
+ end
12
+
13
+ def success?
14
+ @success
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ class SplitIoClient::Engine::Models::Treatment
2
+ CONTROL = 'control'.freeze
3
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: false
2
+
3
+ module SplitIoClient
4
+ module Engine::Models
5
+ class ValidSdkEvent
6
+ attr_reader :sdk_event, :valid
7
+
8
+ def initialize(sdk_event, valid)
9
+ @sdk_event = sdk_event
10
+ @valid = valid
11
+ end
12
+ end
13
+ end
14
+ end