shopify_api 9.2.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +36 -0
- data/.github/workflows/build.yml +41 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +23 -3
- data/.rubocop_todo.yml +75 -0
- data/CHANGELOG.md +15 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +151 -0
- data/Gemfile_ar51 +1 -1
- data/README.md +40 -30
- data/RELEASING +10 -6
- data/Rakefile +10 -6
- data/docs/graphql.md +1 -1
- data/docs/index.md +1 -1
- data/lib/active_resource/connection_ext.rb +1 -0
- data/lib/active_resource/detailed_log_subscriber.rb +6 -7
- data/lib/active_resource/json_errors.rb +8 -2
- data/lib/shopify_api.rb +8 -1
- data/lib/shopify_api/api_access.rb +57 -0
- data/lib/shopify_api/api_version.rb +6 -5
- data/lib/shopify_api/connection.rb +1 -0
- data/lib/shopify_api/countable.rb +3 -2
- data/lib/shopify_api/disable_prefix_check.rb +2 -2
- data/lib/shopify_api/events.rb +2 -1
- data/lib/shopify_api/graphql.rb +8 -6
- data/lib/shopify_api/limits.rb +3 -2
- data/lib/shopify_api/message_enricher.rb +11 -9
- data/lib/shopify_api/meta.rb +0 -1
- data/lib/shopify_api/metafields.rb +5 -4
- data/lib/shopify_api/pagination_link_headers.rb +4 -3
- data/lib/shopify_api/resources.rb +1 -0
- data/lib/shopify_api/resources/access_scope.rb +1 -1
- data/lib/shopify_api/resources/access_token.rb +1 -0
- data/lib/shopify_api/resources/address.rb +1 -0
- data/lib/shopify_api/resources/announcement.rb +2 -1
- data/lib/shopify_api/resources/application_charge.rb +1 -0
- data/lib/shopify_api/resources/application_credit.rb +1 -0
- data/lib/shopify_api/resources/article.rb +3 -2
- data/lib/shopify_api/resources/asset.rb +6 -5
- data/lib/shopify_api/resources/assigned_fulfillment_order.rb +1 -1
- data/lib/shopify_api/resources/base.rb +11 -6
- data/lib/shopify_api/resources/billing_address.rb +1 -0
- data/lib/shopify_api/resources/blog.rb +2 -1
- data/lib/shopify_api/resources/carrier_service.rb +1 -0
- data/lib/shopify_api/resources/cart.rb +2 -1
- data/lib/shopify_api/resources/collect.rb +1 -0
- data/lib/shopify_api/resources/collection_listing.rb +1 -0
- data/lib/shopify_api/resources/comment.rb +20 -5
- data/lib/shopify_api/resources/country.rb +1 -0
- data/lib/shopify_api/resources/custom_collection.rb +4 -3
- data/lib/shopify_api/resources/customer.rb +2 -1
- data/lib/shopify_api/resources/customer_group.rb +1 -0
- data/lib/shopify_api/resources/customer_invite.rb +1 -0
- data/lib/shopify_api/resources/customer_saved_search.rb +2 -1
- data/lib/shopify_api/resources/discount_code.rb +1 -0
- data/lib/shopify_api/resources/discount_code_batch.rb +4 -2
- data/lib/shopify_api/resources/draft_order.rb +1 -0
- data/lib/shopify_api/resources/draft_order_invoice.rb +1 -0
- data/lib/shopify_api/resources/event.rb +1 -0
- data/lib/shopify_api/resources/fulfillment.rb +12 -3
- data/lib/shopify_api/resources/fulfillment_event.rb +1 -0
- data/lib/shopify_api/resources/fulfillment_order.rb +30 -16
- data/lib/shopify_api/resources/fulfillment_order_locations_for_move.rb +1 -0
- data/lib/shopify_api/resources/fulfillment_request.rb +1 -0
- data/lib/shopify_api/resources/fulfillment_service.rb +1 -0
- data/lib/shopify_api/resources/fulfillment_v2.rb +3 -2
- data/lib/shopify_api/resources/gift_card.rb +1 -0
- data/lib/shopify_api/resources/image.rb +2 -1
- data/lib/shopify_api/resources/inventory_level.rb +2 -3
- data/lib/shopify_api/resources/line_item.rb +4 -3
- data/lib/shopify_api/resources/location.rb +1 -1
- data/lib/shopify_api/resources/marketing_event.rb +1 -0
- data/lib/shopify_api/resources/metafield.rb +1 -0
- data/lib/shopify_api/resources/note_attribute.rb +1 -0
- data/lib/shopify_api/resources/option.rb +1 -0
- data/lib/shopify_api/resources/order.rb +2 -1
- data/lib/shopify_api/resources/order_risk.rb +1 -0
- data/lib/shopify_api/resources/page.rb +1 -0
- data/lib/shopify_api/resources/payment_details.rb +1 -0
- data/lib/shopify_api/resources/policy.rb +1 -0
- data/lib/shopify_api/resources/price_rule.rb +1 -1
- data/lib/shopify_api/resources/product.rb +14 -11
- data/lib/shopify_api/resources/product_listing.rb +1 -0
- data/lib/shopify_api/resources/province.rb +1 -0
- data/lib/shopify_api/resources/receipt.rb +1 -0
- data/lib/shopify_api/resources/recurring_application_charge.rb +4 -1
- data/lib/shopify_api/resources/redirect.rb +1 -0
- data/lib/shopify_api/resources/refund.rb +2 -1
- data/lib/shopify_api/resources/report.rb +1 -0
- data/lib/shopify_api/resources/resource_feedback.rb +1 -1
- data/lib/shopify_api/resources/rule.rb +1 -0
- data/lib/shopify_api/resources/script_tag.rb +1 -0
- data/lib/shopify_api/resources/shipping_address.rb +1 -0
- data/lib/shopify_api/resources/shipping_line.rb +1 -0
- data/lib/shopify_api/resources/shipping_zone.rb +1 -0
- data/lib/shopify_api/resources/shop.rb +2 -1
- data/lib/shopify_api/resources/smart_collection.rb +2 -2
- data/lib/shopify_api/resources/storefront_access_token.rb +1 -0
- data/lib/shopify_api/resources/tax_line.rb +1 -0
- data/lib/shopify_api/resources/tax_service.rb +1 -0
- data/lib/shopify_api/resources/theme.rb +1 -0
- data/lib/shopify_api/resources/transaction.rb +1 -0
- data/lib/shopify_api/resources/usage_charge.rb +1 -0
- data/lib/shopify_api/resources/user.rb +1 -0
- data/lib/shopify_api/resources/variant.rb +16 -18
- data/lib/shopify_api/resources/webhook.rb +1 -0
- data/lib/shopify_api/session.rb +20 -12
- data/lib/shopify_api/version.rb +2 -1
- data/lib/verify_docs.rb +1 -0
- data/service.yml +1 -1
- data/shopify_api.gemspec +10 -4
- data/test/access_token_test.rb +6 -5
- data/test/active_resource/json_errors_test.rb +6 -6
- data/test/api_access_test.rb +153 -0
- data/test/api_version_test.rb +3 -3
- data/test/application_charge_test.rb +30 -27
- data/test/application_credit_test.rb +10 -9
- data/test/article_test.rb +34 -35
- data/test/asset_test.rb +14 -6
- data/test/assigned_fulfillment_order_test.rb +5 -4
- data/test/base_test.rb +55 -56
- data/test/blog_test.rb +4 -3
- data/test/carrier_service_test.rb +7 -6
- data/test/cart_test.rb +2 -1
- data/test/collect_test.rb +4 -3
- data/test/collection_listing_test.rb +21 -16
- data/test/collection_publication_test.rb +8 -8
- data/test/collection_test.rb +20 -19
- data/test/countable_test.rb +3 -2
- data/test/currency_test.rb +5 -5
- data/test/custom_collection_test.rb +4 -3
- data/test/customer_saved_search_test.rb +18 -8
- data/test/customer_test.rb +22 -14
- data/test/detailed_log_subscriber_test.rb +15 -11
- data/test/discount_code_batch_test.rb +11 -10
- data/test/discount_code_test.rb +21 -15
- data/test/draft_order_test.rb +68 -52
- data/test/fixtures/assigned_fulfillment_orders.json +2 -0
- data/test/fixtures/fulfillment_order.json +1 -0
- data/test/fixtures/fulfillment_orders.json +2 -0
- data/test/fulfillment_event_test.rb +31 -26
- data/test/fulfillment_order_test.rb +215 -147
- data/test/fulfillment_order_test_helper.rb +1 -0
- data/test/fulfillment_request_test.rb +10 -8
- data/test/fulfillment_service_test.rb +13 -12
- data/test/fulfillment_test.rb +81 -66
- data/test/fulfillment_v2_test.rb +16 -12
- data/test/gift_card_test.rb +6 -4
- data/test/graphql_test.rb +27 -27
- data/test/image_test.rb +19 -17
- data/test/inventory_level_test.rb +24 -15
- data/test/lib/webmock_extensions/last_request.rb +1 -1
- data/test/limits_test.rb +2 -1
- data/test/location_test.rb +2 -1
- data/test/marketing_event_test.rb +20 -20
- data/test/message_enricher_test.rb +6 -6
- data/test/meta_test.rb +7 -9
- data/test/metafield_test.rb +30 -20
- data/test/order_risk_test.rb +17 -16
- data/test/order_test.rb +43 -28
- data/test/pagination_test.rb +89 -56
- data/test/policy_test.rb +6 -5
- data/test/price_rule_test.rb +20 -15
- data/test/product_listing_test.rb +20 -20
- data/test/product_publication_test.rb +8 -8
- data/test/product_test.rb +44 -32
- data/test/publication_test.rb +3 -3
- data/test/recurring_application_charge_test.rb +104 -42
- data/test/redirect_test.rb +4 -3
- data/test/refund_test.rb +22 -17
- data/test/report_test.rb +12 -10
- data/test/resource_feedback_test.rb +14 -13
- data/test/script_tag_test.rb +10 -9
- data/test/session_test.rb +74 -46
- data/test/shipping_zone_test.rb +4 -3
- data/test/shop_test.rb +47 -33
- data/test/smart_collection_test.rb +5 -4
- data/test/storefront_access_token_test.rb +13 -15
- data/test/tax_service_test.rb +7 -4
- data/test/tender_transaction_test.rb +3 -3
- data/test/test_helper.rb +13 -11
- data/test/transaction_test.rb +4 -3
- data/test/usage_charge_test.rb +12 -8
- data/test/user_test.rb +4 -3
- data/test/variant_test.rb +23 -54
- data/test/webhook_test.rb +10 -7
- metadata +14 -9
- data/.rubocop-https---shopify-github-io-ruby-style-guide-rubocop-yml +0 -1027
- data/.travis.yml +0 -28
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class FulfillmentV2 < Base
|
|
3
4
|
self.element_name = 'fulfillment'
|
|
@@ -11,8 +12,8 @@ module ShopifyAPI
|
|
|
11
12
|
body = {
|
|
12
13
|
fulfillment: {
|
|
13
14
|
tracking_info: tracking_info,
|
|
14
|
-
notify_customer: notify_customer
|
|
15
|
-
}
|
|
15
|
+
notify_customer: notify_customer,
|
|
16
|
+
},
|
|
16
17
|
}
|
|
17
18
|
load_attributes_from_response(post(:update_tracking, {}, body.to_json))
|
|
18
19
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class Image < Base
|
|
3
4
|
init_prefix :product
|
|
@@ -5,7 +6,7 @@ module ShopifyAPI
|
|
|
5
6
|
# generate a method for each possible image variant
|
|
6
7
|
[:pico, :icon, :thumb, :small, :compact, :medium, :large, :grande, :original].each do |m|
|
|
7
8
|
reg_exp_match = "/\\1_#{m}.\\2"
|
|
8
|
-
define_method(m) { src.gsub(/\/(.*)\.(\w{2,4})/, reg_exp_match) }
|
|
9
|
+
define_method(m) { src.gsub(%r/\/(.*)\.(\w{2,4})/, reg_exp_match) }
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def attach_image(data, filename = nil)
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
module ShopifyAPI
|
|
4
4
|
class InventoryLevel < Base
|
|
5
|
-
|
|
6
5
|
# The default path structure in ActiveResource for delete would result in:
|
|
7
6
|
# /admin/api/<version>/inventory_levels/#{ inventory_level.id }.json?#{ params }, but since
|
|
8
7
|
# InventoryLevels are a second class resource made up of a Where and a What
|
|
@@ -33,7 +32,7 @@ module ShopifyAPI
|
|
|
33
32
|
body = {
|
|
34
33
|
location_id: location_id,
|
|
35
34
|
inventory_item_id: inventory_item_id,
|
|
36
|
-
available: new_available
|
|
35
|
+
available: new_available,
|
|
37
36
|
}
|
|
38
37
|
body[:disconnect_if_necessary] = disconnect_if_necessary unless disconnect_if_necessary.nil?
|
|
39
38
|
load_attributes_from_response(
|
|
@@ -45,7 +44,7 @@ module ShopifyAPI
|
|
|
45
44
|
body = {
|
|
46
45
|
location_id: location_id,
|
|
47
46
|
inventory_item_id: inventory_item_id,
|
|
48
|
-
available_adjustment: available_adjustment
|
|
47
|
+
available_adjustment: available_adjustment,
|
|
49
48
|
}
|
|
50
49
|
load_attributes_from_response(
|
|
51
50
|
self.class.post(:adjust, {}, body.to_json)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class LineItem < Base
|
|
3
4
|
class Property < Base
|
|
4
5
|
def initialize(*args)
|
|
5
|
-
attributes = args[0] || {}
|
|
6
|
-
persisted = args[1] || false
|
|
6
|
+
self.attributes = args[0] || {}
|
|
7
|
+
self.persisted = args[1] || false
|
|
7
8
|
super
|
|
8
9
|
rescue NameError
|
|
9
|
-
attributes = attributes.to_hash
|
|
10
|
+
self.attributes = attributes.to_hash
|
|
10
11
|
self
|
|
11
12
|
end
|
|
12
13
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class Order < Base
|
|
3
4
|
include Events
|
|
@@ -16,7 +17,7 @@ module ShopifyAPI
|
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
def transactions
|
|
19
|
-
Transaction.find(:all, :
|
|
20
|
+
Transaction.find(:all, params: { order_id: id })
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
def capture(amount = "", currency: nil)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class Product < Base
|
|
3
4
|
include Events
|
|
@@ -5,32 +6,33 @@ module ShopifyAPI
|
|
|
5
6
|
|
|
6
7
|
early_july_pagination_release!
|
|
7
8
|
|
|
9
|
+
def initialize(*)
|
|
10
|
+
super
|
|
11
|
+
self.attributes.except!('total_inventory') unless allow_inventory_params?
|
|
12
|
+
end
|
|
13
|
+
|
|
8
14
|
# compute the price range
|
|
9
15
|
def price_range
|
|
10
16
|
prices = variants.collect(&:price).collect(&:to_f)
|
|
11
|
-
format =
|
|
17
|
+
format = "%0.2f"
|
|
12
18
|
if prices.min != prices.max
|
|
13
19
|
"#{format % prices.min} - #{format % prices.max}"
|
|
14
20
|
else
|
|
15
21
|
format % prices.min
|
|
16
22
|
end
|
|
17
23
|
end
|
|
18
|
-
|
|
24
|
+
|
|
19
25
|
def total_inventory=(new_value)
|
|
20
26
|
raise_deprecated_inventory_call('total_inventory') unless allow_inventory_params?
|
|
21
27
|
super
|
|
22
28
|
end
|
|
23
29
|
|
|
24
|
-
def serializable_hash(options = {})
|
|
25
|
-
allow_inventory_params? ? super(options) : super(options).except('total_inventory')
|
|
26
|
-
end
|
|
27
|
-
|
|
28
30
|
def collections
|
|
29
|
-
CustomCollection.find(:all, :
|
|
31
|
+
CustomCollection.find(:all, params: { product_id: self.id })
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
def smart_collections
|
|
33
|
-
SmartCollection.find(:all, :
|
|
35
|
+
SmartCollection.find(:all, params: { product_id: self.id })
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
def add_to_collection(collection)
|
|
@@ -40,13 +42,14 @@ module ShopifyAPI
|
|
|
40
42
|
def remove_from_collection(collection)
|
|
41
43
|
collection.remove_product(self)
|
|
42
44
|
end
|
|
43
|
-
|
|
45
|
+
|
|
44
46
|
private
|
|
45
47
|
|
|
46
48
|
def raise_deprecated_inventory_call(parameter)
|
|
47
|
-
raise(
|
|
49
|
+
raise(
|
|
50
|
+
ShopifyAPI::ValidationException,
|
|
48
51
|
"'#{parameter}' is deprecated - see https://help.shopify.com/en/api/guides/inventory-migration-guide",
|
|
49
|
-
|
|
52
|
+
)
|
|
50
53
|
end
|
|
51
54
|
|
|
52
55
|
def allow_inventory_params?
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class RecurringApplicationCharge < Base
|
|
3
4
|
undef_method :test
|
|
@@ -25,7 +26,9 @@ module ShopifyAPI
|
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
def customize(customize_recurring_app_charge_params = {})
|
|
28
|
-
load_attributes_from_response(
|
|
29
|
+
load_attributes_from_response(
|
|
30
|
+
put(:customize, recurring_application_charge: customize_recurring_app_charge_params)
|
|
31
|
+
)
|
|
29
32
|
end
|
|
30
33
|
end
|
|
31
34
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class Refund < Base
|
|
3
4
|
init_prefix :order
|
|
4
5
|
|
|
5
6
|
def self.calculate(*args)
|
|
6
|
-
options = { :
|
|
7
|
+
options = { refund: args[0] }
|
|
7
8
|
params = {}
|
|
8
9
|
params = args[1][:params] if args[1] && args[1][:params]
|
|
9
10
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
# Shop object. Use Shop.current to receive
|
|
3
4
|
# the shop.
|
|
@@ -9,7 +10,7 @@ module ShopifyAPI
|
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def metafields(**options)
|
|
12
|
-
Metafield.find
|
|
13
|
+
Metafield.find(:all, params: options)
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def add_metafield(metafield)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class SmartCollection < Base
|
|
3
4
|
include Events
|
|
@@ -7,9 +8,8 @@ module ShopifyAPI
|
|
|
7
8
|
Product.find(:all, params: { collection_id: id })
|
|
8
9
|
end
|
|
9
10
|
|
|
10
|
-
def order(options={})
|
|
11
|
+
def order(options = {})
|
|
11
12
|
load_attributes_from_response(put(:order, options, only_id))
|
|
12
13
|
end
|
|
13
|
-
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -1,45 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ShopifyAPI
|
|
2
3
|
class Variant < Base
|
|
3
4
|
include Metafields
|
|
4
5
|
include DisablePrefixCheck
|
|
5
6
|
|
|
6
7
|
conditional_prefix :product
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
def initialize(*)
|
|
10
|
+
super
|
|
11
|
+
attributes.except!('old_inventory_quantity')
|
|
12
|
+
end
|
|
13
|
+
|
|
8
14
|
def inventory_quantity_adjustment=(new_value)
|
|
9
|
-
raise_deprecated_inventory_call('inventory_quantity_adjustment')
|
|
15
|
+
raise_deprecated_inventory_call('inventory_quantity_adjustment')
|
|
10
16
|
super
|
|
11
17
|
end
|
|
12
18
|
|
|
13
19
|
def inventory_quantity=(new_value)
|
|
14
|
-
raise_deprecated_inventory_call('inventory_quantity')
|
|
20
|
+
raise_deprecated_inventory_call('inventory_quantity')
|
|
15
21
|
super
|
|
16
22
|
end
|
|
17
23
|
|
|
18
24
|
def old_inventory_quantity=(new_value)
|
|
19
|
-
raise_deprecated_inventory_call('old_inventory_quantity')
|
|
25
|
+
raise_deprecated_inventory_call('old_inventory_quantity')
|
|
20
26
|
super
|
|
21
27
|
end
|
|
22
28
|
|
|
23
|
-
def
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
else
|
|
27
|
-
super(options).tap do |resource|
|
|
28
|
-
(resource['variant'] || resource).except!('inventory_quantity', 'old_inventory_quantity')
|
|
29
|
-
end
|
|
30
|
-
end
|
|
29
|
+
def save
|
|
30
|
+
attributes.except!('inventory_quantity')
|
|
31
|
+
super
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
private
|
|
34
35
|
|
|
35
36
|
def raise_deprecated_inventory_call(parameter)
|
|
36
|
-
raise(
|
|
37
|
+
raise(
|
|
38
|
+
ShopifyAPI::ValidationException,
|
|
37
39
|
"'#{parameter}' is deprecated - see https://help.shopify.com/en/api/guides/inventory-migration-guide",
|
|
38
|
-
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def allow_inventory_params?
|
|
42
|
-
Base.api_version < ApiVersion.find_version('2019-10')
|
|
40
|
+
)
|
|
43
41
|
end
|
|
44
42
|
end
|
|
45
43
|
end
|