lucid_shopify-resource 0.2.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c9eb6d5850cf40e62ec8ac2e639a615bda3548f15b85af2a8d2ef909f732dc94
4
+ data.tar.gz: afb34a04d86b048528ca6bce9b3d074ef4d9de2cfb03b1ae9401be432d864154
5
+ SHA512:
6
+ metadata.gz: 0cc9447831828cff0ebde7b974244bc51eb1df033f831776695dbda99c330d3b69464357600b645cb31e4a637f2976ce1667f6cceaf779ef11e657f2bfbf7277
7
+ data.tar.gz: 21cf824bd293dea5f681da5387fd77605cff3704ef23aa28f7d72b79dbff7cb30171f0350e76917a6c7724e0581e3418898ab293dc7e365918eca4aa65e3b194
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ lucid_shopify-resource
2
+ ======================
3
+
4
+ Installation
5
+ ------------
6
+
7
+ Add the following lines to your ‘Gemfile’:
8
+
9
+ git_source :lucid { |r| "https://github.com/lucidnz/gem-lucid_#{r}.git" }
10
+
11
+ gem 'lucid_shopify-resource', lucid: 'shopify-resource'
12
+
13
+
14
+ Usage
15
+ -----
16
+
17
+ ### Create a resource
18
+
19
+ _TODO: Implement when needed._
20
+
21
+
22
+ ### Delete a resource
23
+
24
+ _TODO: Implement when needed._
25
+
26
+
27
+ ### Read a resource
28
+
29
+ Subclass and configure `Read`:
30
+
31
+ class Orders < LucidShopify::Resource::Read
32
+ resource :orders
33
+
34
+ default_options fields: %w(id tags), limit: 250
35
+ end
36
+
37
+ orders = Orders.new
38
+
39
+ orders.find(request_credentials, id)
40
+
41
+ The `Orders` class is enumerable. Each page is fetched from the API as needed,
42
+ rather than all at once:
43
+
44
+ orders = Orders.new
45
+
46
+ orders.each(request_credentials) |order|
47
+ # ...
48
+ end
49
+
50
+
51
+ ### Update a resource
52
+
53
+ _TODO: Implement when needed._
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidShopify
4
+ module Resource
5
+ #
6
+ # @abstract
7
+ #
8
+ class Create
9
+ def self.new; raise NotImplementedError; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidShopify
4
+ module Resource
5
+ #
6
+ # @abstract
7
+ #
8
+ class Delete
9
+ def self.new; raise NotImplementedError; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidShopify
4
+ module Resource
5
+ #
6
+ # @abstract
7
+ #
8
+ # @example
9
+ # class Orders < LucidShopify::Resource::Read
10
+ # resource :orders
11
+ #
12
+ # default_params fields: %w(id tags)
13
+ # end
14
+ #
15
+ class Read
16
+ include Enumerable
17
+ include LucidShopify
18
+
19
+ #
20
+ # @param client [LucidShopify::Client]
21
+ #
22
+ def initialize(client: Client.new(send_request: SendThrottledRequest.new))
23
+ @client = client
24
+ end
25
+
26
+ # @return [LucidShopify::Client]
27
+ attr_reader :client
28
+
29
+ #
30
+ # Set the remote API resource name for the subclass.
31
+ #
32
+ # @param resource_name [String, #to_s]
33
+ #
34
+ # @example
35
+ # resource :orders
36
+ #
37
+ def self.resource(resource_name)
38
+ define_method(:resource) { resource_name.to_s }
39
+ end
40
+
41
+ #
42
+ # @abstract
43
+ #
44
+ # @return [String]
45
+ #
46
+ def resource
47
+ raise NotImplementedError
48
+ end
49
+
50
+ #
51
+ # Set the default query params. Note that 'fields' may be passed as an
52
+ # array of strings.
53
+ #
54
+ # @param params [Hash]
55
+ #
56
+ # @example
57
+ # default_params fields: %w(id tags)
58
+ #
59
+ def self.default_params(params)
60
+ define_method(:default_params) { params }
61
+ end
62
+
63
+ #
64
+ # @abstract
65
+ #
66
+ # @return [Hash]
67
+ #
68
+ def default_params
69
+ {}
70
+ end
71
+
72
+ #
73
+ # Defaults set by Shopify when not specified.
74
+ #
75
+ # @return [Hash]
76
+ #
77
+ def default_shopify_params
78
+ {
79
+ limit: 50,
80
+ }
81
+ end
82
+
83
+ #
84
+ # @param credentials [LucidShopify::RequestCredentials]
85
+ # @param id [Integer]
86
+ # @param params [Hash]
87
+ #
88
+ # @return [Hash]
89
+ #
90
+ def find(credentials, id, params = {})
91
+ params = finalized_params(params)
92
+
93
+ client.get(credentials, "#{resource}/#{id}", params)[resource]
94
+ end
95
+
96
+ #
97
+ # Iterate over results. If set, the 'fields' option must include 'id'. We
98
+ # would not need this if we used offset pagination, but offset pagination
99
+ # is unreliable.
100
+ #
101
+ # Throttling is always enabled.
102
+ #
103
+ # @param credentials [LucidShopify::RequestCredentials]
104
+ # @param params [Hash]
105
+ #
106
+ # @yield [Hash]
107
+ #
108
+ # @return [Enumerator]
109
+ #
110
+ # @raise [ArgumentError] if 'fields' does not include 'id'
111
+ #
112
+ def each(credentials, params = {})
113
+ return to_enum(__callee__) unless block_given?
114
+
115
+ assert_fields_id!(params = finalized_params(params))
116
+
117
+ since_id = 1
118
+
119
+ loop do
120
+ results = client.get(credentials, resource, params.merge(since_id: since_id))
121
+ results.each do |result|
122
+ yield result
123
+ end
124
+
125
+ break if results.empty?
126
+
127
+ since_id = results.last['id']
128
+ end
129
+ end
130
+
131
+ #
132
+ # @param params [Hash] the finalized params (see {#finalize_params})
133
+ #
134
+ private def assert_fields_id!(params)
135
+ return unless params['fields']
136
+ return unless params['fields'] !~ /\bid\b/
137
+
138
+ raise ArgumentError, 'attempt to paginate without id field'
139
+ end
140
+
141
+ #
142
+ # @param client [LucidShopify::AuthorizedClient]
143
+ # @param params [Hash]
144
+ #
145
+ # @return [Integer]
146
+ #
147
+ def count(client, params = {})
148
+ params = finalize_params(params)
149
+
150
+ client.get("#{resource}/count", params)['count']
151
+ end
152
+
153
+ #
154
+ # Merge with default params and format for query string.
155
+ #
156
+ # @param params [Hash]
157
+ #
158
+ # @return [Hash]
159
+ #
160
+ private def finalize_params(params)
161
+ params = default_shopify_params.merge(default_params).merge(params)
162
+ params.each_with_object({}) do |(k, v), h|
163
+ k = k.to_s
164
+
165
+ k == 'fields' && v.is_a?(Array) ? v.join(',') : v
166
+
167
+ h[k] = v
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidShopify
4
+ module Resource
5
+ #
6
+ # @abstract
7
+ #
8
+ class Update
9
+ def self.new; raise NotImplementedError; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidShopify
4
+ class Resource
5
+ VERSION = '0.2.1'
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidShopify
4
+ module Resource; end
5
+ end
6
+
7
+ require 'lucid_shopify/resource/create'
8
+ require 'lucid_shopify/resource/delete'
9
+ require 'lucid_shopify/resource/read'
10
+ require 'lucid_shopify/resource/update'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Primarily for Bundler.
4
+
5
+ require 'lucid_shopify/resource'
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lucid_shopify-resource
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Kelsey Judson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.52.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.52.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: lucid_shopify
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
55
+ description:
56
+ email: kelsey@lucid.nz
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - README.md
62
+ - lib/lucid_shopify-resource.rb
63
+ - lib/lucid_shopify/resource.rb
64
+ - lib/lucid_shopify/resource/create.rb
65
+ - lib/lucid_shopify/resource/delete.rb
66
+ - lib/lucid_shopify/resource/read.rb
67
+ - lib/lucid_shopify/resource/update.rb
68
+ - lib/lucid_shopify/resource/version.rb
69
+ homepage: https://github.com/lucidnz/gem-lucid_shopify-resource
70
+ licenses:
71
+ - ISC
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.7.3
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: Shopify client library resource helpers
93
+ test_files: []