process_settings 0.6.0 → 0.7.0.pre.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: 9dbcb3873001cffeeb4e0ae854bde7a30ef65f5ab84f1abce46d823387522aef
4
- data.tar.gz: 62cf394daea0cea79d71d8b775cdefbdc056aaf40e53103a90ac0482050f66b7
3
+ metadata.gz: f2b30454f2b5c672186e76fa87b45aa330d62fd3c09e96366c4377f4b397ea36
4
+ data.tar.gz: 5bae6a21f59d81f3f365857e5e95fe4cc95b9b047825cd734d5541326ede4a25
5
5
  SHA512:
6
- metadata.gz: aecb307bcd9f2730d59cd56fa0001fd3515c7f4d299a70fa41aac980b2beaa67a6a2f1006bfbd2df434d613dddc06102fd10c2d11f0d62cf1bb42911925ead92
7
- data.tar.gz: 5cc5ea088913ced0a55f66d1e54e5783c38d1199f5eef3be291d547bc1a472151ec0055fc5ad7763908e2febb506f96d4d0f2f4e014a7e52f68f5ea6589e8605
6
+ metadata.gz: 9f928a7ba0fdf1d1050445c363b67ef95b7c3d0c1a2e2a7f79cbf7cf32b06c9aa18172952b7f2e5c364b4f0cedbd2aeb3795466499b141a27a0ebe57e4627979
7
+ data.tar.gz: 26c3b75186e76c80e90e380c6da0433822999acffadb702a5d36b71f284aac27da099a952f596543c4728953036e9742bd6ba70629851fa4098e1d46d14c475e
@@ -9,6 +9,8 @@ require 'active_support'
9
9
  module ProcessSettings
10
10
  class SettingsPathNotFound < StandardError; end
11
11
 
12
+ OnChangeDeprecation = ActiveSupport::Deprecation.new('1.0', 'ProcessSettings::Monitor')
13
+
12
14
  class Monitor
13
15
  attr_reader :file_path, :min_polling_seconds, :logger
14
16
  attr_reader :static_context, :untargeted_settings, :statically_targeted_settings
@@ -19,6 +21,7 @@ module ProcessSettings
19
21
  @file_path = File.expand_path(file_path)
20
22
  @logger = logger
21
23
  @on_change_callbacks = []
24
+ @when_updated_blocks = Set.new
22
25
  @static_context = {}
23
26
  @last_statically_targetted_settings = nil
24
27
  @untargeted_settings = nil
@@ -63,15 +66,35 @@ module ProcessSettings
63
66
  @listener&.stop
64
67
  end
65
68
 
66
- # TODO:
67
- # 1. rename this to `when_updated` and clone that interface from InvocaCluster
68
- # 2. since the callback yields self, support Instance#[]; have ProcessSettings.[] delegate there.
69
+ # Idempotently adds the given block to the when_updated collection
70
+ # calls the block first unless initial_update: false is passed
71
+ # returns a handle (the block itself) which can later be passed into cancel_when_updated
72
+ def when_updated(initial_update: true, &block)
73
+ if @when_updated_blocks.add?(block)
74
+ if initial_update
75
+ begin
76
+ block.call(self)
77
+ rescue => ex
78
+ logger.error("ProcessSettings::Monitor#when_updated rescued exception during initialization:\n#{ex.class}: #{ex.message}")
79
+ end
80
+ end
81
+ end
82
+
83
+ block
84
+ end
85
+
86
+ # removes the given when_updated block identified by the handle returned from when_updated
87
+ def cancel_when_updated(handle)
88
+ @when_updated_blocks.delete_if { |callback| callback.eql?(handle) }
89
+ end
69
90
 
70
91
  # Registers the given callback block to be called when settings change.
71
92
  # These are run using the shared thread that monitors for changes so be courteous and don't monopolize it!
93
+ # @deprecated
72
94
  def on_change(&callback)
73
95
  @on_change_callbacks << callback
74
96
  end
97
+ deprecate on_change: :when_updated, deprecator: OnChangeDeprecation
75
98
 
76
99
  # Assigns a new static context. Recomputes statically_targeted_settings.
77
100
  # Keys must be strings or integers. No symbols.
@@ -128,7 +151,7 @@ module ProcessSettings
128
151
 
129
152
  # Loads the latest untargeted settings from disk. Returns the current process settings as a TargetAndProcessSettings given
130
153
  # by applying the static context to the current untargeted settings from disk.
131
- # If these have changed, borrows this thread to call notify_on_change.
154
+ # If these have changed, borrows this thread to call notify_on_change and call_when_updated_blocks.
132
155
  def load_statically_targeted_settings(force_retarget: false)
133
156
  if force_retarget || @last_untargetted_settings != @untargeted_settings
134
157
  @last_untargetted_settings = @untargeted_settings
@@ -137,6 +160,7 @@ module ProcessSettings
137
160
  @last_statically_targetted_settings = @statically_targeted_settings
138
161
 
139
162
  notify_on_change
163
+ call_when_updated_blocks
140
164
  end
141
165
  end
142
166
  end
@@ -151,9 +175,11 @@ module ProcessSettings
151
175
  end
152
176
 
153
177
  def instance
154
- file_path or raise ArgumentError, "#{self}::file_path must be set before calling instance method"
155
- logger or raise ArgumentError, "#{self}::logger must be set before calling instance method"
156
- @instance ||= new(file_path, logger: logger)
178
+ @instance ||= begin
179
+ file_path or raise ArgumentError, "#{self}::file_path must be set before calling instance method"
180
+ logger or raise ArgumentError, "#{self}::logger must be set before calling instance method"
181
+ new(file_path, logger: logger)
182
+ end
157
183
  end
158
184
 
159
185
  def logger=(new_logger)
@@ -189,6 +215,14 @@ module ProcessSettings
189
215
  end
190
216
  end
191
217
 
218
+ def call_when_updated_blocks
219
+ @when_updated_blocks.each do |block|
220
+ block.call(self)
221
+ rescue => ex
222
+ logger.error("ProcessSettings::Monitor#call_when_updated_blocks rescued exception:\n#{ex.class}: #{ex.message}")
223
+ end
224
+ end
225
+
192
226
  def load_file(file_path)
193
227
  TargetedSettings.from_file(file_path)
194
228
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ProcessSettings
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.0.pre.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: process_settings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0.pre.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Invoca
@@ -98,9 +98,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
98
  version: '0'
99
99
  required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - ">"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: 1.3.1
104
104
  requirements: []
105
105
  rubygems_version: 3.0.3
106
106
  signing_key: