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
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
module SplitIoClient
|
|
2
|
-
|
|
3
|
-
#
|
|
4
|
-
# class to handle cached metrics
|
|
5
|
-
#
|
|
6
|
-
class Metrics < NoMethodError
|
|
7
|
-
|
|
8
|
-
@counter
|
|
9
|
-
@delta
|
|
10
|
-
|
|
11
|
-
#
|
|
12
|
-
# cached latencies
|
|
13
|
-
#
|
|
14
|
-
# @return [object] array of latencies
|
|
15
|
-
attr_accessor :latencies
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
# cached counts
|
|
19
|
-
#
|
|
20
|
-
# @return [object] array of counts
|
|
21
|
-
attr_accessor :counts
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
# cached gauges
|
|
25
|
-
#
|
|
26
|
-
# @return [object] array of gauges
|
|
27
|
-
attr_accessor :gauges
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
# quese size for cached arrays
|
|
31
|
-
#
|
|
32
|
-
# @return [int] queue size
|
|
33
|
-
attr_accessor :queue_size
|
|
34
|
-
|
|
35
|
-
def initialize(queue_size)
|
|
36
|
-
@latencies = []
|
|
37
|
-
@counts = []
|
|
38
|
-
@gauges = []
|
|
39
|
-
@queue_size = queue_size
|
|
40
|
-
@binary_search = SplitIoClient::BinarySearchLatencyTracker.new
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
#
|
|
44
|
-
# creates a new entry in the array for cached counts
|
|
45
|
-
#
|
|
46
|
-
# @param counter [string] name of the counter
|
|
47
|
-
# @delta [int] value of the counter
|
|
48
|
-
#
|
|
49
|
-
# @return void
|
|
50
|
-
def count(counter, delta)
|
|
51
|
-
return if delta <= 0
|
|
52
|
-
|
|
53
|
-
return if (counter.nil? || counter.strip.empty?)
|
|
54
|
-
|
|
55
|
-
counter_hash = @counts.find { |c| c[:name] == counter }
|
|
56
|
-
if counter_hash.nil?
|
|
57
|
-
counter_delta = SumAndCount.new
|
|
58
|
-
counter_delta.add_delta(delta)
|
|
59
|
-
@counts << {name: counter, delta: counter_delta}
|
|
60
|
-
else
|
|
61
|
-
counter_hash[:delta].add_delta(delta)
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
#
|
|
66
|
-
# creates a new entry in the array for cached time metrics
|
|
67
|
-
#
|
|
68
|
-
# @param operation [string] name of the operation
|
|
69
|
-
# @time_in_ms [number] time in miliseconds
|
|
70
|
-
#
|
|
71
|
-
# @return void
|
|
72
|
-
def time(operation, time_in_ms)
|
|
73
|
-
|
|
74
|
-
if operation.nil? || operation.empty? || time_in_ms < 0
|
|
75
|
-
return;
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
operation_hash = @latencies.find { |l| l[:operation] == operation }
|
|
79
|
-
if operation_hash.nil?
|
|
80
|
-
latencies_for_op = (operation == 'sdk.get_treatment') ? @binary_search.add_latency_millis(time_in_ms) : [time_in_ms]
|
|
81
|
-
@latencies << {operation: operation, latencies: latencies_for_op}
|
|
82
|
-
else
|
|
83
|
-
latencies_for_op = (operation == 'sdk.get_treatment') ? @binary_search.add_latency_millis(time_in_ms) : operation_hash[:latencies].push(time_in_ms)
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
#
|
|
88
|
-
# creates a new entry in the array for cached gauges
|
|
89
|
-
#
|
|
90
|
-
# @param gauge [string] name of the gauge
|
|
91
|
-
# @value [number] value of the gauge
|
|
92
|
-
#
|
|
93
|
-
# @return void
|
|
94
|
-
def gauge(gauge, value)
|
|
95
|
-
if gauge.nil? || gauge.empty?
|
|
96
|
-
return
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
gauge_hash = @gauges.find { |g| g[:name] == gauge }
|
|
100
|
-
if gauge_hash.nil?
|
|
101
|
-
gauge_value = ValueAndCount.new
|
|
102
|
-
gauge_value.set_value(value)
|
|
103
|
-
@gauges << {name: gauge, value: gauge_value}
|
|
104
|
-
else
|
|
105
|
-
gauge_hash[:value].set_value(value)
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
#
|
|
112
|
-
# small class to act as DTO for counts
|
|
113
|
-
#
|
|
114
|
-
class SumAndCount
|
|
115
|
-
attr_reader :count
|
|
116
|
-
attr_reader :sum
|
|
117
|
-
|
|
118
|
-
def initialize
|
|
119
|
-
@count = 0
|
|
120
|
-
@sum = 0
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def add_delta(delta)
|
|
124
|
-
@count++
|
|
125
|
-
@sum += delta
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def clear
|
|
129
|
-
@count = 0
|
|
130
|
-
@sum = 0
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
#
|
|
135
|
-
# small class to act as DTO for gauges
|
|
136
|
-
#
|
|
137
|
-
class ValueAndCount
|
|
138
|
-
attr_reader :count
|
|
139
|
-
attr_reader :value
|
|
140
|
-
|
|
141
|
-
def initialize
|
|
142
|
-
@count = 0
|
|
143
|
-
@value = 0
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def set_value(value)
|
|
147
|
-
@count += 1
|
|
148
|
-
@value = value
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def clear
|
|
152
|
-
@count = 0
|
|
153
|
-
@value = 0
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
end
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
module SplitIoClient
|
|
2
|
-
|
|
3
|
-
#
|
|
4
|
-
# acts as dto for a condition structure
|
|
5
|
-
#
|
|
6
|
-
class Condition < NoMethodError
|
|
7
|
-
|
|
8
|
-
#
|
|
9
|
-
# definition of the condition
|
|
10
|
-
#
|
|
11
|
-
# @returns [object] condition values
|
|
12
|
-
attr_accessor :data
|
|
13
|
-
|
|
14
|
-
def initialize(condition)
|
|
15
|
-
@data = condition
|
|
16
|
-
@partitions = set_partitions
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
#
|
|
20
|
-
# @return [object] the combiner value for this condition
|
|
21
|
-
def combiner
|
|
22
|
-
@data[:matcherGroup][:combiner]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
#
|
|
26
|
-
# @return [object] the matcher value for this condition
|
|
27
|
-
def matcher
|
|
28
|
-
@data[:matcherGroup][:matchers].first[:matcherType]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
# @return [object] the matchers array value for this condition
|
|
33
|
-
def matchers
|
|
34
|
-
@data[:matcherGroup][:matchers]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
#
|
|
38
|
-
# @return [object] the segment for this condition in case it has a segment matcher
|
|
39
|
-
def matcher_segment
|
|
40
|
-
result = nil
|
|
41
|
-
if self.matcher == 'IN_SEGMENT'
|
|
42
|
-
result = (@data[:matcherGroup][:matchers].first[:userDefinedSegmentMatcherData])[:segmentName]
|
|
43
|
-
end
|
|
44
|
-
result
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
#
|
|
48
|
-
# @return [object] the whitelist for this condition in case it has a whitelist matcher
|
|
49
|
-
def matcher_whitelist
|
|
50
|
-
result = nil
|
|
51
|
-
if self.matcher == 'WHITELIST'
|
|
52
|
-
is_user_whitelist = ( (@data[:matcherGroup][:matchers].first[:keySelector]).nil? || (@data[:matcherGroup][:matchers].first[:keySelector])[:attribute].nil? )
|
|
53
|
-
#is_attribute_whitelist? = !is_user_whitelist?
|
|
54
|
-
if is_user_whitelist
|
|
55
|
-
result = (@data[:matcherGroup][:matchers].first[:whitelistMatcherData])[:whitelist]
|
|
56
|
-
else
|
|
57
|
-
attribute = (@data[:matcherGroup][:matchers].first[:keySelector])[:attribute]
|
|
58
|
-
white_list = (@data[:matcherGroup][:matchers].first[:whitelistMatcherData])[:whitelist]
|
|
59
|
-
result = {attribute: attribute, value: white_list}
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
result
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def matcher_equal
|
|
66
|
-
result = nil
|
|
67
|
-
if self.matcher == 'EQUAL_TO'
|
|
68
|
-
attribute = (@data[:matcherGroup][:matchers].first[:keySelector])[:attribute]
|
|
69
|
-
value = (@data[:matcherGroup][:matchers].first[:unaryNumericMatcherData])[:value]
|
|
70
|
-
data_type = (@data[:matcherGroup][:matchers].first[:unaryNumericMatcherData])[:dataType]
|
|
71
|
-
result = {attribute: attribute, value: value, data_type: data_type}
|
|
72
|
-
end
|
|
73
|
-
result
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def matcher_greater_than_or_equal
|
|
77
|
-
result = nil
|
|
78
|
-
if self.matcher == 'GREATER_THAN_OR_EQUAL_TO'
|
|
79
|
-
attribute = (@data[:matcherGroup][:matchers].first[:keySelector])[:attribute]
|
|
80
|
-
value = (@data[:matcherGroup][:matchers].first[:unaryNumericMatcherData])[:value]
|
|
81
|
-
data_type = (@data[:matcherGroup][:matchers].first[:unaryNumericMatcherData])[:dataType]
|
|
82
|
-
result = {attribute: attribute, value: value, data_type: data_type}
|
|
83
|
-
end
|
|
84
|
-
result
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def matcher_less_than_or_equal
|
|
88
|
-
result = nil
|
|
89
|
-
if self.matcher == 'LESS_THAN_OR_EQUAL_TO'
|
|
90
|
-
attribute = (@data[:matcherGroup][:matchers].first[:keySelector])[:attribute]
|
|
91
|
-
value = (@data[:matcherGroup][:matchers].first[:unaryNumericMatcherData])[:value]
|
|
92
|
-
data_type = (@data[:matcherGroup][:matchers].first[:unaryNumericMatcherData])[:dataType]
|
|
93
|
-
result = {attribute: attribute, value: value, data_type: data_type}
|
|
94
|
-
end
|
|
95
|
-
result
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def matcher_between
|
|
99
|
-
result = nil
|
|
100
|
-
if self.matcher == 'BETWEEN'
|
|
101
|
-
attribute = (@data[:matcherGroup][:matchers].first[:keySelector])[:attribute]
|
|
102
|
-
start_value = (@data[:matcherGroup][:matchers].first[:betweenMatcherData])[:start]
|
|
103
|
-
end_value = (@data[:matcherGroup][:matchers].first[:betweenMatcherData])[:end]
|
|
104
|
-
data_type = (@data[:matcherGroup][:matchers].first[:betweenMatcherData])[:dataType]
|
|
105
|
-
result = {attribute: attribute, start_value: start_value, end_value: end_value, data_type: data_type}
|
|
106
|
-
end
|
|
107
|
-
result
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
#
|
|
111
|
-
# @return [object] the negate value for this condition
|
|
112
|
-
def negate
|
|
113
|
-
@data[:matcherGroup][:matchers].first[:negate]
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
#
|
|
117
|
-
# @return [object] the array of partitions for this condition
|
|
118
|
-
def partitions
|
|
119
|
-
@partitions
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
#
|
|
123
|
-
# converts the partitions hash for this condition into an array of partition objects
|
|
124
|
-
#
|
|
125
|
-
# @return [void]
|
|
126
|
-
def set_partitions
|
|
127
|
-
partitions_list = []
|
|
128
|
-
@data[:partitions].each do |p|
|
|
129
|
-
partition = SplitIoClient::Partition.new(p)
|
|
130
|
-
partitions_list << partition
|
|
131
|
-
end
|
|
132
|
-
partitions_list
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
#
|
|
136
|
-
# @return [boolean] true if the condition is empty false otherwise
|
|
137
|
-
def is_empty?
|
|
138
|
-
@data.empty? ? true : false
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
end
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
module SplitIoClient
|
|
2
|
-
|
|
3
|
-
#
|
|
4
|
-
# acts as dto for a segment structure
|
|
5
|
-
#
|
|
6
|
-
class Segment < NoMethodError
|
|
7
|
-
#
|
|
8
|
-
# definition of the segment
|
|
9
|
-
#
|
|
10
|
-
# @returns [object] segment values
|
|
11
|
-
attr_accessor :data
|
|
12
|
-
|
|
13
|
-
#
|
|
14
|
-
# users for the segment
|
|
15
|
-
#
|
|
16
|
-
# @returns [object] array of user keys
|
|
17
|
-
attr_accessor :users
|
|
18
|
-
|
|
19
|
-
#
|
|
20
|
-
# added users for the segment in a given time
|
|
21
|
-
#
|
|
22
|
-
# @returns [object] array of user keys that were added after the last segment fetch
|
|
23
|
-
attr_accessor :added
|
|
24
|
-
|
|
25
|
-
#
|
|
26
|
-
# removed users for the segment in a given time
|
|
27
|
-
#
|
|
28
|
-
# @returns [object] array of user keys that were removed after the last segment fetch
|
|
29
|
-
attr_accessor :removed
|
|
30
|
-
|
|
31
|
-
def initialize(segment)
|
|
32
|
-
@data = segment
|
|
33
|
-
@added = @data[:added]
|
|
34
|
-
@removed = @data[:removed]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
#
|
|
38
|
-
# @returns [string] name of the segment
|
|
39
|
-
def name
|
|
40
|
-
@data[:name]
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
#
|
|
44
|
-
# @returns [int] since value fo the segment
|
|
45
|
-
def since
|
|
46
|
-
@data[:since]
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
#
|
|
50
|
-
# @returns [int] till value fo the segment
|
|
51
|
-
def till
|
|
52
|
-
@data[:till]
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
#
|
|
56
|
-
# @return [boolean] true if the condition is empty false otherwise
|
|
57
|
-
def is_empty?
|
|
58
|
-
@data.empty? ? true : false
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
#
|
|
62
|
-
# updates the array of user keys valid for the segment, it's used after each segment fetch
|
|
63
|
-
#
|
|
64
|
-
# @param added [object] array of added user keys
|
|
65
|
-
# @param removed [object] array of removed user keys
|
|
66
|
-
#
|
|
67
|
-
# @return [void]
|
|
68
|
-
def refresh_users(added, removed)
|
|
69
|
-
if @users.nil?
|
|
70
|
-
@users = self.added
|
|
71
|
-
else
|
|
72
|
-
@added = added unless added.empty?
|
|
73
|
-
@removed = removed unless removed.empty?
|
|
74
|
-
self.removed.each do |r|
|
|
75
|
-
@users.delete_if { |u| u == r }
|
|
76
|
-
end
|
|
77
|
-
self.added.each do |a|
|
|
78
|
-
@users << a unless @users.include?(a)
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
end
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
module SplitIoClient
|
|
2
|
-
#
|
|
3
|
-
# helper class to parse fetched segments
|
|
4
|
-
#
|
|
5
|
-
class SegmentParser < NoMethodError
|
|
6
|
-
#
|
|
7
|
-
# segments data
|
|
8
|
-
attr_accessor :segments
|
|
9
|
-
|
|
10
|
-
#
|
|
11
|
-
# since value for segments
|
|
12
|
-
attr_accessor :since
|
|
13
|
-
|
|
14
|
-
def initialize(logger)
|
|
15
|
-
@segments = []
|
|
16
|
-
@since = -1
|
|
17
|
-
@logger = logger
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
#
|
|
21
|
-
# method to get a segment by name
|
|
22
|
-
#
|
|
23
|
-
# @param name [string] segment name
|
|
24
|
-
#
|
|
25
|
-
# @return [object] segment object
|
|
26
|
-
def get_segment(name)
|
|
27
|
-
@segments.find { |s| s.name == name }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
#
|
|
31
|
-
# method to get all segment names within the structure
|
|
32
|
-
#
|
|
33
|
-
# @return [object] array of segment names
|
|
34
|
-
def get_segment_names
|
|
35
|
-
@segments.map { |seg| seg.name }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
#
|
|
39
|
-
# @return [boolean] true if the segment parser data is empty false otherwise
|
|
40
|
-
def is_empty?
|
|
41
|
-
@segments.empty? ? true : false
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
end
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
module SplitIoClient
|
|
2
|
-
#
|
|
3
|
-
# acts as dto for a split structure
|
|
4
|
-
#
|
|
5
|
-
class Split < NoMethodError
|
|
6
|
-
#
|
|
7
|
-
# definition of the split
|
|
8
|
-
#
|
|
9
|
-
# @returns [object] split values
|
|
10
|
-
attr_accessor :data
|
|
11
|
-
|
|
12
|
-
def initialize(split)
|
|
13
|
-
@data = split
|
|
14
|
-
@conditions = set_conditions
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
# @returns [string] name of the split
|
|
19
|
-
def name
|
|
20
|
-
@data[:name]
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
# @returns [int] seed value of the split
|
|
25
|
-
def seed
|
|
26
|
-
@data[:seed]
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
# @returns [string] status value of the split
|
|
31
|
-
def status
|
|
32
|
-
@data[:status]
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
#
|
|
36
|
-
# @returns [string] killed value of the split
|
|
37
|
-
def killed?
|
|
38
|
-
@data[:killed]
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
#
|
|
42
|
-
# @returns [object] array of condition objects for this split
|
|
43
|
-
def conditions
|
|
44
|
-
@conditions
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
#
|
|
48
|
-
# @return [boolean] true if the condition is empty false otherwise
|
|
49
|
-
def is_empty?
|
|
50
|
-
@data.empty? ? true : false
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
#
|
|
54
|
-
# converts the conditions data into an array of condition objects for this split
|
|
55
|
-
#
|
|
56
|
-
# @return [object] array of condition objects
|
|
57
|
-
def set_conditions
|
|
58
|
-
conditions_list = []
|
|
59
|
-
@data[:conditions].each do |c|
|
|
60
|
-
condition = SplitIoClient::Condition.new(c)
|
|
61
|
-
conditions_list << condition
|
|
62
|
-
end
|
|
63
|
-
conditions_list
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
end
|