magick-feature-flags 0.9.20 → 0.9.21

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: e4f9379b630e9db00b28614f347d523edb33d63c842d6b5c9fd747be02f1d75d
4
- data.tar.gz: ffa32ee13faa08781c68870813c15ea7b3dcc15fe65f8c1f2618952251fe870c
3
+ metadata.gz: 467ad50ad54569fd4ac8562da75e37672716b980cfdfb03da79b2f29950fd4c9
4
+ data.tar.gz: 0b89ad165e8aad8fb2074821025bd7e50ef2568cc46f5b750bfc4c91c6e11658
5
5
  SHA512:
6
- metadata.gz: 0f2651c1f8528b4eb385f82a629c7891e0a78ec4a796b574baa8228a2bfcaddf88ee6855af45f9fba9c12b4d7d475e1d8aa6ba6b1002706a1247a8ef81b540e4
7
- data.tar.gz: 418cc8c6909969581b147df052c72ffc9635a86b07726f69f0c6085bef3bbb804515d34a3d6ca782f8b4c03d4127722a5547a483ca2d0cddfc56f3bef4e6e864
6
+ metadata.gz: 7b3fa0a75bd127f269ecafcddfbe6dcba8d45a247d6b47d83085a097f58de6b74c570eb0655fd4a97c78d8335ff1916a57b3eb2b891143d6a2cc585acc5ff87c
7
+ data.tar.gz: 79cf7083e34daab0c569e9e05d6e0b123167692f2b206b67ae53321ddabe722861e701346dd5cac80c6b1898be75140ed52fd93470b9a19ccf8113ebf6d91a16
@@ -33,15 +33,54 @@ module Magick
33
33
  # Update targeting empty cache after loading
34
34
  @_targeting_empty = @targeting.empty?
35
35
  # Cache performance metrics availability (check once, not on every call)
36
- @_perf_metrics_enabled = Magick.performance_metrics != nil
36
+ # Only enable if performance_metrics exists AND is actually being used
37
+ @_perf_metrics_enabled = !Magick.performance_metrics.nil?
37
38
  # Save description and display_name to adapter if they were provided and not already in adapter
38
39
  save_metadata_if_new
39
40
  end
40
41
 
41
42
  def enabled?(context = {})
42
- # Fastest path: check enabled status directly (no overhead)
43
- check_enabled(context)
43
+ # Check performance metrics dynamically (in case enabled after feature creation)
44
+ # But cache the check result for performance
45
+ perf_metrics = Magick.performance_metrics
46
+ perf_metrics_enabled = !perf_metrics.nil?
47
+
48
+ # Update cached flag if it changed
49
+ @_perf_metrics_enabled = perf_metrics_enabled if @_perf_metrics_enabled != perf_metrics_enabled
50
+
51
+ # Fast path: if performance metrics disabled, skip all overhead
52
+ return check_enabled(context) unless perf_metrics_enabled
53
+
54
+ # Performance metrics enabled: measure and record
55
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
56
+ result = check_enabled(context)
57
+ duration = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time) * 1000 # milliseconds
58
+
59
+ # Record metrics (only if enabled)
60
+ perf_metrics.record(name, 'enabled?', duration, success: true)
61
+
62
+ # Rails 8+ events (only in development or when explicitly enabled)
63
+ if @_rails_events_enabled
64
+ if result
65
+ Magick::Rails::Events.feature_enabled(name, context: context)
66
+ else
67
+ Magick::Rails::Events.feature_disabled(name, context: context)
68
+ end
69
+ end
70
+
71
+ # Warn if deprecated (only if enabled)
72
+ if status == :deprecated && result && !context[:allow_deprecated] && Magick.warn_on_deprecated
73
+ warn "DEPRECATED: Feature '#{name}' is deprecated and will be removed."
74
+ Magick::Rails::Events.deprecated_warning(name) if @_rails_events_enabled
75
+ end
76
+
77
+ result
44
78
  rescue StandardError => e
79
+ # Record error metrics if enabled
80
+ if perf_metrics_enabled && perf_metrics
81
+ duration = defined?(start_time) && start_time ? (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time) * 1000 : 0.0
82
+ perf_metrics.record(name, 'enabled?', duration, success: false)
83
+ end
45
84
  # Return false on any error (fail-safe)
46
85
  warn "Magick: Error checking feature '#{name}': #{e.message}" if defined?(Rails) && Rails.env.development?
47
86
  false
@@ -452,6 +491,10 @@ module Magick
452
491
  # Reload feature state from adapter (useful when feature is changed externally)
453
492
  def reload
454
493
  load_from_adapter
494
+ # Update targeting empty cache
495
+ @_targeting_empty = @targeting.empty?
496
+ # Update performance metrics flag (in case it was enabled after feature creation)
497
+ @_perf_metrics_enabled = !Magick.performance_metrics.nil?
455
498
  # Update registered feature instance if it exists
456
499
  if Magick.features.key?(name)
457
500
  registered = Magick.features[name]
@@ -461,6 +504,8 @@ module Magick
461
504
  registered.instance_variable_set(:@description, @description)
462
505
  registered.instance_variable_set(:@display_name, @display_name)
463
506
  registered.instance_variable_set(:@targeting, @targeting.dup)
507
+ registered.instance_variable_set(:@_targeting_empty, @_targeting_empty)
508
+ registered.instance_variable_set(:@_perf_metrics_enabled, @_perf_metrics_enabled)
464
509
  end
465
510
  true
466
511
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Magick
4
- VERSION = '0.9.20'
4
+ VERSION = '0.9.21'
5
5
  end
data/lib/magick.rb CHANGED
@@ -38,6 +38,12 @@ module Magick
38
38
  if value && adapter_registry.is_a?(Adapters::Registry) && adapter_registry.redis_available?
39
39
  value.enable_redis_tracking(enable: true)
40
40
  end
41
+ # Update all existing features to enable performance metrics tracking
42
+ if value
43
+ features.each_value do |feature|
44
+ feature.instance_variable_set(:@_perf_metrics_enabled, true)
45
+ end
46
+ end
41
47
  value
42
48
  end
43
49
 
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.9.20
4
+ version: 0.9.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Lobanov