process_settings 0.6.0 → 0.7.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
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: