sdk-reforge 1.9.2 → 1.11.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: 46d6f6afa160400b4319eb454fd5271462d1dc8264570c549327652a4debb1c3
4
- data.tar.gz: 4a88ea9de1cdfef5dc0e8eff6f8d7b210808ffed6236efb8ec150d138d6923cd
3
+ metadata.gz: 035df48e2bfb88f49415f5bac3cc8472c1941d7aa75b2d5adeaaa9b181249566
4
+ data.tar.gz: 40bcb2f2d07df80308082a732852a1f3c3aca0a6e978d0fe80c022a7cd030c79
5
5
  SHA512:
6
- metadata.gz: 569a9c836b3c0d85f06387235f3909343233ee2d5c8ab9c5d888d5f7780a16cac6c70b78fafa89e9cf3653890c16c1eb86a5461afedce5d96edcf904c1d8a42a
7
- data.tar.gz: 1dd174148278acbc0625ee85081c39ca3d975d710ee837813c4ab3587f117796a341c27d63fd548e16a423d040421efb9096e62809d9922818d9a5ed6de508b2
6
+ metadata.gz: bcea0460ea869dfc1f82563c531425d63191a929dab7558d47093802a03d7d07e752c7750b308848c64e9facc1e8e6afcbff53748585604bbc5e77f72432ae14
7
+ data.tar.gz: 381cae539cebf7e540af04be3d332c20af0256d27b42cabbab7698297f4a96e1d56dc3f3aae99aba50636b80ba323f2d2327cdcf7ab87cce27a30f6394f09925
@@ -21,6 +21,7 @@ jobs:
21
21
 
22
22
  runs-on: ubuntu-latest
23
23
  strategy:
24
+ fail-fast: false
24
25
  matrix:
25
26
  ruby-version: ['3.1','3.2','3.3','3.4']
26
27
 
data/.rubocop.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
3
  Exclude:
4
- - prefab-cloud-ruby.gemspec
4
+ - sdk-reforge.gemspec
5
5
  - lib/prefab_pb.rb
6
6
 
7
7
  Metrics:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.11.1 - 2025-10-06
4
+
5
+ - quiet logging for SSE reconnections
6
+ - let the SSE::Client handle the Last-Event-ID header
7
+
8
+ ## 1.10.0 - 2025-10-02
9
+
10
+ - require `base64` for newest ruby versions
11
+ - look for `REFORGE_BACKEND_SDK_KEY` and `REFORGE_DATAFILE`
3
12
 
4
13
  ## 1.9.2 - 2025-10-02
5
14
 
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Ruby Client for Reforge Feature Flags and Config as a Service: https://launch.reforge.com
4
4
 
5
5
  ```ruby
6
- client = Reforge::Client.new
6
+ Reforge.init
7
7
 
8
8
  context = {
9
9
  user: {
@@ -14,12 +14,12 @@ context = {
14
14
  }
15
15
  }
16
16
 
17
- result = client.enabled? "my-first-feature-flag", context
17
+ result = Reforge.enabled? "my-first-feature-flag", context
18
18
 
19
19
  puts "my-first-feature-flag is: #{result}"
20
20
  ```
21
21
 
22
- See full documentation https://docs.prefab.cloud/docs/sdks/ruby
22
+ See full documentation https://docs.reforge.com/docs/sdks/ruby
23
23
 
24
24
  ## Supports
25
25
 
@@ -47,7 +47,7 @@ Many ruby web servers fork. When the process is forked, the current realtime upd
47
47
 
48
48
  ```ruby
49
49
  #config/application.rb
50
- Prefab.init # reads REFORGE_SDK_KEY env var by default
50
+ Reforge.init # reads REFORGE_BACKEND_SDK_KEY env var by default
51
51
  ```
52
52
 
53
53
  ```ruby
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.9.2
1
+ 1.11.1
@@ -80,10 +80,6 @@ module Reforge
80
80
  )
81
81
  end
82
82
 
83
- def set_rails_loggers
84
- warn '[DEPRECATION] `set_rails_loggers` is deprecated since 1.6. Please use semantic_logger or `Prefab.log_filter` instead.'
85
- end
86
-
87
83
  def on_update(&block)
88
84
  resolver.on_update(&block)
89
85
  end
@@ -5,7 +5,7 @@ module Reforge
5
5
  class InvalidSdkKeyError < Reforge::Error
6
6
  def initialize(key)
7
7
  if key.nil? || key.empty?
8
- message = 'No SDK key. Set REFORGE_SDK_KEY env var or use PREFAB_DATASOURCES=LOCAL_ONLY'
8
+ message = 'No SDK key. Set REFORGE_BACKEND_SDK_KEY env var or use REFORGE_DATAFILE'
9
9
 
10
10
  super(message)
11
11
  else
@@ -46,7 +46,7 @@ module Reforge
46
46
 
47
47
  private def init(
48
48
  sources: nil,
49
- sdk_key: ENV['SDK_API_KEY'] || ENV['PREFAB_API_KEY'],
49
+ sdk_key: ENV['REFORGE_BACKEND_SDK_KEY'] || ENV['PREFAB_API_KEY'],
50
50
  namespace: '',
51
51
  reforge_api_url: nil,
52
52
  on_no_default: ON_NO_DEFAULT::RAISE, # options :raise, :warn_and_return_nil,
@@ -61,7 +61,7 @@ module Reforge
61
61
  collect_evaluation_summaries: true,
62
62
  collect_max_evaluation_summaries: DEFAULT_MAX_EVAL_SUMMARIES,
63
63
  allow_telemetry_in_local_mode: false,
64
- datafile: ENV['PREFAB_DATAFILE'],
64
+ datafile: ENV['REFORGE_DATAFILE'] || ENV['PREFAB_DATAFILE'],
65
65
  x_datafile: nil, # DEPRECATED in favor of `datafile`
66
66
  x_use_local_cache: false,
67
67
  symbolize_json_names: false,
@@ -7,7 +7,7 @@ module Reforge
7
7
 
8
8
  def self.init(options = Reforge::Options.new)
9
9
  unless @singleton.nil?
10
- LOG.warn 'Prefab already initialized.'
10
+ LOG.warn 'Reforge already initialized.'
11
11
  return @singleton
12
12
  end
13
13
 
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+ require 'base64'
2
3
 
3
4
  module Reforge
4
- class SSEConfigClient
5
+ class SSEConfigClient
5
6
  class Options
6
7
  attr_reader :sse_read_timeout, :seconds_between_new_connection,
7
8
  :sse_default_reconnect_time, :sleep_delay_for_new_connection_check,
@@ -71,6 +72,7 @@ module Reforge
71
72
  headers: headers,
72
73
  read_timeout: @options.sse_read_timeout,
73
74
  reconnect_time: @options.sse_default_reconnect_time,
75
+ last_event_id: (@config_loader.highwater_mark&.positive? ? @config_loader.highwater_mark.to_s : nil),
74
76
  logger: Reforge::InternalLogger.new(SSE::Client)) do |client|
75
77
  client.on_event do |event|
76
78
  if event.data.nil? || event.data.empty?
@@ -91,7 +93,12 @@ module Reforge
91
93
  end
92
94
 
93
95
  client.on_error do |error|
94
- @logger.error "SSE Streaming Error: #{error.inspect} for url #{url}"
96
+ # SSL "unexpected eof" is expected when SSE sessions timeout normally
97
+ if error.is_a?(OpenSSL::SSL::SSLError) && error.message.include?('unexpected eof')
98
+ @logger.debug "SSE Streaming: Connection closed (expected timeout) for url #{url}"
99
+ else
100
+ @logger.error "SSE Streaming Error: #{error.inspect} for url #{url}"
101
+ end
95
102
 
96
103
  if @options.errors_to_close_connection.any? { |klass| error.is_a?(klass) }
97
104
  @logger.debug "Closing SSE connection for url #{url}"
@@ -105,7 +112,6 @@ module Reforge
105
112
  auth = "#{AUTH_USER}:#{@prefab_options.sdk_key}"
106
113
  auth_string = Base64.strict_encode64(auth)
107
114
  return {
108
- 'Last-Event-ID' => @config_loader.highwater_mark,
109
115
  'Authorization' => "Basic #{auth_string}",
110
116
  'Accept' => 'text/event-stream',
111
117
  'X-Reforge-SDK-Version' => "sdk-ruby-#{Reforge::VERSION}"
data/sdk-reforge.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: sdk-reforge 1.9.2 ruby lib
5
+ # stub: sdk-reforge 1.11.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "sdk-reforge".freeze
9
- s.version = "1.9.2"
9
+ s.version = "1.11.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Jeff Dwyer".freeze]
14
- s.date = "2025-10-02"
14
+ s.date = "2025-10-06"
15
15
  s.description = "Feature Flags, Live Config as a service".freeze
16
16
  s.email = "jeff.dwyer@reforge.com.cloud".freeze
17
17
  s.extra_rdoc_files = [
@@ -102,7 +102,7 @@ module CommonHelpers
102
102
 
103
103
  FakeResponse = Struct.new(:status, :body)
104
104
 
105
- def wait_for(condition, max_wait: 2, sleep_time: 0.01)
105
+ def wait_for(condition, max_wait: 10, sleep_time: 0.01)
106
106
  wait_time = 0
107
107
  while !condition.call
108
108
  wait_time += sleep_time
@@ -16,7 +16,6 @@ class TestSSEConfigClient < Minitest::Test
16
16
 
17
17
  client = Reforge::SSEConfigClient.new(options, config_loader)
18
18
 
19
- assert_equal 4, client.headers['Last-Event-ID']
20
19
  assert_equal "https://stream.goatsofreforge.com", client.source
21
20
 
22
21
  result = nil
@@ -48,8 +47,6 @@ class TestSSEConfigClient < Minitest::Test
48
47
 
49
48
  client = Reforge::SSEConfigClient.new(prefab_options, config_loader, sse_options)
50
49
 
51
- assert_equal 4, client.headers['Last-Event-ID']
52
-
53
50
  result = nil
54
51
 
55
52
  # fake our load_configs block
@@ -247,4 +244,41 @@ class TestSSEConfigClient < Minitest::Test
247
244
  'Expected to have logged an error about empty data for nil'
248
245
  mock_client.verify
249
246
  end
247
+
248
+ def test_last_event_id_initialization
249
+ # Test with positive highwater_mark
250
+ config_loader = OpenStruct.new(highwater_mark: 42)
251
+ prefab_options = OpenStruct.new(sse_sources: ['http://localhost:4567'], sdk_key: 'test')
252
+ client = Reforge::SSEConfigClient.new(prefab_options, config_loader)
253
+
254
+ # Mock SSE::Client.new to capture the last_event_id argument
255
+ SSE::Client.stub :new, ->(*args, **kwargs, &block) {
256
+ assert_equal '42', kwargs[:last_event_id], 'Expected last_event_id to be "42"'
257
+ OpenStruct.new(closed?: false, close: nil)
258
+ } do
259
+ client.connect { |_configs, _event, _source| }
260
+ end
261
+
262
+ # Test with nil highwater_mark
263
+ config_loader = OpenStruct.new(highwater_mark: nil)
264
+ client = Reforge::SSEConfigClient.new(prefab_options, config_loader)
265
+
266
+ SSE::Client.stub :new, ->(*args, **kwargs, &block) {
267
+ assert_nil kwargs[:last_event_id], 'Expected last_event_id to be nil when highwater_mark is nil'
268
+ OpenStruct.new(closed?: false, close: nil)
269
+ } do
270
+ client.connect { |_configs, _event, _source| }
271
+ end
272
+
273
+ # Test with zero highwater_mark
274
+ config_loader = OpenStruct.new(highwater_mark: 0)
275
+ client = Reforge::SSEConfigClient.new(prefab_options, config_loader)
276
+
277
+ SSE::Client.stub :new, ->(*args, **kwargs, &block) {
278
+ assert_nil kwargs[:last_event_id], 'Expected last_event_id to be nil when highwater_mark is 0'
279
+ OpenStruct.new(closed?: false, close: nil)
280
+ } do
281
+ client.connect { |_configs, _event, _source| }
282
+ end
283
+ end
250
284
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdk-reforge
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.2
4
+ version: 1.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Dwyer
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-10-02 00:00:00.000000000 Z
10
+ date: 2025-10-06 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: concurrent-ruby