From b6a7080ff04c9228436ee2092b5f441bbf906d93 Mon Sep 17 00:00:00 2001 From: Josh Reeves Date: Thu, 26 Oct 2017 07:45:18 -0700 Subject: [PATCH 1/4] Improve compatibility with Rails 5 --- lib/ship_compliant/search_sales_orders_result.rb | 4 +--- ship_compliant.gemspec | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/ship_compliant/search_sales_orders_result.rb b/lib/ship_compliant/search_sales_orders_result.rb index 58f041d..70861fd 100644 --- a/lib/ship_compliant/search_sales_orders_result.rb +++ b/lib/ship_compliant/search_sales_orders_result.rb @@ -62,9 +62,7 @@ def paging_cookie_expires # Standardizes the XML response by converting fields to integers # and forcing the order summaries into an array. def parse! - unless raw.has_key?(:sales_orders) - raw[:sales_orders] = {} - end + raw[:sales_orders] ||= {} # force orders to be an array orders = raw[:sales_orders].fetch(:sales_order_summary, {}) diff --git a/ship_compliant.gemspec b/ship_compliant.gemspec index ee36cb7..bd8bdd5 100644 --- a/ship_compliant.gemspec +++ b/ship_compliant.gemspec @@ -20,7 +20,7 @@ Gem::Specification.new do |s| s.test_files = s.files.grep(%r{^(test|spec|features)/}) s.require_paths = ["lib"] - s.add_dependency "activesupport", "~> 4.0", ">= 4.0.3" + s.add_dependency "activesupport", ">= 4.0.3" s.add_dependency "savon", "~> 2.3" s.add_development_dependency "bundler", "~> 1.5" From 9cbfa50429adec3e2b1b905b4435d47149654675 Mon Sep 17 00:00:00 2001 From: Josh Reeves Date: Fri, 22 May 2020 18:28:52 -0700 Subject: [PATCH 2/4] Add thread safety --- lib/ship_compliant/client.rb | 10 ++++++++++ lib/ship_compliant/configuration.rb | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/ship_compliant/client.rb b/lib/ship_compliant/client.rb index cbceddf..c4fcefa 100644 --- a/lib/ship_compliant/client.rb +++ b/lib/ship_compliant/client.rb @@ -3,6 +3,16 @@ class << self attr_accessor :ship_compliant_client end + def self.ship_compliant_client + Thread.current[:ship_compliant] ||= {} + Thread.current[:ship_compliant][:client] + end + + def self.ship_compliant_client=(client) + Thread.current[:ship_compliant] ||= {} + Thread.current[:ship_compliant][:client] = client + end + # Returns an instance of +Client+. def self.client self.ship_compliant_client ||= new_client_from_wsdl(configuration.wsdl) diff --git a/lib/ship_compliant/configuration.rb b/lib/ship_compliant/configuration.rb index 6e9a7e0..e56efb7 100644 --- a/lib/ship_compliant/configuration.rb +++ b/lib/ship_compliant/configuration.rb @@ -8,7 +8,8 @@ def self.configure end def self.configuration - @configuration ||= Configuration.new + Thread.current[:ship_compliant] ||= {} + Thread.current[:ship_compliant][:configuration] ||= Configuration.new end # Stores runtime configuration to authenticate user. From 594b5ab5b21920ec45f3c66cb552924b29b89597 Mon Sep 17 00:00:00 2001 From: Josh Reeves Date: Tue, 11 Aug 2020 13:15:57 -0700 Subject: [PATCH 3/4] Upgrade bundler dependency --- ship_compliant.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ship_compliant.gemspec b/ship_compliant.gemspec index bd8bdd5..7627a29 100644 --- a/ship_compliant.gemspec +++ b/ship_compliant.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |s| s.add_dependency "activesupport", ">= 4.0.3" s.add_dependency "savon", "~> 2.3" - s.add_development_dependency "bundler", "~> 1.5" + s.add_development_dependency "bundler", "~> 2.0" s.add_development_dependency "rake", "~> 10.0" s.add_development_dependency "sdoc", "~> 0.4" s.add_development_dependency "pry", "~> 0.9" From 60a29e595d462aab733b793cd164baedf6e43dee Mon Sep 17 00:00:00 2001 From: Josh Reeves Date: Tue, 11 Aug 2020 13:16:55 -0700 Subject: [PATCH 4/4] Add configuration thread-safe setter and thread-safe specs --- lib/ship_compliant/client.rb | 6 ++---- lib/ship_compliant/configuration.rb | 7 +++++-- spec/lib/ship_compliant/client_spec.rb | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/ship_compliant/client.rb b/lib/ship_compliant/client.rb index c4fcefa..28de487 100644 --- a/lib/ship_compliant/client.rb +++ b/lib/ship_compliant/client.rb @@ -4,13 +4,11 @@ class << self end def self.ship_compliant_client - Thread.current[:ship_compliant] ||= {} - Thread.current[:ship_compliant][:client] + Thread.current[:ship_compliant_client] end def self.ship_compliant_client=(client) - Thread.current[:ship_compliant] ||= {} - Thread.current[:ship_compliant][:client] = client + Thread.current[:ship_compliant_client] = client end # Returns an instance of +Client+. diff --git a/lib/ship_compliant/configuration.rb b/lib/ship_compliant/configuration.rb index e56efb7..644691f 100644 --- a/lib/ship_compliant/configuration.rb +++ b/lib/ship_compliant/configuration.rb @@ -8,8 +8,11 @@ def self.configure end def self.configuration - Thread.current[:ship_compliant] ||= {} - Thread.current[:ship_compliant][:configuration] ||= Configuration.new + Thread.current[:ship_compliant_configuration] ||= Configuration.new + end + + def self.configuration=(value) + Thread.current[:ship_compliant_configuration] = value end # Stores runtime configuration to authenticate user. diff --git a/spec/lib/ship_compliant/client_spec.rb b/spec/lib/ship_compliant/client_spec.rb index 5e79b11..be4c6d4 100644 --- a/spec/lib/ship_compliant/client_spec.rb +++ b/spec/lib/ship_compliant/client_spec.rb @@ -20,6 +20,22 @@ module ShipCompliant expect(ShipCompliant.client.globals[:log]).to be_falsey end + it "don't share configuration between threads" do + ShipCompliant.configure do |c| + c.username = 'foo' + end + + Thread.new do + ShipCompliant.configure do |c| + c.username = 'bar' + end + + expect(ShipCompliant.configuration.username).to eq('bar') + end.join + + expect(ShipCompliant.configuration.username).to eq('foo') + end + context "call" do before { savon.mock! } after { savon.unmock! }