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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ab8236f8c928279337c89be2c15f6ff413c6f33f3bbd2d2489eb9344d93b546
4
- data.tar.gz: 14bc44e42dc9429441b504c81fe0b076f947c0638d2e55a590a0743bf75822e8
3
+ metadata.gz: cb4c8735b5c0df6cc7331ddd6cb4bec60b7557839dbe38087c61b5c3ac7a434e
4
+ data.tar.gz: 1035c662c99663e07265a6e25f5cccfaa833057bac07b3dd7b9739f15916ece2
5
5
  SHA512:
6
- metadata.gz: e346d563053b3adb3acc9fed5bcd8b085b064be393a6cc1303435ff592a69f7987261baf9383f82ca5a46667f89de0c0dcecc5d01708fc972616ecd042dc54cc
7
- data.tar.gz: 8ad9c0b56690511dc1709721248875a474e0ab521dd8d98ce63e80aedbec8e4993eb88be099b01cac82ad41096aba4eae2b40a06bd6840fd15d805f102282585
6
+ metadata.gz: 5d42c95ef3ea3e5b2a96788970df810d18fc8bad3c73efb87dd6ec056a6eb1518d20bee97a3940faf302f432deb524b98529dd350bc0b2ed83796fcb78ffbd6c
7
+ data.tar.gz: a0753994c42679b82438fe6d9b6f9a1d993b1efd151cf93a2a027ee23c1b8355945a62d32421aee55d8fecd61eb810b9638eb7d237b6fb9e4d10309905dbf9dc
@@ -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
- raise e
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
- # Fall back to stored value or default
130
- stored_value || default_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
- # Clear cached value to force reload from adapter (which checks version)
467
- @stored_value = nil
468
- @stored_value = load_value_from_adapter
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 (override initial value if present in adapter)
473
- description_value = adapter_registry.get(name, 'description')
474
- @description = description_value if description_value
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 (override initial value if present in adapter)
477
- display_name_value = adapter_registry.get(name, 'display_name')
478
- @display_name = display_name_value if display_name_value
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
- # Save description and display_name to adapter if they were provided in options
494
- # but don't exist in adapter yet (to avoid overwriting existing values)
495
- if @description && !adapter_registry.get(name, 'description')
496
- adapter_registry.set(name, 'description', @description)
497
- end
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Magick
4
- VERSION = '0.8.7'
4
+ VERSION = '0.9.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magick-feature-flags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.7
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Lobanov