shopify_api 12.4.0 → 13.0.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 (178) hide show
  1. checksums.yaml +4 -4
  2. data/.github/api_update_reminder.md +25 -0
  3. data/.github/api_update_reminder_on_release.md +19 -0
  4. data/.github/workflows/api_update_reminder.yml +16 -0
  5. data/.github/workflows/api_update_reminder_on_release.yml +16 -0
  6. data/.github/workflows/stale.yml +20 -10
  7. data/.rubocop.yml +3 -0
  8. data/CHANGELOG.md +18 -4
  9. data/CONTRIBUTING.md +2 -2
  10. data/Gemfile.lock +7 -7
  11. data/README.md +10 -10
  12. data/docs/getting_started.md +2 -2
  13. data/docs/usage/graphql.md +6 -0
  14. data/docs/usage/graphql_storefront.md +8 -2
  15. data/docs/usage/oauth.md +1 -1
  16. data/docs/usage/rest.md +9 -2
  17. data/docs/usage/webhooks.md +1 -1
  18. data/lib/shopify_api/admin_versions.rb +2 -1
  19. data/lib/shopify_api/auth/oauth.rb +0 -2
  20. data/lib/shopify_api/clients/graphql/admin.rb +3 -3
  21. data/lib/shopify_api/clients/graphql/client.rb +13 -3
  22. data/lib/shopify_api/clients/graphql/storefront.rb +3 -3
  23. data/lib/shopify_api/clients/http_client.rb +21 -10
  24. data/lib/shopify_api/clients/rest/admin.rb +14 -3
  25. data/lib/shopify_api/context.rb +4 -20
  26. data/lib/shopify_api/rest/base.rb +50 -14
  27. data/lib/shopify_api/rest/resources/2022_04/application_charge.rb +6 -1
  28. data/lib/shopify_api/rest/resources/2022_04/application_credit.rb +8 -3
  29. data/lib/shopify_api/rest/resources/2022_04/discount_code.rb +3 -0
  30. data/lib/shopify_api/rest/resources/2022_04/dispute.rb +2 -2
  31. data/lib/shopify_api/rest/resources/2022_04/draft_order.rb +2 -2
  32. data/lib/shopify_api/rest/resources/2022_04/event.rb +2 -2
  33. data/lib/shopify_api/rest/resources/2022_04/fulfillment.rb +6 -0
  34. data/lib/shopify_api/rest/resources/2022_04/gift_card.rb +10 -7
  35. data/lib/shopify_api/rest/resources/2022_04/metafield.rb +2 -2
  36. data/lib/shopify_api/rest/resources/2022_04/order.rb +2 -2
  37. data/lib/shopify_api/rest/resources/2022_04/order_risk.rb +9 -2
  38. data/lib/shopify_api/rest/resources/2022_04/recurring_application_charge.rb +6 -1
  39. data/lib/shopify_api/rest/resources/2022_04/shipping_zone.rb +8 -8
  40. data/lib/shopify_api/rest/resources/2022_04/shop.rb +2 -2
  41. data/lib/shopify_api/rest/resources/2022_04/theme.rb +3 -0
  42. data/lib/shopify_api/rest/resources/2022_04/usage_charge.rb +8 -3
  43. data/lib/shopify_api/rest/resources/2022_07/application_charge.rb +6 -1
  44. data/lib/shopify_api/rest/resources/2022_07/application_credit.rb +8 -3
  45. data/lib/shopify_api/rest/resources/2022_07/carrier_service.rb +3 -0
  46. data/lib/shopify_api/rest/resources/2022_07/discount_code.rb +3 -0
  47. data/lib/shopify_api/rest/resources/2022_07/dispute.rb +2 -2
  48. data/lib/shopify_api/rest/resources/2022_07/draft_order.rb +2 -2
  49. data/lib/shopify_api/rest/resources/2022_07/event.rb +2 -2
  50. data/lib/shopify_api/rest/resources/2022_07/fulfillment.rb +6 -0
  51. data/lib/shopify_api/rest/resources/2022_07/gift_card.rb +10 -7
  52. data/lib/shopify_api/rest/resources/2022_07/metafield.rb +2 -2
  53. data/lib/shopify_api/rest/resources/2022_07/order.rb +2 -2
  54. data/lib/shopify_api/rest/resources/2022_07/order_risk.rb +9 -2
  55. data/lib/shopify_api/rest/resources/2022_07/recurring_application_charge.rb +6 -1
  56. data/lib/shopify_api/rest/resources/2022_07/shipping_zone.rb +8 -8
  57. data/lib/shopify_api/rest/resources/2022_07/shop.rb +2 -2
  58. data/lib/shopify_api/rest/resources/2022_07/theme.rb +3 -0
  59. data/lib/shopify_api/rest/resources/2022_07/usage_charge.rb +8 -3
  60. data/lib/shopify_api/rest/resources/2022_10/application_charge.rb +6 -1
  61. data/lib/shopify_api/rest/resources/2022_10/application_credit.rb +8 -3
  62. data/lib/shopify_api/rest/resources/2022_10/carrier_service.rb +3 -0
  63. data/lib/shopify_api/rest/resources/2022_10/discount_code.rb +3 -0
  64. data/lib/shopify_api/rest/resources/2022_10/dispute.rb +2 -2
  65. data/lib/shopify_api/rest/resources/2022_10/draft_order.rb +2 -2
  66. data/lib/shopify_api/rest/resources/2022_10/event.rb +2 -2
  67. data/lib/shopify_api/rest/resources/2022_10/fulfillment.rb +6 -0
  68. data/lib/shopify_api/rest/resources/2022_10/gift_card.rb +10 -7
  69. data/lib/shopify_api/rest/resources/2022_10/metafield.rb +2 -2
  70. data/lib/shopify_api/rest/resources/2022_10/order.rb +2 -2
  71. data/lib/shopify_api/rest/resources/2022_10/order_risk.rb +9 -2
  72. data/lib/shopify_api/rest/resources/2022_10/recurring_application_charge.rb +6 -1
  73. data/lib/shopify_api/rest/resources/2022_10/shipping_zone.rb +8 -8
  74. data/lib/shopify_api/rest/resources/2022_10/shop.rb +2 -2
  75. data/lib/shopify_api/rest/resources/2022_10/theme.rb +3 -0
  76. data/lib/shopify_api/rest/resources/2022_10/usage_charge.rb +8 -3
  77. data/lib/shopify_api/rest/resources/2023_01/application_charge.rb +6 -1
  78. data/lib/shopify_api/rest/resources/2023_01/application_credit.rb +8 -3
  79. data/lib/shopify_api/rest/resources/2023_01/carrier_service.rb +3 -0
  80. data/lib/shopify_api/rest/resources/2023_01/discount_code.rb +3 -0
  81. data/lib/shopify_api/rest/resources/2023_01/dispute.rb +2 -2
  82. data/lib/shopify_api/rest/resources/2023_01/dispute_evidence.rb +117 -0
  83. data/lib/shopify_api/rest/resources/{2022_01/android_pay_key.rb → 2023_01/dispute_file_upload.rb} +29 -25
  84. data/lib/shopify_api/rest/resources/2023_01/draft_order.rb +2 -2
  85. data/lib/shopify_api/rest/resources/2023_01/event.rb +2 -2
  86. data/lib/shopify_api/rest/resources/2023_01/fulfillment.rb +6 -0
  87. data/lib/shopify_api/rest/resources/2023_01/gift_card.rb +10 -7
  88. data/lib/shopify_api/rest/resources/2023_01/metafield.rb +2 -2
  89. data/lib/shopify_api/rest/resources/2023_01/order.rb +2 -2
  90. data/lib/shopify_api/rest/resources/2023_01/order_risk.rb +9 -2
  91. data/lib/shopify_api/rest/resources/2023_01/recurring_application_charge.rb +6 -1
  92. data/lib/shopify_api/rest/resources/2023_01/shipping_zone.rb +8 -8
  93. data/lib/shopify_api/rest/resources/2023_01/shop.rb +2 -2
  94. data/lib/shopify_api/rest/resources/2023_01/theme.rb +3 -0
  95. data/lib/shopify_api/rest/resources/2023_01/usage_charge.rb +8 -3
  96. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/application_charge.rb +6 -1
  97. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/application_credit.rb +8 -3
  98. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/customer.rb +3 -0
  99. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/discount_code.rb +3 -0
  100. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/dispute.rb +2 -2
  101. data/lib/shopify_api/rest/resources/2023_04/dispute_evidence.rb +117 -0
  102. data/lib/shopify_api/rest/resources/2023_04/dispute_file_upload.rb +81 -0
  103. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/draft_order.rb +2 -2
  104. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/event.rb +2 -2
  105. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/fulfillment.rb +8 -49
  106. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/fulfillment_order.rb +39 -8
  107. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/fulfillment_service.rb +3 -3
  108. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/gift_card.rb +10 -7
  109. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/metafield.rb +8 -13
  110. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/order.rb +14 -2
  111. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/order_risk.rb +9 -2
  112. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/price_rule.rb +3 -3
  113. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/recurring_application_charge.rb +6 -1
  114. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/shipping_zone.rb +8 -8
  115. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/shop.rb +5 -2
  116. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/theme.rb +3 -0
  117. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/transaction.rb +3 -0
  118. data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/usage_charge.rb +8 -3
  119. data/lib/shopify_api/utils/graphql_proxy.rb +3 -6
  120. data/lib/shopify_api/utils/session_utils.rb +0 -84
  121. data/lib/shopify_api/version.rb +1 -1
  122. data/lib/shopify_api/webhooks/registry.rb +1 -1
  123. data/shopify_api.gemspec +1 -1
  124. metadata +85 -80
  125. data/lib/shopify_api/auth/file_session_storage.rb +0 -72
  126. data/lib/shopify_api/auth/session_storage.rb +0 -30
  127. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/abandoned_checkout.rb +0 -0
  128. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/access_scope.rb +0 -0
  129. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/apple_pay_certificate.rb +0 -0
  130. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/article.rb +0 -0
  131. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/asset.rb +0 -0
  132. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/assigned_fulfillment_order.rb +0 -0
  133. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/balance.rb +0 -0
  134. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/blog.rb +0 -0
  135. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/cancellation_request.rb +0 -0
  136. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/carrier_service.rb +0 -0
  137. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/checkout.rb +0 -0
  138. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/collect.rb +0 -0
  139. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/collection.rb +0 -0
  140. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/collection_listing.rb +0 -0
  141. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/comment.rb +0 -0
  142. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/country.rb +0 -0
  143. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/currency.rb +0 -0
  144. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/custom_collection.rb +0 -0
  145. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/customer_address.rb +0 -0
  146. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/customer_saved_search.rb +0 -0
  147. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/deprecated_api_call.rb +0 -0
  148. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/fulfillment_event.rb +0 -0
  149. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/fulfillment_request.rb +0 -0
  150. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/gift_card_adjustment.rb +0 -0
  151. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/image.rb +0 -0
  152. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/inventory_item.rb +0 -0
  153. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/inventory_level.rb +0 -0
  154. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/location.rb +0 -0
  155. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/locations_for_move.rb +0 -0
  156. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/marketing_event.rb +0 -0
  157. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/mobile_platform_application.rb +0 -0
  158. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/page.rb +0 -0
  159. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/payment.rb +0 -0
  160. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/payment_gateway.rb +0 -0
  161. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/payment_transaction.rb +0 -0
  162. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/payout.rb +0 -0
  163. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/policy.rb +0 -0
  164. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/product.rb +0 -0
  165. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/product_listing.rb +0 -0
  166. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/product_resource_feedback.rb +0 -0
  167. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/province.rb +0 -0
  168. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/redirect.rb +0 -0
  169. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/refund.rb +0 -0
  170. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/report.rb +0 -0
  171. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/resource_feedback.rb +0 -0
  172. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/script_tag.rb +0 -0
  173. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/smart_collection.rb +0 -0
  174. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/storefront_access_token.rb +0 -0
  175. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/tender_transaction.rb +0 -0
  176. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/user.rb +0 -0
  177. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/variant.rb +0 -0
  178. /data/lib/shopify_api/rest/resources/{2022_01 → 2023_04}/webhook.rb +0 -0
@@ -15,8 +15,7 @@ module ShopifyAPI
15
15
  @logger = T.let(::Logger.new($stdout), ::Logger)
16
16
  @log_level = T.let(:info, Symbol)
17
17
  @notified_missing_resources_folder = T.let({}, T::Hash[String, T::Boolean])
18
- @active_session = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
19
- @session_storage = T.let(nil, T.nilable(ShopifyAPI::Auth::SessionStorage))
18
+ @active_session = T.let(Concurrent::ThreadLocalVar.new { nil }, T.nilable(Concurrent::ThreadLocalVar))
20
19
  @user_agent_prefix = T.let(nil, T.nilable(String))
21
20
  @old_api_secret_key = T.let(nil, T.nilable(String))
22
21
 
@@ -35,7 +34,6 @@ module ShopifyAPI
35
34
  is_embedded: T::Boolean,
36
35
  log_level: T.any(String, Symbol),
37
36
  logger: ::Logger,
38
- session_storage: T.nilable(ShopifyAPI::Auth::SessionStorage),
39
37
  host_name: T.nilable(String),
40
38
  host: T.nilable(String),
41
39
  private_shop: T.nilable(String),
@@ -52,7 +50,6 @@ module ShopifyAPI
52
50
  is_embedded:,
53
51
  log_level: :info,
54
52
  logger: ::Logger.new($stdout),
55
- session_storage: nil,
56
53
  host_name: nil,
57
54
  host: ENV["HOST"] || "https://#{host_name}",
58
55
  private_shop: nil,
@@ -71,7 +68,6 @@ module ShopifyAPI
71
68
  @is_private = is_private
72
69
  @scope = Auth::AuthScopes.new(scope)
73
70
  @is_embedded = is_embedded
74
- @session_storage = session_storage
75
71
  @logger = logger
76
72
  @private_shop = private_shop
77
73
  @user_agent_prefix = user_agent_prefix
@@ -82,13 +78,6 @@ module ShopifyAPI
82
78
  :info
83
79
  end
84
80
 
85
- if @session_storage
86
- ::ShopifyAPI::Logger.deprecated("The use of SessionStorage in the API library has been deprecated. " \
87
- "The ShopifyAPI will no longer have responsibility for session persistence. " \
88
- "Upgrading to `shopify_app` 21.3 will allow you to remove session_storage" \
89
- " from the API library Context configuration.", "13.0.0")
90
- end
91
-
92
81
  load_rest_resources(api_version: api_version)
93
82
  end
94
83
 
@@ -126,9 +115,6 @@ module ShopifyAPI
126
115
  sig { returns(Auth::AuthScopes) }
127
116
  attr_reader :scope
128
117
 
129
- sig { returns(T.nilable(ShopifyAPI::Auth::SessionStorage)) }
130
- attr_reader :session_storage
131
-
132
118
  sig { returns(::Logger) }
133
119
  attr_reader :logger
134
120
 
@@ -155,19 +141,17 @@ module ShopifyAPI
155
141
 
156
142
  sig { returns(T.nilable(Auth::Session)) }
157
143
  def active_session
158
- return @active_session.value unless @active_session.value.nil?
159
-
160
- private? ? Utils::SessionUtils.load_current_session : nil
144
+ @active_session&.value
161
145
  end
162
146
 
163
147
  sig { params(session: T.nilable(Auth::Session)).void }
164
148
  def activate_session(session)
165
- @active_session.value = session
149
+ T.must(@active_session).value = session
166
150
  end
167
151
 
168
152
  sig { void }
169
153
  def deactivate_session
170
- @active_session.value = nil
154
+ T.must(@active_session).value = nil
171
155
  end
172
156
 
173
157
  sig { returns(String) }
@@ -21,7 +21,7 @@ module ShopifyAPI
21
21
  sig { returns(T::Hash[Symbol, T.untyped]) }
22
22
  attr_accessor :original_state
23
23
 
24
- sig { returns(Rest::BaseErrors) }
24
+ sig { returns(T.any(Rest::BaseErrors, T.nilable(T::Hash[T.untyped, T.untyped]))) }
25
25
  attr_reader :errors
26
26
 
27
27
  sig do
@@ -234,14 +234,20 @@ module ShopifyAPI
234
234
  attr_sym = attribute.to_sym
235
235
 
236
236
  if has_many?(attr_sym) && value
237
+ instance.original_state[attr_sym] = []
237
238
  attr_list = []
238
239
  value.each do |element|
239
- attr_list << T.unsafe(@has_many[attr_sym]).create_instance(data: element, session: session)
240
+ child = T.unsafe(@has_many[attr_sym]).create_instance(data: element, session: session)
241
+ attr_list << child
242
+ instance.original_state[attr_sym] << child.to_hash(true)
240
243
  end
241
244
  instance.public_send("#{attribute}=", attr_list)
242
245
  elsif has_one?(attr_sym) && value
243
- instance.public_send("#{attribute}=",
244
- T.unsafe(@has_one[attr_sym]).create_instance(data: value, session: session))
246
+ # force a hash if core returns values that instantiate objects like "USD"
247
+ data_hash = value.is_a?(Hash) ? value : { attribute.to_s => value }
248
+ child = T.unsafe(@has_one[attr_sym]).create_instance(data: data_hash, session: session)
249
+ instance.public_send("#{attribute}=", child)
250
+ instance.original_state[attr_sym] = child.to_hash(true)
245
251
  else
246
252
  instance.public_send("#{attribute}=", value)
247
253
  instance.original_state[attr_sym] = value
@@ -333,16 +339,12 @@ module ShopifyAPI
333
339
 
334
340
  sig { params(update_object: T::Boolean).void }
335
341
  def save(update_object: false)
336
- hash = HashDiff::Comparison.new(original_state, to_hash(true)).left_diff
337
- method = hash[self.class.primary_key] ? :put : :post
338
-
339
- path = self.class.get_path(http_method: method, operation: method, entity: self)
340
- if path.nil?
341
- method = method == :post ? :put : :post
342
- path = self.class.get_path(http_method: method, operation: method, entity: self)
343
- end
344
-
345
- response = @client.public_send(method, body: { self.class.json_body_name => hash }, path: path)
342
+ method = deduce_write_verb
343
+ response = @client.public_send(
344
+ method,
345
+ body: { self.class.json_body_name => attributes_to_update },
346
+ path: deduce_write_path(method),
347
+ )
346
348
 
347
349
  if update_object
348
350
  self.class.create_instance(
@@ -357,6 +359,40 @@ module ShopifyAPI
357
359
 
358
360
  private
359
361
 
362
+ sig { returns(T::Hash[String, String]) }
363
+ def attributes_to_update
364
+ HashDiff::Comparison.new(
365
+ deep_stringify_keys(original_state),
366
+ deep_stringify_keys(to_hash(true)),
367
+ ).left_diff
368
+ end
369
+
370
+ sig { returns(Symbol) }
371
+ def deduce_write_verb
372
+ send(self.class.primary_key) ? :put : :post
373
+ end
374
+
375
+ sig { params(method: Symbol).returns(T.nilable(String)) }
376
+ def deduce_write_path(method)
377
+ path = self.class.get_path(http_method: method, operation: method, entity: self)
378
+
379
+ if path.nil?
380
+ method = method == :post ? :put : :post
381
+ path = self.class.get_path(http_method: method, operation: method, entity: self)
382
+ end
383
+
384
+ path
385
+ end
386
+
387
+ sig { params(hash: T::Hash[T.any(String, Symbol), T.untyped]).returns(T::Hash[String, String]) }
388
+ def deep_stringify_keys(hash)
389
+ hash.each_with_object({}) do |(key, value), result|
390
+ new_key = key.to_s
391
+ new_value = value.is_a?(Hash) ? deep_stringify_keys(value) : value
392
+ result[new_key] = new_value
393
+ end
394
+ end
395
+
360
396
  sig { params(key: T.any(String, Symbol), val: T.untyped).void }
361
397
  def set_property(key, val)
362
398
  # Some API fields contain invalid characters, like `?`, which causes issues when setting them as instance
@@ -18,6 +18,7 @@ module ShopifyAPI
18
18
 
19
19
  @confirmation_url = T.let(nil, T.nilable(String))
20
20
  @created_at = T.let(nil, T.nilable(String))
21
+ @currency = T.let(nil, T.nilable(Currency))
21
22
  @id = T.let(nil, T.nilable(Integer))
22
23
  @name = T.let(nil, T.nilable(String))
23
24
  @price = T.let(nil, T.nilable(T.any(String, Float)))
@@ -27,7 +28,9 @@ module ShopifyAPI
27
28
  @updated_at = T.let(nil, T.nilable(String))
28
29
  end
29
30
 
30
- @has_one = T.let({}, T::Hash[Symbol, Class])
31
+ @has_one = T.let({
32
+ currency: Currency
33
+ }, T::Hash[Symbol, Class])
31
34
  @has_many = T.let({}, T::Hash[Symbol, Class])
32
35
  @paths = T.let([
33
36
  {http_method: :get, operation: :get, ids: [], path: "application_charges.json"},
@@ -39,6 +42,8 @@ module ShopifyAPI
39
42
  attr_reader :confirmation_url
40
43
  sig { returns(T.nilable(String)) }
41
44
  attr_reader :created_at
45
+ sig { returns(T.nilable(Currency)) }
46
+ attr_reader :currency
42
47
  sig { returns(T.nilable(Integer)) }
43
48
  attr_reader :id
44
49
  sig { returns(T.nilable(String)) }
@@ -16,13 +16,16 @@ module ShopifyAPI
16
16
  def initialize(session: ShopifyAPI::Context.active_session)
17
17
  super(session: session)
18
18
 
19
- @amount = T.let(nil, T.nilable(Integer))
19
+ @amount = T.let(nil, T.nilable(String))
20
+ @currency = T.let(nil, T.nilable(Currency))
20
21
  @description = T.let(nil, T.nilable(String))
21
22
  @id = T.let(nil, T.nilable(Integer))
22
23
  @test = T.let(nil, T.nilable(T::Boolean))
23
24
  end
24
25
 
25
- @has_one = T.let({}, T::Hash[Symbol, Class])
26
+ @has_one = T.let({
27
+ currency: Currency
28
+ }, T::Hash[Symbol, Class])
26
29
  @has_many = T.let({}, T::Hash[Symbol, Class])
27
30
  @paths = T.let([
28
31
  {http_method: :get, operation: :get, ids: [], path: "application_credits.json"},
@@ -30,8 +33,10 @@ module ShopifyAPI
30
33
  {http_method: :post, operation: :post, ids: [], path: "application_credits.json"}
31
34
  ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]])
32
35
 
33
- sig { returns(T.nilable(Integer)) }
36
+ sig { returns(T.nilable(String)) }
34
37
  attr_reader :amount
38
+ sig { returns(T.nilable(Currency)) }
39
+ attr_reader :currency
35
40
  sig { returns(T.nilable(String)) }
36
41
  attr_reader :description
37
42
  sig { returns(T.nilable(Integer)) }
@@ -18,6 +18,7 @@ module ShopifyAPI
18
18
 
19
19
  @code = T.let(nil, T.nilable(String))
20
20
  @created_at = T.let(nil, T.nilable(String))
21
+ @errors = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
21
22
  @id = T.let(nil, T.nilable(Integer))
22
23
  @price_rule_id = T.let(nil, T.nilable(Integer))
23
24
  @updated_at = T.let(nil, T.nilable(String))
@@ -43,6 +44,8 @@ module ShopifyAPI
43
44
  attr_reader :code
44
45
  sig { returns(T.nilable(String)) }
45
46
  attr_reader :created_at
47
+ sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
48
+ attr_reader :errors
46
49
  sig { returns(T.nilable(Integer)) }
47
50
  attr_reader :id
48
51
  sig { returns(T.nilable(Integer)) }
@@ -22,7 +22,7 @@ module ShopifyAPI
22
22
  @evidence_sent_on = T.let(nil, T.nilable(String))
23
23
  @finalized_on = T.let(nil, T.nilable(String))
24
24
  @id = T.let(nil, T.nilable(Integer))
25
- @network_reason_code = T.let(nil, T.nilable(Integer))
25
+ @network_reason_code = T.let(nil, T.nilable(String))
26
26
  @order_id = T.let(nil, T.nilable(Integer))
27
27
  @reason = T.let(nil, T.nilable(String))
28
28
  @status = T.let(nil, T.nilable(String))
@@ -48,7 +48,7 @@ module ShopifyAPI
48
48
  attr_reader :finalized_on
49
49
  sig { returns(T.nilable(Integer)) }
50
50
  attr_reader :id
51
- sig { returns(T.nilable(Integer)) }
51
+ sig { returns(T.nilable(String)) }
52
52
  attr_reader :network_reason_code
53
53
  sig { returns(T.nilable(Integer)) }
54
54
  attr_reader :order_id
@@ -36,7 +36,7 @@ module ShopifyAPI
36
36
  @shipping_line = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
37
37
  @source_name = T.let(nil, T.nilable(String))
38
38
  @status = T.let(nil, T.nilable(String))
39
- @subtotal_price = T.let(nil, T.nilable(Float))
39
+ @subtotal_price = T.let(nil, T.nilable(String))
40
40
  @tags = T.let(nil, T.nilable(String))
41
41
  @tax_exempt = T.let(nil, T.nilable(T::Boolean))
42
42
  @tax_exemptions = T.let(nil, T.nilable(T::Array[T.untyped]))
@@ -102,7 +102,7 @@ module ShopifyAPI
102
102
  attr_reader :source_name
103
103
  sig { returns(T.nilable(String)) }
104
104
  attr_reader :status
105
- sig { returns(T.nilable(Float)) }
105
+ sig { returns(T.nilable(String)) }
106
106
  attr_reader :subtotal_price
107
107
  sig { returns(T.nilable(String)) }
108
108
  attr_reader :tags
@@ -16,7 +16,7 @@ module ShopifyAPI
16
16
  def initialize(session: ShopifyAPI::Context.active_session)
17
17
  super(session: session)
18
18
 
19
- @arguments = T.let(nil, T.nilable(String))
19
+ @arguments = T.let(nil, T.nilable(T::Array[T.untyped]))
20
20
  @body = T.let(nil, T.nilable(String))
21
21
  @created_at = T.let(nil, T.nilable(String))
22
22
  @description = T.let(nil, T.nilable(String))
@@ -38,7 +38,7 @@ module ShopifyAPI
38
38
  {http_method: :get, operation: :get, ids: [:product_id], path: "products/<product_id>/events.json"}
39
39
  ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]])
40
40
 
41
- sig { returns(T.nilable(String)) }
41
+ sig { returns(T.nilable(T::Array[String])) }
42
42
  attr_reader :arguments
43
43
  sig { returns(T.nilable(String)) }
44
44
  attr_reader :body
@@ -29,7 +29,9 @@ module ShopifyAPI
29
29
  @shipment_status = T.let(nil, T.nilable(String))
30
30
  @status = T.let(nil, T.nilable(String))
31
31
  @tracking_company = T.let(nil, T.nilable(String))
32
+ @tracking_number = T.let(nil, T.nilable(String))
32
33
  @tracking_numbers = T.let(nil, T.nilable(T::Array[T.untyped]))
34
+ @tracking_url = T.let(nil, T.nilable(String))
33
35
  @tracking_urls = T.let(nil, T.nilable(T::Array[T.untyped]))
34
36
  @updated_at = T.let(nil, T.nilable(String))
35
37
  @variant_inventory_management = T.let(nil, T.nilable(String))
@@ -78,8 +80,12 @@ module ShopifyAPI
78
80
  attr_reader :status
79
81
  sig { returns(T.nilable(String)) }
80
82
  attr_reader :tracking_company
83
+ sig { returns(T.nilable(String)) }
84
+ attr_reader :tracking_number
81
85
  sig { returns(T.nilable(T::Array[String])) }
82
86
  attr_reader :tracking_numbers
87
+ sig { returns(T.nilable(String)) }
88
+ attr_reader :tracking_url
83
89
  sig { returns(T.nilable(T::Array[String])) }
84
90
  attr_reader :tracking_urls
85
91
  sig { returns(T.nilable(String)) }
@@ -17,15 +17,15 @@ module ShopifyAPI
17
17
  super(session: session)
18
18
 
19
19
  @api_client_id = T.let(nil, T.nilable(Integer))
20
- @balance = T.let(nil, T.nilable(Float))
20
+ @balance = T.let(nil, T.nilable(Balance))
21
21
  @code = T.let(nil, T.nilable(String))
22
22
  @created_at = T.let(nil, T.nilable(String))
23
- @currency = T.let(nil, T.nilable(String))
23
+ @currency = T.let(nil, T.nilable(Currency))
24
24
  @customer_id = T.let(nil, T.nilable(Integer))
25
25
  @disabled_at = T.let(nil, T.nilable(String))
26
26
  @expires_on = T.let(nil, T.nilable(String))
27
27
  @id = T.let(nil, T.nilable(Integer))
28
- @initial_value = T.let(nil, T.nilable(Float))
28
+ @initial_value = T.let(nil, T.nilable(String))
29
29
  @last_characters = T.let(nil, T.nilable(String))
30
30
  @line_item_id = T.let(nil, T.nilable(Integer))
31
31
  @note = T.let(nil, T.nilable(String))
@@ -35,7 +35,10 @@ module ShopifyAPI
35
35
  @user_id = T.let(nil, T.nilable(Integer))
36
36
  end
37
37
 
38
- @has_one = T.let({}, T::Hash[Symbol, Class])
38
+ @has_one = T.let({
39
+ balance: Balance,
40
+ currency: Currency
41
+ }, T::Hash[Symbol, Class])
39
42
  @has_many = T.let({}, T::Hash[Symbol, Class])
40
43
  @paths = T.let([
41
44
  {http_method: :get, operation: :count, ids: [], path: "gift_cards/count.json"},
@@ -49,13 +52,13 @@ module ShopifyAPI
49
52
 
50
53
  sig { returns(T.nilable(Integer)) }
51
54
  attr_reader :api_client_id
52
- sig { returns(T.nilable(Float)) }
55
+ sig { returns(T.nilable(Balance)) }
53
56
  attr_reader :balance
54
57
  sig { returns(T.nilable(String)) }
55
58
  attr_reader :code
56
59
  sig { returns(T.nilable(String)) }
57
60
  attr_reader :created_at
58
- sig { returns(T.nilable(String)) }
61
+ sig { returns(T.nilable(Currency)) }
59
62
  attr_reader :currency
60
63
  sig { returns(T.nilable(Integer)) }
61
64
  attr_reader :customer_id
@@ -65,7 +68,7 @@ module ShopifyAPI
65
68
  attr_reader :expires_on
66
69
  sig { returns(T.nilable(Integer)) }
67
70
  attr_reader :id
68
- sig { returns(T.nilable(Float)) }
71
+ sig { returns(T.nilable(String)) }
69
72
  attr_reader :initial_value
70
73
  sig { returns(T.nilable(String)) }
71
74
  attr_reader :last_characters
@@ -18,7 +18,7 @@ module ShopifyAPI
18
18
 
19
19
  @key = T.let(nil, T.nilable(String))
20
20
  @namespace = T.let(nil, T.nilable(String))
21
- @value = T.let(nil, T.nilable(T.any(String, Integer, Float)))
21
+ @value = T.let(nil, T.nilable(T.any(String, Integer, Float, T::Boolean, String)))
22
22
  @article_id = T.let(nil, T.nilable(Integer))
23
23
  @blog_id = T.let(nil, T.nilable(Integer))
24
24
  @collection_id = T.let(nil, T.nilable(Integer))
@@ -119,7 +119,7 @@ module ShopifyAPI
119
119
  attr_reader :key
120
120
  sig { returns(T.nilable(String)) }
121
121
  attr_reader :namespace
122
- sig { returns(T.nilable(T.any(String, Integer, Float))) }
122
+ sig { returns(T.nilable(T.any(String, Integer, Float, T::Boolean, String))) }
123
123
  attr_reader :value
124
124
  sig { returns(T.nilable(Integer)) }
125
125
  attr_reader :article_id
@@ -72,7 +72,7 @@ module ShopifyAPI
72
72
  @source_identifier = T.let(nil, T.nilable(String))
73
73
  @source_name = T.let(nil, T.nilable(String))
74
74
  @source_url = T.let(nil, T.nilable(String))
75
- @subtotal_price = T.let(nil, T.nilable(Float))
75
+ @subtotal_price = T.let(nil, T.nilable(String))
76
76
  @subtotal_price_set = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
77
77
  @tags = T.let(nil, T.nilable(String))
78
78
  @tax_lines = T.let(nil, T.nilable(T::Array[T.untyped]))
@@ -227,7 +227,7 @@ module ShopifyAPI
227
227
  attr_reader :source_name
228
228
  sig { returns(T.nilable(String)) }
229
229
  attr_reader :source_url
230
- sig { returns(T.nilable(Float)) }
230
+ sig { returns(T.nilable(String)) }
231
231
  attr_reader :subtotal_price
232
232
  sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
233
233
  attr_reader :subtotal_price_set
@@ -24,7 +24,7 @@ module ShopifyAPI
24
24
  @message = T.let(nil, T.nilable(String))
25
25
  @order_id = T.let(nil, T.nilable(Integer))
26
26
  @recommendation = T.let(nil, T.nilable(String))
27
- @score = T.let(nil, T.nilable(Float))
27
+ @score = T.let(nil, T.nilable(String))
28
28
  @source = T.let(nil, T.nilable(String))
29
29
  end
30
30
 
@@ -54,7 +54,7 @@ module ShopifyAPI
54
54
  attr_reader :order_id
55
55
  sig { returns(T.nilable(String)) }
56
56
  attr_reader :recommendation
57
- sig { returns(T.nilable(Float)) }
57
+ sig { returns(T.nilable(String)) }
58
58
  attr_reader :score
59
59
  sig { returns(T.nilable(String)) }
60
60
  attr_reader :source
@@ -67,6 +67,13 @@ module ShopifyAPI
67
67
  "risk"
68
68
  end
69
69
 
70
+ sig do
71
+ returns(String)
72
+ end
73
+ def json_response_body_name()
74
+ "risk"
75
+ end
76
+
70
77
  sig do
71
78
  params(
72
79
  id: T.any(Integer, String),
@@ -22,6 +22,7 @@ module ShopifyAPI
22
22
  @capped_amount = T.let(nil, T.nilable(T.any(String, Integer)))
23
23
  @confirmation_url = T.let(nil, T.nilable(String))
24
24
  @created_at = T.let(nil, T.nilable(String))
25
+ @currency = T.let(nil, T.nilable(Currency))
25
26
  @id = T.let(nil, T.nilable(Integer))
26
27
  @name = T.let(nil, T.nilable(String))
27
28
  @price = T.let(nil, T.nilable(T.any(String, Float)))
@@ -34,7 +35,9 @@ module ShopifyAPI
34
35
  @updated_at = T.let(nil, T.nilable(String))
35
36
  end
36
37
 
37
- @has_one = T.let({}, T::Hash[Symbol, Class])
38
+ @has_one = T.let({
39
+ currency: Currency
40
+ }, T::Hash[Symbol, Class])
38
41
  @has_many = T.let({}, T::Hash[Symbol, Class])
39
42
  @paths = T.let([
40
43
  {http_method: :delete, operation: :delete, ids: [:id], path: "recurring_application_charges/<id>.json"},
@@ -56,6 +59,8 @@ module ShopifyAPI
56
59
  attr_reader :confirmation_url
57
60
  sig { returns(T.nilable(String)) }
58
61
  attr_reader :created_at
62
+ sig { returns(T.nilable(Currency)) }
63
+ attr_reader :currency
59
64
  sig { returns(T.nilable(Integer)) }
60
65
  attr_reader :id
61
66
  sig { returns(T.nilable(String)) }
@@ -19,12 +19,12 @@ module ShopifyAPI
19
19
  @carrier_shipping_rate_providers = T.let(nil, T.untyped)
20
20
  @countries = T.let(nil, T.nilable(T::Array[T.untyped]))
21
21
  @id = T.let(nil, T.nilable(Integer))
22
- @location_group_id = T.let(nil, T.nilable(Integer))
22
+ @location_group_id = T.let(nil, T.nilable(String))
23
23
  @name = T.let(nil, T.nilable(String))
24
- @price_based_shipping_rates = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
25
- @profile_id = T.let(nil, T.nilable(Integer))
24
+ @price_based_shipping_rates = T.let(nil, T.nilable(T::Array[T.untyped]))
25
+ @profile_id = T.let(nil, T.nilable(String))
26
26
  @provinces = T.let(nil, T.nilable(T::Array[T.untyped]))
27
- @weight_based_shipping_rates = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
27
+ @weight_based_shipping_rates = T.let(nil, T.nilable(T::Array[T.untyped]))
28
28
  end
29
29
 
30
30
  @has_one = T.let({}, T::Hash[Symbol, Class])
@@ -42,17 +42,17 @@ module ShopifyAPI
42
42
  attr_reader :countries
43
43
  sig { returns(T.nilable(Integer)) }
44
44
  attr_reader :id
45
- sig { returns(T.nilable(Integer)) }
45
+ sig { returns(T.nilable(String)) }
46
46
  attr_reader :location_group_id
47
47
  sig { returns(T.nilable(String)) }
48
48
  attr_reader :name
49
- sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
49
+ sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) }
50
50
  attr_reader :price_based_shipping_rates
51
- sig { returns(T.nilable(Integer)) }
51
+ sig { returns(T.nilable(String)) }
52
52
  attr_reader :profile_id
53
53
  sig { returns(T.nilable(T::Array[Province])) }
54
54
  attr_reader :provinces
55
- sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
55
+ sig { returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]])) }
56
56
  attr_reader :weight_based_shipping_rates
57
57
 
58
58
  class << self
@@ -24,7 +24,7 @@ module ShopifyAPI
24
24
  @country = T.let(nil, T.nilable(String))
25
25
  @country_code = T.let(nil, T.nilable(String))
26
26
  @country_name = T.let(nil, T.nilable(String))
27
- @county_taxes = T.let(nil, T.nilable(String))
27
+ @county_taxes = T.let(nil, T.nilable(T::Boolean))
28
28
  @created_at = T.let(nil, T.nilable(String))
29
29
  @currency = T.let(nil, T.nilable(String))
30
30
  @customer_email = T.let(nil, T.nilable(String))
@@ -95,7 +95,7 @@ module ShopifyAPI
95
95
  attr_reader :country_code
96
96
  sig { returns(T.nilable(String)) }
97
97
  attr_reader :country_name
98
- sig { returns(T.nilable(String)) }
98
+ sig { returns(T.nilable(T::Boolean)) }
99
99
  attr_reader :county_taxes
100
100
  sig { returns(T.nilable(String)) }
101
101
  attr_reader :created_at
@@ -22,6 +22,7 @@ module ShopifyAPI
22
22
  @previewable = T.let(nil, T.nilable(T::Boolean))
23
23
  @processing = T.let(nil, T.nilable(T::Boolean))
24
24
  @role = T.let(nil, T.nilable(String))
25
+ @src = T.let(nil, T.nilable(String))
25
26
  @theme_store_id = T.let(nil, T.nilable(Integer))
26
27
  @updated_at = T.let(nil, T.nilable(String))
27
28
  end
@@ -48,6 +49,8 @@ module ShopifyAPI
48
49
  attr_reader :processing
49
50
  sig { returns(T.nilable(String)) }
50
51
  attr_reader :role
52
+ sig { returns(T.nilable(String)) }
53
+ attr_reader :src
51
54
  sig { returns(T.nilable(Integer)) }
52
55
  attr_reader :theme_store_id
53
56
  sig { returns(T.nilable(String)) }
@@ -17,14 +17,17 @@ module ShopifyAPI
17
17
  super(session: session)
18
18
 
19
19
  @created_at = T.let(nil, T.nilable(String))
20
+ @currency = T.let(nil, T.nilable(Currency))
20
21
  @description = T.let(nil, T.nilable(String))
21
22
  @id = T.let(nil, T.nilable(Integer))
22
- @price = T.let(nil, T.nilable(Integer))
23
+ @price = T.let(nil, T.nilable(String))
23
24
  @recurring_application_charge_id = T.let(nil, T.nilable(Integer))
24
25
  @updated_at = T.let(nil, T.nilable(String))
25
26
  end
26
27
 
27
- @has_one = T.let({}, T::Hash[Symbol, Class])
28
+ @has_one = T.let({
29
+ currency: Currency
30
+ }, T::Hash[Symbol, Class])
28
31
  @has_many = T.let({}, T::Hash[Symbol, Class])
29
32
  @paths = T.let([
30
33
  {http_method: :get, operation: :get, ids: [:recurring_application_charge_id], path: "recurring_application_charges/<recurring_application_charge_id>/usage_charges.json"},
@@ -34,11 +37,13 @@ module ShopifyAPI
34
37
 
35
38
  sig { returns(T.nilable(String)) }
36
39
  attr_reader :created_at
40
+ sig { returns(T.nilable(Currency)) }
41
+ attr_reader :currency
37
42
  sig { returns(T.nilable(String)) }
38
43
  attr_reader :description
39
44
  sig { returns(T.nilable(Integer)) }
40
45
  attr_reader :id
41
- sig { returns(T.nilable(Integer)) }
46
+ sig { returns(T.nilable(String)) }
42
47
  attr_reader :price
43
48
  sig { returns(T.nilable(Integer)) }
44
49
  attr_reader :recurring_application_charge_id
@@ -18,6 +18,7 @@ module ShopifyAPI
18
18
 
19
19
  @confirmation_url = T.let(nil, T.nilable(String))
20
20
  @created_at = T.let(nil, T.nilable(String))
21
+ @currency = T.let(nil, T.nilable(Currency))
21
22
  @id = T.let(nil, T.nilable(Integer))
22
23
  @name = T.let(nil, T.nilable(String))
23
24
  @price = T.let(nil, T.nilable(T.any(String, Float)))
@@ -27,7 +28,9 @@ module ShopifyAPI
27
28
  @updated_at = T.let(nil, T.nilable(String))
28
29
  end
29
30
 
30
- @has_one = T.let({}, T::Hash[Symbol, Class])
31
+ @has_one = T.let({
32
+ currency: Currency
33
+ }, T::Hash[Symbol, Class])
31
34
  @has_many = T.let({}, T::Hash[Symbol, Class])
32
35
  @paths = T.let([
33
36
  {http_method: :get, operation: :get, ids: [], path: "application_charges.json"},
@@ -39,6 +42,8 @@ module ShopifyAPI
39
42
  attr_reader :confirmation_url
40
43
  sig { returns(T.nilable(String)) }
41
44
  attr_reader :created_at
45
+ sig { returns(T.nilable(Currency)) }
46
+ attr_reader :currency
42
47
  sig { returns(T.nilable(Integer)) }
43
48
  attr_reader :id
44
49
  sig { returns(T.nilable(String)) }
@@ -16,13 +16,16 @@ module ShopifyAPI
16
16
  def initialize(session: ShopifyAPI::Context.active_session)
17
17
  super(session: session)
18
18
 
19
- @amount = T.let(nil, T.nilable(Integer))
19
+ @amount = T.let(nil, T.nilable(String))
20
+ @currency = T.let(nil, T.nilable(Currency))
20
21
  @description = T.let(nil, T.nilable(String))
21
22
  @id = T.let(nil, T.nilable(Integer))
22
23
  @test = T.let(nil, T.nilable(T::Boolean))
23
24
  end
24
25
 
25
- @has_one = T.let({}, T::Hash[Symbol, Class])
26
+ @has_one = T.let({
27
+ currency: Currency
28
+ }, T::Hash[Symbol, Class])
26
29
  @has_many = T.let({}, T::Hash[Symbol, Class])
27
30
  @paths = T.let([
28
31
  {http_method: :get, operation: :get, ids: [], path: "application_credits.json"},
@@ -30,8 +33,10 @@ module ShopifyAPI
30
33
  {http_method: :post, operation: :post, ids: [], path: "application_credits.json"}
31
34
  ], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]])
32
35
 
33
- sig { returns(T.nilable(Integer)) }
36
+ sig { returns(T.nilable(String)) }
34
37
  attr_reader :amount
38
+ sig { returns(T.nilable(Currency)) }
39
+ attr_reader :currency
35
40
  sig { returns(T.nilable(String)) }
36
41
  attr_reader :description
37
42
  sig { returns(T.nilable(Integer)) }