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.
- checksums.yaml +5 -5
- data/.github/CODEOWNERS +1 -0
- data/.github/pull_request_template.md +9 -0
- data/.github/workflows/ci.yml +90 -0
- data/.github/workflows/update-license-year.yml +45 -0
- data/.gitignore +20 -0
- data/.rubocop.yml +76 -0
- data/.simplecov +1 -0
- data/CHANGES.txt +361 -2
- data/CONTRIBUTORS-GUIDE.md +49 -0
- data/Gemfile +2 -0
- data/LICENSE +3 -36
- data/NOTICE.txt +5 -0
- data/README.md +59 -127
- data/Rakefile +27 -3
- data/ext/murmurhash/MurmurHash3.java +302 -0
- data/gemfiles/faraday_after_0.13.gemfile +7 -0
- data/gemfiles/faraday_before_0.13.gemfile +8 -0
- data/lib/murmurhash/base.rb +58 -0
- data/lib/murmurhash/murmurhash.jar +0 -0
- data/lib/murmurhash/murmurhash_mri.rb +3 -0
- data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +130 -0
- data/lib/splitclient-rb/cache/adapters/memory_adapter.rb +12 -0
- data/lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb +137 -0
- data/lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb +53 -0
- data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +178 -0
- data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +83 -0
- data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +70 -0
- data/lib/splitclient-rb/cache/filter/bloom_filter.rb +67 -0
- data/lib/splitclient-rb/cache/filter/filter_adapter.rb +32 -0
- data/lib/splitclient-rb/cache/filter/flag_set_filter.rb +40 -0
- data/lib/splitclient-rb/cache/hashers/impression_hasher.rb +34 -0
- data/lib/splitclient-rb/cache/observers/impression_observer.rb +22 -0
- data/lib/splitclient-rb/cache/observers/noop_impression_observer.rb +10 -0
- data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +45 -0
- data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +35 -0
- data/lib/splitclient-rb/cache/repositories/events_repository.rb +61 -0
- data/lib/splitclient-rb/cache/repositories/flag_sets/memory_repository.rb +40 -0
- data/lib/splitclient-rb/cache/repositories/flag_sets/redis_repository.rb +49 -0
- data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +56 -0
- data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +57 -0
- data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +23 -0
- data/lib/splitclient-rb/cache/repositories/repository.rb +24 -0
- data/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +136 -0
- data/lib/splitclient-rb/cache/repositories/segments_repository.rb +124 -0
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +296 -0
- data/lib/splitclient-rb/cache/routers/impression_router.rb +60 -0
- data/lib/splitclient-rb/cache/senders/events_sender.rb +42 -0
- data/lib/splitclient-rb/cache/senders/impressions_adapter/memory_sender.rb +71 -0
- data/lib/splitclient-rb/cache/senders/impressions_adapter/redis_sender.rb +69 -0
- data/lib/splitclient-rb/cache/senders/impressions_count_sender.rb +43 -0
- data/lib/splitclient-rb/cache/senders/impressions_formatter.rb +95 -0
- data/lib/splitclient-rb/cache/senders/impressions_sender.rb +52 -0
- data/lib/splitclient-rb/cache/senders/impressions_sender_adapter.rb +21 -0
- data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +47 -0
- data/lib/splitclient-rb/cache/stores/localhost_split_builder.rb +95 -0
- data/lib/splitclient-rb/cache/stores/localhost_split_store.rb +110 -0
- data/lib/splitclient-rb/cache/stores/store_utils.rb +13 -0
- data/lib/splitclient-rb/clients/split_client.rb +530 -0
- data/lib/splitclient-rb/constants.rb +16 -0
- data/lib/splitclient-rb/engine/api/client.rb +87 -0
- data/lib/splitclient-rb/engine/api/events.rb +57 -0
- data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +58 -0
- data/lib/splitclient-rb/engine/api/impressions.rb +79 -0
- data/lib/splitclient-rb/engine/api/segments.rb +78 -0
- data/lib/splitclient-rb/engine/api/splits.rb +139 -0
- data/lib/splitclient-rb/engine/api/telemetry_api.rb +47 -0
- data/lib/splitclient-rb/engine/auth_api_client.rb +100 -0
- data/lib/splitclient-rb/engine/back_off.rb +26 -0
- data/lib/splitclient-rb/engine/common/impressions_counter.rb +45 -0
- data/lib/splitclient-rb/engine/common/impressions_manager.rb +165 -0
- data/lib/splitclient-rb/engine/common/noop_impressions_counter.rb +27 -0
- data/lib/{splitclient-engine → splitclient-rb/engine}/evaluator/splitter.rb +35 -22
- data/lib/splitclient-rb/engine/events/events_delivery.rb +20 -0
- data/lib/splitclient-rb/engine/events/events_manager.rb +194 -0
- data/lib/splitclient-rb/engine/events/events_manager_config.rb +96 -0
- data/lib/splitclient-rb/engine/events/events_task.rb +50 -0
- data/lib/splitclient-rb/engine/events/noop_events_queue.rb +13 -0
- data/lib/splitclient-rb/engine/fallback_treatment_calculator.rb +48 -0
- data/lib/splitclient-rb/engine/impressions/noop_unique_keys_tracker.rb +17 -0
- data/lib/splitclient-rb/engine/impressions/unique_keys_tracker.rb +144 -0
- data/lib/{splitclient-engine → splitclient-rb/engine}/matchers/all_keys_matcher.rb +10 -21
- data/lib/splitclient-rb/engine/matchers/between_matcher.rb +47 -0
- data/lib/splitclient-rb/engine/matchers/between_semver_matcher.rb +33 -0
- data/lib/{splitclient-engine → splitclient-rb/engine}/matchers/combiners.rb +4 -6
- data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +80 -0
- data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +20 -0
- data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +16 -0
- data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +43 -0
- data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +26 -0
- data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +42 -0
- data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +37 -0
- data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +44 -0
- data/lib/splitclient-rb/engine/matchers/equal_to_semver_matcher.rb +28 -0
- data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +16 -0
- data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +43 -0
- data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher.rb +28 -0
- data/lib/splitclient-rb/engine/matchers/in_list_semver_matcher.rb +36 -0
- data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +43 -0
- data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher.rb +28 -0
- data/lib/splitclient-rb/engine/matchers/matcher.rb +52 -0
- data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +29 -0
- data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +47 -0
- data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +22 -0
- data/lib/splitclient-rb/engine/matchers/prerequisites_matcher.rb +31 -0
- data/lib/splitclient-rb/engine/matchers/rule_based_segment_matcher.rb +78 -0
- data/lib/splitclient-rb/engine/matchers/semver.rb +201 -0
- data/lib/splitclient-rb/engine/matchers/set_matcher.rb +27 -0
- data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +40 -0
- data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +28 -0
- data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +66 -0
- data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +66 -0
- data/lib/splitclient-rb/engine/models/evaluation_options.rb +9 -0
- data/lib/splitclient-rb/engine/models/event_active_subscriptions.rb +14 -0
- data/lib/splitclient-rb/engine/models/events_metadata.rb +10 -0
- data/lib/splitclient-rb/engine/models/fallback_treatment.rb +11 -0
- data/lib/splitclient-rb/engine/models/fallback_treatments_configuration.rb +36 -0
- data/lib/splitclient-rb/engine/models/label.rb +10 -0
- data/lib/splitclient-rb/engine/models/sdk_event.rb +4 -0
- data/lib/splitclient-rb/engine/models/sdk_event_type.rb +4 -0
- data/lib/splitclient-rb/engine/models/sdk_internal_event.rb +8 -0
- data/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb +16 -0
- data/lib/splitclient-rb/engine/models/segment_type.rb +4 -0
- data/lib/splitclient-rb/engine/models/split.rb +17 -0
- data/lib/splitclient-rb/engine/models/split_http_response.rb +19 -0
- data/lib/splitclient-rb/engine/models/treatment.rb +3 -0
- data/lib/splitclient-rb/engine/models/valid_sdk_event.rb +14 -0
- data/lib/splitclient-rb/engine/parser/condition.rb +271 -0
- data/lib/splitclient-rb/engine/parser/evaluator.rb +112 -0
- data/lib/{splitclient-engine → splitclient-rb/engine}/parser/partition.rb +2 -4
- data/lib/splitclient-rb/engine/push_manager.rb +66 -0
- data/lib/splitclient-rb/engine/status_manager.rb +39 -0
- data/lib/splitclient-rb/engine/sync_manager.rb +183 -0
- data/lib/splitclient-rb/engine/synchronizer.rb +231 -0
- data/lib/splitclient-rb/exceptions.rb +26 -0
- data/lib/splitclient-rb/helpers/decryption_helper.rb +25 -0
- data/lib/splitclient-rb/helpers/evaluator_helper.rb +37 -0
- data/lib/splitclient-rb/helpers/repository_helper.rb +61 -0
- data/lib/splitclient-rb/helpers/thread_helper.rb +24 -0
- data/lib/splitclient-rb/helpers/util.rb +26 -0
- data/lib/splitclient-rb/managers/split_manager.rb +121 -0
- data/lib/splitclient-rb/spec.rb +9 -0
- data/lib/splitclient-rb/split_config.rb +591 -47
- data/lib/splitclient-rb/split_factory.rb +284 -0
- data/lib/splitclient-rb/split_factory_builder.rb +7 -0
- data/lib/splitclient-rb/split_factory_registry.rb +63 -0
- data/lib/splitclient-rb/split_logger.rb +23 -0
- data/lib/splitclient-rb/sse/event_source/client.rb +264 -0
- data/lib/splitclient-rb/sse/event_source/event_parser.rb +65 -0
- data/lib/splitclient-rb/sse/event_source/event_types.rb +15 -0
- data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
- data/lib/splitclient-rb/sse/notification_manager_keeper.rb +84 -0
- data/lib/splitclient-rb/sse/notification_processor.rb +48 -0
- data/lib/splitclient-rb/sse/sse_handler.rb +44 -0
- data/lib/splitclient-rb/sse/workers/segments_worker.rb +62 -0
- data/lib/splitclient-rb/sse/workers/splits_worker.rb +153 -0
- data/lib/splitclient-rb/telemetry/domain/constants.rb +48 -0
- data/lib/splitclient-rb/telemetry/domain/structs.rb +35 -0
- data/lib/splitclient-rb/telemetry/evaluation_consumer.rb +14 -0
- data/lib/splitclient-rb/telemetry/evaluation_producer.rb +21 -0
- data/lib/splitclient-rb/telemetry/init_consumer.rb +14 -0
- data/lib/splitclient-rb/telemetry/init_producer.rb +19 -0
- data/lib/splitclient-rb/telemetry/memory/memory_evaluation_consumer.rb +32 -0
- data/lib/splitclient-rb/telemetry/memory/memory_evaluation_producer.rb +24 -0
- data/lib/splitclient-rb/telemetry/memory/memory_init_consumer.rb +28 -0
- data/lib/splitclient-rb/telemetry/memory/memory_init_producer.rb +34 -0
- data/lib/splitclient-rb/telemetry/memory/memory_runtime_consumer.rb +119 -0
- data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +87 -0
- data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +213 -0
- data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +38 -0
- data/lib/splitclient-rb/telemetry/redis/redis_init_producer.rb +37 -0
- data/lib/splitclient-rb/telemetry/redis/redis_synchronizer.rb +27 -0
- data/lib/splitclient-rb/telemetry/runtime_consumer.rb +25 -0
- data/lib/splitclient-rb/telemetry/runtime_producer.rb +25 -0
- data/lib/splitclient-rb/telemetry/storages/memory.rb +159 -0
- data/lib/splitclient-rb/telemetry/sync_task.rb +36 -0
- data/lib/splitclient-rb/telemetry/synchronizer.rb +33 -0
- data/lib/splitclient-rb/utilitites.rb +49 -0
- data/lib/splitclient-rb/validators.rb +361 -0
- data/lib/splitclient-rb/version.rb +1 -1
- data/lib/splitclient-rb.rb +177 -25
- data/sonar-project.properties +6 -0
- data/splitclient-rb.gemspec +53 -26
- data/tasks/benchmark_get_treatment.rake +31 -17
- data/tasks/irb.rake +6 -0
- metadata +411 -86
- data/NEWS +0 -9
- data/lib/splitclient-cache/local_store.rb +0 -45
- data/lib/splitclient-engine/impressions/impressions.rb +0 -79
- data/lib/splitclient-engine/matchers/between_matcher.rb +0 -48
- data/lib/splitclient-engine/matchers/combining_matcher.rb +0 -94
- data/lib/splitclient-engine/matchers/equal_to_matcher.rb +0 -48
- data/lib/splitclient-engine/matchers/greater_than_or_equal_to_matcher.rb +0 -48
- data/lib/splitclient-engine/matchers/less_than_or_equal_to_matcher.rb +0 -48
- data/lib/splitclient-engine/matchers/negation_matcher.rb +0 -54
- data/lib/splitclient-engine/matchers/user_defined_segment_matcher.rb +0 -61
- data/lib/splitclient-engine/matchers/whitelist_matcher.rb +0 -64
- data/lib/splitclient-engine/metrics/binary_search_latency_tracker.rb +0 -122
- data/lib/splitclient-engine/metrics/metrics.rb +0 -158
- data/lib/splitclient-engine/parser/condition.rb +0 -143
- data/lib/splitclient-engine/parser/segment.rb +0 -84
- data/lib/splitclient-engine/parser/segment_parser.rb +0 -46
- data/lib/splitclient-engine/parser/split.rb +0 -68
- data/lib/splitclient-engine/parser/split_adapter.rb +0 -433
- data/lib/splitclient-engine/parser/split_parser.rb +0 -139
- data/lib/splitclient-engine/partitions/treatments.rb +0 -40
- data/lib/splitclient-rb/split_client.rb +0 -156
- data/lib/splitclient-rb_utilitites.rb +0 -26
- data/tasks/console.rake +0 -4
- 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,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,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,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,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
|