lucid-shopify 0.37.0 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 514e2e06b6f26b6bb7cf487e1c8bdf15ced2d6f22edc0999bb938d80ed56b84e
4
- data.tar.gz: '00976c459f606e71d097a016b1529f2e735366a49ff0972da489522638501170'
3
+ metadata.gz: 98281c9fea5c19507b29e96c9ac8d5ccaf1c1f94b902cd3f736c28514913228a
4
+ data.tar.gz: 5e7c2d62db39d4ca105666fccc329b255d3e20e4de7730d2d75f8dd031d3cd77
5
5
  SHA512:
6
- metadata.gz: 4a90a8ecb406a9ebdd61d3605a278a5a1f9de09133b26561b406f8fefa4bbeccea2db2d46f060b55bf5c54a9b8a01ba5b1f97b345b1d582578bedcafdb514cfb
7
- data.tar.gz: 8b3649891e6cc04e146b8e793cd959c52169b94bb1deb06ae65191fe40e91b87ac31d713be6db50f97176c7f8e7c105dd9955a7413a6aa7723b9f64e690ed99b
6
+ metadata.gz: 9461458119fca0aafc7fe4ebe00366a544ca63aba55588beec3d86d749f26ae9b2e7f31da3460511ea471b4f0fdbfb04c05a35ff0906fbb4809d7b5c00cc84a7
7
+ data.tar.gz: 6912e93c75a6c708b7da8e31b778fe266ce26e823473c3a6a5859b73e716feb73b307bab2b7dd0ddfe90ab88fde65bb7e219349705656ef9b7cda715db4719c6
data/README.md CHANGED
@@ -16,7 +16,7 @@ Usage
16
16
 
17
17
  Lucid::Shopify.configure do |config|
18
18
  config.api_key = '...'
19
- config.api_version = '...' # e.g. '2019-07'
19
+ config.api_version = '...' # e.g. '2020-01'
20
20
  config.billing_callback_uri = '...'
21
21
  config.callback_uri = '...' # (for OAuth; unused by this gem)
22
22
  config.logger = Logger.new(STDOUT)
@@ -135,11 +135,26 @@ Request logging is disabled by default. To enable it:
135
135
 
136
136
  Lucid::Shopify.config.logger = Logger.new(STDOUT)
137
137
 
138
+ Request throttling is enabled by default. If you're using Redis, throttling
139
+ will automatically make use of it; otherwise, throttling will only be
140
+ maintained across a single thread.
138
141
 
139
- ### Make throttled API requests
140
142
 
141
- client.throttled.get(credentials, 'orders')
142
- client.throttled.post_json(credentials, 'orders', new_order)
143
+ ### Make unthrottled API requests
143
144
 
144
- Note that throttling currently uses a naive implementation that is
145
- only maintained across a single thread.
145
+ client.unthrottled.get(credentials, 'orders')
146
+ client.unthrottled.post_json(credentials, 'orders', new_order)
147
+
148
+
149
+ ### Pagination
150
+
151
+ Since API version 2019-07, Shopify has encouraged a new method for
152
+ pagination based on the Link header. When you make a GET request,
153
+ you can request the next or the previous page directly from the
154
+ response object.
155
+
156
+ page_1 = client.get(credentials, 'orders')
157
+ page_2 = page_1.next
158
+ page_1 = page_2.previous
159
+
160
+ When no page is available, `nil` will be returned.
@@ -9,9 +9,10 @@ module Lucid
9
9
  class Client
10
10
  # @param send_request [#call]
11
11
  # @param send_throttled_request [#call]
12
+ # @param throttling [Boolean]
12
13
  def initialize(send_request: Container[:send_request],
13
14
  send_throttled_request: Container[:send_throttled_request],
14
- throttling: false)
15
+ throttling: true)
15
16
  @send_request = send_request
16
17
  @send_throttled_request = send_throttled_request
17
18
  @throttling = throttling
@@ -19,6 +19,7 @@ module Lucid
19
19
  Container.register(:delete_all_webhooks) { DeleteAllWebhooks.new }
20
20
  Container.register(:delete_webhook) { DeleteWebhook.new }
21
21
  Container.register(:http) { ::HTTP::Client.new }
22
+ Container.register(:parse_link_header) { ParseLinkHeader.new }
22
23
  Container.register(:send_request) { SendRequest.new }
23
24
  Container.register(:send_throttled_request) do
24
25
  if defined?(Redis)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid/shopify'
4
+
5
+ module Lucid
6
+ module Shopify
7
+ class ParseLinkHeader
8
+ # Parse a Link header into query params for each pagination link (e.g.
9
+ # :next, :previous).
10
+ #
11
+ # @param link_header [String, nil]
12
+ #
13
+ # @return [Hash]
14
+ def call(link_header)
15
+ return {} if link_header.nil?
16
+
17
+ link_header.split(',').map do |link|
18
+ url, rel = link.split(';') # rel should be the first param
19
+ url = url[/<(.*)>/, 1]
20
+ rel = rel[/rel="?(\w+)"?/, 1]
21
+
22
+ [rel.to_sym, query_params(url)]
23
+ end.to_h
24
+ end
25
+
26
+ # @param url [String]
27
+ #
28
+ # @return [Hash]
29
+ private def query_params(url)
30
+ url.split('?').last.split('&').map do |param|
31
+ name, value = param.split('=')
32
+ name == 'limit' && value = value.to_i
33
+
34
+ [name.to_sym, value]
35
+ end.to_h
36
+ end
37
+ end
38
+ end
39
+ end
@@ -13,7 +13,7 @@ module Lucid
13
13
  # @return [Symbol]
14
14
  param :http_method
15
15
  # @return [String] the endpoint relative to the base URL
16
- param :path, reader: :private
16
+ param :path
17
17
  # @return [Hash]
18
18
  param :options, default: -> { {} }
19
19
 
@@ -43,6 +43,42 @@ module Lucid
43
43
  # @return [String]
44
44
  param :data
45
45
 
46
+ # @return [Hash]
47
+ param :link, default: -> { build_link }
48
+
49
+ # @return [Hash]
50
+ def build_link
51
+ Container[:parse_link_header].(headers['Link'])
52
+ end
53
+
54
+ # Request the next page of a GET request, if any.
55
+ #
56
+ # @param client [Client]
57
+ #
58
+ # @return [Response, nil]
59
+ def next(client: Container[:client], limit: nil)
60
+ return nil unless link[:next]
61
+
62
+ limit = limit ||
63
+ request.options.dig(:params, :limit) ||
64
+ link[:next][:limit]
65
+ client.get(request.credentials, request.path, {**link[:next], limit: limit})
66
+ end
67
+
68
+ # Request the previous page of a GET request, if any.
69
+ #
70
+ # @param client [Client]
71
+ #
72
+ # @return [Response, nil]
73
+ def previous(client: Container[:client], limit: nil)
74
+ return nil unless link[:previous]
75
+
76
+ limit = limit ||
77
+ request.options.dig(:params, :limit) ||
78
+ link[:previous][:limit]
79
+ client.get(request.credentials, request.path, {**link[:previous], limit: limit})
80
+ end
81
+
46
82
  # The parsed response body.
47
83
  #
48
84
  # @return [Hash]
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lucid
4
4
  module Shopify
5
- VERSION = '0.37.0'
5
+ VERSION = '0.40.0'
6
6
  end
7
7
  end
data/lib/lucid/shopify.rb CHANGED
@@ -23,6 +23,7 @@ module Lucid
23
23
  autoload :DeleteWebhook, 'lucid/shopify/delete_webhook'
24
24
  autoload :Error, 'lucid/shopify/error'
25
25
  autoload :GetRequest, 'lucid/shopify/get_request'
26
+ autoload :ParseLinkHeader, 'lucid/shopify/parse_link_header'
26
27
  autoload :PostRequest, 'lucid/shopify/post_request'
27
28
  autoload :PutRequest, 'lucid/shopify/put_request'
28
29
  autoload :RedisThrottledStrategy, 'lucid/shopify/redis_throttled_strategy'
@@ -42,7 +43,7 @@ module Lucid
42
43
  extend Dry::Configurable
43
44
 
44
45
  setting :api_key
45
- setting :api_version, '2019-07'
46
+ setting :api_version, '2020-01'
46
47
  setting :billing_callback_uri
47
48
  setting :callback_uri
48
49
  setting :logger, Logger.new(File::NULL).freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lucid-shopify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.37.0
4
+ version: 0.40.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelsey Judson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-05 00:00:00.000000000 Z
11
+ date: 2020-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dotenv
@@ -158,6 +158,7 @@ files:
158
158
  - lib/lucid/shopify/delete_webhook.rb
159
159
  - lib/lucid/shopify/error.rb
160
160
  - lib/lucid/shopify/get_request.rb
161
+ - lib/lucid/shopify/parse_link_header.rb
161
162
  - lib/lucid/shopify/post_request.rb
162
163
  - lib/lucid/shopify/put_request.rb
163
164
  - lib/lucid/shopify/redis_throttled_strategy.rb