Skip to content

Commit 1bdaad6

Browse files
committed
feat: linter
1 parent a5ef567 commit 1bdaad6

File tree

3 files changed

+54
-91
lines changed

3 files changed

+54
-91
lines changed

lib/flagsmith.rb

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -206,35 +206,22 @@ def get_value_for_identity(feature_name, user_id = nil, default: nil)
206206
end
207207

208208
def get_identity_segments(identifier, traits = {})
209-
unless environment
210-
raise Flagsmith::ClientError,
211-
'Local evaluation or offline handler is required to obtain identity segments.'
212-
end
209+
raise Flagsmith::ClientError, 'Local evaluation or offline handler is required to obtain identity segments.' unless environment
213210

214211
identity_model = get_identity_model(identifier, traits)
215-
216-
context = Flagsmith::Engine::Mappers.get_evaluation_context(
217-
environment, identity_model
218-
)
219-
220-
unless context
221-
raise Flagsmith::ClientError,
222-
'Local evaluation required to obtain identity segments'
223-
end
212+
context = Flagsmith::Engine::Mappers.get_evaluation_context(environment, identity_model)
213+
raise Flagsmith::ClientError, 'Local evaluation required to obtain identity segments' unless context
224214

225215
evaluation_result = Flagsmith::Engine.get_evaluation_result(context)
226-
227-
evaluation_result[:segments].map do |segment_result|
216+
evaluation_result[:segments].filter_map do |segment_result|
228217
flagsmith_id = segment_result.dig(:metadata, :flagsmith_id)
229-
next unless flagsmith_id
230-
231-
Flagsmith::Segments::Segment.new(id: flagsmith_id, name: segment_result[:name])
232-
end.compact
218+
Flagsmith::Segments::Segment.new(id: flagsmith_id, name: segment_result[:name]) if flagsmith_id
219+
end
233220
end
234221

235222
private
236223

237-
def environment_flags_from_document
224+
def environment_flags_from_document # rubocop:disable Metrics/MethodLength
238225
context = Flagsmith::Engine::Mappers.get_evaluation_context(environment)
239226

240227
unless context
@@ -254,22 +241,13 @@ def environment_flags_from_document
254241

255242
def get_identity_flags_from_document(identifier, traits = {})
256243
identity_model = get_identity_model(identifier, traits)
257-
258-
context = Flagsmith::Engine::Mappers.get_evaluation_context(
259-
environment, identity_model
260-
)
261-
262-
unless context
263-
raise Flagsmith::ClientError,
264-
'Unable to get flags. No environment present.'
265-
end
244+
context = Flagsmith::Engine::Mappers.get_evaluation_context(environment, identity_model)
245+
raise Flagsmith::ClientError, 'Unable to get flags. No environment present.' unless context
266246

267247
evaluation_result = Flagsmith::Engine.get_evaluation_result(context)
268-
269248
Flagsmith::Flags::Collection.from_evaluation_result(
270249
evaluation_result,
271-
analytics_processor: analytics_processor,
272-
default_flag_handler: default_flag_handler,
250+
analytics_processor: analytics_processor, default_flag_handler: default_flag_handler,
273251
offline_handler: offline_handler
274252
)
275253
end

lib/flagsmith/engine/core.rb

Lines changed: 32 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,7 @@ def evaluate_segments(evaluation_context)
4444
identity_segments = get_segments_from_context(evaluation_context)
4545

4646
segments = identity_segments.map do |segment|
47-
result = {
48-
name: segment[:name]
49-
}
50-
51-
result[:metadata] = segment[:metadata] if segment[:metadata]
52-
53-
result
47+
{ name: segment[:name], metadata: segment[:metadata] }.compact
5448
end
5549

5650
segment_overrides = process_segment_overrides(identity_segments)
@@ -59,15 +53,11 @@ def evaluate_segments(evaluation_context)
5953
end
6054

6155
# Returns Record<string: override.name, SegmentOverride>
62-
def process_segment_overrides(identity_segments)
56+
def process_segment_overrides(identity_segments) # rubocop:disable Metrics/MethodLength
6357
segment_overrides = {}
6458

6559
identity_segments.each do |segment|
66-
next unless segment[:overrides]
67-
68-
overrides_list = segment[:overrides].is_a?(Array) ? segment[:overrides] : []
69-
70-
overrides_list.each do |override|
60+
Array(segment[:overrides]).each do |override|
7161
next unless should_apply_override(override, segment_overrides)
7262

7363
segment_overrides[override[:name]] = {
@@ -82,33 +72,15 @@ def process_segment_overrides(identity_segments)
8272

8373
# returns EvaluationResultFlags<Metadata>
8474
def evaluate_features(evaluation_context, segment_overrides)
85-
flags = {}
75+
identity_key = get_identity_key(evaluation_context)
8676

87-
(evaluation_context[:features] || {}).each_value do |feature|
77+
(evaluation_context[:features] || {}).each_with_object({}) do |(_, feature), flags|
8878
segment_override = segment_overrides[feature[:name]]
8979
final_feature = segment_override ? segment_override[:feature] : feature
90-
has_override = !segment_override.nil?
91-
92-
# Evaluate feature value
93-
evaluated = evaluate_feature_value(final_feature, get_identity_key(evaluation_context))
94-
95-
# Build flag result
96-
flag_result = {
97-
name: final_feature[:name],
98-
enabled: final_feature[:enabled],
99-
value: evaluated[:value]
100-
}
101-
102-
# Add metadata if present
103-
flag_result[:metadata] = final_feature[:metadata] if final_feature[:metadata]
10480

105-
# Set reason
106-
flag_result[:reason] = evaluated[:reason] ||
107-
(has_override ? "#{TARGETING_REASON_TARGETING_MATCH}; segment=#{segment_override[:segment_name]}" : TARGETING_REASON_DEFAULT)
81+
flag_result = build_flag_result(final_feature, identity_key, segment_override)
10882
flags[final_feature[:name].to_sym] = flag_result
10983
end
110-
111-
flags
11284
end
11385

11486
# Returns {value: any; reason?: string}
@@ -123,19 +95,19 @@ def get_multivariate_feature_value(feature, identity_key)
12395
percentage_value = hashed_percentage_for_object_ids([feature[:key], identity_key])
12496
sorted_variants = (feature[:variants] || []).sort_by { |v| v[:priority] || WEAKEST_PRIORITY }
12597

98+
variant = find_matching_variant(sorted_variants, percentage_value)
99+
variant || { value: feature[:value], reason: nil }
100+
end
101+
102+
def find_matching_variant(sorted_variants, percentage_value)
126103
start_percentage = 0
127104
sorted_variants.each do |variant|
128105
limit = start_percentage + variant[:weight]
129-
if start_percentage <= percentage_value && percentage_value < limit
130-
return {
131-
value: variant[:value],
132-
reason: "#{TARGETING_REASON_SPLIT}; weight=#{variant[:weight]}"
133-
}
134-
end
106+
return { value: variant[:value], reason: "#{TARGETING_REASON_SPLIT}; weight=#{variant[:weight]}" } if start_percentage <= percentage_value && percentage_value < limit
107+
135108
start_percentage = limit
136109
end
137-
138-
{ value: feature[:value], reason: nil }
110+
nil
139111
end
140112

141113
# returns boolean
@@ -144,12 +116,22 @@ def should_apply_override(override, existing_overrides)
144116
!current_override || stronger_priority?(override[:priority], current_override[:feature][:priority])
145117
end
146118

147-
def stronger_priority?(priority_a, priority_b)
148-
(priority_a || WEAKEST_PRIORITY) < (priority_b || WEAKEST_PRIORITY)
149-
end
150-
151119
private
152120

121+
def build_flag_result(feature, identity_key, segment_override)
122+
evaluated = evaluate_feature_value(feature, identity_key)
123+
124+
flag_result = {
125+
name: feature[:name],
126+
enabled: feature[:enabled],
127+
value: evaluated[:value],
128+
reason: evaluated[:reason] || (segment_override ? "#{TARGETING_REASON_TARGETING_MATCH}; segment=#{segment_override[:segment_name]}" : TARGETING_REASON_DEFAULT)
129+
}
130+
131+
flag_result[:metadata] = feature[:metadata] if feature[:metadata]
132+
flag_result
133+
end
134+
153135
# Extract identity key from evaluation context
154136
#
155137
# @param evaluation_context [Hash] The evaluation context
@@ -159,5 +141,9 @@ def get_identity_key(evaluation_context)
159141

160142
evaluation_context[:identity][:key]
161143
end
144+
145+
def stronger_priority?(priority_a, priority_b)
146+
(priority_a || WEAKEST_PRIORITY) < (priority_b || WEAKEST_PRIORITY)
147+
end
162148
end
163149
end

lib/flagsmith/sdk/models/flags.rb

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -177,25 +177,24 @@ def from_api(json_data, **args)
177177
def from_evaluation_result(evaluation_result, **args)
178178
to_flag_object = lambda { |flag_result, acc|
179179
flagsmith_id = flag_result.dig(:metadata, :flagsmith_id)
180-
181180
if flagsmith_id.nil?
182181
raise Flagsmith::ClientError,
183-
"FlagResult metadata.flagsmith_id is missing for feature \"#{flag_result[:name]}\". " \
184-
'This indicates a bug in the SDK, please report it.'
182+
"FlagResult metadata.flagsmith_id is missing for feature \"#{flag_result[:name]}\". This indicates a bug in the SDK, please report it."
185183
end
186184

187-
acc[flag_result[:name]] = Flagsmith::Flags::Flag.new(
188-
feature_name: flag_result[:name],
189-
enabled: flag_result[:enabled],
190-
value: flag_result[:value],
191-
feature_id: flagsmith_id,
192-
reason: flag_result[:reason]
193-
)
185+
acc[flag_result[:name]] = Collection.map_evaluated_flag_to_flag_result(flag_result, flagsmith_id)
194186
}
195187

196-
new(
197-
evaluation_result[:flags].each_value.each_with_object({}, &to_flag_object),
198-
**args
188+
new(evaluation_result[:flags].each_value.each_with_object({}, &to_flag_object), **args)
189+
end
190+
191+
def map_evaluated_flag_to_flag_result(flag_result, flagsmith_id)
192+
Flagsmith::Flags::Flag.new(
193+
feature_name: flag_result[:name],
194+
enabled: flag_result[:enabled],
195+
value: flag_result[:value],
196+
feature_id: flagsmith_id,
197+
reason: flag_result[:reason]
199198
)
200199
end
201200

0 commit comments

Comments
 (0)