lucid-shopify 0.37.0 → 0.40.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 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