Skip to content

Commit 239b250

Browse files
authored
Merge pull request #883 from Shopify/flavorjones-ruby-3-0-support
Support for ruby 3.0
2 parents 34d2243 + 714c86f commit 239b250

File tree

11 files changed

+83
-29
lines changed

11 files changed

+83
-29
lines changed

.github/workflows/build.yml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ jobs:
1212
strategy:
1313
matrix:
1414
version:
15-
- 2.4
16-
- 2.5
17-
- 2.6
18-
- 2.7
15+
- "2.4"
16+
- "2.5"
17+
- "2.6"
18+
- "2.7"
19+
- "3.0"
1920
gemfile:
2021
- Gemfile_ar41
2122
- Gemfile_ar50
2223
- Gemfile_ar51
2324
- Gemfile_ar_master
2425
exclude:
25-
- version: 2.7
26+
- version: "2.7"
27+
gemfile: Gemfile_ar41
28+
- version: "3.0"
2629
gemfile: Gemfile_ar41
2730
steps:
2831
- uses: actions/checkout@v2

Gemfile.lock

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ PATH
55
activeresource (>= 4.1.0, < 6.0.0)
66
graphql-client
77
rack
8+
webrick
89

910
GEM
1011
remote: https://rubygems.org/
@@ -78,7 +79,7 @@ GEM
7879
rb-inotify (~> 0.9, >= 0.9.10)
7980
mercenary (0.4.0)
8081
method_source (1.0.0)
81-
minitest (5.14.1)
82+
minitest (5.14.4)
8283
mocha (1.11.2)
8384
parallel (1.19.2)
8485
parser (2.7.2.0)
@@ -129,6 +130,7 @@ GEM
129130
addressable (>= 2.3.6)
130131
crack (>= 0.3.2)
131132
hashdiff (>= 0.4.0, < 2.0.0)
133+
webrick (1.7.0)
132134
zeitwerk (2.3.0)
133135

134136
PLATFORMS
@@ -137,7 +139,7 @@ PLATFORMS
137139
DEPENDENCIES
138140
activeresource (~> 5.1)
139141
jekyll
140-
minitest (>= 4.0)
142+
minitest (>= 5.14)
141143
mocha (>= 1.4.0)
142144
pry
143145
pry-byebug

dev.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: shopify-api
33
type: ruby
44

55
up:
6-
- ruby: 2.7.1
6+
- ruby: "3.0"
77
- bundler
88

99
commands:

lib/shopify_api.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ module ShopifyAPI
2121
require 'shopify_api/countable'
2222
require 'shopify_api/resources'
2323
require 'shopify_api/session'
24+
require 'shopify_api/hmac_params'
2425
require 'shopify_api/api_access'
2526
require 'shopify_api/message_enricher'
2627
require 'shopify_api/connection'

lib/shopify_api/hmac_params.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
require 'webrick/httputils'
3+
4+
module ShopifyAPI
5+
module HmacParams
6+
extend WEBrick::HTTPUtils
7+
8+
def self.encode(params)
9+
params
10+
.except(:signature, :hmac, :action, :controller)
11+
.map { |k,v| sprintf("%s=%s", encode_key(k), encode_value(v)) }
12+
.sort.join("&")
13+
end
14+
15+
def self.encode_key(key)
16+
_escape(key.to_s, _make_regex('&=%'))
17+
end
18+
19+
def self.encode_value(value)
20+
_escape(value.to_s, _make_regex('&%'))
21+
end
22+
end
23+
end

lib/shopify_api/session.rb

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,14 @@ def validate_signature(params)
7171
return false unless (signature = params[:hmac])
7272

7373
calculated_signature = OpenSSL::HMAC.hexdigest(
74-
OpenSSL::Digest.new('SHA256'), secret, encoded_params_for_signature(params)
74+
OpenSSL::Digest.new('SHA256'), secret, ShopifyAPI::HmacParams.encode(params)
7575
)
7676

7777
Rack::Utils.secure_compare(calculated_signature, signature)
7878
end
7979

8080
private
8181

82-
def encoded_params_for_signature(params)
83-
params = params.except(:signature, :hmac, :action, :controller)
84-
params.map { |k, v| "#{URI.escape(k.to_s, '&=%')}=#{URI.escape(v.to_s, '&%')}" }.sort.join('&')
85-
end
86-
8782
def extract_current_session
8883
site = ShopifyAPI::Base.site.to_s
8984
token = ShopifyAPI::Base.headers['X-Shopify-Access-Token']
@@ -188,7 +183,7 @@ def access_scopes=(access_scopes)
188183
end
189184

190185
def parameterize(params)
191-
URI.escape(params.collect { |k, v| "#{k}=#{v}" }.join('&'))
186+
URI.encode_www_form(params)
192187
end
193188

194189
def access_token_request(code)

shopify_api.gemspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ Gem::Specification.new do |s|
3535
s.add_runtime_dependency("activeresource", ">= 4.1.0", "< 6.0.0")
3636
s.add_runtime_dependency("rack")
3737
s.add_runtime_dependency("graphql-client")
38+
s.add_runtime_dependency("webrick")
3839

3940
s.add_development_dependency("mocha", ">= 1.4.0")
4041
s.add_development_dependency("webmock")
41-
s.add_development_dependency("minitest", ">= 4.0")
42+
s.add_development_dependency("minitest", ">= 5.14")
4243
s.add_development_dependency("rake")
4344
s.add_development_dependency("timecop")
4445
s.add_development_dependency("rubocop-shopify")

test/fulfillment_order_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ def setup
315315
fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
316316
message: "Fulfill this FO, please.",
317317
}
318-
response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
318+
response_fulfillment_orders = fulfillment_order.request_fulfillment(**params)
319319

320320
assert_equal('closed', fulfillment_order.status)
321321
assert_equal(3, response_fulfillment_orders.size)
@@ -367,7 +367,7 @@ def setup
367367
fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
368368
message: "Fulfill this FO, please.",
369369
}
370-
response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
370+
response_fulfillment_orders = fulfillment_order.request_fulfillment(**params)
371371

372372
assert_equal('closed', fulfillment_order.status)
373373
assert_equal(3, response_fulfillment_orders.size)

test/hmac_params_test.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# frozen_string_literal: true
2+
require 'test_helper'
3+
4+
class HmacParamsTest < Test::Unit::TestCase
5+
test "cgi param keys are prepared for hmac validation by encoding equals, ampersand, and percent characters" do
6+
assert_equal(
7+
"abcd%26%3D%251234",
8+
ShopifyAPI::HmacParams.encode_key("abcd&=%1234")
9+
)
10+
end
11+
12+
test "cgi param values are prepared for hmac validation by encoding ampersand and percent characters" do
13+
assert_equal(
14+
"abcd%26=%251234",
15+
ShopifyAPI::HmacParams.encode_value("abcd&=%1234")
16+
)
17+
end
18+
19+
test "cgi params are encoded properly for hmac validation" do
20+
assert_equal(
21+
"abcd%26%3D%251234=abcd%26=%251234",
22+
ShopifyAPI::HmacParams.encode({"abcd&=%1234" => "abcd&=%1234"})
23+
)
24+
end
25+
end

test/meta_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ class ApiVersionTest < Test::Unit::TestCase
4040
"display_name": "unstable",
4141
"supported": false,
4242
},
43-
].to_json
43+
].as_json
4444

45-
assert_equal versions, ShopifyAPI::Meta.admin_versions.to_json
45+
assert_equal versions, ShopifyAPI::Meta.admin_versions.as_json
4646
end
4747
end

0 commit comments

Comments
 (0)