ruby_shopify_api 1.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 (351) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.github/CODEOWNERS +1 -0
  4. data/.github/ISSUE_TEMPLATE.md +36 -0
  5. data/.github/probots.yml +2 -0
  6. data/.github/workflows/build.yml +43 -0
  7. data/.gitignore +15 -0
  8. data/.rubocop.yml +28 -0
  9. data/.rubocop_todo.yml +75 -0
  10. data/CHANGELOG-OLD.md +501 -0
  11. data/CHANGELOG.md +5 -0
  12. data/CONTRIBUTING.md +8 -0
  13. data/CONTRIBUTORS +3 -0
  14. data/Gemfile +10 -0
  15. data/Gemfile.lock +151 -0
  16. data/Gemfile_ar41 +5 -0
  17. data/Gemfile_ar50 +5 -0
  18. data/Gemfile_ar51 +5 -0
  19. data/Gemfile_ar60 +5 -0
  20. data/Gemfile_ar_main +5 -0
  21. data/LICENSE +20 -0
  22. data/README.md +649 -0
  23. data/RELEASING +17 -0
  24. data/Rakefile +55 -0
  25. data/SECURITY.md +59 -0
  26. data/dev.yml +11 -0
  27. data/docker-compose.yml +13 -0
  28. data/docs/_config.yml +1 -0
  29. data/docs/_includes/footer.html +28 -0
  30. data/docs/_includes/head.html +28 -0
  31. data/docs/_layouts/index.html +57 -0
  32. data/docs/graphql.md +241 -0
  33. data/docs/index.md +639 -0
  34. data/lib/active_resource/connection_ext.rb +11 -0
  35. data/lib/active_resource/detailed_log_subscriber.rb +55 -0
  36. data/lib/active_resource/json_errors.rb +37 -0
  37. data/lib/shopify_api/api_access.rb +57 -0
  38. data/lib/shopify_api/api_version.rb +206 -0
  39. data/lib/shopify_api/connection.rb +36 -0
  40. data/lib/shopify_api/countable.rb +15 -0
  41. data/lib/shopify_api/disable_prefix_check.rb +31 -0
  42. data/lib/shopify_api/events.rb +8 -0
  43. data/lib/shopify_api/graphql/http_client.rb +22 -0
  44. data/lib/shopify_api/graphql/railtie.rb +17 -0
  45. data/lib/shopify_api/graphql/task.rake +100 -0
  46. data/lib/shopify_api/graphql.rb +103 -0
  47. data/lib/shopify_api/hmac_params.rb +33 -0
  48. data/lib/shopify_api/limits.rb +77 -0
  49. data/lib/shopify_api/message_enricher.rb +25 -0
  50. data/lib/shopify_api/meta.rb +14 -0
  51. data/lib/shopify_api/metafields.rb +21 -0
  52. data/lib/shopify_api/paginated_collection.rb +69 -0
  53. data/lib/shopify_api/pagination_link_headers.rb +34 -0
  54. data/lib/shopify_api/resources/abandoned_checkout.rb +7 -0
  55. data/lib/shopify_api/resources/access_scope.rb +10 -0
  56. data/lib/shopify_api/resources/access_token.rb +9 -0
  57. data/lib/shopify_api/resources/address.rb +5 -0
  58. data/lib/shopify_api/resources/announcement.rb +5 -0
  59. data/lib/shopify_api/resources/api_permission.rb +9 -0
  60. data/lib/shopify_api/resources/application_charge.rb +16 -0
  61. data/lib/shopify_api/resources/application_credit.rb +5 -0
  62. data/lib/shopify_api/resources/array_base.rb +13 -0
  63. data/lib/shopify_api/resources/article.rb +22 -0
  64. data/lib/shopify_api/resources/asset.rb +101 -0
  65. data/lib/shopify_api/resources/assigned_fulfillment_order.rb +16 -0
  66. data/lib/shopify_api/resources/base.rb +166 -0
  67. data/lib/shopify_api/resources/billing_address.rb +5 -0
  68. data/lib/shopify_api/resources/blog.rb +11 -0
  69. data/lib/shopify_api/resources/carrier_service.rb +5 -0
  70. data/lib/shopify_api/resources/cart.rb +5 -0
  71. data/lib/shopify_api/resources/checkout.rb +30 -0
  72. data/lib/shopify_api/resources/collect.rb +7 -0
  73. data/lib/shopify_api/resources/collection.rb +14 -0
  74. data/lib/shopify_api/resources/collection_listing.rb +19 -0
  75. data/lib/shopify_api/resources/collection_publication.rb +10 -0
  76. data/lib/shopify_api/resources/comment.rb +24 -0
  77. data/lib/shopify_api/resources/country.rb +5 -0
  78. data/lib/shopify_api/resources/currency.rb +6 -0
  79. data/lib/shopify_api/resources/custom_collection.rb +20 -0
  80. data/lib/shopify_api/resources/customer.rb +30 -0
  81. data/lib/shopify_api/resources/customer_group.rb +6 -0
  82. data/lib/shopify_api/resources/customer_invite.rb +5 -0
  83. data/lib/shopify_api/resources/customer_saved_search.rb +12 -0
  84. data/lib/shopify_api/resources/discount_code.rb +10 -0
  85. data/lib/shopify_api/resources/discount_code_batch.rb +34 -0
  86. data/lib/shopify_api/resources/draft_order.rb +15 -0
  87. data/lib/shopify_api/resources/draft_order_invoice.rb +5 -0
  88. data/lib/shopify_api/resources/event.rb +9 -0
  89. data/lib/shopify_api/resources/fulfillment.rb +56 -0
  90. data/lib/shopify_api/resources/fulfillment_event.rb +16 -0
  91. data/lib/shopify_api/resources/fulfillment_order.rb +151 -0
  92. data/lib/shopify_api/resources/fulfillment_order_locations_for_move.rb +5 -0
  93. data/lib/shopify_api/resources/fulfillment_request.rb +16 -0
  94. data/lib/shopify_api/resources/fulfillment_service.rb +5 -0
  95. data/lib/shopify_api/resources/fulfillment_v2.rb +21 -0
  96. data/lib/shopify_api/resources/gift_card.rb +8 -0
  97. data/lib/shopify_api/resources/image.rb +17 -0
  98. data/lib/shopify_api/resources/inventory_item.rb +6 -0
  99. data/lib/shopify_api/resources/inventory_level.rb +54 -0
  100. data/lib/shopify_api/resources/line_item.rb +15 -0
  101. data/lib/shopify_api/resources/location.rb +8 -0
  102. data/lib/shopify_api/resources/marketing_event.rb +11 -0
  103. data/lib/shopify_api/resources/metafield.rb +14 -0
  104. data/lib/shopify_api/resources/note_attribute.rb +5 -0
  105. data/lib/shopify_api/resources/option.rb +5 -0
  106. data/lib/shopify_api/resources/order.rb +44 -0
  107. data/lib/shopify_api/resources/order_risk.rb +9 -0
  108. data/lib/shopify_api/resources/page.rb +7 -0
  109. data/lib/shopify_api/resources/payment.rb +7 -0
  110. data/lib/shopify_api/resources/payment_details.rb +5 -0
  111. data/lib/shopify_api/resources/ping.rb +3 -0
  112. data/lib/shopify_api/resources/policy.rb +8 -0
  113. data/lib/shopify_api/resources/price_rule.rb +8 -0
  114. data/lib/shopify_api/resources/product.rb +59 -0
  115. data/lib/shopify_api/resources/product_listing.rb +17 -0
  116. data/lib/shopify_api/resources/product_publication.rb +10 -0
  117. data/lib/shopify_api/resources/province.rb +6 -0
  118. data/lib/shopify_api/resources/publication.rb +5 -0
  119. data/lib/shopify_api/resources/receipt.rb +5 -0
  120. data/lib/shopify_api/resources/recurring_application_charge.rb +34 -0
  121. data/lib/shopify_api/resources/redirect.rb +5 -0
  122. data/lib/shopify_api/resources/refund.rb +15 -0
  123. data/lib/shopify_api/resources/report.rb +5 -0
  124. data/lib/shopify_api/resources/resource_feedback.rb +19 -0
  125. data/lib/shopify_api/resources/rule.rb +5 -0
  126. data/lib/shopify_api/resources/script_tag.rb +5 -0
  127. data/lib/shopify_api/resources/shipping_address.rb +5 -0
  128. data/lib/shopify_api/resources/shipping_line.rb +5 -0
  129. data/lib/shopify_api/resources/shipping_rate.rb +7 -0
  130. data/lib/shopify_api/resources/shipping_zone.rb +5 -0
  131. data/lib/shopify_api/resources/shop.rb +26 -0
  132. data/lib/shopify_api/resources/smart_collection.rb +15 -0
  133. data/lib/shopify_api/resources/storefront_access_token.rb +5 -0
  134. data/lib/shopify_api/resources/tax_line.rb +5 -0
  135. data/lib/shopify_api/resources/tax_service.rb +5 -0
  136. data/lib/shopify_api/resources/tender_transaction.rb +6 -0
  137. data/lib/shopify_api/resources/theme.rb +5 -0
  138. data/lib/shopify_api/resources/transaction.rb +6 -0
  139. data/lib/shopify_api/resources/usage_charge.rb +6 -0
  140. data/lib/shopify_api/resources/user.rb +5 -0
  141. data/lib/shopify_api/resources/variant.rb +43 -0
  142. data/lib/shopify_api/resources/webhook.rb +5 -0
  143. data/lib/shopify_api/resources.rb +4 -0
  144. data/lib/shopify_api/session.rb +203 -0
  145. data/lib/shopify_api/version.rb +4 -0
  146. data/lib/shopify_api.rb +45 -0
  147. data/lib/verify_docs.rb +8 -0
  148. data/service.yml +2 -0
  149. data/shipit.rubygems.yml +1 -0
  150. data/shopify_api.gemspec +47 -0
  151. data/test/abandoned_checkouts_test.rb +29 -0
  152. data/test/access_scope_test.rb +23 -0
  153. data/test/access_token_test.rb +20 -0
  154. data/test/active_resource/json_errors_test.rb +19 -0
  155. data/test/api_access_test.rb +153 -0
  156. data/test/api_permission_test.rb +9 -0
  157. data/test/api_version_test.rb +157 -0
  158. data/test/application_charge_test.rb +82 -0
  159. data/test/application_credit_test.rb +36 -0
  160. data/test/article_test.rb +72 -0
  161. data/test/asset_test.rb +26 -0
  162. data/test/assigned_fulfillment_order_test.rb +78 -0
  163. data/test/base_test.rb +213 -0
  164. data/test/blog_test.rb +9 -0
  165. data/test/carrier_service_test.rb +18 -0
  166. data/test/cart_test.rb +14 -0
  167. data/test/checkouts_test.rb +77 -0
  168. data/test/collect_test.rb +10 -0
  169. data/test/collection_listing_test.rb +84 -0
  170. data/test/collection_publication_test.rb +40 -0
  171. data/test/collection_test.rb +50 -0
  172. data/test/countable_test.rb +14 -0
  173. data/test/currency_test.rb +21 -0
  174. data/test/custom_collection_test.rb +10 -0
  175. data/test/customer_saved_search_test.rb +37 -0
  176. data/test/customer_test.rb +58 -0
  177. data/test/detailed_log_subscriber_test.rb +143 -0
  178. data/test/discount_code_batch_test.rb +41 -0
  179. data/test/discount_code_test.rb +59 -0
  180. data/test/draft_order_test.rb +167 -0
  181. data/test/fixtures/abandoned_checkout.json +184 -0
  182. data/test/fixtures/abandoned_checkouts.json +186 -0
  183. data/test/fixtures/access_scopes.json +10 -0
  184. data/test/fixtures/access_token_delegate.json +4 -0
  185. data/test/fixtures/api_versions.json +38 -0
  186. data/test/fixtures/apis.json +42 -0
  187. data/test/fixtures/application_charge.json +16 -0
  188. data/test/fixtures/application_charges.json +57 -0
  189. data/test/fixtures/application_credit.json +12 -0
  190. data/test/fixtures/application_credits.json +24 -0
  191. data/test/fixtures/article.json +15 -0
  192. data/test/fixtures/articles.json +39 -0
  193. data/test/fixtures/asset.json +9 -0
  194. data/test/fixtures/assets.json +136 -0
  195. data/test/fixtures/assigned_fulfillment_orders.json +80 -0
  196. data/test/fixtures/authors.json +1 -0
  197. data/test/fixtures/blog.json +13 -0
  198. data/test/fixtures/blogs.json +13 -0
  199. data/test/fixtures/carrier_service.json +9 -0
  200. data/test/fixtures/carts.json +43 -0
  201. data/test/fixtures/checkout.json +160 -0
  202. data/test/fixtures/checkouts.json +162 -0
  203. data/test/fixtures/collect.json +12 -0
  204. data/test/fixtures/collection.json +17 -0
  205. data/test/fixtures/collection_listing.json +11 -0
  206. data/test/fixtures/collection_listing_product_ids.json +1 -0
  207. data/test/fixtures/collection_listing_product_ids2.json +1 -0
  208. data/test/fixtures/collection_listings.json +13 -0
  209. data/test/fixtures/collection_products.json +47 -0
  210. data/test/fixtures/collection_publication.json +11 -0
  211. data/test/fixtures/collection_publications.json +13 -0
  212. data/test/fixtures/currencies.json +25 -0
  213. data/test/fixtures/custom_collection.json +17 -0
  214. data/test/fixtures/customer_invite.json +9 -0
  215. data/test/fixtures/customer_saved_search.json +9 -0
  216. data/test/fixtures/customer_saved_search_customers.json +60 -0
  217. data/test/fixtures/customers.json +59 -0
  218. data/test/fixtures/customers_account_activation_url.json +3 -0
  219. data/test/fixtures/customers_search.json +60 -0
  220. data/test/fixtures/discount_code.json +10 -0
  221. data/test/fixtures/discount_code_batch.json +14 -0
  222. data/test/fixtures/discount_code_batch_discount_codes.json +21 -0
  223. data/test/fixtures/discount_codes.json +12 -0
  224. data/test/fixtures/draft_order.json +159 -0
  225. data/test/fixtures/draft_order_completed.json +159 -0
  226. data/test/fixtures/draft_order_invoice.json +9 -0
  227. data/test/fixtures/draft_orders.json +161 -0
  228. data/test/fixtures/engagement.json +15 -0
  229. data/test/fixtures/events.json +31 -0
  230. data/test/fixtures/fulfillment.json +49 -0
  231. data/test/fixtures/fulfillment_event.json +12 -0
  232. data/test/fixtures/fulfillment_order.json +39 -0
  233. data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
  234. data/test/fixtures/fulfillment_orders.json +80 -0
  235. data/test/fixtures/fulfillment_request.json +28 -0
  236. data/test/fixtures/fulfillment_service.json +10 -0
  237. data/test/fixtures/fulfillments.json +53 -0
  238. data/test/fixtures/gift_card.json +20 -0
  239. data/test/fixtures/gift_card_disabled.json +20 -0
  240. data/test/fixtures/graphql/2019-10.json +1083 -0
  241. data/test/fixtures/graphql/dummy_schema.rb +16 -0
  242. data/test/fixtures/graphql/unstable.json +1083 -0
  243. data/test/fixtures/image.json +10 -0
  244. data/test/fixtures/images.json +20 -0
  245. data/test/fixtures/inventory_level.json +7 -0
  246. data/test/fixtures/inventory_levels.json +24 -0
  247. data/test/fixtures/marketing_event.json +28 -0
  248. data/test/fixtures/marketing_events.json +54 -0
  249. data/test/fixtures/metafield.json +12 -0
  250. data/test/fixtures/metafields.json +34 -0
  251. data/test/fixtures/order.json +297 -0
  252. data/test/fixtures/order_risk.json +14 -0
  253. data/test/fixtures/order_risks.json +28 -0
  254. data/test/fixtures/order_with_properties.json +373 -0
  255. data/test/fixtures/orders.json +299 -0
  256. data/test/fixtures/payment.json +7 -0
  257. data/test/fixtures/payments.json +9 -0
  258. data/test/fixtures/ping/conversation.json +1 -0
  259. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  260. data/test/fixtures/ping/message.json +1 -0
  261. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  262. data/test/fixtures/policies.json +8 -0
  263. data/test/fixtures/price_rule.json +27 -0
  264. data/test/fixtures/price_rules.json +28 -0
  265. data/test/fixtures/product.json +116 -0
  266. data/test/fixtures/product_listing.json +86 -0
  267. data/test/fixtures/product_listing_product_ids.json +1 -0
  268. data/test/fixtures/product_listing_product_ids2.json +1 -0
  269. data/test/fixtures/product_listings.json +174 -0
  270. data/test/fixtures/product_publication.json +11 -0
  271. data/test/fixtures/product_publications.json +13 -0
  272. data/test/fixtures/publications.json +9 -0
  273. data/test/fixtures/recurring_application_charge.json +22 -0
  274. data/test/fixtures/recurring_application_charge_adjustment.json +5 -0
  275. data/test/fixtures/recurring_application_charges.json +106 -0
  276. data/test/fixtures/redirect.json +7 -0
  277. data/test/fixtures/refund.json +112 -0
  278. data/test/fixtures/report.json +9 -0
  279. data/test/fixtures/reports.json +11 -0
  280. data/test/fixtures/script_tag.json +10 -0
  281. data/test/fixtures/script_tags.json +18 -0
  282. data/test/fixtures/shipping_rates.json +12 -0
  283. data/test/fixtures/shipping_zones.json +315 -0
  284. data/test/fixtures/shop.json +26 -0
  285. data/test/fixtures/smart_collection.json +21 -0
  286. data/test/fixtures/smart_collection_products.json +155 -0
  287. data/test/fixtures/storefront_access_token.json +9 -0
  288. data/test/fixtures/storefront_access_tokens.json +18 -0
  289. data/test/fixtures/tags.json +1 -0
  290. data/test/fixtures/tax_service.json +9 -0
  291. data/test/fixtures/tender_transactions.json +52 -0
  292. data/test/fixtures/transaction.json +29 -0
  293. data/test/fixtures/usage_charge.json +11 -0
  294. data/test/fixtures/usage_charges.json +23 -0
  295. data/test/fixtures/user.json +21 -0
  296. data/test/fixtures/users.json +42 -0
  297. data/test/fixtures/variant.json +23 -0
  298. data/test/fixtures/variants.json +88 -0
  299. data/test/fixtures/webhook.json +10 -0
  300. data/test/fixtures/webhooks.json +18 -0
  301. data/test/fulfillment_event_test.rb +74 -0
  302. data/test/fulfillment_order_test.rb +530 -0
  303. data/test/fulfillment_order_test_helper.rb +8 -0
  304. data/test/fulfillment_request_test.rb +35 -0
  305. data/test/fulfillment_service_test.rb +18 -0
  306. data/test/fulfillment_test.rb +239 -0
  307. data/test/fulfillment_v2_test.rb +66 -0
  308. data/test/gift_card_test.rb +24 -0
  309. data/test/graphql/http_client_test.rb +26 -0
  310. data/test/graphql_test.rb +190 -0
  311. data/test/hmac_params_test.rb +25 -0
  312. data/test/image_test.rb +41 -0
  313. data/test/inventory_level_test.rb +68 -0
  314. data/test/lib/webmock_extensions/last_request.rb +16 -0
  315. data/test/limits_test.rb +39 -0
  316. data/test/location_test.rb +15 -0
  317. data/test/marketing_event_test.rb +68 -0
  318. data/test/message_enricher_test.rb +45 -0
  319. data/test/meta_test.rb +47 -0
  320. data/test/metafield_test.rb +56 -0
  321. data/test/order_risk_test.rb +47 -0
  322. data/test/order_test.rb +140 -0
  323. data/test/pagination_test.rb +290 -0
  324. data/test/payment_test.rb +19 -0
  325. data/test/policy_test.rb +20 -0
  326. data/test/price_rule_test.rb +70 -0
  327. data/test/product_listing_test.rb +97 -0
  328. data/test/product_publication_test.rb +40 -0
  329. data/test/product_test.rb +111 -0
  330. data/test/publication_test.rb +12 -0
  331. data/test/recurring_application_charge_test.rb +204 -0
  332. data/test/redirect_test.rb +10 -0
  333. data/test/refund_test.rb +37 -0
  334. data/test/report_test.rb +37 -0
  335. data/test/resource_feedback_test.rb +43 -0
  336. data/test/script_tag_test.rb +31 -0
  337. data/test/session_test.rb +640 -0
  338. data/test/shipping_rate_test.rb +17 -0
  339. data/test/shipping_zone_test.rb +11 -0
  340. data/test/shop_test.rb +82 -0
  341. data/test/smart_collection_test.rb +11 -0
  342. data/test/storefront_access_token_test.rb +30 -0
  343. data/test/tax_service_test.rb +12 -0
  344. data/test/tender_transaction_test.rb +18 -0
  345. data/test/test_helper.rb +126 -0
  346. data/test/transaction_test.rb +18 -0
  347. data/test/usage_charge_test.rb +25 -0
  348. data/test/user_test.rb +18 -0
  349. data/test/variant_test.rb +73 -0
  350. data/test/webhook_test.rb +24 -0
  351. metadata +555 -0
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Blog < Base
4
+ include Events
5
+ include Metafields
6
+
7
+ def articles
8
+ Article.find(:all, params: { blog_id: id })
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class CarrierService < Base
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Cart < Base
4
+ end
5
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyAPI
4
+ class Checkout < Base
5
+ self.primary_key = :token
6
+
7
+ def self.headers
8
+ super.merge('X-Shopify-Checkout-Version' => '2016-09-06')
9
+ end
10
+
11
+ def complete
12
+ post(:complete)
13
+ end
14
+
15
+ def ready?
16
+ return false unless persisted?
17
+
18
+ reload
19
+ [200, 201].include?(ShopifyAPI::Base.connection.response.code.to_i)
20
+ end
21
+
22
+ def payments
23
+ Payment.find(:all, params: { checkout_id: id })
24
+ end
25
+
26
+ def shipping_rates
27
+ ShippingRate.find(:all, params: { checkout_id: id })
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ # For adding/removing products from custom collections
4
+ class Collect < Base
5
+ early_july_pagination_release!
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyAPI
4
+ class Collection < Base
5
+ include Events
6
+ include Metafields
7
+
8
+ def products(options = {})
9
+ available_in_version = ShopifyAPI::ApiVersion.find_version('2020-01')
10
+ raise NotImplementedError unless ShopifyAPI::Base.api_version >= available_in_version
11
+ Product.find(:all, from: "#{self.class.prefix}collections/#{id}/products.json", params: options)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class CollectionListing < Base
4
+ self.primary_key = :collection_id
5
+
6
+ early_july_pagination_release!
7
+
8
+ def product_ids
9
+ ProductId.all(params: { collection_id: collection_id })
10
+ end
11
+
12
+ class ProductId < ArrayBase
13
+ self.resource_prefix = 'collection_listings/:collection_id/'
14
+
15
+ early_july_pagination_release!
16
+ end
17
+ private_constant :ProductId
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class CollectionPublication < Base
4
+ init_prefix :publication
5
+
6
+ def publication_id
7
+ @prefix_options[:publication_id]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Comment < Base
4
+ def remove
5
+ load_attributes_from_response(post(:remove, {}, only_id))
6
+ end
7
+
8
+ def spam
9
+ load_attributes_from_response(post(:spam, {}, only_id))
10
+ end
11
+
12
+ def approve
13
+ load_attributes_from_response(post(:approve, {}, only_id))
14
+ end
15
+
16
+ def restore
17
+ load_attributes_from_response(post(:restore, {}, only_id))
18
+ end
19
+
20
+ def not_spam
21
+ load_attributes_from_response(post(:not_spam, {}, only_id))
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Country < Base
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyAPI
4
+ class Currency < Base
5
+ end
6
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class CustomCollection < Base
4
+ include Events
5
+ include Metafields
6
+
7
+ def products
8
+ Product.find(:all, params: { collection_id: self.id })
9
+ end
10
+
11
+ def add_product(product)
12
+ Collect.create(collection_id: self.id, product_id: product.id)
13
+ end
14
+
15
+ def remove_product(product)
16
+ collect = Collect.find(:first, params: { collection_id: self.id, product_id: product.id })
17
+ collect.destroy if collect
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Customer < Base
4
+ include Metafields
5
+
6
+ def orders
7
+ Order.find(:all, params: { customer_id: self.id })
8
+ end
9
+
10
+ def self.search(params)
11
+ find(:all, from: :search, params: params)
12
+ end
13
+
14
+ def account_activation_url
15
+ resource = post(:account_activation_url, {}, only_id)
16
+ data = ActiveSupport::JSON.decode(resource.body.to_s)
17
+ result = nil
18
+
19
+ if data.key?('account_activation_url')
20
+ result = data['account_activation_url']
21
+ end
22
+ result
23
+ end
24
+
25
+ def send_invite(customer_invite = ShopifyAPI::CustomerInvite.new)
26
+ resource = post(:send_invite, {}, customer_invite.encode)
27
+ ShopifyAPI::CustomerInvite.new(ShopifyAPI::CustomerInvite.format.decode(resource.body))
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ require 'shopify_api/resources/customer_saved_search'
3
+
4
+ module ShopifyAPI
5
+ CustomerGroup = CustomerSavedSearch
6
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class CustomerInvite < Base
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ require 'shopify_api/resources/customer'
3
+
4
+ module ShopifyAPI
5
+ class CustomerSavedSearch < Base
6
+ early_july_pagination_release!
7
+
8
+ def customers(params = {})
9
+ Customer.search(params.merge({ customer_saved_search_id: self.id }))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class DiscountCode < Base
4
+ init_prefix :price_rule
5
+
6
+ def price_rule_id
7
+ @prefix_options[:price_rule_id]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class DiscountCodeBatch < Base
4
+ init_prefix :price_rule
5
+
6
+ self.collection_name = 'batch'
7
+
8
+ def price_rule_id
9
+ @prefix_options[:price_rule_id]
10
+ end
11
+
12
+ def discount_code_job
13
+ @discount_codes ||= begin
14
+ if id
15
+ path = self.class.api_version.construct_api_path(
16
+ "price_rules/#{price_rule_id}/batch/#{id}/discount_codes.json"
17
+ )
18
+ discount_codes = ShopifyAPI::DiscountCode.find(:all, from: path)
19
+ discount_codes.each do |code|
20
+ errors = code.attributes['errors']
21
+ errors.attributes.each do |key, values|
22
+ values.each { |message| code.errors.add(key, message) }
23
+ end
24
+ end
25
+ discount_codes
26
+ end
27
+ end
28
+ end
29
+
30
+ def encode(options = {})
31
+ send("to_#{self.class.format.extension}", options)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class DraftOrder < Base
4
+ include Metafields
5
+
6
+ def send_invoice(draft_order_invoice = ShopifyAPI::DraftOrderInvoice.new)
7
+ resource = post(:send_invoice, {}, draft_order_invoice.encode)
8
+ ShopifyAPI::DraftOrderInvoice.new(ShopifyAPI::DraftOrder.format.decode(resource.body))
9
+ end
10
+
11
+ def complete(options = {})
12
+ load_attributes_from_response(put(:complete, options, nil))
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class DraftOrderInvoice < Base
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Event < Base
4
+ include DisablePrefixCheck
5
+
6
+ conditional_prefix :resource, true
7
+ early_july_pagination_release!
8
+ end
9
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Fulfillment < Base
4
+ init_prefix :order
5
+
6
+ def order_id
7
+ @prefix_options[:order_id]
8
+ end
9
+
10
+ def cancel
11
+ load_attributes_from_response(post(:cancel, {}, only_id))
12
+ end
13
+
14
+ def complete
15
+ load_attributes_from_response(post(:complete, {}, only_id))
16
+ end
17
+
18
+ def open
19
+ load_attributes_from_response(post(:open, {}, only_id))
20
+ end
21
+
22
+ def order_id=(order_id)
23
+ prefix_options[:order_id] = order_id
24
+ end
25
+
26
+ def load(attributes, remove_root = false, persisted = false)
27
+ order_id = attributes['order_id']
28
+ prefix_options[:order_id] = order_id if order_id
29
+ super(attributes, remove_root, persisted)
30
+ end
31
+
32
+ def save
33
+ if prefix_options[:order_id].present?
34
+ super
35
+ else
36
+ line_items = attributes['line_items_by_fulfillment_order'] || attributes[:line_items_by_fulfillment_order]
37
+ if line_items.blank?
38
+ raise ShopifyAPI::ValidationException,
39
+ "either 'line_items_by_fulfillment_order' or prefix_options[:order_id] is required"
40
+ end
41
+
42
+ fulfillmentV2 = FulfillmentV2.new(attributes)
43
+ result = fulfillmentV2.save
44
+ load(fulfillmentV2.attributes, false, true)
45
+ result
46
+ end
47
+ end
48
+
49
+ def update_tracking(tracking_info:, notify_customer:)
50
+ fulfillmentV2 = FulfillmentV2.new(attributes)
51
+ result = fulfillmentV2.update_tracking(tracking_info: tracking_info, notify_customer: notify_customer)
52
+ load(fulfillmentV2.attributes, false, true)
53
+ result
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class FulfillmentEvent < Base
4
+ self.resource_prefix = "orders/:order_id/fulfillments/:fulfillment_id/"
5
+ self.collection_name = 'events'
6
+ self.element_name = 'event'
7
+
8
+ def order_id
9
+ @prefix_options[:order_id]
10
+ end
11
+
12
+ def fulfillment_id
13
+ @prefix_options[:fulfillment_id]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class FulfillmentOrder < Base
4
+ MINIMUM_VERSION = '2020-01'
5
+
6
+ def initialize(attributes = {}, persisted = false)
7
+ ShopifyAPI::Base.version_validation!(MINIMUM_VERSION)
8
+ super(attributes, persisted)
9
+ end
10
+
11
+ def self.find(scope, *args)
12
+ ShopifyAPI::Base.version_validation!(MINIMUM_VERSION)
13
+
14
+ if scope == :all
15
+ order_id = args.first&.dig(:params, :order_id)
16
+ raise ShopifyAPI::ValidationException, "'order_id' is required" if order_id.blank?
17
+
18
+ order = ::ShopifyAPI::Order.new(id: order_id)
19
+ order.fulfillment_orders(args.first[:params].except(:order_id))
20
+ else
21
+ super(scope, *args)
22
+ end
23
+ end
24
+
25
+ def fulfillments(options = {})
26
+ fulfillment_hashes = get(:fulfillments, options)
27
+ fulfillment_hashes.map { |fulfillment_hash| Fulfillment.new(fulfillment_hash) }
28
+ end
29
+
30
+ def locations_for_move
31
+ locations_for_move_hashes = get(:locations_for_move, {})
32
+
33
+ locations_for_move_hashes.map do |locations_for_move_hash|
34
+ FulfillmentOrderLocationsForMove.new(locations_for_move_hash)
35
+ end
36
+ end
37
+
38
+ def move(new_location_id:)
39
+ body = {
40
+ fulfillment_order: {
41
+ new_location_id: new_location_id,
42
+ },
43
+ }
44
+ keyed_fulfillment_orders = keyed_fulfillment_orders_from_response(post(:move, {}, body.to_json))
45
+ load_keyed_fulfillment_order(keyed_fulfillment_orders, 'original_fulfillment_order')
46
+ keyed_fulfillment_orders
47
+ end
48
+
49
+ def cancel
50
+ keyed_fulfillment_orders = keyed_fulfillment_orders_from_response(post(:cancel, {}, only_id))
51
+ load_keyed_fulfillment_order(keyed_fulfillment_orders, 'fulfillment_order')
52
+ keyed_fulfillment_orders
53
+ end
54
+
55
+ def open
56
+ load_attributes_from_response(post(:open, {}, only_id))
57
+ end
58
+
59
+ def reschedule(new_fulfill_at:)
60
+ body = {
61
+ fulfillment_order: {
62
+ new_fulfill_at: new_fulfill_at,
63
+ },
64
+ }
65
+ load_attributes_from_response(post(:reschedule, {}, body.to_json))
66
+ end
67
+
68
+ def close(message: nil)
69
+ body = {
70
+ fulfillment_order: {
71
+ message: message,
72
+ },
73
+ }
74
+ load_attributes_from_response(post(:close, {}, body.to_json))
75
+ end
76
+
77
+ def request_fulfillment(fulfillment_order_line_items: nil, message: nil)
78
+ body = {
79
+ fulfillment_request: {
80
+ fulfillment_order_line_items: fulfillment_order_line_items,
81
+ message: message,
82
+ },
83
+ }
84
+ keyed_fulfillment_orders = keyed_fulfillment_orders_from_response(post(:fulfillment_request, {}, body.to_json))
85
+ load_keyed_fulfillment_order(keyed_fulfillment_orders, 'original_fulfillment_order')
86
+ keyed_fulfillment_orders
87
+ end
88
+
89
+ def accept_fulfillment_request(message: nil)
90
+ body = {
91
+ fulfillment_request: {
92
+ message: message,
93
+ },
94
+ }
95
+ load_attributes_from_response(post('fulfillment_request/accept', {}, body.to_json))
96
+ end
97
+
98
+ def reject_fulfillment_request(message: nil)
99
+ body = {
100
+ fulfillment_request: {
101
+ message: message,
102
+ },
103
+ }
104
+ load_attributes_from_response(post('fulfillment_request/reject', {}, body.to_json))
105
+ end
106
+
107
+ def request_cancellation(message: nil)
108
+ body = {
109
+ cancellation_request: {
110
+ message: message,
111
+ },
112
+ }
113
+ load_attributes_from_response(post(:cancellation_request, {}, body.to_json))
114
+ end
115
+
116
+ def accept_cancellation_request(message: nil)
117
+ body = {
118
+ cancellation_request: {
119
+ message: message,
120
+ },
121
+ }
122
+ load_attributes_from_response(post('cancellation_request/accept', {}, body.to_json))
123
+ end
124
+
125
+ def reject_cancellation_request(message: nil)
126
+ body = {
127
+ cancellation_request: {
128
+ message: message,
129
+ },
130
+ }
131
+ load_attributes_from_response(post('cancellation_request/reject', {}, body.to_json))
132
+ end
133
+
134
+ private
135
+
136
+ def load_keyed_fulfillment_order(keyed_fulfillment_orders, key)
137
+ if keyed_fulfillment_orders[key]&.attributes
138
+ load(keyed_fulfillment_orders[key].attributes, false, true)
139
+ end
140
+ end
141
+
142
+ def keyed_fulfillment_orders_from_response(response)
143
+ return load_attributes_from_response(response) if response.code != '200'
144
+
145
+ keyed_fulfillment_orders = ActiveSupport::JSON.decode(response.body)
146
+ keyed_fulfillment_orders.transform_values do |fulfillment_order_attributes|
147
+ FulfillmentOrder.new(fulfillment_order_attributes) if fulfillment_order_attributes
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class FulfillmentOrderLocationsForMove < Base
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class FulfillmentRequest < Base
4
+ init_prefix :order
5
+
6
+ def order_id
7
+ @prefix_options[:order_id]
8
+ end
9
+
10
+ def mark_as_failed
11
+ options = {}
12
+ options[:message] = failure_message if failure_message
13
+ load_attributes_from_response(put(:mark_as_failed, options))
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class FulfillmentService < Base
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class FulfillmentV2 < Base
4
+ self.element_name = 'fulfillment'
5
+
6
+ def initialize(attributes = {}, persisted = false)
7
+ ShopifyAPI::Base.version_validation!(FulfillmentOrder::MINIMUM_VERSION)
8
+ super(attributes, persisted)
9
+ end
10
+
11
+ def update_tracking(tracking_info:, notify_customer:)
12
+ body = {
13
+ fulfillment: {
14
+ tracking_info: tracking_info,
15
+ notify_customer: notify_customer,
16
+ },
17
+ }
18
+ load_attributes_from_response(post(:update_tracking, {}, body.to_json))
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class GiftCard < Base
4
+ def disable
5
+ load_attributes_from_response(post(:disable))
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyAPI
3
+ class Image < Base
4
+ init_prefix :product
5
+
6
+ # generate a method for each possible image variant
7
+ [:pico, :icon, :thumb, :small, :compact, :medium, :large, :grande, :original].each do |m|
8
+ reg_exp_match = "/\\1_#{m}.\\2"
9
+ define_method(m) { src.gsub(%r/\/(.*)\.(\w{2,4})/, reg_exp_match) }
10
+ end
11
+
12
+ def attach_image(data, filename = nil)
13
+ attributes['attachment'] = Base64.encode64(data)
14
+ attributes['filename'] = filename unless filename.nil?
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyAPI
4
+ class InventoryItem < Base
5
+ end
6
+ end