magick-feature-flags 0.8.7 → 0.9.1
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 +4 -4
- data/lib/magick/feature.rb +57 -18
- data/lib/magick/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cb4c8735b5c0df6cc7331ddd6cb4bec60b7557839dbe38087c61b5c3ac7a434e
|
|
4
|
+
data.tar.gz: 1035c662c99663e07265a6e25f5cccfaa833057bac07b3dd7b9739f15916ece2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5d42c95ef3ea3e5b2a96788970df810d18fc8bad3c73efb87dd6ec056a6eb1518d20bee97a3940faf302f432deb524b98529dd350bc0b2ed83796fcb78ffbd6c
|
|
7
|
+
data.tar.gz: a0753994c42679b82438fe6d9b6f9a1d993b1efd151cf93a2a027ee23c1b8355945a62d32421aee55d8fecd61eb810b9638eb7d237b6fb9e4d10309905dbf9dc
|
data/lib/magick/feature.rb
CHANGED
|
@@ -20,6 +20,7 @@ module Magick
|
|
|
20
20
|
@display_name = options[:name] || options[:display_name]
|
|
21
21
|
@targeting = {}
|
|
22
22
|
@dependencies = options[:dependencies] ? Array(options[:dependencies]) : []
|
|
23
|
+
@stored_value_initialized = false # Track if @stored_value has been explicitly set
|
|
23
24
|
|
|
24
25
|
validate_type!
|
|
25
26
|
validate_default_value!
|
|
@@ -64,7 +65,9 @@ module Magick
|
|
|
64
65
|
duration = (Time.now - start_time) * 1000
|
|
65
66
|
Magick.performance_metrics.record(name, 'enabled?', duration, success: false)
|
|
66
67
|
end
|
|
67
|
-
|
|
68
|
+
# Return false on any error (fail-safe)
|
|
69
|
+
warn "Magick: Error checking feature '#{name}': #{e.message}" if defined?(Rails) && Rails.env.development?
|
|
70
|
+
false
|
|
68
71
|
end
|
|
69
72
|
|
|
70
73
|
def check_enabled(context = {})
|
|
@@ -99,6 +102,10 @@ module Magick
|
|
|
99
102
|
else
|
|
100
103
|
false
|
|
101
104
|
end
|
|
105
|
+
rescue StandardError => e
|
|
106
|
+
# Return false on any error (fail-safe)
|
|
107
|
+
warn "Magick: Error in check_enabled for '#{name}': #{e.message}" if defined?(Rails) && Rails.env.development?
|
|
108
|
+
false
|
|
102
109
|
end
|
|
103
110
|
|
|
104
111
|
def disabled?(context = {})
|
|
@@ -126,8 +133,26 @@ module Magick
|
|
|
126
133
|
targeting_result = check_targeting(context)
|
|
127
134
|
return targeting_result unless targeting_result.nil?
|
|
128
135
|
|
|
129
|
-
#
|
|
130
|
-
stored_value
|
|
136
|
+
# Use instance variable if it has been set (check using defined? to handle nil vs uninitialized)
|
|
137
|
+
# We use a special check: if @stored_value was explicitly set (even to false), use it
|
|
138
|
+
# We track this by checking if @stored_value_initialized flag is set
|
|
139
|
+
return @stored_value if defined?(@stored_value_initialized) && @stored_value_initialized
|
|
140
|
+
|
|
141
|
+
# Load from adapter if instance variable hasn't been initialized
|
|
142
|
+
loaded_value = load_value_from_adapter
|
|
143
|
+
if loaded_value.nil?
|
|
144
|
+
# Value not found in adapter, use default
|
|
145
|
+
default_value
|
|
146
|
+
else
|
|
147
|
+
# Value found in adapter, use it and mark as initialized
|
|
148
|
+
@stored_value = loaded_value
|
|
149
|
+
@stored_value_initialized = true
|
|
150
|
+
loaded_value
|
|
151
|
+
end
|
|
152
|
+
rescue StandardError => e
|
|
153
|
+
# Return default value on error (fail-safe)
|
|
154
|
+
warn "Magick: Error in get_value for '#{name}': #{e.message}" if defined?(Rails) && Rails.env.development?
|
|
155
|
+
default_value
|
|
131
156
|
end
|
|
132
157
|
|
|
133
158
|
def enable_for_user(user_id)
|
|
@@ -323,11 +348,13 @@ module Magick
|
|
|
323
348
|
adapter_registry.set(name, 'description', description) if description
|
|
324
349
|
adapter_registry.set(name, 'display_name', display_name) if display_name
|
|
325
350
|
@stored_value = value
|
|
351
|
+
@stored_value_initialized = true # Mark as initialized
|
|
326
352
|
|
|
327
353
|
# Update registered feature instance if it exists
|
|
328
354
|
if Magick.features.key?(name)
|
|
329
355
|
registered = Magick.features[name]
|
|
330
356
|
registered.instance_variable_set(:@stored_value, value)
|
|
357
|
+
registered.instance_variable_set(:@stored_value_initialized, true)
|
|
331
358
|
registered.instance_variable_set(:@targeting, @targeting.dup) if @targeting
|
|
332
359
|
end
|
|
333
360
|
|
|
@@ -431,6 +458,7 @@ module Magick
|
|
|
431
458
|
if Magick.features.key?(name)
|
|
432
459
|
registered = Magick.features[name]
|
|
433
460
|
registered.instance_variable_set(:@stored_value, @stored_value)
|
|
461
|
+
registered.instance_variable_set(:@stored_value_initialized, @stored_value_initialized)
|
|
434
462
|
registered.instance_variable_set(:@status, @status)
|
|
435
463
|
registered.instance_variable_set(:@description, @description)
|
|
436
464
|
registered.instance_variable_set(:@display_name, @display_name)
|
|
@@ -463,19 +491,31 @@ module Magick
|
|
|
463
491
|
end
|
|
464
492
|
|
|
465
493
|
def load_from_adapter
|
|
466
|
-
#
|
|
467
|
-
|
|
468
|
-
@stored_value
|
|
494
|
+
# Load value from adapter
|
|
495
|
+
loaded_value = load_value_from_adapter
|
|
496
|
+
# Set @stored_value if we got a value from adapter (can be false, true, '', 0, etc.)
|
|
497
|
+
# Only set if loaded_value is not nil (nil means not found in adapter)
|
|
498
|
+
unless loaded_value.nil?
|
|
499
|
+
@stored_value = loaded_value
|
|
500
|
+
@stored_value_initialized = true
|
|
501
|
+
end
|
|
502
|
+
|
|
469
503
|
status_value = adapter_registry.get(name, 'status')
|
|
470
504
|
@status = status_value ? status_value.to_sym : status
|
|
471
505
|
|
|
472
|
-
# Load description from adapter
|
|
473
|
-
|
|
474
|
-
@description
|
|
506
|
+
# Load description from adapter only if not provided in DSL
|
|
507
|
+
# DSL (features.rb) is the source of truth, so don't override DSL values
|
|
508
|
+
unless @description
|
|
509
|
+
description_value = adapter_registry.get(name, 'description')
|
|
510
|
+
@description = description_value if description_value
|
|
511
|
+
end
|
|
475
512
|
|
|
476
|
-
# Load display_name from adapter
|
|
477
|
-
|
|
478
|
-
@display_name
|
|
513
|
+
# Load display_name from adapter only if not provided in DSL
|
|
514
|
+
# DSL (features.rb) is the source of truth, so don't override DSL values
|
|
515
|
+
unless @display_name
|
|
516
|
+
display_name_value = adapter_registry.get(name, 'display_name')
|
|
517
|
+
@display_name = display_name_value if display_name_value
|
|
518
|
+
end
|
|
479
519
|
|
|
480
520
|
targeting_value = adapter_registry.get(name, 'targeting')
|
|
481
521
|
if targeting_value.is_a?(Hash)
|
|
@@ -490,12 +530,11 @@ module Magick
|
|
|
490
530
|
end
|
|
491
531
|
|
|
492
532
|
def save_metadata_if_new
|
|
493
|
-
#
|
|
494
|
-
#
|
|
495
|
-
if
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
return unless @display_name && !adapter_registry.get(name, 'display_name')
|
|
533
|
+
# Always save description and display_name from DSL to adapter
|
|
534
|
+
# The features.rb file is the source of truth for metadata
|
|
535
|
+
# This ensures metadata is always up-to-date even if feature already exists
|
|
536
|
+
adapter_registry.set(name, 'description', @description) if @description
|
|
537
|
+
return unless @display_name
|
|
499
538
|
|
|
500
539
|
adapter_registry.set(name, 'display_name', @display_name)
|
|
501
540
|
end
|
data/lib/magick/version.rb
CHANGED