breaker_machines 0.7.0 → 0.7.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: 5137f3692641c76411b86e725df03e901220a09d18a9bc1ba64fc1834d93b811
4
- data.tar.gz: f5f0c05289c82dfe6aa1fe23322a531fbfd9faa1b8e9f29575eb5c801aacf712
3
+ metadata.gz: 922f6ca105785c7276dc4bb80bb8e6d093b671f96cf8239ce570e8e98a6b9b25
4
+ data.tar.gz: 423412d5402092df0358418360718847cf7ef8f7d50676537719f629c5a25889
5
5
  SHA512:
6
- metadata.gz: 1150d77d3823b038277fb4bd7ee2c28bb39ea0307fefe227f2346c220ceb961f89349bfadc0d8b7bbcea01d7c0bd319ad96177c2de0eb24b6df82f57ee8001f6
7
- data.tar.gz: 3673de4be4d9784ea7135da34e0d02aae91c4b2f8a0c04bc3e058cb01e7f250feb9e6526c4f638d555cc7a3e35a4d3ffb75ffcd770db867442e234ecf43f58a7
6
+ metadata.gz: dffbafc7ce58e54b5250624afd09fb208d8af9aaca253edb5a8278463da824f7bc2ea195ec643e34ccf91a95ff40a113130fb379b66658c1d903b8d60d587c68
7
+ data.tar.gz: 5287c44c22803c61d1e090ba4c631a30560e925e45c1b56ac4d222961898a396bc9535273e8aa9c65b466d0211ae767549dee6c76baacfff2d9bfc22fe598bc0
@@ -27,9 +27,7 @@ def create_noop_makefile(message)
27
27
  exit 0
28
28
  end
29
29
 
30
- unless cargo_available?
31
- create_noop_makefile('Skipping native extension (Cargo not found)')
32
- end
30
+ create_noop_makefile('Skipping native extension (Cargo not found)') unless cargo_available?
33
31
 
34
32
  # Use rb_sys to compile the Rust extension
35
33
  require 'mkmf'
@@ -55,7 +53,7 @@ begin
55
53
  if File.exist?(makefile_path)
56
54
  manifest_path = File.expand_path(__dir__)
57
55
  contents = File.read(makefile_path)
58
- contents.gsub!(%r{^RB_SYS_CARGO_MANIFEST_DIR \?=.*$}, "RB_SYS_CARGO_MANIFEST_DIR ?= #{manifest_path}")
56
+ contents.gsub!(/^RB_SYS_CARGO_MANIFEST_DIR \?=.*$/, "RB_SYS_CARGO_MANIFEST_DIR ?= #{manifest_path}")
59
57
  File.write(makefile_path, contents)
60
58
  end
61
59
  rescue LoadError => e
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rbconfig'
4
+ require 'active_support/core_ext/object/blank'
5
+
3
6
  module BreakerMachines
4
7
  # Handles loading and status of the optional native extension
5
8
  module NativeExtension
@@ -17,18 +20,23 @@ module BreakerMachines
17
20
  return false
18
21
  end
19
22
 
20
- @loaded = true
21
- require 'breaker_machines_native/breaker_machines_native'
22
- BreakerMachines.instance_variable_set(:@native_available, true)
23
- BreakerMachines.log(:info, 'Native extension loaded successfully')
24
- true
25
- rescue LoadError => e
23
+ errors = []
24
+
25
+ native_library_candidates.each do |require_path|
26
+ try_require(require_path)
27
+ @loaded = true
28
+ BreakerMachines.instance_variable_set(:@native_available, true)
29
+ BreakerMachines.log(:info, "Native extension loaded successfully (#{require_path})")
30
+ return true
31
+ rescue LoadError => e
32
+ errors << "#{require_path}: #{e.message}"
33
+ end
34
+
26
35
  @loaded = false
27
36
  BreakerMachines.instance_variable_set(:@native_available, false)
28
37
 
29
- # Only log if it's not JRuby (expected failure) and logging is enabled
30
38
  if RUBY_ENGINE != 'jruby'
31
- BreakerMachines.log(:warn, "Native extension not available: #{e.message}")
39
+ BreakerMachines.log(:warn, "Native extension not available: #{errors.join(' | ')}") unless errors.empty?
32
40
  BreakerMachines.log(:warn, 'Using pure Ruby backend (slower but functional)')
33
41
  end
34
42
 
@@ -39,6 +47,40 @@ module BreakerMachines
39
47
  def loaded?
40
48
  defined?(@loaded) && @loaded
41
49
  end
50
+
51
+ private
52
+
53
+ def native_library_candidates
54
+ dlext = RbConfig::CONFIG['DLEXT']
55
+ base_dir = File.expand_path('../breaker_machines_native', __dir__)
56
+ ruby_version = RbConfig::CONFIG['ruby_version']
57
+ arch = RbConfig::CONFIG['arch']
58
+ platform = Gem::Platform.local.to_s
59
+
60
+ matches = Dir.glob(File.join(base_dir, '**', "breaker_machines_native.#{dlext}"))
61
+
62
+ prioritized = matches.sort_by do |path|
63
+ score = 0
64
+ score -= 3 if path.include?(ruby_version)
65
+ score -= 2 if path.include?(arch)
66
+ score -= 1 if path.include?(platform)
67
+ [score, path]
68
+ end
69
+
70
+ candidates = prioritized.map { |full_path| require_path_for(full_path, dlext) }.presence
71
+ candidates ||= ['breaker_machines_native/breaker_machines_native']
72
+ candidates.uniq
73
+ end
74
+
75
+ def require_path_for(full_path, dlext)
76
+ root = File.expand_path('..', __dir__)
77
+ relative = full_path.sub(%r{^#{Regexp.escape(root)}/?}, '')
78
+ relative.sub(/\.#{Regexp.escape(dlext)}\z/, '')
79
+ end
80
+
81
+ def try_require(require_path)
82
+ require require_path
83
+ end
42
84
  end
43
85
  end
44
86
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BreakerMachines
4
- VERSION = '0.7.0'
4
+ VERSION = '0.7.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breaker_machines
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Abdelkader Boudih
@@ -52,47 +52,47 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: '1.3'
54
54
  - !ruby/object:Gem::Dependency
55
- name: state_machines
55
+ name: rb_sys
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.100.4
60
+ version: '0.9'
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 0.100.4
67
+ version: '0.9'
68
68
  - !ruby/object:Gem::Dependency
69
- name: zeitwerk
69
+ name: state_machines
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - "~>"
72
+ - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: '2.7'
74
+ version: 0.100.4
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
- version: '2.7'
81
+ version: 0.100.4
82
82
  - !ruby/object:Gem::Dependency
83
- name: rb_sys
83
+ name: zeitwerk
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '0.9'
88
+ version: '2.7'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '0.9'
95
+ version: '2.7'
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: minitest
98
98
  requirement: !ruby/object:Gem::Requirement