splitclient-rb 6.3.0 → 8.11.0

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 (192) hide show
  1. checksums.yaml +4 -4
  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 +4 -0
  7. data/.rubocop.yml +46 -3
  8. data/CHANGES.txt +158 -11
  9. data/CONTRIBUTORS-GUIDE.md +49 -0
  10. data/LICENSE +169 -13
  11. data/NOTICE.txt +5 -0
  12. data/README.md +67 -27
  13. data/Rakefile +1 -8
  14. data/ext/murmurhash/3_x64_128.c +117 -0
  15. data/ext/murmurhash/murmurhash.c +5 -1
  16. data/lib/murmurhash/murmurhash.jar +0 -0
  17. data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +3 -3
  18. data/lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb +4 -0
  19. data/lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb +7 -0
  20. data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +12 -4
  21. data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +83 -0
  22. data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +70 -0
  23. data/lib/splitclient-rb/cache/filter/bloom_filter.rb +67 -0
  24. data/lib/splitclient-rb/cache/filter/filter_adapter.rb +32 -0
  25. data/lib/splitclient-rb/cache/filter/flag_set_filter.rb +40 -0
  26. data/lib/splitclient-rb/cache/hashers/impression_hasher.rb +34 -0
  27. data/lib/splitclient-rb/cache/observers/impression_observer.rb +22 -0
  28. data/lib/splitclient-rb/cache/observers/noop_impression_observer.rb +10 -0
  29. data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +26 -14
  30. data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +9 -14
  31. data/lib/splitclient-rb/cache/repositories/events_repository.rb +31 -10
  32. data/lib/splitclient-rb/cache/repositories/flag_sets/memory_repository.rb +40 -0
  33. data/lib/splitclient-rb/cache/repositories/flag_sets/redis_repository.rb +49 -0
  34. data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +22 -23
  35. data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +15 -22
  36. data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +6 -31
  37. data/lib/splitclient-rb/cache/repositories/repository.rb +6 -5
  38. data/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +136 -0
  39. data/lib/splitclient-rb/cache/repositories/segments_repository.rb +46 -6
  40. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +232 -43
  41. data/lib/splitclient-rb/cache/routers/impression_router.rb +24 -22
  42. data/lib/splitclient-rb/cache/senders/events_sender.rb +12 -29
  43. data/lib/splitclient-rb/cache/senders/impressions_adapter/memory_sender.rb +71 -0
  44. data/lib/splitclient-rb/cache/senders/impressions_adapter/redis_sender.rb +69 -0
  45. data/lib/splitclient-rb/cache/senders/impressions_count_sender.rb +43 -0
  46. data/lib/splitclient-rb/cache/senders/impressions_formatter.rb +27 -13
  47. data/lib/splitclient-rb/cache/senders/impressions_sender.rb +11 -25
  48. data/lib/splitclient-rb/cache/senders/impressions_sender_adapter.rb +21 -0
  49. data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +47 -0
  50. data/lib/splitclient-rb/cache/stores/localhost_split_builder.rb +95 -0
  51. data/lib/splitclient-rb/cache/stores/localhost_split_store.rb +110 -0
  52. data/lib/splitclient-rb/cache/stores/store_utils.rb +13 -0
  53. data/lib/splitclient-rb/clients/split_client.rb +385 -138
  54. data/lib/splitclient-rb/constants.rb +16 -0
  55. data/lib/splitclient-rb/engine/api/client.rb +38 -43
  56. data/lib/splitclient-rb/engine/api/events.rb +19 -11
  57. data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +1 -0
  58. data/lib/splitclient-rb/engine/api/impressions.rb +49 -14
  59. data/lib/splitclient-rb/engine/api/segments.rb +31 -24
  60. data/lib/splitclient-rb/engine/api/splits.rb +108 -33
  61. data/lib/splitclient-rb/engine/api/telemetry_api.rb +47 -0
  62. data/lib/splitclient-rb/engine/auth_api_client.rb +96 -0
  63. data/lib/splitclient-rb/engine/back_off.rb +26 -0
  64. data/lib/splitclient-rb/engine/common/impressions_counter.rb +45 -0
  65. data/lib/splitclient-rb/engine/common/impressions_manager.rb +165 -0
  66. data/lib/splitclient-rb/engine/common/noop_impressions_counter.rb +27 -0
  67. data/lib/splitclient-rb/engine/events/events_delivery.rb +20 -0
  68. data/lib/splitclient-rb/engine/events/events_manager.rb +194 -0
  69. data/lib/splitclient-rb/engine/events/events_manager_config.rb +96 -0
  70. data/lib/splitclient-rb/engine/events/events_task.rb +50 -0
  71. data/lib/splitclient-rb/engine/events/noop_events_queue.rb +13 -0
  72. data/lib/splitclient-rb/engine/fallback_treatment_calculator.rb +48 -0
  73. data/lib/splitclient-rb/engine/impressions/noop_unique_keys_tracker.rb +17 -0
  74. data/lib/splitclient-rb/engine/impressions/unique_keys_tracker.rb +144 -0
  75. data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +1 -1
  76. data/lib/splitclient-rb/engine/matchers/between_matcher.rb +7 -5
  77. data/lib/splitclient-rb/engine/matchers/between_semver_matcher.rb +33 -0
  78. data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +10 -8
  79. data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +2 -6
  80. data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +1 -5
  81. data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +7 -5
  82. data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +6 -5
  83. data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +5 -4
  84. data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +3 -2
  85. data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +6 -4
  86. data/lib/splitclient-rb/engine/matchers/equal_to_semver_matcher.rb +28 -0
  87. data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +1 -5
  88. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +6 -4
  89. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher.rb +28 -0
  90. data/lib/splitclient-rb/engine/matchers/in_list_semver_matcher.rb +36 -0
  91. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +6 -4
  92. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher.rb +28 -0
  93. data/lib/splitclient-rb/engine/matchers/matcher.rb +22 -0
  94. data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +3 -2
  95. data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +3 -2
  96. data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +2 -6
  97. data/lib/splitclient-rb/engine/matchers/prerequisites_matcher.rb +31 -0
  98. data/lib/splitclient-rb/engine/matchers/rule_based_segment_matcher.rb +78 -0
  99. data/lib/splitclient-rb/engine/matchers/semver.rb +201 -0
  100. data/lib/splitclient-rb/engine/matchers/set_matcher.rb +2 -1
  101. data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +4 -3
  102. data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +3 -2
  103. data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +7 -5
  104. data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +3 -65
  105. data/lib/splitclient-rb/engine/models/evaluation_options.rb +9 -0
  106. data/lib/splitclient-rb/engine/models/event_active_subscriptions.rb +14 -0
  107. data/lib/splitclient-rb/engine/models/events_metadata.rb +10 -0
  108. data/lib/splitclient-rb/engine/models/fallback_treatment.rb +11 -0
  109. data/lib/splitclient-rb/engine/models/fallback_treatments_configuration.rb +36 -0
  110. data/lib/splitclient-rb/engine/models/label.rb +3 -0
  111. data/lib/splitclient-rb/engine/models/sdk_event.rb +4 -0
  112. data/lib/splitclient-rb/engine/models/sdk_event_type.rb +4 -0
  113. data/lib/splitclient-rb/engine/models/sdk_internal_event.rb +8 -0
  114. data/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb +14 -0
  115. data/lib/splitclient-rb/engine/models/segment_type.rb +4 -0
  116. data/lib/splitclient-rb/engine/models/split_http_response.rb +19 -0
  117. data/lib/splitclient-rb/engine/models/valid_sdk_event.rb +14 -0
  118. data/lib/splitclient-rb/engine/parser/condition.rb +81 -20
  119. data/lib/splitclient-rb/engine/parser/evaluator.rb +40 -51
  120. data/lib/splitclient-rb/engine/push_manager.rb +66 -0
  121. data/lib/splitclient-rb/engine/status_manager.rb +39 -0
  122. data/lib/splitclient-rb/engine/sync_manager.rb +180 -0
  123. data/lib/splitclient-rb/engine/synchronizer.rb +231 -0
  124. data/lib/splitclient-rb/exceptions.rb +20 -1
  125. data/lib/splitclient-rb/helpers/decryption_helper.rb +25 -0
  126. data/lib/splitclient-rb/helpers/evaluator_helper.rb +37 -0
  127. data/lib/splitclient-rb/helpers/repository_helper.rb +61 -0
  128. data/lib/splitclient-rb/helpers/thread_helper.rb +24 -0
  129. data/lib/splitclient-rb/helpers/util.rb +26 -0
  130. data/lib/splitclient-rb/managers/split_manager.rb +58 -20
  131. data/lib/splitclient-rb/spec.rb +9 -0
  132. data/lib/splitclient-rb/split_config.rb +336 -54
  133. data/lib/splitclient-rb/split_factory.rb +219 -33
  134. data/lib/splitclient-rb/split_factory_builder.rb +1 -22
  135. data/lib/splitclient-rb/split_factory_registry.rb +63 -0
  136. data/lib/splitclient-rb/split_logger.rb +9 -10
  137. data/lib/splitclient-rb/sse/event_source/client.rb +263 -0
  138. data/lib/splitclient-rb/sse/event_source/event_parser.rb +65 -0
  139. data/lib/splitclient-rb/sse/event_source/event_types.rb +15 -0
  140. data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
  141. data/lib/splitclient-rb/sse/notification_manager_keeper.rb +84 -0
  142. data/lib/splitclient-rb/sse/notification_processor.rb +48 -0
  143. data/lib/splitclient-rb/sse/sse_handler.rb +44 -0
  144. data/lib/splitclient-rb/sse/workers/segments_worker.rb +62 -0
  145. data/lib/splitclient-rb/sse/workers/splits_worker.rb +149 -0
  146. data/lib/splitclient-rb/telemetry/domain/constants.rb +48 -0
  147. data/lib/splitclient-rb/telemetry/domain/structs.rb +35 -0
  148. data/lib/splitclient-rb/telemetry/evaluation_consumer.rb +14 -0
  149. data/lib/splitclient-rb/telemetry/evaluation_producer.rb +21 -0
  150. data/lib/splitclient-rb/telemetry/init_consumer.rb +14 -0
  151. data/lib/splitclient-rb/telemetry/init_producer.rb +19 -0
  152. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_consumer.rb +32 -0
  153. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_producer.rb +24 -0
  154. data/lib/splitclient-rb/telemetry/memory/memory_init_consumer.rb +28 -0
  155. data/lib/splitclient-rb/telemetry/memory/memory_init_producer.rb +34 -0
  156. data/lib/splitclient-rb/telemetry/memory/memory_runtime_consumer.rb +119 -0
  157. data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +87 -0
  158. data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +213 -0
  159. data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +38 -0
  160. data/lib/splitclient-rb/telemetry/redis/redis_init_producer.rb +37 -0
  161. data/lib/splitclient-rb/telemetry/redis/redis_synchronizer.rb +27 -0
  162. data/lib/splitclient-rb/telemetry/runtime_consumer.rb +25 -0
  163. data/lib/splitclient-rb/telemetry/runtime_producer.rb +25 -0
  164. data/lib/splitclient-rb/telemetry/storages/memory.rb +159 -0
  165. data/lib/splitclient-rb/telemetry/sync_task.rb +36 -0
  166. data/lib/splitclient-rb/telemetry/synchronizer.rb +33 -0
  167. data/lib/splitclient-rb/utilitites.rb +8 -0
  168. data/lib/splitclient-rb/validators.rb +142 -38
  169. data/lib/splitclient-rb/version.rb +1 -1
  170. data/lib/splitclient-rb.rb +101 -16
  171. data/sonar-project.properties +6 -0
  172. data/splitclient-rb.gemspec +28 -23
  173. metadata +262 -82
  174. data/.travis.yml +0 -11
  175. data/Appraisals +0 -10
  176. data/Detailed-README.md +0 -588
  177. data/NEWS +0 -141
  178. data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +0 -127
  179. data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +0 -96
  180. data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +0 -21
  181. data/lib/splitclient-rb/cache/senders/metrics_sender.rb +0 -56
  182. data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +0 -46
  183. data/lib/splitclient-rb/cache/stores/segment_store.rb +0 -81
  184. data/lib/splitclient-rb/cache/stores/split_store.rb +0 -102
  185. data/lib/splitclient-rb/clients/localhost_split_client.rb +0 -183
  186. data/lib/splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent.rb +0 -46
  187. data/lib/splitclient-rb/engine/api/metrics.rb +0 -60
  188. data/lib/splitclient-rb/engine/metrics/metrics.rb +0 -80
  189. data/lib/splitclient-rb/engine/parser/split_adapter.rb +0 -81
  190. data/lib/splitclient-rb/localhost_split_factory.rb +0 -13
  191. data/lib/splitclient-rb/localhost_utils.rb +0 -59
  192. data/lib/splitclient-rb/managers/localhost_split_manager.rb +0 -60
@@ -1,8 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SplitIoClient
4
- module Validators
5
- extend self
4
+ class Validators
5
+
6
+ Flagset_regex = /^[a-z0-9][_a-z0-9]{0,49}$/
7
+ Fallback_treatment_regex = /^[0-9]+[.a-zA-Z0-9_-]*$|^[a-zA-Z]+[a-zA-Z0-9_-]*$/
8
+ Fallback_treatment_size = 100
9
+
10
+ def initialize(config)
11
+ @config = config
12
+ end
6
13
 
7
14
  def valid_get_treatment_parameters(method, key, split_name, matching_key, bucketing_key, attributes)
8
15
  valid_key?(method, key) &&
@@ -12,15 +19,20 @@ module SplitIoClient
12
19
  valid_attributes?(method, attributes)
13
20
  end
14
21
 
15
- def valid_get_treatments_parameters(method, split_names)
16
- valid_split_names?(method, split_names)
22
+ def valid_get_treatments_parameters(method, key, split_names, matching_key, bucketing_key, attributes)
23
+ valid_key?(method, key) &&
24
+ valid_split_names?(method, split_names)
25
+ valid_matching_key?(method, matching_key) &&
26
+ valid_bucketing_key?(method, key, bucketing_key) &&
27
+ valid_attributes?(method, attributes)
17
28
  end
18
29
 
19
- def valid_track_parameters(key, traffic_type_name, event_type, value)
30
+ def valid_track_parameters(key, traffic_type_name, event_type, value, properties)
20
31
  valid_track_key?(key) &&
21
32
  valid_traffic_type_name?(traffic_type_name) &&
22
33
  valid_event_type?(event_type) &&
23
- valid_value?(value)
34
+ valid_value?(value) &&
35
+ valid_properties?(properties)
24
36
  end
25
37
 
26
38
  def valid_split_parameters(split_name)
@@ -34,6 +46,83 @@ module SplitIoClient
34
46
  true
35
47
  end
36
48
 
49
+ def valid_flag_sets(method, flag_sets)
50
+ if flag_sets.nil? || !flag_sets.is_a?(Array)
51
+ @config.logger.error("#{method}: FlagSets must be a non-empty list.")
52
+ return []
53
+ end
54
+ if flag_sets.empty?
55
+ @config.logger.error("#{method}: FlagSets must be a non-empty list.")
56
+ return []
57
+ end
58
+ without_nil = Array.new
59
+ flag_sets.each { |flag_set|
60
+ if !flag_set.nil?
61
+ without_nil.push(flag_set)
62
+ next
63
+ end
64
+
65
+ log_nil("flag set", method)
66
+ }
67
+ if without_nil.length() == 0
68
+ log_invalid_flag_set_type(method)
69
+ return []
70
+ end
71
+ valid_flag_sets = Set[]
72
+ without_nil.compact.uniq.select do |flag_set|
73
+ if flag_set.nil? || !flag_set.is_a?(String)
74
+ log_invalid_flag_set_type(method)
75
+ elsif flag_set.is_a?(String) && flag_set.empty?
76
+ log_invalid_flag_set_type(method)
77
+ elsif !flag_set.empty? && string_match?(flag_set.strip.downcase, method, Flagset_regex, :log_invalid_match)
78
+ valid_flag_sets.add(flag_set.strip.downcase)
79
+ else
80
+ log_invalid_flag_set_type(method)
81
+ end
82
+ end
83
+ !valid_flag_sets.empty? ? valid_flag_sets.to_a.sort : []
84
+ end
85
+
86
+ def validate_fallback_treatment(method, fallback_treatment)
87
+ if !fallback_treatment.is_a? Engine::Models::FallbackTreatment
88
+ @config.logger.warn("#{method}: Fallback treatment instance should be FallbackTreatment, input is discarded")
89
+ return false
90
+ end
91
+
92
+ if !fallback_treatment.treatment.is_a? String
93
+ @config.logger.warn("#{method}: Fallback treatment value should be str type, input is discarded")
94
+ return false
95
+ end
96
+
97
+ return false unless string_match?(fallback_treatment.treatment, method, Fallback_treatment_regex, :log_invalid_fallback_treatment)
98
+
99
+ if fallback_treatment.treatment.size > Fallback_treatment_size
100
+ @config.logger.warn("#{method}: Fallback treatment size should not exceed #{Fallback_treatment_size} characters")
101
+ return false
102
+ end
103
+
104
+ true
105
+ end
106
+
107
+ def valid_split_name?(method, split_name)
108
+ if split_name.nil?
109
+ log_nil(:split_name, method)
110
+ return false
111
+ end
112
+
113
+ unless string?(split_name)
114
+ log_invalid_type(:split_name, method)
115
+ return false
116
+ end
117
+
118
+ if empty_string?(split_name)
119
+ log_empty_string(:split_name, method)
120
+ return false
121
+ end
122
+
123
+ true
124
+ end
125
+
37
126
  private
38
127
 
39
128
  def string?(value)
@@ -48,43 +137,45 @@ module SplitIoClient
48
137
  (value.is_a?(Numeric) && !value.to_f.nan?) || string?(value)
49
138
  end
50
139
 
140
+ def string_match?(value, method, regex_exp, log_if_invalid)
141
+ if regex_exp.match(value) == nil
142
+ method(log_if_invalid).call(value, method)
143
+ false
144
+ else
145
+ true
146
+ end
147
+ end
148
+
149
+ def log_invalid_match(key, method)
150
+ @config.logger.error("#{method}: you passed #{key}, flag set must adhere to the regular expression #{Flagset_regex}. " +
151
+ "This means flag set must be alphanumeric, cannot be more than 50 characters long, and can only include a dash, underscore, " +
152
+ "period, or colon as separators of alphanumeric characters.")
153
+ end
154
+
51
155
  def log_nil(key, method)
52
- SplitIoClient.configuration.logger.error("#{method}: you passed a nil #{key}, #{key} must be a non-empty String or a Symbol")
156
+ msg_text = String.new("#{method}: you passed a nil #{key}, #{key} must be a non-empty String")
157
+ msg_text << " or a Symbol" if !key.equal?("flag set")
158
+ @config.logger.error(msg_text)
53
159
  end
54
160
 
55
161
  def log_empty_string(key, method)
56
- SplitIoClient.configuration.logger.error("#{method}: you passed an empty #{key}, #{key} must be a non-empty String or a Symbol")
162
+ @config.logger.error("#{method}: you passed an empty #{key}, #{key} must be a non-empty String or a Symbol")
57
163
  end
58
164
 
59
165
  def log_invalid_type(key, method)
60
- SplitIoClient.configuration.logger.error("#{method}: you passed an invalid #{key} type, #{key} must be a non-empty String or a Symbol")
166
+ @config.logger.error("#{method}: you passed an invalid #{key} type, #{key} must be a non-empty String or a Symbol")
61
167
  end
62
168
 
63
- def log_convert_numeric(key, method, value)
64
- SplitIoClient.configuration.logger.warn("#{method}: #{key} \"#{value}\" is not of type String, converting")
169
+ def log_invalid_flag_set_type(method)
170
+ @config.logger.warn("#{method}: you passed an invalid flag set type, flag set must be a non-empty String")
65
171
  end
66
172
 
67
- def log_key_too_long(key, method)
68
- SplitIoClient.configuration.logger.error("#{method}: #{key} is too long - must be #{SplitIoClient.configuration.max_key_size} characters or less")
173
+ def log_convert_numeric(key, method, value)
174
+ @config.logger.warn("#{method}: #{key} \"#{value}\" is not of type String, converting")
69
175
  end
70
176
 
71
- def valid_split_name?(method, split_name)
72
- if split_name.nil?
73
- log_nil(:split_name, method)
74
- return false
75
- end
76
-
77
- unless string?(split_name)
78
- log_invalid_type(:split_name, method)
79
- return false
80
- end
81
-
82
- if empty_string?(split_name)
83
- log_empty_string(:split_name, method)
84
- return false
85
- end
86
-
87
- true
177
+ def log_key_too_long(key, method)
178
+ @config.logger.error("#{method}: #{key} is too long - must be #{@config.max_key_size} characters or less")
88
179
  end
89
180
 
90
181
  def valid_key?(method, key)
@@ -114,7 +205,7 @@ module SplitIoClient
114
205
 
115
206
  log_convert_numeric(:matching_key, method, matching_key) if matching_key.is_a? Numeric
116
207
 
117
- if matching_key.size > SplitIoClient.configuration.max_key_size
208
+ if matching_key.size > @config.max_key_size
118
209
  log_key_too_long(:matching_key, method)
119
210
  return false
120
211
  end
@@ -141,7 +232,7 @@ module SplitIoClient
141
232
 
142
233
  log_convert_numeric(:bucketing_key, method, bucketing_key) if bucketing_key.is_a? Numeric
143
234
 
144
- if bucketing_key.size > SplitIoClient.configuration.max_key_size
235
+ if bucketing_key.size > @config.max_key_size
145
236
  log_key_too_long(:bucketing_key, method)
146
237
  return false
147
238
  end
@@ -152,7 +243,7 @@ module SplitIoClient
152
243
 
153
244
  def valid_split_names?(method, split_names)
154
245
  unless !split_names.nil? && split_names.is_a?(Array)
155
- SplitIoClient.configuration.logger.error("#{method}: split_names must be a non-empty Array")
246
+ @config.logger.error("#{method}: feature_flag_names must be a non-empty Array")
156
247
  return false
157
248
  end
158
249
 
@@ -161,7 +252,7 @@ module SplitIoClient
161
252
 
162
253
  def valid_attributes?(method, attributes)
163
254
  unless attributes.nil? || attributes.is_a?(Hash)
164
- SplitIoClient.configuration.logger.error("#{method}: attributes must be of type Hash")
255
+ @config.logger.error("#{method}: attributes must be of type Hash")
165
256
  return false
166
257
  end
167
258
 
@@ -186,7 +277,7 @@ module SplitIoClient
186
277
 
187
278
  log_convert_numeric(:key, :track, key) if key.is_a? Numeric
188
279
 
189
- if key.size > SplitIoClient.configuration.max_key_size
280
+ if key.size > @config.max_key_size
190
281
  log_key_too_long(:key, :track)
191
282
  return false
192
283
  end
@@ -211,7 +302,7 @@ module SplitIoClient
211
302
  end
212
303
 
213
304
  if (event_type.to_s =~ /^[a-zA-Z0-9][-_.:a-zA-Z0-9]{0,79}$/).nil?
214
- SplitIoClient.configuration.logger.error("track: you passed '#{event_type}', " \
305
+ @config.logger.error("track: you passed '#{event_type}', " \
215
306
  'event_type must adhere to the regular expression ^[a-zA-Z0-9][-_.:a-zA-Z0-9]{0,79}$. ' \
216
307
  'This means an event name must be alphanumeric, cannot be more than 80 characters long, ' \
217
308
  'and can only include a dash, underscore, period, or colon as separators of alphanumeric characters')
@@ -238,7 +329,7 @@ module SplitIoClient
238
329
  end
239
330
 
240
331
  unless traffic_type_name == traffic_type_name.downcase
241
- SplitIoClient.configuration.logger.warn('track: traffic_type_name should be all lowercase - ' \
332
+ @config.logger.warn('track: traffic_type_name should be all lowercase - ' \
242
333
  'converting string to lowercase')
243
334
  end
244
335
 
@@ -247,11 +338,24 @@ module SplitIoClient
247
338
 
248
339
  def valid_value?(value)
249
340
  unless (value.is_a?(Numeric) && !value.to_f.nan?) || value.nil?
250
- SplitIoClient.configuration.logger.error('track: value must be Numeric')
341
+ @config.logger.error('track: value must be Numeric')
251
342
  return false
252
343
  end
253
344
 
254
345
  true
255
346
  end
347
+
348
+ def valid_properties?(properties)
349
+ unless properties.is_a?(Hash) || properties.nil?
350
+ @config.logger.error('track: properties must be a Hash')
351
+ return false
352
+ end
353
+
354
+ true
355
+ end
356
+
357
+ def log_invalid_fallback_treatment(key, method)
358
+ @config.logger.warn("#{method}: Invalid treatment #{key}, Fallback treatment should match regex #{Fallback_treatment_regex}")
359
+ end
256
360
  end
257
361
  end
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '6.3.0'
2
+ VERSION = '8.11.0'
3
3
  end
@@ -2,6 +2,7 @@ require 'forwardable'
2
2
 
3
3
  require 'splitclient-rb/version'
4
4
 
5
+ require 'splitclient-rb/constants'
5
6
  require 'splitclient-rb/exceptions'
6
7
  require 'splitclient-rb/cache/routers/impression_router'
7
8
  require 'splitclient-rb/cache/adapters/memory_adapters/map_adapter'
@@ -9,48 +10,69 @@ require 'splitclient-rb/cache/adapters/memory_adapters/queue_adapter'
9
10
  require 'splitclient-rb/cache/adapters/cache_adapter'
10
11
  require 'splitclient-rb/cache/adapters/memory_adapter'
11
12
  require 'splitclient-rb/cache/adapters/redis_adapter'
13
+ require 'splitclient-rb/cache/fetchers/segment_fetcher'
14
+ require 'splitclient-rb/cache/fetchers/split_fetcher'
15
+ require 'splitclient-rb/cache/filter/bloom_filter'
16
+ require 'splitclient-rb/cache/filter/filter_adapter'
17
+ require 'splitclient-rb/cache/filter/flag_set_filter'
18
+ require 'splitclient-rb/cache/hashers/impression_hasher'
19
+ require 'splitclient-rb/cache/observers/impression_observer'
20
+ require 'splitclient-rb/cache/observers/noop_impression_observer'
12
21
  require 'splitclient-rb/cache/repositories/repository'
13
22
  require 'splitclient-rb/cache/repositories/segments_repository'
14
23
  require 'splitclient-rb/cache/repositories/splits_repository'
15
24
  require 'splitclient-rb/cache/repositories/events_repository'
16
25
  require 'splitclient-rb/cache/repositories/impressions_repository'
26
+ require 'splitclient-rb/cache/repositories/rule_based_segments_repository'
17
27
  require 'splitclient-rb/cache/repositories/events/memory_repository'
18
28
  require 'splitclient-rb/cache/repositories/events/redis_repository'
29
+ require 'splitclient-rb/cache/repositories/flag_sets/memory_repository'
30
+ require 'splitclient-rb/cache/repositories/flag_sets/redis_repository'
19
31
  require 'splitclient-rb/cache/repositories/impressions/memory_repository'
20
32
  require 'splitclient-rb/cache/repositories/impressions/redis_repository'
21
- require 'splitclient-rb/cache/repositories/metrics_repository'
22
- require 'splitclient-rb/cache/repositories/metrics/memory_repository'
23
- require 'splitclient-rb/cache/repositories/metrics/redis_repository'
24
33
  require 'splitclient-rb/cache/senders/impressions_formatter'
25
34
  require 'splitclient-rb/cache/senders/impressions_sender'
26
- require 'splitclient-rb/cache/senders/metrics_sender'
27
35
  require 'splitclient-rb/cache/senders/events_sender'
28
- require 'splitclient-rb/cache/stores/sdk_blocker'
29
- require 'splitclient-rb/cache/stores/segment_store'
30
- require 'splitclient-rb/cache/stores/split_store'
36
+ require 'splitclient-rb/cache/senders/impressions_count_sender'
37
+ require 'splitclient-rb/cache/senders/localhost_repo_cleaner'
38
+ require 'splitclient-rb/cache/senders/impressions_sender_adapter'
39
+ require 'splitclient-rb/cache/senders/impressions_adapter/memory_sender'
40
+ require 'splitclient-rb/cache/senders/impressions_adapter/redis_sender'
41
+ require 'splitclient-rb/cache/stores/localhost_split_builder'
42
+ require 'splitclient-rb/cache/stores/localhost_split_store'
43
+ require 'splitclient-rb/cache/stores/store_utils'
31
44
 
32
- require 'splitclient-rb/localhost_utils'
33
- require 'splitclient-rb/clients/localhost_split_client'
34
45
  require 'splitclient-rb/clients/split_client'
35
- require 'splitclient-rb/managers/localhost_split_manager'
36
46
  require 'splitclient-rb/managers/split_manager'
47
+ require 'splitclient-rb/helpers/thread_helper'
48
+ require 'splitclient-rb/helpers/decryption_helper'
49
+ require 'splitclient-rb/helpers/util'
50
+ require 'splitclient-rb/helpers/repository_helper'
51
+ require 'splitclient-rb/helpers/evaluator_helper'
37
52
  require 'splitclient-rb/split_factory'
38
53
  require 'splitclient-rb/split_factory_builder'
39
- require 'splitclient-rb/localhost_split_factory'
40
54
  require 'splitclient-rb/split_config'
41
55
  require 'splitclient-rb/split_logger'
56
+ require 'splitclient-rb/validators'
57
+ require 'splitclient-rb/split_factory_registry'
42
58
 
43
59
  require 'splitclient-rb/engine/api/faraday_middleware/gzip'
44
- require 'splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent'
45
60
  require 'splitclient-rb/engine/api/client'
46
61
  require 'splitclient-rb/engine/api/impressions'
47
- require 'splitclient-rb/engine/api/metrics'
48
62
  require 'splitclient-rb/engine/api/segments'
49
63
  require 'splitclient-rb/engine/api/splits'
50
64
  require 'splitclient-rb/engine/api/events'
65
+ require 'splitclient-rb/engine/api/telemetry_api'
66
+ require 'splitclient-rb/engine/common/impressions_counter'
67
+ require 'splitclient-rb/engine/common/impressions_manager'
68
+ require 'splitclient-rb/engine/common/noop_impressions_counter'
69
+ require 'splitclient-rb/engine/events/events_manager_config.rb'
70
+ require 'splitclient-rb/engine/events/events_manager.rb'
71
+ require 'splitclient-rb/engine/events/events_task.rb'
72
+ require 'splitclient-rb/engine/events/events_delivery.rb'
73
+ require 'splitclient-rb/engine/events/noop_events_queue.rb'
51
74
  require 'splitclient-rb/engine/parser/condition'
52
75
  require 'splitclient-rb/engine/parser/partition'
53
- require 'splitclient-rb/engine/parser/split_adapter'
54
76
  require 'splitclient-rb/engine/parser/evaluator'
55
77
  require 'splitclient-rb/engine/matchers/matcher'
56
78
  require 'splitclient-rb/engine/matchers/combiners'
@@ -75,14 +97,77 @@ require 'splitclient-rb/engine/matchers/dependency_matcher'
75
97
  require 'splitclient-rb/engine/matchers/equal_to_boolean_matcher'
76
98
  require 'splitclient-rb/engine/matchers/equal_to_matcher'
77
99
  require 'splitclient-rb/engine/matchers/matches_string_matcher'
100
+ require 'splitclient-rb/engine/matchers/semver'
101
+ require 'splitclient-rb/engine/matchers/equal_to_semver_matcher'
102
+ require 'splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher'
103
+ require 'splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher'
104
+ require 'splitclient-rb/engine/matchers/between_semver_matcher'
105
+ require 'splitclient-rb/engine/matchers/in_list_semver_matcher'
106
+ require 'splitclient-rb/engine/matchers/rule_based_segment_matcher'
107
+ require 'splitclient-rb/engine/matchers/prerequisites_matcher'
78
108
  require 'splitclient-rb/engine/evaluator/splitter'
79
- require 'splitclient-rb/engine/metrics/metrics'
109
+ require 'splitclient-rb/engine/impressions/noop_unique_keys_tracker'
110
+ require 'splitclient-rb/engine/impressions/unique_keys_tracker'
80
111
  require 'splitclient-rb/engine/metrics/binary_search_latency_tracker'
81
112
  require 'splitclient-rb/engine/models/split'
82
113
  require 'splitclient-rb/engine/models/label'
114
+ require 'splitclient-rb/engine/models/segment_type'
83
115
  require 'splitclient-rb/engine/models/treatment'
116
+ require 'splitclient-rb/engine/models/split_http_response'
117
+ require 'splitclient-rb/engine/models/evaluation_options'
118
+ require 'splitclient-rb/engine/models/fallback_treatment.rb'
119
+ require 'splitclient-rb/engine/models/fallback_treatments_configuration.rb'
120
+ require 'splitclient-rb/engine/models/events_metadata.rb'
121
+ require 'splitclient-rb/engine/models/sdk_event_type.rb'
122
+ require 'splitclient-rb/engine/models/sdk_event.rb'
123
+ require 'splitclient-rb/engine/models/sdk_internal_event.rb'
124
+ require 'splitclient-rb/engine/models/sdk_internal_event_notification.rb'
125
+ require 'splitclient-rb/engine/models/valid_sdk_event.rb'
126
+ require 'splitclient-rb/engine/models/event_active_subscriptions.rb'
127
+ require 'splitclient-rb/engine/auth_api_client'
128
+ require 'splitclient-rb/engine/back_off'
129
+ require 'splitclient-rb/engine/fallback_treatment_calculator.rb'
130
+ require 'splitclient-rb/engine/push_manager'
131
+ require 'splitclient-rb/engine/status_manager'
132
+ require 'splitclient-rb/engine/sync_manager'
133
+ require 'splitclient-rb/engine/synchronizer'
84
134
  require 'splitclient-rb/utilitites'
85
- require 'splitclient-rb/validators'
135
+
136
+ require 'splitclient-rb/spec.rb'
137
+
138
+ # SSE
139
+ require 'splitclient-rb/sse/event_source/client'
140
+ require 'splitclient-rb/sse/event_source/event_parser'
141
+ require 'splitclient-rb/sse/event_source/event_types'
142
+ require 'splitclient-rb/sse/event_source/stream_data'
143
+ require 'splitclient-rb/sse/workers/segments_worker'
144
+ require 'splitclient-rb/sse/workers/splits_worker'
145
+ require 'splitclient-rb/sse/notification_manager_keeper'
146
+ require 'splitclient-rb/sse/notification_processor'
147
+ require 'splitclient-rb/sse/sse_handler'
148
+
149
+ # Telemetry
150
+ require 'splitclient-rb/telemetry/domain/constants'
151
+ require 'splitclient-rb/telemetry/domain/structs'
152
+ require 'splitclient-rb/telemetry/storages/memory'
153
+ require 'splitclient-rb/telemetry/evaluation_consumer'
154
+ require 'splitclient-rb/telemetry/evaluation_producer'
155
+ require 'splitclient-rb/telemetry/init_consumer'
156
+ require 'splitclient-rb/telemetry/init_producer'
157
+ require 'splitclient-rb/telemetry/runtime_consumer'
158
+ require 'splitclient-rb/telemetry/runtime_producer'
159
+ require 'splitclient-rb/telemetry/sync_task'
160
+ require 'splitclient-rb/telemetry/synchronizer'
161
+ require 'splitclient-rb/telemetry/memory/memory_evaluation_consumer'
162
+ require 'splitclient-rb/telemetry/memory/memory_evaluation_producer'
163
+ require 'splitclient-rb/telemetry/memory/memory_init_consumer'
164
+ require 'splitclient-rb/telemetry/memory/memory_init_producer'
165
+ require 'splitclient-rb/telemetry/memory/memory_runtime_consumer'
166
+ require 'splitclient-rb/telemetry/memory/memory_runtime_producer'
167
+ require 'splitclient-rb/telemetry/memory/memory_synchronizer'
168
+ require 'splitclient-rb/telemetry/redis/redis_evaluation_producer'
169
+ require 'splitclient-rb/telemetry/redis/redis_init_producer'
170
+ require 'splitclient-rb/telemetry/redis/redis_synchronizer'
86
171
 
87
172
  # C extension
88
173
  require 'murmurhash/murmurhash_mri'
@@ -0,0 +1,6 @@
1
+ sonar.projectKey=ruby-client
2
+ sonar.projectKey=ruby-client
3
+ sonar.sources=lib
4
+ sonar.tests=spec
5
+ sonar.java.source=17
6
+ sonar.ruby.coverage.reportPaths=coverage/.resultset.sonarqube.json
@@ -8,16 +8,15 @@ Gem::Specification.new do |spec|
8
8
  spec.name = 'splitclient-rb'
9
9
  spec.version = SplitIoClient::VERSION
10
10
  spec.authors = ['Split Software']
11
- spec.email = ['pato@split.io']
12
-
11
+ spec.email = ['mauro.sanz@split.io']
13
12
  spec.summary = 'Ruby client for split SDK.'
14
13
  spec.description = 'Ruby client for using split SDK.'
15
14
  spec.homepage = 'https://github.com/splitio/ruby-client'
16
- spec.license = 'Apache 2.0'
15
+ spec.license = 'Apache-2.0'
17
16
 
18
17
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|features|ext)/}) }
19
-
20
18
  spec.require_paths = ['lib']
19
+ spec.required_ruby_version = '>= 2.5.0'
21
20
 
22
21
  if defined?(JRUBY_VERSION)
23
22
  spec.platform = 'java'
@@ -28,6 +27,7 @@ Gem::Specification.new do |spec|
28
27
  else
29
28
  spec.files.concat(
30
29
  %w[ext/murmurhash/3_x86_32.c
30
+ ext/murmurhash/3_x64_128.c
31
31
  ext/murmurhash/extconf.rb
32
32
  ext/murmurhash/murmurhash.c
33
33
  ext/murmurhash/murmurhash.h]
@@ -35,24 +35,29 @@ Gem::Specification.new do |spec|
35
35
  spec.extensions = ['ext/murmurhash/extconf.rb']
36
36
  end
37
37
 
38
- spec.add_development_dependency 'allocation_stats'
39
- spec.add_development_dependency 'appraisal'
40
- spec.add_development_dependency 'bundler', '~> 1.11'
41
- spec.add_development_dependency 'pry'
42
- spec.add_development_dependency 'pry-nav'
43
- spec.add_development_dependency 'rake', '~> 10.0'
44
- spec.add_development_dependency 'rake-compiler'
45
- spec.add_development_dependency 'rspec'
46
- spec.add_development_dependency 'rubocop', '0.59.0'
47
- spec.add_development_dependency 'simplecov'
48
- spec.add_development_dependency 'timecop'
49
- spec.add_development_dependency 'webmock'
50
-
38
+ spec.add_development_dependency 'allocation_stats', '~> 0.1'
39
+ spec.add_development_dependency 'bundler', '~> 2.2'
40
+ spec.add_development_dependency 'byebug', '~> 11.1'
41
+ spec.add_development_dependency 'pry', '~> 0.14'
42
+ spec.add_development_dependency 'pry-nav', '~> 1.0'
43
+ spec.add_development_dependency 'rake', '~> 13.0'
44
+ spec.add_development_dependency 'rake-compiler', '~> 1.1'
45
+ spec.add_development_dependency 'rspec', '~> 3.10'
46
+ spec.add_development_dependency 'rubocop', '1.28.2'
47
+ spec.add_development_dependency 'simplecov', '~> 0.20'
48
+ spec.add_development_dependency 'simplecov-json', '~> 0.2'
49
+ spec.add_development_dependency 'timecop', '~> 0.9'
50
+ spec.add_development_dependency 'webmock', '~> 3.24'
51
+ spec.add_development_dependency 'webrick', '~> 1.8.2'
52
+
53
+ spec.add_runtime_dependency 'bitarray', '~> 1.3'
51
54
  spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
52
- spec.add_runtime_dependency 'faraday', '>= 0.8'
53
- spec.add_runtime_dependency 'json', '>= 1.8'
54
- spec.add_runtime_dependency 'lru_redux'
55
- spec.add_runtime_dependency 'net-http-persistent', '>= 2.9'
56
- spec.add_runtime_dependency 'redis', '>= 3.2'
57
- spec.add_runtime_dependency 'thread_safe', '>= 0.3'
55
+ spec.add_runtime_dependency 'faraday', '>= 1.1', '< 3.0'
56
+ spec.add_runtime_dependency 'faraday-net_http_persistent', '>= 1.0', '< 3.0'
57
+ spec.add_runtime_dependency 'json', '>= 1.8', '< 3.0'
58
+ spec.add_runtime_dependency 'jwt', '>= 3.1'
59
+ spec.add_runtime_dependency 'lru_redux', '~> 1.1'
60
+ spec.add_runtime_dependency 'net-http-persistent', '>= 2.9', '< 5.0'
61
+ spec.add_runtime_dependency 'redis', '>= 4.0.0', '< 6.0'
62
+ spec.add_runtime_dependency 'thread_safe', '~> 0.3'
58
63
  end