shopify_api 12.2.1 → 12.4.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.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/BUG_REPORT.md +40 -0
  3. data/.github/ISSUE_TEMPLATE/ENHANCEMENT.md +9 -0
  4. data/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +9 -0
  5. data/.github/workflows/build.yml +0 -3
  6. data/.github/workflows/stale.yml +1 -0
  7. data/CHANGELOG.md +13 -0
  8. data/Gemfile.lock +17 -17
  9. data/README.md +9 -10
  10. data/docs/getting_started.md +1 -1
  11. data/docs/usage/oauth.md +3 -4
  12. data/lib/shopify_api/admin_versions.rb +2 -1
  13. data/lib/shopify_api/auth/oauth.rb +1 -4
  14. data/lib/shopify_api/clients/http_client.rb +3 -3
  15. data/lib/shopify_api/context.rb +38 -8
  16. data/lib/shopify_api/errors/feature_deprecated_error.rb +9 -0
  17. data/lib/shopify_api/errors/http_response_error.rb +7 -3
  18. data/lib/shopify_api/errors/log_level_not_found_error.rb +9 -0
  19. data/lib/shopify_api/logger.rb +82 -0
  20. data/lib/shopify_api/rest/base.rb +11 -4
  21. data/lib/shopify_api/rest/resources/2022_01/assigned_fulfillment_order.rb +7 -0
  22. data/lib/shopify_api/rest/resources/2022_01/customer.rb +9 -1
  23. data/lib/shopify_api/rest/resources/2022_01/fulfillment.rb +5 -1
  24. data/lib/shopify_api/rest/resources/2022_01/fulfillment_order.rb +3 -3
  25. data/lib/shopify_api/rest/resources/2022_04/assigned_fulfillment_order.rb +7 -0
  26. data/lib/shopify_api/rest/resources/2022_04/customer.rb +9 -1
  27. data/lib/shopify_api/rest/resources/2022_04/fulfillment.rb +5 -1
  28. data/lib/shopify_api/rest/resources/2022_04/fulfillment_order.rb +3 -3
  29. data/lib/shopify_api/rest/resources/2022_04/metafield.rb +5 -3
  30. data/lib/shopify_api/rest/resources/2022_07/assigned_fulfillment_order.rb +7 -0
  31. data/lib/shopify_api/rest/resources/2022_07/customer.rb +9 -1
  32. data/lib/shopify_api/rest/resources/2022_07/fulfillment.rb +5 -1
  33. data/lib/shopify_api/rest/resources/2022_07/fulfillment_order.rb +3 -3
  34. data/lib/shopify_api/rest/resources/2022_07/metafield.rb +5 -3
  35. data/lib/shopify_api/rest/resources/2022_10/assigned_fulfillment_order.rb +7 -0
  36. data/lib/shopify_api/rest/resources/2022_10/customer.rb +9 -1
  37. data/lib/shopify_api/rest/resources/2022_10/fulfillment.rb +5 -1
  38. data/lib/shopify_api/rest/resources/2022_10/fulfillment_order.rb +3 -3
  39. data/lib/shopify_api/rest/resources/2022_10/metafield.rb +5 -3
  40. data/lib/shopify_api/rest/resources/2023_01/abandoned_checkout.rb +190 -0
  41. data/lib/shopify_api/rest/resources/2023_01/access_scope.rb +58 -0
  42. data/lib/shopify_api/rest/resources/2023_01/apple_pay_certificate.rb +105 -0
  43. data/lib/shopify_api/rest/resources/2023_01/application_charge.rb +104 -0
  44. data/lib/shopify_api/rest/resources/2023_01/application_credit.rb +87 -0
  45. data/lib/shopify_api/rest/resources/2023_01/article.rb +265 -0
  46. data/lib/shopify_api/rest/resources/2023_01/asset.rb +118 -0
  47. data/lib/shopify_api/rest/resources/2023_01/assigned_fulfillment_order.rb +86 -0
  48. data/lib/shopify_api/rest/resources/2023_01/balance.rb +50 -0
  49. data/lib/shopify_api/rest/resources/2023_01/blog.rb +162 -0
  50. data/lib/shopify_api/rest/resources/2023_01/cancellation_request.rb +83 -0
  51. data/lib/shopify_api/rest/resources/2023_01/carrier_service.rb +113 -0
  52. data/lib/shopify_api/rest/resources/2023_01/checkout.rb +209 -0
  53. data/lib/shopify_api/rest/resources/2023_01/collect.rb +142 -0
  54. data/lib/shopify_api/rest/resources/2023_01/collection.rb +110 -0
  55. data/lib/shopify_api/rest/resources/2023_01/collection_listing.rb +155 -0
  56. data/lib/shopify_api/rest/resources/2023_01/comment.rb +283 -0
  57. data/lib/shopify_api/rest/resources/2023_01/country.rb +137 -0
  58. data/lib/shopify_api/rest/resources/2023_01/currency.rb +57 -0
  59. data/lib/shopify_api/rest/resources/2023_01/custom_collection.rb +187 -0
  60. data/lib/shopify_api/rest/resources/2023_01/customer.rb +329 -0
  61. data/lib/shopify_api/rest/resources/2023_01/customer_address.rb +201 -0
  62. data/lib/shopify_api/rest/resources/2023_01/customer_saved_search.rb +169 -0
  63. data/lib/shopify_api/rest/resources/2023_01/deprecated_api_call.rb +57 -0
  64. data/lib/shopify_api/rest/resources/2023_01/discount_code.rb +219 -0
  65. data/lib/shopify_api/rest/resources/2023_01/dispute.rb +111 -0
  66. data/lib/shopify_api/rest/resources/2023_01/draft_order.rb +275 -0
  67. data/lib/shopify_api/rest/resources/2023_01/event.rb +148 -0
  68. data/lib/shopify_api/rest/resources/2023_01/fulfillment.rb +225 -0
  69. data/lib/shopify_api/rest/resources/2023_01/fulfillment_event.rb +166 -0
  70. data/lib/shopify_api/rest/resources/2023_01/fulfillment_order.rb +316 -0
  71. data/lib/shopify_api/rest/resources/2023_01/fulfillment_request.rb +87 -0
  72. data/lib/shopify_api/rest/resources/2023_01/fulfillment_service.rb +130 -0
  73. data/lib/shopify_api/rest/resources/2023_01/gift_card.rb +215 -0
  74. data/lib/shopify_api/rest/resources/2023_01/gift_card_adjustment.rb +118 -0
  75. data/lib/shopify_api/rest/resources/2023_01/image.rb +157 -0
  76. data/lib/shopify_api/rest/resources/2023_01/inventory_item.rb +108 -0
  77. data/lib/shopify_api/rest/resources/2023_01/inventory_level.rb +179 -0
  78. data/lib/shopify_api/rest/resources/2023_01/location.rb +167 -0
  79. data/lib/shopify_api/rest/resources/2023_01/locations_for_move.rb +56 -0
  80. data/lib/shopify_api/rest/resources/2023_01/marketing_event.rb +209 -0
  81. data/lib/shopify_api/rest/resources/2023_01/metafield.rb +344 -0
  82. data/lib/shopify_api/rest/resources/2023_01/mobile_platform_application.rb +110 -0
  83. data/lib/shopify_api/rest/resources/2023_01/order.rb +479 -0
  84. data/lib/shopify_api/rest/resources/2023_01/order_risk.rb +135 -0
  85. data/lib/shopify_api/rest/resources/2023_01/page.rb +194 -0
  86. data/lib/shopify_api/rest/resources/2023_01/payment.rb +140 -0
  87. data/lib/shopify_api/rest/resources/2023_01/payment_gateway.rb +143 -0
  88. data/lib/shopify_api/rest/resources/2023_01/payment_transaction.rb +107 -0
  89. data/lib/shopify_api/rest/resources/2023_01/payout.rb +97 -0
  90. data/lib/shopify_api/rest/resources/2023_01/policy.rb +69 -0
  91. data/lib/shopify_api/rest/resources/2023_01/price_rule.rb +223 -0
  92. data/lib/shopify_api/rest/resources/2023_01/product.rb +223 -0
  93. data/lib/shopify_api/rest/resources/2023_01/product_listing.rb +196 -0
  94. data/lib/shopify_api/rest/resources/2023_01/product_resource_feedback.rb +88 -0
  95. data/lib/shopify_api/rest/resources/2023_01/province.rb +132 -0
  96. data/lib/shopify_api/rest/resources/2023_01/recurring_application_charge.rb +167 -0
  97. data/lib/shopify_api/rest/resources/2023_01/redirect.rb +139 -0
  98. data/lib/shopify_api/rest/resources/2023_01/refund.rb +151 -0
  99. data/lib/shopify_api/rest/resources/2023_01/report.rb +121 -0
  100. data/lib/shopify_api/rest/resources/2023_01/resource_feedback.rb +73 -0
  101. data/lib/shopify_api/rest/resources/2023_01/script_tag.rb +155 -0
  102. data/lib/shopify_api/rest/resources/2023_01/shipping_zone.rb +83 -0
  103. data/lib/shopify_api/rest/resources/2023_01/shop.rb +221 -0
  104. data/lib/shopify_api/rest/resources/2023_01/smart_collection.rb +216 -0
  105. data/lib/shopify_api/rest/resources/2023_01/storefront_access_token.rb +87 -0
  106. data/lib/shopify_api/rest/resources/2023_01/tender_transaction.rb +93 -0
  107. data/lib/shopify_api/rest/resources/2023_01/theme.rb +120 -0
  108. data/lib/shopify_api/rest/resources/2023_01/transaction.rb +181 -0
  109. data/lib/shopify_api/rest/resources/2023_01/usage_charge.rb +97 -0
  110. data/lib/shopify_api/rest/resources/2023_01/user.rb +138 -0
  111. data/lib/shopify_api/rest/resources/2023_01/variant.rb +212 -0
  112. data/lib/shopify_api/rest/resources/2023_01/webhook.rb +168 -0
  113. data/lib/shopify_api/utils/session_utils.rb +38 -21
  114. data/lib/shopify_api/version.rb +1 -1
  115. data/shopify_api.gemspec +2 -2
  116. metadata +100 -16
  117. data/.github/ISSUE_TEMPLATE.md +0 -35
@@ -0,0 +1,212 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ ########################################################################################################################
5
+ # This file is auto-generated. If you have an issue, please create a GitHub issue. #
6
+ ########################################################################################################################
7
+
8
+ module ShopifyAPI
9
+ class Variant < ShopifyAPI::Rest::Base
10
+ extend T::Sig
11
+
12
+ @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
13
+ @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
14
+
15
+ sig { params(session: T.nilable(ShopifyAPI::Auth::Session)).void }
16
+ def initialize(session: ShopifyAPI::Context.active_session)
17
+ super(session: session)
18
+
19
+ @barcode = T.let(nil, T.nilable(String))
20
+ @compare_at_price = T.let(nil, T.nilable(String))
21
+ @created_at = T.let(nil, T.nilable(String))
22
+ @fulfillment_service = T.let(nil, T.nilable(String))
23
+ @grams = T.let(nil, T.nilable(Integer))
24
+ @id = T.let(nil, T.nilable(Integer))
25
+ @image_id = T.let(nil, T.nilable(Integer))
26
+ @inventory_item_id = T.let(nil, T.nilable(Integer))
27
+ @inventory_management = T.let(nil, T.nilable(String))
28
+ @inventory_policy = T.let(nil, T.nilable(String))
29
+ @inventory_quantity = T.let(nil, T.nilable(Integer))
30
+ @inventory_quantity_adjustment = T.let(nil, T.nilable(Integer))
31
+ @old_inventory_quantity = T.let(nil, T.nilable(Integer))
32
+ @option = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
33
+ @position = T.let(nil, T.nilable(Integer))
34
+ @presentment_prices = T.let(nil, T.nilable(T::Array[T.untyped]))
35
+ @price = T.let(nil, T.nilable(String))
36
+ @product_id = T.let(nil, T.nilable(Integer))
37
+ @requires_shipping = T.let(nil, T.nilable(T::Boolean))
38
+ @sku = T.let(nil, T.nilable(String))
39
+ @tax_code = T.let(nil, T.nilable(String))
40
+ @taxable = T.let(nil, T.nilable(T::Boolean))
41
+ @title = T.let(nil, T.nilable(String))
42
+ @updated_at = T.let(nil, T.nilable(String))
43
+ @weight = T.let(nil, T.nilable(Float))
44
+ @weight_unit = T.let(nil, T.nilable(String))
45
+ end
46
+
47
+ @has_one = T.let({}, T::Hash[Symbol, Class])
48
+ @has_many = T.let({}, T::Hash[Symbol, Class])
49
+ @paths = T.let([
50
+ {http_method: :delete, operation: :delete, ids: [:product_id, :id], path: "products/<product_id>/variants/<id>.json"},
51
+ {http_method: :get, operation: :count, ids: [:product_id], path: "products/<product_id>/variants/count.json"},
52
+ {http_method: :get, operation: :get, ids: [:product_id], path: "products/<product_id>/variants.json"},
53
+ {http_method: :get, operation: :get, ids: [:id], path: "variants/<id>.json"},
54
+ {http_method: :post, operation: :post, ids: [:product_id], path: "products/<product_id>/variants.json"},
55
+ {http_method: :put, operation: :put, ids: [:id], path: "variants/<id>.json"}
56
+ ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]])
57
+ @read_only_attributes = T.let([
58
+ :inventory_quantity,
59
+ :inventory_quantity_adjustment
60
+ ], T::Array[Symbol])
61
+
62
+ sig { returns(T.nilable(String)) }
63
+ attr_reader :barcode
64
+ sig { returns(T.nilable(String)) }
65
+ attr_reader :compare_at_price
66
+ sig { returns(T.nilable(String)) }
67
+ attr_reader :created_at
68
+ sig { returns(T.nilable(String)) }
69
+ attr_reader :fulfillment_service
70
+ sig { returns(T.nilable(Integer)) }
71
+ attr_reader :grams
72
+ sig { returns(T.nilable(Integer)) }
73
+ attr_reader :id
74
+ sig { returns(T.nilable(Integer)) }
75
+ attr_reader :image_id
76
+ sig { returns(T.nilable(Integer)) }
77
+ attr_reader :inventory_item_id
78
+ sig { returns(T.nilable(String)) }
79
+ attr_reader :inventory_management
80
+ sig { returns(T.nilable(String)) }
81
+ attr_reader :inventory_policy
82
+ sig { returns(T.nilable(Integer)) }
83
+ attr_reader :inventory_quantity
84
+ sig { returns(T.nilable(Integer)) }
85
+ attr_reader :inventory_quantity_adjustment
86
+ sig { returns(T.nilable(Integer)) }
87
+ attr_reader :old_inventory_quantity
88
+ sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
89
+ attr_reader :option
90
+ sig { returns(T.nilable(Integer)) }
91
+ attr_reader :position
92
+ sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) }
93
+ attr_reader :presentment_prices
94
+ sig { returns(T.nilable(String)) }
95
+ attr_reader :price
96
+ sig { returns(T.nilable(Integer)) }
97
+ attr_reader :product_id
98
+ sig { returns(T.nilable(T::Boolean)) }
99
+ attr_reader :requires_shipping
100
+ sig { returns(T.nilable(String)) }
101
+ attr_reader :sku
102
+ sig { returns(T.nilable(String)) }
103
+ attr_reader :tax_code
104
+ sig { returns(T.nilable(T::Boolean)) }
105
+ attr_reader :taxable
106
+ sig { returns(T.nilable(String)) }
107
+ attr_reader :title
108
+ sig { returns(T.nilable(String)) }
109
+ attr_reader :updated_at
110
+ sig { returns(T.nilable(Float)) }
111
+ attr_reader :weight
112
+ sig { returns(T.nilable(String)) }
113
+ attr_reader :weight_unit
114
+
115
+ class << self
116
+ sig do
117
+ params(
118
+ id: T.any(Integer, String),
119
+ fields: T.untyped,
120
+ session: Auth::Session
121
+ ).returns(T.nilable(Variant))
122
+ end
123
+ def find(
124
+ id:,
125
+ fields: nil,
126
+ session: ShopifyAPI::Context.active_session
127
+ )
128
+ result = base_find(
129
+ session: session,
130
+ ids: {id: id},
131
+ params: {fields: fields},
132
+ )
133
+ T.cast(result[0], T.nilable(Variant))
134
+ end
135
+
136
+ sig do
137
+ params(
138
+ id: T.any(Integer, String),
139
+ product_id: T.nilable(T.any(Integer, String)),
140
+ session: Auth::Session
141
+ ).returns(T.untyped)
142
+ end
143
+ def delete(
144
+ id:,
145
+ product_id: nil,
146
+ session: ShopifyAPI::Context.active_session
147
+ )
148
+ request(
149
+ http_method: :delete,
150
+ operation: :delete,
151
+ session: session,
152
+ ids: {id: id, product_id: product_id},
153
+ params: {},
154
+ )
155
+ end
156
+
157
+ sig do
158
+ params(
159
+ product_id: T.nilable(T.any(Integer, String)),
160
+ limit: T.untyped,
161
+ presentment_currencies: T.untyped,
162
+ since_id: T.untyped,
163
+ fields: T.untyped,
164
+ session: Auth::Session,
165
+ kwargs: T.untyped
166
+ ).returns(T::Array[Variant])
167
+ end
168
+ def all(
169
+ product_id: nil,
170
+ limit: nil,
171
+ presentment_currencies: nil,
172
+ since_id: nil,
173
+ fields: nil,
174
+ session: ShopifyAPI::Context.active_session,
175
+ **kwargs
176
+ )
177
+ response = base_find(
178
+ session: session,
179
+ ids: {product_id: product_id},
180
+ params: {limit: limit, presentment_currencies: presentment_currencies, since_id: since_id, fields: fields}.merge(kwargs).compact,
181
+ )
182
+
183
+ T.cast(response, T::Array[Variant])
184
+ end
185
+
186
+ sig do
187
+ params(
188
+ product_id: T.nilable(T.any(Integer, String)),
189
+ session: Auth::Session,
190
+ kwargs: T.untyped
191
+ ).returns(T.untyped)
192
+ end
193
+ def count(
194
+ product_id: nil,
195
+ session: ShopifyAPI::Context.active_session,
196
+ **kwargs
197
+ )
198
+ request(
199
+ http_method: :get,
200
+ operation: :count,
201
+ session: session,
202
+ ids: {product_id: product_id},
203
+ params: {}.merge(kwargs).compact,
204
+ body: {},
205
+ entity: nil,
206
+ )
207
+ end
208
+
209
+ end
210
+
211
+ end
212
+ end
@@ -0,0 +1,168 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ ########################################################################################################################
5
+ # This file is auto-generated. If you have an issue, please create a GitHub issue. #
6
+ ########################################################################################################################
7
+
8
+ module ShopifyAPI
9
+ class Webhook < ShopifyAPI::Rest::Base
10
+ extend T::Sig
11
+
12
+ @prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
13
+ @next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
14
+
15
+ sig { params(session: T.nilable(ShopifyAPI::Auth::Session)).void }
16
+ def initialize(session: ShopifyAPI::Context.active_session)
17
+ super(session: session)
18
+
19
+ @address = T.let(nil, T.nilable(String))
20
+ @topic = T.let(nil, T.nilable(String))
21
+ @api_version = T.let(nil, T.nilable(String))
22
+ @created_at = T.let(nil, T.nilable(String))
23
+ @fields = T.let(nil, T.nilable(T::Array[T.untyped]))
24
+ @format = T.let(nil, T.nilable(String))
25
+ @id = T.let(nil, T.nilable(Integer))
26
+ @metafield_namespaces = T.let(nil, T.nilable(T::Array[T.untyped]))
27
+ @private_metafield_namespaces = T.let(nil, T.nilable(T::Array[T.untyped]))
28
+ @updated_at = T.let(nil, T.nilable(String))
29
+ end
30
+
31
+ @has_one = T.let({}, T::Hash[Symbol, Class])
32
+ @has_many = T.let({}, T::Hash[Symbol, Class])
33
+ @paths = T.let([
34
+ {http_method: :delete, operation: :delete, ids: [:id], path: "webhooks/<id>.json"},
35
+ {http_method: :get, operation: :count, ids: [], path: "webhooks/count.json"},
36
+ {http_method: :get, operation: :get, ids: [], path: "webhooks.json"},
37
+ {http_method: :get, operation: :get, ids: [:id], path: "webhooks/<id>.json"},
38
+ {http_method: :post, operation: :post, ids: [], path: "webhooks.json"},
39
+ {http_method: :put, operation: :put, ids: [:id], path: "webhooks/<id>.json"}
40
+ ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]])
41
+
42
+ sig { returns(T.nilable(String)) }
43
+ attr_reader :address
44
+ sig { returns(T.nilable(String)) }
45
+ attr_reader :topic
46
+ sig { returns(T.nilable(String)) }
47
+ attr_reader :api_version
48
+ sig { returns(T.nilable(String)) }
49
+ attr_reader :created_at
50
+ sig { returns(T.nilable(T::Array[String])) }
51
+ attr_reader :fields
52
+ sig { returns(T.nilable(String)) }
53
+ attr_reader :format
54
+ sig { returns(T.nilable(Integer)) }
55
+ attr_reader :id
56
+ sig { returns(T.nilable(T::Array[String])) }
57
+ attr_reader :metafield_namespaces
58
+ sig { returns(T.nilable(T::Array[String])) }
59
+ attr_reader :private_metafield_namespaces
60
+ sig { returns(T.nilable(String)) }
61
+ attr_reader :updated_at
62
+
63
+ class << self
64
+ sig do
65
+ params(
66
+ id: T.any(Integer, String),
67
+ fields: T.untyped,
68
+ session: Auth::Session
69
+ ).returns(T.nilable(Webhook))
70
+ end
71
+ def find(
72
+ id:,
73
+ fields: nil,
74
+ session: ShopifyAPI::Context.active_session
75
+ )
76
+ result = base_find(
77
+ session: session,
78
+ ids: {id: id},
79
+ params: {fields: fields},
80
+ )
81
+ T.cast(result[0], T.nilable(Webhook))
82
+ end
83
+
84
+ sig do
85
+ params(
86
+ id: T.any(Integer, String),
87
+ session: Auth::Session
88
+ ).returns(T.untyped)
89
+ end
90
+ def delete(
91
+ id:,
92
+ session: ShopifyAPI::Context.active_session
93
+ )
94
+ request(
95
+ http_method: :delete,
96
+ operation: :delete,
97
+ session: session,
98
+ ids: {id: id},
99
+ params: {},
100
+ )
101
+ end
102
+
103
+ sig do
104
+ params(
105
+ address: T.untyped,
106
+ created_at_max: T.untyped,
107
+ created_at_min: T.untyped,
108
+ fields: T.untyped,
109
+ limit: T.untyped,
110
+ since_id: T.untyped,
111
+ topic: T.untyped,
112
+ updated_at_min: T.untyped,
113
+ updated_at_max: T.untyped,
114
+ session: Auth::Session,
115
+ kwargs: T.untyped
116
+ ).returns(T::Array[Webhook])
117
+ end
118
+ def all(
119
+ address: nil,
120
+ created_at_max: nil,
121
+ created_at_min: nil,
122
+ fields: nil,
123
+ limit: nil,
124
+ since_id: nil,
125
+ topic: nil,
126
+ updated_at_min: nil,
127
+ updated_at_max: nil,
128
+ session: ShopifyAPI::Context.active_session,
129
+ **kwargs
130
+ )
131
+ response = base_find(
132
+ session: session,
133
+ ids: {},
134
+ params: {address: address, created_at_max: created_at_max, created_at_min: created_at_min, fields: fields, limit: limit, since_id: since_id, topic: topic, updated_at_min: updated_at_min, updated_at_max: updated_at_max}.merge(kwargs).compact,
135
+ )
136
+
137
+ T.cast(response, T::Array[Webhook])
138
+ end
139
+
140
+ sig do
141
+ params(
142
+ address: T.untyped,
143
+ topic: T.untyped,
144
+ session: Auth::Session,
145
+ kwargs: T.untyped
146
+ ).returns(T.untyped)
147
+ end
148
+ def count(
149
+ address: nil,
150
+ topic: nil,
151
+ session: ShopifyAPI::Context.active_session,
152
+ **kwargs
153
+ )
154
+ request(
155
+ http_method: :get,
156
+ operation: :count,
157
+ session: session,
158
+ ids: {},
159
+ params: {address: address, topic: topic}.merge(kwargs).compact,
160
+ body: {},
161
+ entity: nil,
162
+ )
163
+ end
164
+
165
+ end
166
+
167
+ end
168
+ end
@@ -17,12 +17,13 @@ module ShopifyAPI
17
17
  ).returns(T.nilable(Auth::Session))
18
18
  end
19
19
  def load_current_session(auth_header: nil, cookies: nil, is_online: false)
20
+ validate_session_storage_for_deprecated_utils
20
21
  return load_private_session if Context.private?
21
22
 
22
23
  session_id = current_session_id(auth_header, cookies, is_online)
23
24
  return nil unless session_id
24
25
 
25
- Context.session_storage.load_session(session_id)
26
+ T.must(Context.session_storage).load_session(session_id)
26
27
  end
27
28
 
28
29
  sig do
@@ -33,10 +34,12 @@ module ShopifyAPI
33
34
  ).returns(T::Boolean)
34
35
  end
35
36
  def delete_current_session(auth_header: nil, cookies: nil, is_online: false)
37
+ validate_session_storage_for_deprecated_utils
38
+
36
39
  session_id = current_session_id(auth_header, cookies, is_online)
37
40
  return false unless session_id
38
41
 
39
- Context.session_storage.delete_session(session_id)
42
+ T.must(Context.session_storage).delete_session(session_id)
40
43
  end
41
44
 
42
45
  sig do
@@ -46,8 +49,10 @@ module ShopifyAPI
46
49
  ).returns(T.nilable(Auth::Session))
47
50
  end
48
51
  def load_offline_session(shop:, include_expired: false)
52
+ validate_session_storage_for_deprecated_utils
53
+
49
54
  session_id = offline_session_id(shop)
50
- session = Context.session_storage.load_session(session_id)
55
+ session = T.must(Context.session_storage).load_session(session_id)
51
56
  return nil if session && !include_expired && session.expires && T.must(session.expires) < Time.now
52
57
 
53
58
  session
@@ -59,23 +64,10 @@ module ShopifyAPI
59
64
  ).returns(T::Boolean)
60
65
  end
61
66
  def delete_offline_session(shop:)
62
- session_id = offline_session_id(shop)
63
- Context.session_storage.delete_session(session_id)
64
- end
65
-
66
- private
67
+ validate_session_storage_for_deprecated_utils
67
68
 
68
- sig { returns(Auth::Session) }
69
- def load_private_session
70
- unless Context.private_shop
71
- raise Errors::SessionNotFoundError, "Could not load private shop, Context.private_shop is nil."
72
- end
73
-
74
- Auth::Session.new(
75
- shop: T.must(Context.private_shop),
76
- access_token: Context.api_secret_key,
77
- scope: Context.scope.to_a,
78
- )
69
+ session_id = offline_session_id(shop)
70
+ T.must(Context.session_storage).delete_session(session_id)
79
71
  end
80
72
 
81
73
  sig do
@@ -89,8 +81,10 @@ module ShopifyAPI
89
81
  if Context.embedded?
90
82
  if auth_header
91
83
  matches = auth_header.match(/^Bearer (.+)$/)
92
- raise Errors::MissingJwtTokenError,
93
- "Missing Bearer token in authorization header" unless matches
84
+ unless matches
85
+ ShopifyAPI::Logger.warn("Missing Bearer token in authorization header")
86
+ raise Errors::MissingJwtTokenError, "Missing Bearer token in authorization header"
87
+ end
94
88
 
95
89
  jwt_payload = Auth::JwtPayload.new(T.must(matches[1]))
96
90
  shop = jwt_payload.shop
@@ -129,6 +123,29 @@ module ShopifyAPI
129
123
  def cookie_session_id(cookies)
130
124
  cookies[Auth::Oauth::SessionCookie::SESSION_COOKIE_NAME]
131
125
  end
126
+
127
+ private
128
+
129
+ sig { void }
130
+ def validate_session_storage_for_deprecated_utils
131
+ unless Context.session_storage
132
+ raise ShopifyAPI::Errors::SessionStorageError,
133
+ "session_storage is required in ShopifyAPI::Context when using deprecated Session utility methods."
134
+ end
135
+ end
136
+
137
+ sig { returns(Auth::Session) }
138
+ def load_private_session
139
+ unless Context.private_shop
140
+ raise Errors::SessionNotFoundError, "Could not load private shop, Context.private_shop is nil."
141
+ end
142
+
143
+ Auth::Session.new(
144
+ shop: T.must(Context.private_shop),
145
+ access_token: Context.api_secret_key,
146
+ scope: Context.scope.to_a,
147
+ )
148
+ end
132
149
  end
133
150
  end
134
151
  end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module ShopifyAPI
5
- VERSION = "12.2.1"
5
+ VERSION = "12.4.0"
6
6
  end
data/shopify_api.gemspec CHANGED
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
32
32
 
33
33
  s.required_ruby_version = ">= 2.6"
34
34
 
35
+ s.add_runtime_dependency("activesupport")
35
36
  s.add_runtime_dependency("concurrent-ruby")
36
37
  s.add_runtime_dependency("hash_diff")
37
38
  s.add_runtime_dependency("httparty")
@@ -40,9 +41,8 @@ Gem::Specification.new do |s|
40
41
  s.add_runtime_dependency("openssl")
41
42
  s.add_runtime_dependency("securerandom")
42
43
  s.add_runtime_dependency("sorbet-runtime")
43
- s.add_runtime_dependency("zeitwerk", "~> 2.5")
44
+ s.add_runtime_dependency("zeitwerk", "~> 2.5", "< 2.6.5") # https://github.com/Shopify/shopify-api-ruby/issues/1058
44
45
 
45
- s.add_development_dependency("activesupport")
46
46
  s.add_development_dependency("pry-byebug")
47
47
  s.add_development_dependency("rake")
48
48
  s.add_development_dependency("rubocop")
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.2.1
4
+ version: 12.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-20 00:00:00.000000000 Z
11
+ date: 2023-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: concurrent-ruby
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -129,6 +143,9 @@ dependencies:
129
143
  - - "~>"
130
144
  - !ruby/object:Gem::Version
131
145
  version: '2.5'
146
+ - - "<"
147
+ - !ruby/object:Gem::Version
148
+ version: 2.6.5
132
149
  type: :runtime
133
150
  prerelease: false
134
151
  version_requirements: !ruby/object:Gem::Requirement
@@ -136,20 +153,9 @@ dependencies:
136
153
  - - "~>"
137
154
  - !ruby/object:Gem::Version
138
155
  version: '2.5'
139
- - !ruby/object:Gem::Dependency
140
- name: activesupport
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
156
+ - - "<"
151
157
  - !ruby/object:Gem::Version
152
- version: '0'
158
+ version: 2.6.5
153
159
  - !ruby/object:Gem::Dependency
154
160
  name: pry-byebug
155
161
  requirement: !ruby/object:Gem::Requirement
@@ -273,7 +279,9 @@ extra_rdoc_files:
273
279
  - README.md
274
280
  files:
275
281
  - ".github/CODEOWNERS"
276
- - ".github/ISSUE_TEMPLATE.md"
282
+ - ".github/ISSUE_TEMPLATE/BUG_REPORT.md"
283
+ - ".github/ISSUE_TEMPLATE/ENHANCEMENT.md"
284
+ - ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.md"
277
285
  - ".github/dependabot.yml"
278
286
  - ".github/pull_request_template.md"
279
287
  - ".github/workflows/build.yml"
@@ -325,6 +333,7 @@ files:
325
333
  - lib/shopify_api/context.rb
326
334
  - lib/shopify_api/errors/context_not_setup_error.rb
327
335
  - lib/shopify_api/errors/cookie_not_found_error.rb
336
+ - lib/shopify_api/errors/feature_deprecated_error.rb
328
337
  - lib/shopify_api/errors/http_response_error.rb
329
338
  - lib/shopify_api/errors/invalid_graphql_request_error.rb
330
339
  - lib/shopify_api/errors/invalid_http_request_error.rb
@@ -332,6 +341,7 @@ files:
332
341
  - lib/shopify_api/errors/invalid_oauth_error.rb
333
342
  - lib/shopify_api/errors/invalid_webhook_error.rb
334
343
  - lib/shopify_api/errors/invalid_webhook_registration_error.rb
344
+ - lib/shopify_api/errors/log_level_not_found_error.rb
335
345
  - lib/shopify_api/errors/max_http_retries_exceeded_error.rb
336
346
  - lib/shopify_api/errors/missing_jwt_token_error.rb
337
347
  - lib/shopify_api/errors/missing_required_argument_error.rb
@@ -346,6 +356,7 @@ files:
346
356
  - lib/shopify_api/errors/unsupported_version_error.rb
347
357
  - lib/shopify_api/errors/webhook_registration_error.rb
348
358
  - lib/shopify_api/inflector.rb
359
+ - lib/shopify_api/logger.rb
349
360
  - lib/shopify_api/rest/base.rb
350
361
  - lib/shopify_api/rest/base_errors.rb
351
362
  - lib/shopify_api/rest/resources/2022_01/abandoned_checkout.rb
@@ -648,6 +659,79 @@ files:
648
659
  - lib/shopify_api/rest/resources/2022_10/user.rb
649
660
  - lib/shopify_api/rest/resources/2022_10/variant.rb
650
661
  - lib/shopify_api/rest/resources/2022_10/webhook.rb
662
+ - lib/shopify_api/rest/resources/2023_01/abandoned_checkout.rb
663
+ - lib/shopify_api/rest/resources/2023_01/access_scope.rb
664
+ - lib/shopify_api/rest/resources/2023_01/apple_pay_certificate.rb
665
+ - lib/shopify_api/rest/resources/2023_01/application_charge.rb
666
+ - lib/shopify_api/rest/resources/2023_01/application_credit.rb
667
+ - lib/shopify_api/rest/resources/2023_01/article.rb
668
+ - lib/shopify_api/rest/resources/2023_01/asset.rb
669
+ - lib/shopify_api/rest/resources/2023_01/assigned_fulfillment_order.rb
670
+ - lib/shopify_api/rest/resources/2023_01/balance.rb
671
+ - lib/shopify_api/rest/resources/2023_01/blog.rb
672
+ - lib/shopify_api/rest/resources/2023_01/cancellation_request.rb
673
+ - lib/shopify_api/rest/resources/2023_01/carrier_service.rb
674
+ - lib/shopify_api/rest/resources/2023_01/checkout.rb
675
+ - lib/shopify_api/rest/resources/2023_01/collect.rb
676
+ - lib/shopify_api/rest/resources/2023_01/collection.rb
677
+ - lib/shopify_api/rest/resources/2023_01/collection_listing.rb
678
+ - lib/shopify_api/rest/resources/2023_01/comment.rb
679
+ - lib/shopify_api/rest/resources/2023_01/country.rb
680
+ - lib/shopify_api/rest/resources/2023_01/currency.rb
681
+ - lib/shopify_api/rest/resources/2023_01/custom_collection.rb
682
+ - lib/shopify_api/rest/resources/2023_01/customer.rb
683
+ - lib/shopify_api/rest/resources/2023_01/customer_address.rb
684
+ - lib/shopify_api/rest/resources/2023_01/customer_saved_search.rb
685
+ - lib/shopify_api/rest/resources/2023_01/deprecated_api_call.rb
686
+ - lib/shopify_api/rest/resources/2023_01/discount_code.rb
687
+ - lib/shopify_api/rest/resources/2023_01/dispute.rb
688
+ - lib/shopify_api/rest/resources/2023_01/draft_order.rb
689
+ - lib/shopify_api/rest/resources/2023_01/event.rb
690
+ - lib/shopify_api/rest/resources/2023_01/fulfillment.rb
691
+ - lib/shopify_api/rest/resources/2023_01/fulfillment_event.rb
692
+ - lib/shopify_api/rest/resources/2023_01/fulfillment_order.rb
693
+ - lib/shopify_api/rest/resources/2023_01/fulfillment_request.rb
694
+ - lib/shopify_api/rest/resources/2023_01/fulfillment_service.rb
695
+ - lib/shopify_api/rest/resources/2023_01/gift_card.rb
696
+ - lib/shopify_api/rest/resources/2023_01/gift_card_adjustment.rb
697
+ - lib/shopify_api/rest/resources/2023_01/image.rb
698
+ - lib/shopify_api/rest/resources/2023_01/inventory_item.rb
699
+ - lib/shopify_api/rest/resources/2023_01/inventory_level.rb
700
+ - lib/shopify_api/rest/resources/2023_01/location.rb
701
+ - lib/shopify_api/rest/resources/2023_01/locations_for_move.rb
702
+ - lib/shopify_api/rest/resources/2023_01/marketing_event.rb
703
+ - lib/shopify_api/rest/resources/2023_01/metafield.rb
704
+ - lib/shopify_api/rest/resources/2023_01/mobile_platform_application.rb
705
+ - lib/shopify_api/rest/resources/2023_01/order.rb
706
+ - lib/shopify_api/rest/resources/2023_01/order_risk.rb
707
+ - lib/shopify_api/rest/resources/2023_01/page.rb
708
+ - lib/shopify_api/rest/resources/2023_01/payment.rb
709
+ - lib/shopify_api/rest/resources/2023_01/payment_gateway.rb
710
+ - lib/shopify_api/rest/resources/2023_01/payment_transaction.rb
711
+ - lib/shopify_api/rest/resources/2023_01/payout.rb
712
+ - lib/shopify_api/rest/resources/2023_01/policy.rb
713
+ - lib/shopify_api/rest/resources/2023_01/price_rule.rb
714
+ - lib/shopify_api/rest/resources/2023_01/product.rb
715
+ - lib/shopify_api/rest/resources/2023_01/product_listing.rb
716
+ - lib/shopify_api/rest/resources/2023_01/product_resource_feedback.rb
717
+ - lib/shopify_api/rest/resources/2023_01/province.rb
718
+ - lib/shopify_api/rest/resources/2023_01/recurring_application_charge.rb
719
+ - lib/shopify_api/rest/resources/2023_01/redirect.rb
720
+ - lib/shopify_api/rest/resources/2023_01/refund.rb
721
+ - lib/shopify_api/rest/resources/2023_01/report.rb
722
+ - lib/shopify_api/rest/resources/2023_01/resource_feedback.rb
723
+ - lib/shopify_api/rest/resources/2023_01/script_tag.rb
724
+ - lib/shopify_api/rest/resources/2023_01/shipping_zone.rb
725
+ - lib/shopify_api/rest/resources/2023_01/shop.rb
726
+ - lib/shopify_api/rest/resources/2023_01/smart_collection.rb
727
+ - lib/shopify_api/rest/resources/2023_01/storefront_access_token.rb
728
+ - lib/shopify_api/rest/resources/2023_01/tender_transaction.rb
729
+ - lib/shopify_api/rest/resources/2023_01/theme.rb
730
+ - lib/shopify_api/rest/resources/2023_01/transaction.rb
731
+ - lib/shopify_api/rest/resources/2023_01/usage_charge.rb
732
+ - lib/shopify_api/rest/resources/2023_01/user.rb
733
+ - lib/shopify_api/rest/resources/2023_01/variant.rb
734
+ - lib/shopify_api/rest/resources/2023_01/webhook.rb
651
735
  - lib/shopify_api/utils/graphql_proxy.rb
652
736
  - lib/shopify_api/utils/hmac_validator.rb
653
737
  - lib/shopify_api/utils/http_utils.rb