shopify_api 8.0.0 → 8.1.0
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/active_resource/detailed_log_subscriber.rb +3 -3
- data/lib/shopify_api.rb +1 -0
- data/lib/shopify_api/connection.rb +1 -1
- data/lib/shopify_api/message_enricher.rb +17 -0
- data/lib/shopify_api/paginated_collection.rb +12 -0
- data/lib/shopify_api/resources/collection.rb +1 -1
- data/lib/shopify_api/session.rb +1 -1
- data/lib/shopify_api/version.rb +1 -1
- data/test/api_version_test.rb +6 -5
- data/test/collection_test.rb +8 -8
- data/test/fixtures/api_versions.json +16 -10
- data/test/fixtures/apis.json +10 -4
- data/test/message_enricher_test.rb +33 -0
- data/test/meta_test.rb +15 -9
- data/test/pagination_test.rb +28 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6b6467bc9d4c7e3180f0385a0b7c6f75921b391659e7d0566796fb34f5fe63d
|
4
|
+
data.tar.gz: 6bcd7084be9a692d3e960c5659b4ed4e25abd629e6f91f58faa9934f55f720a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ab61dddb0c4fe44d89c9bced7e328c8e76932c9876803d2aeef6ea0a7c9eace8eaa728841f9445a2c59e53b555d8c16c40b4ed881b8630069f2e8343c2f3971
|
7
|
+
data.tar.gz: 5808669808de2b254c33d2a0d4f120f9b47a4868bb992575824f2a9348ecd74a1c54231b3ed821e694de1c2ed63ae6653c5138b6e86874d88c2a10fcee080965
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== Version 8.1.0
|
2
|
+
|
3
|
+
* Release 2020-01 REST ADMIN API VERSION [#656](https://github.com/Shopify/shopify_api/pull/656)
|
4
|
+
* Release new Endpoint `collection.products` and `collection.find()` in 2020-01 REST API version [#657](https://github.com/Shopify/shopify_api/pull/657)
|
5
|
+
* Enrich 4xx errors with error message from response body [#647](https://github.com/Shopify/shopify_api/pull/647)
|
6
|
+
* Make relative cursor based pagination work across page loads [#625](https://github.com/Shopify/shopify_api/pull/625)
|
7
|
+
* Small ruby compat fix [#623](https://github.com/Shopify/shopify_api/pull/623)
|
8
|
+
* Small consistency change [#621](https://github.com/Shopify/shopify_api/pull/621)
|
9
|
+
|
1
10
|
== Version 8.0.0
|
2
11
|
|
3
12
|
* Api Version changes [#600](https://github.com/Shopify/shopify_api/pull/600)
|
@@ -27,9 +27,9 @@ module ActiveResource
|
|
27
27
|
payload[:response].each do |header_name, header_value|
|
28
28
|
case header_name.downcase
|
29
29
|
when 'x-shopify-api-deprecated-reason'
|
30
|
-
warning_message =
|
31
|
-
|
32
|
-
|
30
|
+
warning_message = <<-MSG
|
31
|
+
[DEPRECATED] ShopifyAPI made a call to #{payload[:method].upcase} #{payload[:path]}, and this call made
|
32
|
+
use of a deprecated endpoint, behaviour, or parameter. See #{header_value} for more details.
|
33
33
|
MSG
|
34
34
|
|
35
35
|
warn warning_message
|
data/lib/shopify_api.rb
CHANGED
@@ -20,6 +20,7 @@ require 'shopify_api/metafields'
|
|
20
20
|
require 'shopify_api/countable'
|
21
21
|
require 'shopify_api/resources'
|
22
22
|
require 'shopify_api/session'
|
23
|
+
require 'shopify_api/message_enricher'
|
23
24
|
require 'shopify_api/connection'
|
24
25
|
require 'shopify_api/pagination_link_headers'
|
25
26
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ShopifyAPI
|
2
|
+
class MessageEnricher < SimpleDelegator
|
3
|
+
def message
|
4
|
+
return super unless (400...500).include?(code.to_i)
|
5
|
+
|
6
|
+
@_cached_message ||= begin
|
7
|
+
detailed_error = begin
|
8
|
+
JSON.parse(body)['error'].to_s
|
9
|
+
rescue JSON::ParserError
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
detailed_error.present? ? "#{super} (#{detailed_error})" : super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -27,6 +27,14 @@ module ShopifyAPI
|
|
27
27
|
fetch_page(@previous_url)
|
28
28
|
end
|
29
29
|
|
30
|
+
def next_page_info
|
31
|
+
extract_page_info(@next_url)
|
32
|
+
end
|
33
|
+
|
34
|
+
def previous_page_info
|
35
|
+
extract_page_info(@previous_url)
|
36
|
+
end
|
37
|
+
|
30
38
|
private
|
31
39
|
|
32
40
|
AVAILABLE_IN_VERSION = ShopifyAPI::ApiVersion.find_version('2019-10')
|
@@ -50,6 +58,10 @@ module ShopifyAPI
|
|
50
58
|
return if ShopifyAPI::Base.api_version >= AVAILABLE_IN_VERSION_EARLY && resource_class.early_july_pagination?
|
51
59
|
raise NotImplementedError
|
52
60
|
end
|
61
|
+
|
62
|
+
def extract_page_info(url)
|
63
|
+
CGI.escape(Rack::Utils.parse_query(URI(url).query)['page_info']) if url.present?
|
64
|
+
end
|
53
65
|
end
|
54
66
|
|
55
67
|
include CollectionPagination
|
@@ -6,7 +6,7 @@ module ShopifyAPI
|
|
6
6
|
include Metafields
|
7
7
|
|
8
8
|
def products(options = {})
|
9
|
-
available_in_version = ShopifyAPI::ApiVersion.find_version(
|
9
|
+
available_in_version = ShopifyAPI::ApiVersion.find_version('2020-01')
|
10
10
|
raise NotImplementedError unless ShopifyAPI::Base.api_version >= available_in_version
|
11
11
|
Product.find(:all, from: "#{self.class.prefix}collections/#{id}/products.json", params: options)
|
12
12
|
end
|
data/lib/shopify_api/session.rb
CHANGED
@@ -104,7 +104,7 @@ module ShopifyAPI
|
|
104
104
|
raise ShopifyAPI::ValidationException, "Invalid Signature: Possible malicious login"
|
105
105
|
end
|
106
106
|
|
107
|
-
response = access_token_request(params[
|
107
|
+
response = access_token_request(params[:code])
|
108
108
|
if response.code == "200"
|
109
109
|
self.extra = JSON.parse(response.body)
|
110
110
|
self.token = extra.delete('access_token')
|
data/lib/shopify_api/version.rb
CHANGED
data/test/api_version_test.rb
CHANGED
@@ -22,15 +22,15 @@ class ApiVersionTest < Test::Unit::TestCase
|
|
22
22
|
test "find_version removes unverified versions from version set if mode is set to :raise_on_unknown" do
|
23
23
|
ShopifyAPI::ApiVersion.version_lookup_mode = :define_on_unknown
|
24
24
|
assert ShopifyAPI::ApiVersion.versions.values.all?(&:verified?)
|
25
|
-
assert_equal
|
25
|
+
assert_equal 6, ShopifyAPI::ApiVersion.versions.size
|
26
26
|
|
27
27
|
ShopifyAPI::ApiVersion.find_version('2019-30')
|
28
28
|
refute ShopifyAPI::ApiVersion.versions.values.all?(&:verified?)
|
29
|
-
assert_equal
|
29
|
+
assert_equal 7, ShopifyAPI::ApiVersion.versions.size
|
30
30
|
ShopifyAPI::ApiVersion.version_lookup_mode = :raise_on_unknown
|
31
31
|
|
32
32
|
assert ShopifyAPI::ApiVersion.versions.values.all?(&:verified?)
|
33
|
-
assert_equal
|
33
|
+
assert_equal 6, ShopifyAPI::ApiVersion.versions.size
|
34
34
|
end
|
35
35
|
|
36
36
|
test "find_version does not raise when coercing a string if no versions are defined when version_lookup_mode is :define_on_unknown" do
|
@@ -101,8 +101,9 @@ class ApiVersionTest < Test::Unit::TestCase
|
|
101
101
|
{
|
102
102
|
"2019-01" => ShopifyAPI::ApiVersion.new(handle: '2019-01', supported: true, latest_supported: false),
|
103
103
|
"2019-04" => ShopifyAPI::ApiVersion.new(handle: '2019-04', supported: true, latest_supported: false),
|
104
|
-
"2019-07" => ShopifyAPI::ApiVersion.new(handle: '2019-07', supported: true, latest_supported:
|
104
|
+
"2019-07" => ShopifyAPI::ApiVersion.new(handle: '2019-07', supported: true, latest_supported: false),
|
105
105
|
"2019-10" => ShopifyAPI::ApiVersion.new(handle: '2019-10', supported: false, latest_supported: false),
|
106
|
+
"2020-01" => ShopifyAPI::ApiVersion.new(handle: '2020-01', supported: false, latest_supported: true),
|
106
107
|
"unstable" => ShopifyAPI::ApiVersion.new(handle: 'unstable', supported: false, latest_supported: false),
|
107
108
|
}
|
108
109
|
)
|
@@ -114,7 +115,7 @@ class ApiVersionTest < Test::Unit::TestCase
|
|
114
115
|
)
|
115
116
|
|
116
117
|
assert_equal(
|
117
|
-
ShopifyAPI::ApiVersion.new(handle: '
|
118
|
+
ShopifyAPI::ApiVersion.new(handle: '2020-01'),
|
118
119
|
ShopifyAPI::ApiVersion.latest_stable_version
|
119
120
|
)
|
120
121
|
end
|
data/test/collection_test.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class CollectionTest < Test::Unit::TestCase
|
4
|
-
test "Collection get products gets all products in a collection on
|
5
|
-
|
6
|
-
ShopifyAPI::Base.activate_session(
|
4
|
+
test "Collection get products gets all products in a collection on 2020-01 version" do
|
5
|
+
available_version = ShopifyAPI::Session.new(domain: 'shop2.myshopify.com', token: 'token2', api_version: '2020-01')
|
6
|
+
ShopifyAPI::Base.activate_session(available_version)
|
7
7
|
|
8
8
|
fake(
|
9
9
|
'collections',
|
10
|
-
url: 'https://shop2.myshopify.com/admin/api/
|
10
|
+
url: 'https://shop2.myshopify.com/admin/api/2020-01/collections/1.json',
|
11
11
|
method: :get,
|
12
12
|
status: 200,
|
13
13
|
body: load_fixture('collection'),
|
@@ -18,7 +18,7 @@ class CollectionTest < Test::Unit::TestCase
|
|
18
18
|
|
19
19
|
fake(
|
20
20
|
'products',
|
21
|
-
url: 'https://shop2.myshopify.com/admin/api/
|
21
|
+
url: 'https://shop2.myshopify.com/admin/api/2020-01/collections/1/products.json',
|
22
22
|
method: :get,
|
23
23
|
status: 200,
|
24
24
|
body: load_fixture('collection_products'),
|
@@ -28,12 +28,12 @@ class CollectionTest < Test::Unit::TestCase
|
|
28
28
|
end
|
29
29
|
|
30
30
|
test "Collection get products fails on older api version" do
|
31
|
-
|
32
|
-
ShopifyAPI::Base.activate_session(
|
31
|
+
old_version = ShopifyAPI::Session.new(domain: 'shop2.myshopify.com', token: 'token2', api_version: '2019-10')
|
32
|
+
ShopifyAPI::Base.activate_session(old_version)
|
33
33
|
|
34
34
|
fake(
|
35
35
|
'collections',
|
36
|
-
url: 'https://shop2.myshopify.com/admin/api/2019-
|
36
|
+
url: 'https://shop2.myshopify.com/admin/api/2019-10/collections/1.json',
|
37
37
|
method: :get,
|
38
38
|
status: 200,
|
39
39
|
body: load_fixture('collection'),
|
@@ -7,26 +7,32 @@
|
|
7
7
|
},
|
8
8
|
{
|
9
9
|
"handle": "2019-04",
|
10
|
+
"latest_supported": false,
|
10
11
|
"display_name": "2019-04",
|
11
|
-
"supported": true
|
12
|
-
"latest_supported": false
|
12
|
+
"supported": true
|
13
13
|
},
|
14
14
|
{
|
15
15
|
"handle": "2019-07",
|
16
|
-
"
|
17
|
-
"
|
18
|
-
"
|
16
|
+
"latest_supported": false,
|
17
|
+
"display_name": "2019-07",
|
18
|
+
"supported": true
|
19
19
|
},
|
20
20
|
{
|
21
21
|
"handle": "2019-10",
|
22
|
-
"
|
23
|
-
"
|
24
|
-
"
|
22
|
+
"latest_supported": false,
|
23
|
+
"display_name": "2019-10",
|
24
|
+
"supported": true
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"handle": "2020-01",
|
28
|
+
"latest_supported": true,
|
29
|
+
"display_name": "2020-01 (Latest)",
|
30
|
+
"supported": true
|
25
31
|
},
|
26
32
|
{
|
27
33
|
"handle": "unstable",
|
34
|
+
"latest_supported": false,
|
28
35
|
"display_name": "unstable",
|
29
|
-
"supported": false
|
30
|
-
"latest_supported": false
|
36
|
+
"supported": false
|
31
37
|
}
|
32
38
|
]
|
data/test/fixtures/apis.json
CHANGED
@@ -14,15 +14,21 @@
|
|
14
14
|
},
|
15
15
|
{
|
16
16
|
"handle": "2019-07",
|
17
|
-
"latest_supported":
|
18
|
-
"display_name": "2019-07
|
17
|
+
"latest_supported": false,
|
18
|
+
"display_name": "2019-07",
|
19
19
|
"supported": true
|
20
20
|
},
|
21
21
|
{
|
22
22
|
"handle": "2019-10",
|
23
23
|
"latest_supported": false,
|
24
|
-
"display_name": "2019-10
|
25
|
-
"supported":
|
24
|
+
"display_name": "2019-10",
|
25
|
+
"supported": true
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"handle": "2020-01",
|
29
|
+
"latest_supported": true,
|
30
|
+
"display_name": "2020-01 (Latest)",
|
31
|
+
"supported": true
|
26
32
|
},
|
27
33
|
{
|
28
34
|
"handle": "unstable",
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MessageEnricherTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_enriches_initial_message_when_body_is_passed
|
6
|
+
response = enriched_response(422, 'InitialMessage', { error: 'My Error' })
|
7
|
+
|
8
|
+
assert_equal 'InitialMessage (My Error)', response.message
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_returns_initial_message_when_code_is_200
|
12
|
+
response = enriched_response(200, 'InitialMessage', { result: 'Success' })
|
13
|
+
|
14
|
+
assert_equal 'InitialMessage', response.message
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_returns_initial_message_when_body_cant_be_parsed
|
18
|
+
response = enriched_response(422, 'InitialMessage', 'not a json')
|
19
|
+
|
20
|
+
assert_equal 'InitialMessage', response.message
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def enriched_response(code, message, body)
|
26
|
+
mock_response =
|
27
|
+
Struct
|
28
|
+
.new(:code, :message, :body)
|
29
|
+
.new(code.to_s, message.to_s, body.to_json)
|
30
|
+
|
31
|
+
ShopifyAPI::MessageEnricher.new(mock_response)
|
32
|
+
end
|
33
|
+
end
|
data/test/meta_test.rb
CHANGED
@@ -8,32 +8,38 @@ class ApiVersionTest < Test::Unit::TestCase
|
|
8
8
|
"handle": "2019-01",
|
9
9
|
"display_name": "2019-01",
|
10
10
|
"supported": true,
|
11
|
-
"latest_supported": false
|
11
|
+
"latest_supported": false
|
12
12
|
},
|
13
13
|
{
|
14
14
|
"handle": "2019-04",
|
15
15
|
"latest_supported": false,
|
16
16
|
"display_name": "2019-04",
|
17
|
-
"supported": true
|
17
|
+
"supported": true
|
18
18
|
},
|
19
19
|
{
|
20
20
|
"handle": "2019-07",
|
21
|
-
"latest_supported":
|
22
|
-
"display_name": "2019-07
|
23
|
-
"supported": true
|
21
|
+
"latest_supported": false,
|
22
|
+
"display_name": "2019-07",
|
23
|
+
"supported": true
|
24
24
|
},
|
25
25
|
{
|
26
26
|
"handle": "2019-10",
|
27
27
|
"latest_supported": false,
|
28
|
-
"display_name": "2019-10
|
29
|
-
"supported":
|
28
|
+
"display_name": "2019-10",
|
29
|
+
"supported": true
|
30
|
+
},
|
31
|
+
{
|
32
|
+
"handle": "2020-01",
|
33
|
+
"latest_supported": true,
|
34
|
+
"display_name": "2020-01 (Latest)",
|
35
|
+
"supported": true
|
30
36
|
},
|
31
37
|
{
|
32
38
|
"handle": "unstable",
|
33
39
|
"latest_supported": false,
|
34
40
|
"display_name": "unstable",
|
35
|
-
"supported": false
|
36
|
-
}
|
41
|
+
"supported": false
|
42
|
+
}
|
37
43
|
].to_json
|
38
44
|
|
39
45
|
|
data/test/pagination_test.rb
CHANGED
@@ -97,6 +97,20 @@ class PaginationTest < Test::Unit::TestCase
|
|
97
97
|
refute orders.next_page?
|
98
98
|
end
|
99
99
|
|
100
|
+
test "#next_page_info returns next_page_info if next page is present" do
|
101
|
+
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
|
102
|
+
orders = ShopifyAPI::Order.all
|
103
|
+
|
104
|
+
assert_equal @next_page_info, orders.next_page_info
|
105
|
+
end
|
106
|
+
|
107
|
+
test "#next_page_info returns nil if next page is not present" do
|
108
|
+
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
|
109
|
+
orders = ShopifyAPI::Order.all
|
110
|
+
|
111
|
+
assert_nil orders.next_page_info
|
112
|
+
end
|
113
|
+
|
100
114
|
test "#previous_page? returns true if previous page is present" do
|
101
115
|
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
|
102
116
|
orders = ShopifyAPI::Order.all
|
@@ -111,6 +125,20 @@ class PaginationTest < Test::Unit::TestCase
|
|
111
125
|
refute orders.previous_page?
|
112
126
|
end
|
113
127
|
|
128
|
+
test "#previous_page_info returns previous_page_info if next page is present" do
|
129
|
+
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
|
130
|
+
orders = ShopifyAPI::Order.all
|
131
|
+
|
132
|
+
assert_equal @previous_page_info, orders.previous_page_info
|
133
|
+
end
|
134
|
+
|
135
|
+
test "#previous_page_info returns nil if next page is not present" do
|
136
|
+
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
|
137
|
+
orders = ShopifyAPI::Order.all
|
138
|
+
|
139
|
+
assert_nil orders.previous_page_info
|
140
|
+
end
|
141
|
+
|
114
142
|
test "pagination handles no link headers" do
|
115
143
|
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders')
|
116
144
|
orders = ShopifyAPI::Order.all
|
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: 8.
|
4
|
+
version: 8.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeresource
|
@@ -213,6 +213,7 @@ files:
|
|
213
213
|
- lib/shopify_api/disable_prefix_check.rb
|
214
214
|
- lib/shopify_api/events.rb
|
215
215
|
- lib/shopify_api/limits.rb
|
216
|
+
- lib/shopify_api/message_enricher.rb
|
216
217
|
- lib/shopify_api/meta.rb
|
217
218
|
- lib/shopify_api/metafields.rb
|
218
219
|
- lib/shopify_api/paginated_collection.rb
|
@@ -456,6 +457,7 @@ files:
|
|
456
457
|
- test/limits_test.rb
|
457
458
|
- test/location_test.rb
|
458
459
|
- test/marketing_event_test.rb
|
460
|
+
- test/message_enricher_test.rb
|
459
461
|
- test/meta_test.rb
|
460
462
|
- test/metafield_test.rb
|
461
463
|
- test/order_risk_test.rb
|