sparoid 2.2.0 → 2.2.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: d077c30ec18d566719f9d594991798d8ecd94ac74938d5f5b21fb37a677066ca
4
- data.tar.gz: b5f44ce465c4705dfdf5a0c705ad29603744be2145a831cd9c000be0ebb03ea0
3
+ metadata.gz: 71eaf9ec6bae245550f5134ddd360754aa3b360342551676bea056083a56ee8b
4
+ data.tar.gz: d97abd87405cd9c65bc96583648f6f2075867b08bab919e8871ed95de5e2e4f0
5
5
  SHA512:
6
- metadata.gz: e937c061cacbadf3206cffc1d96eb4f99dd667ce8daf1becb91db2eba8aa3893384dd31a59924acc255c11e39bd0aad3ebed7b5e29430c92356e3c54162d2d1b
7
- data.tar.gz: 5ee4e40eef7d12ee5e052ca92452bdae45814f81260d10e35339710255eec8b8cd207fcba2cd31af73a35b50344a2d224cb5f237ce8c6a498b94b7c61249b61e
6
+ metadata.gz: 4a4426c422d8c973596758cdfeed9e23a256aa697605e9beaa9c1aa6b06f14d2fbcf5712a8fd44e25d830ed97f47912e0b707e5006d52139f686efdcf288cec9
7
+ data.tar.gz: b7df47069061130c91155b86fa8385f8ca2c77919baf1189c7513db3f2aca7fc1bff06f8b8e8911184ef8c2014bf8092e9b1933af6692a4137a5155c1923a7d1
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  fail-fast: false
13
13
  matrix:
14
- ruby: [ 3.2, 3.3, 3.4, 4.0, ruby-head ]
14
+ ruby: [ "3.2", "3.3", "3.4", "4.0", ruby-head ]
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
17
  - uses: actions/checkout@v6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [2.2.1] - 2026-06-30
2
+
3
+ - Make Sparoid::Instance public-IP resolution thread-safe and empty-aware; raise Sparoid::PublicIPError when no public IP resolves (#25)
4
+
1
5
  ## [2.2.0] - 2026-05-06
2
6
 
3
7
  - Raise when sendmsg fails for every resolved address (#23)
data/Gemfile CHANGED
@@ -11,3 +11,4 @@ gem "rake", "~> 13.0"
11
11
  gem "rubocop", "~> 1.7"
12
12
  gem "rubocop-minitest", require: false
13
13
  gem "rubocop-rake", require: false
14
+ gem "webmock"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sparoid
4
- VERSION = "2.2.0"
4
+ VERSION = "2.2.1"
5
5
  end
data/lib/sparoid.rb CHANGED
@@ -103,6 +103,8 @@ module Sparoid # rubocop:disable Metrics/ModuleLength
103
103
  ips = ips.grep_v(Resolv::IPv6)
104
104
  ips << Resolv::IPv6.create(native_ipv6)
105
105
  end
106
+ raise PublicIPError, "Sparoid could not resolve a public IP to knock from" if ips.empty?
107
+
106
108
  ips.map { |i| message(i) }
107
109
  end
108
110
  end
@@ -253,16 +255,31 @@ module Sparoid # rubocop:disable Metrics/ModuleLength
253
255
 
254
256
  class ResolvError < Error; end
255
257
 
256
- # Instance of SPAroid that only resolved public_ips once
258
+ class PublicIPError < Error; end
259
+
260
+ # Instance of SPAroid that resolves its public IP once and reuses it
257
261
  class Instance
258
262
  include Sparoid
259
263
 
260
- def public_ips(*args)
261
- @public_ips ||= super
264
+ def initialize
265
+ @resolve_mutex = Mutex.new
266
+ @public_ips = []
262
267
  end
263
268
 
264
269
  def cached_public_ips
265
- public_ips
270
+ return @public_ips if @public_ips.any?
271
+
272
+ @resolve_mutex.synchronize do
273
+ return @public_ips if @public_ips.any?
274
+
275
+ ips = public_ips
276
+ if ips.empty?
277
+ warn "Sparoid: Failed to retrieve public IPs"
278
+ else
279
+ @public_ips = ips
280
+ end
281
+ ips
282
+ end
266
283
  end
267
284
  end
268
285
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carl Hörberg