shopify_api 9.4.1 → 9.5

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: 9b4f86a8f19033687d5dda9d848efcc2906e506375d7f05365180afa065e0c7e
4
- data.tar.gz: 47f66045afe505387863977fc14a02217fe85ac11d9d9d0f0e8ac061f2f2af6d
3
+ metadata.gz: 86c73a80fab5607e57486b42ce37c750797bfc5ac391012b0ca4b8ad2e8dee7e
4
+ data.tar.gz: 7b4df963e1f9163d23a51623aa845f32a0bf996abf5f447f22a7226f0b6f0b5d
5
5
  SHA512:
6
- metadata.gz: 2aa02363f15762bc316b4d5281799526ac00c9793570fc4b63ff41d7db033ae70ff046ca007d3d855dbb14dde54803a7d42e62a1466c45a30ddd3664493950a6
7
- data.tar.gz: 5e720ca16972acd0dd2a96eac7d331d06ce3979efd7b97b007f612458f2b05de89d9a08a4d54bc8265553e3664811f3814c91b5cc8957317dd4e0f444f85c27a
6
+ metadata.gz: 87c1fdb069d8f3946eb2136c99eede3f03eb86373ccd60a1e7e46188b7fd141fd418e92a665802949b6b196625aafd6e4065af815cc52f5ff5d437e25517b7d1
7
+ data.tar.gz: ca85757c71561e6956f1e7499142a45f44d511e9256fb112fc594302d12bdca3d0071d68534a2e8061e0949251aec1c00cd8c5c977a7cfc040f3419ab7a9a1bb
data/.github/CODEOWNERS CHANGED
@@ -1 +1 @@
1
- * @shopify/platform-dev-tools-education
1
+ * @shopify/core-build-learn
@@ -12,17 +12,20 @@ jobs:
12
12
  strategy:
13
13
  matrix:
14
14
  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"
19
20
  gemfile:
20
21
  - Gemfile_ar41
21
22
  - Gemfile_ar50
22
23
  - Gemfile_ar51
23
24
  - Gemfile_ar_master
24
25
  exclude:
25
- - version: 2.7
26
+ - version: "2.7"
27
+ gemfile: Gemfile_ar41
28
+ - version: "3.0"
26
29
  gemfile: Gemfile_ar41
27
30
  steps:
28
31
  - uses: actions/checkout@v2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## Version 9.5
2
+
3
+ * [#883](https://github.com/Shopify/shopify_api/pull/883) Add support for Ruby 3.0
4
+
1
5
  ## Version 9.4.1
2
6
 
3
7
  * [#847](https://github.com/Shopify/shopify_api/pull/847) Update `create_permission_url` method to use grant_options
data/Gemfile.lock CHANGED
@@ -1,10 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shopify_api (9.4.1)
4
+ shopify_api (9.5)
5
5
  activeresource (>= 4.1.0, < 6.0.0)
6
6
  graphql-client
7
7
  rack
8
+ webrick
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
@@ -25,7 +26,7 @@ GEM
25
26
  minitest (~> 5.1)
26
27
  tzinfo (~> 1.1)
27
28
  zeitwerk (~> 2.2, >= 2.2.2)
28
- addressable (2.7.0)
29
+ addressable (2.8.0)
29
30
  public_suffix (>= 2.0.2, < 5.0)
30
31
  ast (2.4.1)
31
32
  builder (3.2.4)
@@ -41,10 +42,10 @@ GEM
41
42
  eventmachine (1.2.7)
42
43
  ffi (1.12.2)
43
44
  forwardable-extended (2.6.0)
44
- graphql (1.12.6)
45
- graphql-client (0.16.0)
45
+ graphql (1.12.16)
46
+ graphql-client (0.17.0)
46
47
  activesupport (>= 3.0)
47
- graphql (~> 1.8)
48
+ graphql (~> 1.10)
48
49
  hashdiff (1.0.1)
49
50
  http_parser.rb (0.6.0)
50
51
  i18n (1.8.2)
@@ -78,7 +79,7 @@ GEM
78
79
  rb-inotify (~> 0.9, >= 0.9.10)
79
80
  mercenary (0.4.0)
80
81
  method_source (1.0.0)
81
- minitest (5.14.1)
82
+ minitest (5.14.4)
82
83
  mocha (1.11.2)
83
84
  parallel (1.19.2)
84
85
  parser (2.7.2.0)
@@ -91,7 +92,7 @@ GEM
91
92
  pry-byebug (3.9.0)
92
93
  byebug (~> 11.0)
93
94
  pry (~> 0.13.0)
94
- public_suffix (4.0.5)
95
+ public_suffix (4.0.6)
95
96
  rack (2.2.3)
96
97
  rainbow (3.0.0)
97
98
  rake (13.0.1)
@@ -99,7 +100,7 @@ GEM
99
100
  rb-inotify (0.10.1)
100
101
  ffi (~> 1.0)
101
102
  regexp_parser (1.8.2)
102
- rexml (3.2.4)
103
+ rexml (3.2.5)
103
104
  rouge (3.19.0)
104
105
  rubocop (0.93.1)
105
106
  parallel (~> 1.10)
@@ -129,6 +130,7 @@ GEM
129
130
  addressable (>= 2.3.6)
130
131
  crack (>= 0.3.2)
131
132
  hashdiff (>= 0.4.0, < 2.0.0)
133
+ webrick (1.7.0)
132
134
  zeitwerk (2.3.0)
133
135
 
134
136
  PLATFORMS
@@ -137,7 +139,7 @@ PLATFORMS
137
139
  DEPENDENCIES
138
140
  activeresource (~> 5.1)
139
141
  jekyll
140
- minitest (>= 4.0)
142
+ minitest (>= 5.14)
141
143
  mocha (>= 1.4.0)
142
144
  pry
143
145
  pry-byebug
@@ -148,4 +150,4 @@ DEPENDENCIES
148
150
  webmock
149
151
 
150
152
  BUNDLED WITH
151
- 2.1.4
153
+ 2.2.22
data/dev.yml ADDED
@@ -0,0 +1,11 @@
1
+ name: shopify-api
2
+
3
+ type: ruby
4
+
5
+ up:
6
+ - ruby: "3.0"
7
+ - bundler
8
+
9
+ commands:
10
+ test:
11
+ run: bundle exec rake test
@@ -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
@@ -71,7 +71,7 @@ module ShopifyAPI
71
71
  return false unless (signature = params[:hmac])
72
72
 
73
73
  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)
75
75
  )
76
76
 
77
77
  Rack::Utils.secure_compare(calculated_signature, signature)
@@ -79,11 +79,6 @@ module ShopifyAPI
79
79
 
80
80
  private
81
81
 
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
-
87
82
  def extract_current_session
88
83
  site = ShopifyAPI::Base.site.to_s
89
84
  token = ShopifyAPI::Base.headers['X-Shopify-Access-Token']
@@ -188,7 +183,7 @@ module ShopifyAPI
188
183
  end
189
184
 
190
185
  def parameterize(params)
191
- URI.escape(params.collect { |k, v| "#{k}=#{v}" }.join('&'))
186
+ URI.encode_www_form(params)
192
187
  end
193
188
 
194
189
  def access_token_request(code)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ShopifyAPI
3
- VERSION = "9.4.1"
3
+ VERSION = "9.5"
4
4
  end
data/lib/shopify_api.rb CHANGED
@@ -21,6 +21,7 @@ require 'shopify_api/metafields'
21
21
  require 'shopify_api/countable'
22
22
  require 'shopify_api/resources'
23
23
  require 'shopify_api/session'
24
+ require 'shopify_api/hmac_params'
24
25
  require 'shopify_api/api_access'
25
26
  require 'shopify_api/message_enricher'
26
27
  require 'shopify_api/connection'
data/service.yml CHANGED
@@ -1,8 +1,5 @@
1
1
  audience: partner
2
2
  classification: library
3
- org_line: App & Partner Platform
4
- owners:
5
- - Shopify/app-partner-dev-tools-education
6
3
  slack_channels:
7
- - dev-tools-education
8
- - help-api-patterns
4
+ - core-build-learn
5
+ - help-api-patterns
data/shopify_api.gemspec CHANGED
@@ -35,10 +35,11 @@ Gem::Specification.new do |s|
35
35
  s.add_runtime_dependency("activeresource", ">= 4.1.0", "< 6.0.0")
36
36
  s.add_runtime_dependency("rack")
37
37
  s.add_runtime_dependency("graphql-client")
38
+ s.add_runtime_dependency("webrick")
38
39
 
39
40
  s.add_development_dependency("mocha", ">= 1.4.0")
40
41
  s.add_development_dependency("webmock")
41
- s.add_development_dependency("minitest", ">= 4.0")
42
+ s.add_development_dependency("minitest", ">= 5.14")
42
43
  s.add_development_dependency("rake")
43
44
  s.add_development_dependency("timecop")
44
45
  s.add_development_dependency("rubocop-shopify")
@@ -315,7 +315,7 @@ class FulFillmentOrderTest < Test::Unit::TestCase
315
315
  fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
316
316
  message: "Fulfill this FO, please.",
317
317
  }
318
- response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
318
+ response_fulfillment_orders = fulfillment_order.request_fulfillment(**params)
319
319
 
320
320
  assert_equal('closed', fulfillment_order.status)
321
321
  assert_equal(3, response_fulfillment_orders.size)
@@ -367,7 +367,7 @@ class FulFillmentOrderTest < Test::Unit::TestCase
367
367
  fulfillment_order_line_items: [{ id: 1, quantity: 1 }],
368
368
  message: "Fulfill this FO, please.",
369
369
  }
370
- response_fulfillment_orders = fulfillment_order.request_fulfillment(params)
370
+ response_fulfillment_orders = fulfillment_order.request_fulfillment(**params)
371
371
 
372
372
  assert_equal('closed', fulfillment_order.status)
373
373
  assert_equal(3, response_fulfillment_orders.size)
@@ -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
data/test/meta_test.rb CHANGED
@@ -40,8 +40,8 @@ class ApiVersionTest < Test::Unit::TestCase
40
40
  "display_name": "unstable",
41
41
  "supported": false,
42
42
  },
43
- ].to_json
43
+ ].as_json
44
44
 
45
- assert_equal versions, ShopifyAPI::Meta.admin_versions.to_json
45
+ assert_equal versions, ShopifyAPI::Meta.admin_versions.as_json
46
46
  end
47
47
  end
data/test/session_test.rb CHANGED
@@ -94,7 +94,7 @@ class SessionTest < Test::Unit::TestCase
94
94
  end
95
95
 
96
96
  test "ignore everything but the subdomain in the shop" do
97
- assert_equal(
97
+ assert_equal_uri(
98
98
  "https://testshop.myshopify.com",
99
99
  ShopifyAPI::Session.new(
100
100
  domain: "http://user:pass@testshop.notshopify.net/path",
@@ -105,7 +105,7 @@ class SessionTest < Test::Unit::TestCase
105
105
  end
106
106
 
107
107
  test "append the myshopify domain if not given" do
108
- assert_equal(
108
+ assert_equal_uri(
109
109
  "https://testshop.myshopify.com",
110
110
  ShopifyAPI::Session.new(domain: "testshop", token: "any-token", api_version: any_api_version).site
111
111
  )
@@ -283,7 +283,7 @@ class SessionTest < Test::Unit::TestCase
283
283
  )
284
284
  scope = ["write_products"]
285
285
  permission_url = session.create_permission_url(scope, "http://my_redirect_uri.com")
286
- assert_equal(
286
+ assert_equal_uri(
287
287
  "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&" \
288
288
  "scope=write_products&redirect_uri=http://my_redirect_uri.com",
289
289
  permission_url
@@ -299,7 +299,7 @@ class SessionTest < Test::Unit::TestCase
299
299
  )
300
300
  scope = ["write_products", "write_customers"]
301
301
  permission_url = session.create_permission_url(scope, "http://my_redirect_uri.com")
302
- assert_equal(
302
+ assert_equal_uri(
303
303
  "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&" \
304
304
  "scope=write_products,write_customers&redirect_uri=http://my_redirect_uri.com",
305
305
  permission_url
@@ -315,7 +315,7 @@ class SessionTest < Test::Unit::TestCase
315
315
  )
316
316
  scope = []
317
317
  permission_url = session.create_permission_url(scope, "http://my_redirect_uri.com")
318
- assert_equal(
318
+ assert_equal_uri(
319
319
  "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&" \
320
320
  "scope=&redirect_uri=http://my_redirect_uri.com",
321
321
  permission_url
@@ -331,9 +331,9 @@ class SessionTest < Test::Unit::TestCase
331
331
  )
332
332
  scope = []
333
333
  permission_url = session.create_permission_url(scope, "http://my_redirect_uri.com", state: "My nonce")
334
- assert_equal(
334
+ assert_equal_uri(
335
335
  "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&" \
336
- "scope=&redirect_uri=http://my_redirect_uri.com&state=My%20nonce",
336
+ "scope=&redirect_uri=http://my_redirect_uri.com&state=My+nonce",
337
337
  permission_url
338
338
  )
339
339
  end
@@ -347,7 +347,7 @@ class SessionTest < Test::Unit::TestCase
347
347
  )
348
348
  scope = []
349
349
  permission_url = session.create_permission_url(scope, "http://my_redirect_uri.com", grant_options: "per-user")
350
- assert_equal(
350
+ assert_equal_uri(
351
351
  "https://localhost.myshopify.com/admin/oauth/authorize?client_id=My_test_key&" \
352
352
  "scope=&redirect_uri=http://my_redirect_uri.com&grant_options[]=per-user",
353
353
  permission_url
@@ -380,7 +380,7 @@ class SessionTest < Test::Unit::TestCase
380
380
  token: "any-token",
381
381
  api_version: any_api_version
382
382
  )
383
- assert_equal("https://testshop.myshopify.com", session.site)
383
+ assert_equal_uri("https://testshop.myshopify.com", session.site)
384
384
  end
385
385
 
386
386
  test "return_token_if_signature_is_valid" do
@@ -618,6 +618,10 @@ class SessionTest < Test::Unit::TestCase
618
618
 
619
619
  private
620
620
 
621
+ def assert_equal_uri(expected, actual)
622
+ assert_equal(Addressable::URI.parse(expected), Addressable::URI.parse(actual))
623
+ end
624
+
621
625
  def make_sorted_params(params)
622
626
  params.with_indifferent_access.except(
623
627
  :signature, :hmac, :action, :controller
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.4.1
4
+ version: '9.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-30 00:00:00.000000000 Z
11
+ date: 2021-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activeresource
@@ -58,6 +58,20 @@ dependencies:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: webrick
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
61
75
  - !ruby/object:Gem::Dependency
62
76
  name: mocha
63
77
  requirement: !ruby/object:Gem::Requirement
@@ -92,14 +106,14 @@ dependencies:
92
106
  requirements:
93
107
  - - ">="
94
108
  - !ruby/object:Gem::Version
95
- version: '4.0'
109
+ version: '5.14'
96
110
  type: :development
97
111
  prerelease: false
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
114
  - - ">="
101
115
  - !ruby/object:Gem::Version
102
- version: '4.0'
116
+ version: '5.14'
103
117
  - !ruby/object:Gem::Dependency
104
118
  name: rake
105
119
  requirement: !ruby/object:Gem::Requirement
@@ -204,6 +218,7 @@ files:
204
218
  - RELEASING
205
219
  - Rakefile
206
220
  - SECURITY.md
221
+ - dev.yml
207
222
  - docker-compose.yml
208
223
  - docs/_config.yml
209
224
  - docs/_includes/footer.html
@@ -225,6 +240,7 @@ files:
225
240
  - lib/shopify_api/graphql/http_client.rb
226
241
  - lib/shopify_api/graphql/railtie.rb
227
242
  - lib/shopify_api/graphql/task.rake
243
+ - lib/shopify_api/hmac_params.rb
228
244
  - lib/shopify_api/limits.rb
229
245
  - lib/shopify_api/message_enricher.rb
230
246
  - lib/shopify_api/meta.rb
@@ -487,6 +503,7 @@ files:
487
503
  - test/gift_card_test.rb
488
504
  - test/graphql/http_client_test.rb
489
505
  - test/graphql_test.rb
506
+ - test/hmac_params_test.rb
490
507
  - test/image_test.rb
491
508
  - test/inventory_level_test.rb
492
509
  - test/lib/webmock_extensions/last_request.rb
@@ -547,7 +564,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
547
564
  - !ruby/object:Gem::Version
548
565
  version: '0'
549
566
  requirements: []
550
- rubygems_version: 3.0.3
567
+ rubygems_version: 3.2.20
551
568
  signing_key:
552
569
  specification_version: 4
553
570
  summary: ShopifyAPI is a lightweight gem for accessing the Shopify admin REST web