e_plat 1.0.0 → 1.1.0.pre.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +467 -413
  3. data/lib/e_plat/client.rb +9 -5
  4. data/lib/e_plat/mapping/base.rb +22 -3
  5. data/lib/e_plat/mapping/bigcommerce/v_3/order.rb +156 -156
  6. data/lib/e_plat/mapping/woocommerce/v_3/metafield.rb +39 -0
  7. data/lib/e_plat/mapping/woocommerce/v_3/order/billing_address.rb +79 -0
  8. data/lib/e_plat/mapping/woocommerce/v_3/order/line_item.rb +85 -0
  9. data/lib/e_plat/mapping/woocommerce/v_3/order/shipping_address.rb +71 -0
  10. data/lib/e_plat/mapping/woocommerce/v_3/order/shipping_line.rb +54 -0
  11. data/lib/e_plat/mapping/woocommerce/v_3/order.rb +189 -0
  12. data/lib/e_plat/mapping/woocommerce/v_3/product/image.rb +43 -0
  13. data/lib/e_plat/mapping/woocommerce/v_3/product/option.rb +45 -0
  14. data/lib/e_plat/mapping/woocommerce/v_3/product/variant/option_value.rb +40 -0
  15. data/lib/e_plat/mapping/woocommerce/v_3/product/variant.rb +188 -0
  16. data/lib/e_plat/mapping/woocommerce/v_3/product.rb +168 -0
  17. data/lib/e_plat/mapping/woocommerce/v_3/script_tag.rb +22 -0
  18. data/lib/e_plat/mapping/woocommerce/v_3/shop.rb +142 -0
  19. data/lib/e_plat/mapping/woocommerce/v_3/webhook.rb +52 -0
  20. data/lib/e_plat/paginated/woocommerce_pagination.rb +45 -0
  21. data/lib/e_plat/resource/attribute_interface.rb +7 -4
  22. data/lib/e_plat/resource/base.rb +12 -3
  23. data/lib/e_plat/resource/collection.rb +19 -2
  24. data/lib/e_plat/resource/concerns/aliases.rb +14 -6
  25. data/lib/e_plat/resource/concerns/metafieldable.rb +31 -10
  26. data/lib/e_plat/resource/concerns/overwrite_instance_methods.rb +1 -1
  27. data/lib/e_plat/resource/concerns/overwrite_request_methods.rb +12 -1
  28. data/lib/e_plat/resource/countable.rb +7 -0
  29. data/lib/e_plat/resource/order.rb +5 -0
  30. data/lib/e_plat/resource/paginated/link_headers.rb +1 -1
  31. data/lib/e_plat/resource/platform_specific/woocommerce/metafield.rb +41 -0
  32. data/lib/e_plat/resource/platform_specific/woocommerce/order/billing_address.rb +8 -0
  33. data/lib/e_plat/resource/platform_specific/woocommerce/order/line_item.rb +2 -0
  34. data/lib/e_plat/resource/platform_specific/woocommerce/order/shipping_address.rb +8 -0
  35. data/lib/e_plat/resource/platform_specific/woocommerce/order/shipping_line.rb +2 -0
  36. data/lib/e_plat/resource/platform_specific/woocommerce/order.rb +8 -0
  37. data/lib/e_plat/resource/platform_specific/woocommerce/product/image.rb +8 -0
  38. data/lib/e_plat/resource/platform_specific/woocommerce/product/option.rb +8 -0
  39. data/lib/e_plat/resource/platform_specific/woocommerce/product/variant/option_value.rb +10 -0
  40. data/lib/e_plat/resource/platform_specific/woocommerce/product/variant.rb +53 -0
  41. data/lib/e_plat/resource/platform_specific/woocommerce/product.rb +75 -0
  42. data/lib/e_plat/resource/platform_specific/woocommerce/script_tag.rb +5 -0
  43. data/lib/e_plat/resource/platform_specific/woocommerce/shop.rb +36 -0
  44. data/lib/e_plat/resource/platform_specific/woocommerce/webhook.rb +8 -0
  45. data/lib/e_plat/resource/product/variant.rb +2 -0
  46. data/lib/e_plat/utils/money.rb +32 -0
  47. data/lib/e_plat/version.rb +1 -1
  48. data/lib/e_plat.rb +9 -3
  49. metadata +32 -2
@@ -18,7 +18,7 @@ module EPlat
18
18
 
19
19
  if arguments.second && arguments.second.is_a?(Hash) && arguments.second[:params]
20
20
  arguments.second[:params].merge!(client.try("#{element_name}_default_request_args") || {})
21
- arguments.second[:params] = mapping.via_native_attributes_where_possible(arguments.second[:params])
21
+ arguments.second[:params] = mapping.via_native_attributes_where_possible(arguments.second[:params], search: true)
22
22
  else
23
23
  arguments << {params: (client.try("#{element_name}_default_request_args") || {}) }
24
24
  end
@@ -89,6 +89,7 @@ module EPlat
89
89
  def delete(id, options = {})
90
90
  client = EPlat::Current.e_plat_session
91
91
  cached_shopify_webhook_warning if cached_shopify_webhook?
92
+ options[:force] = true if client.platform == :woocommerce
92
93
 
93
94
  if client.platform_klass(self)
94
95
  client.platform_klass(self).delete(id, options)
@@ -127,6 +128,16 @@ module EPlat
127
128
 
128
129
  end
129
130
 
131
+ def initialize(attributes = {}, persisted = false)
132
+ EPlat::Base::PROTECTED_ATTRIBUTES.each do |protected_attr_key|
133
+ if attributes.key?(protected_attr_key)
134
+ new_key_name = self.class.mapping.protected_attributes_rename_on_initialize[protected_attr_key] || "#{EPlat::PROTECTED_PREFIX}#{protected_attr_key}"
135
+ attributes[new_key_name] = attributes.delete(protected_attr_key)
136
+ end
137
+ end
138
+
139
+ super
140
+ end
130
141
 
131
142
  def collection_path(options = {})
132
143
  options = options.merge client.try("#{element_name}_default_request_args") || {}
@@ -9,6 +9,9 @@ module EPlat
9
9
  data =
10
10
  if counts_via_graphql?
11
11
  graphql_count
12
+ elsif counts_via_header?
13
+ raw_data = connection.get(collection_path, headers)
14
+ raw_data.headers[:x_wp_total].last.to_i
12
15
  elsif counts_via_meta_data?
13
16
  raw_data = connection.get(collection_path, headers)
14
17
  data_hash = ActiveSupport::JSON.decode(raw_data.body)
@@ -39,6 +42,10 @@ module EPlat
39
42
  self == EPlat::Product or self == EPlat::Shopify::Product
40
43
  end
41
44
 
45
+ def counts_via_header?
46
+ client.woocommerce?
47
+ end
48
+
42
49
  def counts_via_meta_data?
43
50
  return false unless client.bigcommerce?
44
51
 
@@ -107,6 +107,9 @@ module EPlat
107
107
  if client.bigcommerce?
108
108
  self.status_id = 5
109
109
  save
110
+ elsif client.woocommerce?
111
+ self.status = "cancelled"
112
+ save
110
113
  else
111
114
  load_attributes_from_response(post(:cancel, {}, options.to_json))
112
115
  end
@@ -118,6 +121,8 @@ module EPlat
118
121
  cancelled_at.present?
119
122
  when :bigcommerce
120
123
  status_id == 5
124
+ when :woocommerce
125
+ status == "cancelled"
121
126
  end
122
127
  end
123
128
 
@@ -11,7 +11,7 @@ module EPlat
11
11
  def initialize(link_header)
12
12
  links = parse_link_header(link_header)
13
13
 
14
- @previous_link = links.find { |link| link.rel == :previous }
14
+ @previous_link = links.find { |link| link.rel == :previous || link.rel == :prev }
15
15
  @next_link = links.find { |link| link.rel == :next }
16
16
  end
17
17
 
@@ -0,0 +1,41 @@
1
+ module EPlat::Woocommerce
2
+ class Metafield < EPlat::Metafield
3
+ # In WooCommerce, metafields are stored in the meta_data array
4
+ # with id, key, and value attributes
5
+ # WooCommerce metafields are always attached to a resource and don't have their own URLs
6
+
7
+ belongs_to :product, foreign_key: :owner_id, class_name: "EPlat::Woocommerce::Product"
8
+ belongs_to :order, foreign_key: :owner_id, class_name: "EPlat::Woocommerce::Order"
9
+ belongs_to :variant, foreign_key: :owner_id, class_name: "EPlat::Woocommerce::Product::Variant"
10
+
11
+ attr_accessor :product, :order, :variant
12
+
13
+ def destroy
14
+ return unless owner.present?
15
+
16
+ run_callbacks :destroy do
17
+ owner.meta_data = owner.meta_data.reject { _1.id == id }
18
+ owner.save
19
+ self.destroyed = true
20
+ end
21
+ end
22
+
23
+ def owner
24
+ product || order || variant
25
+ end
26
+
27
+ def owner=(owner)
28
+ return if owner.nil?
29
+
30
+ case owner.class.name
31
+ when "EPlat::Woocommerce::Product"
32
+ @product = owner
33
+ when "EPlat::Woocommerce::Order"
34
+ @order = owner
35
+ when "EPlat::Woocommerce::Product::Variant"
36
+ @variant = owner
37
+ end
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,8 @@
1
+ module EPlat::Woocommerce
2
+ class Order
3
+ class BillingAddress < EPlat::Order::BillingAddress
4
+ self.element_name = "billing"
5
+ # WooCommerce BillingAddress implementation to be added later
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,2 @@
1
+
2
+ class EPlat::Woocommerce::Order::LineItem < EPlat::Order::LineItem; end
@@ -0,0 +1,8 @@
1
+ module EPlat::Woocommerce
2
+ class Order
3
+ class ShippingAddress < EPlat::Order::ShippingAddress
4
+ self.element_name = "shipping"
5
+ # WooCommerce ShippingAddress implementation to be added later
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,2 @@
1
+
2
+ class EPlat::Woocommerce::Order::ShippingLine < EPlat::Order::ShippingLine; end
@@ -0,0 +1,8 @@
1
+
2
+ module EPlat::Woocommerce
3
+ class Order < EPlat::Order
4
+ has_one :shipping, class_name: EPlat::Woocommerce::Order::ShippingAddress
5
+ has_one :billing, class_name: EPlat::Woocommerce::Order::BillingAddress
6
+ has_many :meta_data, class_name: "EPlat::Woocommerce::Metafield"
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module EPlat::Woocommerce
2
+ class Product
3
+ class Image < EPlat::Product::Image
4
+ # WooCommerce images are part of the product
5
+ # and don't have a separate API endpoint
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module EPlat::Woocommerce
2
+ class Product
3
+ class Option < EPlat::Product::Option
4
+ # WooCommerce options are part of the product attributes
5
+ # and don't have a separate API endpoint
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module EPlat::Woocommerce
2
+ class Product
3
+ class Variant
4
+ class OptionValue < EPlat::Product::Variant::OptionValue
5
+ # WooCommerce option values come from the variant's attributes array
6
+ # Each attribute has { id, name, option } structure
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,53 @@
1
+ module EPlat::Woocommerce
2
+ class Product
3
+ class Variant < EPlat::Product::Variant
4
+ self.collection_name = "variations"
5
+ has_many :meta_data, class_name: "EPlat::Woocommerce::Metafield"
6
+
7
+ attr_accessor :_is_virtual
8
+ alias_method :new?, :_is_virtual
9
+
10
+ class << self
11
+ def generate_virtual_variant(attributes)
12
+ instance = new attributes
13
+ instance._is_virtual = true
14
+ instance
15
+ end
16
+ end
17
+
18
+ def save
19
+ if _is_virtual
20
+ EPlat.config.mute_woocommerce_variant_warnings || warn("updating product as this is a non-variant product. this variant is generated for interface purposes only")
21
+
22
+ pass_through_attributes = {}
23
+ product.common_product_variant_attributes.each do |attr|
24
+ next unless changed_attributes.key? attr
25
+ pass_through_attributes[attr] = send(attr)
26
+ end
27
+
28
+ pass_through_attributes = mapping.via_native_attributes_where_possible(pass_through_attributes)
29
+ pass_through_attributes.each do |attr, value|
30
+ product.send("#{attr}=", value)
31
+ end
32
+
33
+ if product.type == "variable" and product.variants.empty?
34
+ EPlat.config.mute_woocommerce_variant_warnings || warn("Variable product with no variants found, attributes like price can't be set without variants")
35
+ end
36
+
37
+ product.save
38
+ else
39
+ super
40
+ end
41
+ end
42
+
43
+ def delete(id, options = {})
44
+ raise "EPlat: Can not delete _is_virtual variant" if _is_virtual
45
+ super
46
+ end
47
+
48
+ def exists?(id, options = {})
49
+ (_is_virtual) ? false : super
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,75 @@
1
+ module EPlat::Woocommerce
2
+ class Product < EPlat::Product
3
+ has_many :meta_data, class_name: "EPlat::Woocommerce::Metafield"
4
+
5
+ def lazy_load_variants
6
+ # Woo products natively just return an array of ids under the 'variations' key
7
+ @variants_collection ||= EPlat::Product::Variant.find(
8
+ :all, from: "#{ client.url_prefix }products/#{id}/variations"
9
+ ).presence || EPlat::Collection.new([generate_default_variant])
10
+
11
+ @variants_collection.each do |variant|
12
+ variant.product = self
13
+ variant.product_id = id
14
+ end
15
+
16
+ @variants_collection
17
+ end
18
+
19
+ def dup
20
+ self.class.new.tap do |resource|
21
+ resource.attributes = @attributes
22
+ resource.attributes.delete("id")
23
+ resource.prefix_options = @prefix_options
24
+ end
25
+ end
26
+
27
+
28
+ def common_product_variant_attributes
29
+ [
30
+ "body_html",
31
+ "name",
32
+ "description",
33
+ "permalink",
34
+ "sku",
35
+ "price",
36
+ "regular_price",
37
+ "sale_price",
38
+ "date_on_sale_from",
39
+ "date_on_sale_from_gmt",
40
+ "date_on_sale_to",
41
+ "date_on_sale_to_gmt",
42
+ "on_sale",
43
+ "status",
44
+ "purchasable",
45
+ "virtual",
46
+ "downloadable",
47
+ "downloads",
48
+ "download_limit",
49
+ "download_expiry",
50
+ "tax_status",
51
+ "tax_class",
52
+ "manage_stock",
53
+ "stock_quantity",
54
+ "stock_status",
55
+ "backorders",
56
+ "backorders_allowed",
57
+ "backordered",
58
+ "weight",
59
+ "dimensions",
60
+ "shipping_class",
61
+ "shipping_class_id",
62
+ "attributes",
63
+ "menu_order",
64
+ "meta_data"
65
+ ]
66
+ end
67
+
68
+ private
69
+
70
+ def generate_default_variant
71
+ EPlat::Woocommerce::Product::Variant.generate_virtual_variant attributes.slice(*common_product_variant_attributes).merge(product_id: id, product: self)
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,5 @@
1
+ module EPlat::Woocommerce
2
+ class ScriptTag < EPlat::ScriptTag
3
+ # WooCommerce ScriptTag implementation to be added later
4
+ end
5
+ end
@@ -0,0 +1,36 @@
1
+ module EPlat::Woocommerce
2
+ class Shop < EPlat::Shop
3
+ class << self
4
+ # Custom find_single for WooCommerce, since it uses settings/general endpoint
5
+ def find_single(scope, options)
6
+ prefix_options, query_options = split_options(options[:params])
7
+ path = "#{client.url_prefix}settings/general"
8
+
9
+ # The response is an array, so we need to wrap it in a hash with a top-level key
10
+ response = connection.get(path, client.headers)
11
+ response_data = format.decode(response.body)
12
+
13
+ # Process response data to create a hash with expected structure
14
+ response_hash = {}
15
+ if response_data.is_a?(Array)
16
+ response_data.each do |setting|
17
+ key = setting["id"]
18
+ response_hash[key] = setting if key
19
+ end
20
+ end
21
+
22
+ instantiate_record(response_hash, prefix_options)
23
+ end
24
+ end
25
+
26
+ def lazy_load_weight_unit
27
+ return @lazy_load_weight_unit if @lazy_load_weight_unit
28
+
29
+ path = "#{client.url_prefix}settings/products/woocommerce_weight_unit"
30
+ response = connection.get(path, client.headers)
31
+ response_data = JSON.parse(response.body)
32
+
33
+ @lazy_load_weight_unit = response_data["value"] || response_data["default"]
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,8 @@
1
+ module EPlat::Woocommerce
2
+ class Webhook < EPlat::Webhook
3
+ def destroy
4
+ self.status = "disabled"
5
+ self.save
6
+ end
7
+ end
8
+ end
@@ -40,6 +40,8 @@ module EPlat
40
40
  def image_src(images=[]) # EPlat::Product::Image => string
41
41
  if client.bigcommerce?
42
42
  image_url
43
+ elsif client.woocommerce?
44
+ image&.src
43
45
  elsif is_a?(EPlat::ShopifyWebhook::Product::Variant)
44
46
  images.to_a.find{ |i| i.id == image_id }.try(:src)
45
47
  elsif is_a?(EPlat::Shopify::Product::Variant)
@@ -0,0 +1,32 @@
1
+ module EPlat
2
+ module Utils
3
+ class Money
4
+ include ActiveModel::Model
5
+ include ActionView::Helpers::NumberHelper
6
+
7
+ def self.string_to_coinage_int(money_string)
8
+ decimals_removed = ::ApplicationController.helpers.number_with_precision(money_string, precision: 2)
9
+ (decimals_removed.to_f*100).to_i
10
+ end
11
+
12
+ def self.percent_discount_int(original_price, discounted_price)
13
+ return 0 if original_price.to_f.zero?
14
+
15
+ discount_amount = original_price.to_f - discounted_price.to_f
16
+ discount_percentage = (discount_amount / original_price.to_f)*100
17
+ discount_percentage.round
18
+ end
19
+
20
+ def self.coinage_to_poundage_str(number)
21
+ ::ApplicationController.helpers.number_with_precision( number.to_f/100, precision: 2).to_s
22
+ end
23
+
24
+ def self.money_string_total(money_string, quantity)
25
+ coinage = string_to_coinage_int(money_string)
26
+ coinage_to_poundage_str(coinage*quantity.to_i)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+
@@ -1,3 +1,3 @@
1
1
  module EPlat
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0-rc.1"
3
3
  end
data/lib/e_plat.rb CHANGED
@@ -24,8 +24,8 @@ module EPlat
24
24
  extend Dry::Configurable
25
25
  SUPPORTED_SHOPIFY_API_VERSIONS = ['2024_01', '2024_07', '2025_01']
26
26
  SUPPORTED_BIGCOMMERCE_API_VERSIONS = ['3']
27
-
28
- SUPPORTED_PLATFORMS = ["shopify", "bigcommerce"]
27
+ SUPPORTED_WOOCOMMERCE_API_VERSIONS = ['3']
28
+ SUPPORTED_PLATFORMS = ["shopify", "bigcommerce", "woocommerce"]
29
29
  SUPPORTED_RESOURCES = [
30
30
  "shop",
31
31
  "product",
@@ -41,6 +41,7 @@ module EPlat
41
41
  "webhook",
42
42
  "metafield"
43
43
  ]
44
+ PROTECTED_PREFIX = "_protected_"
44
45
 
45
46
  setting(:shopify_api_version, default: ENV['EPLAT_SHOPIFY_API_VERSION'] || "2025_01", constructor: ->(value) do
46
47
  SUPPORTED_SHOPIFY_API_VERSIONS.include?(value.underscore) ? value.underscore : raise(ArgumentError, "Shopify API version #{value} is not supported")
@@ -51,10 +52,15 @@ module EPlat
51
52
  SUPPORTED_BIGCOMMERCE_API_VERSIONS.include?(v) ? v : raise(ArgumentError, "Bigcommerce API version #{value} is not supported")
52
53
  end)
53
54
 
54
- setting(:woocommerce_api_version, default: "v3", constructor: ->(value) { value.downcase.gsub("v", "") })
55
+ setting(:woocommerce_api_version, default: ENV['EPLAT_WOOCOMMERCE_API_VERSION'] || "v3", constructor: ->(value) do
56
+ v = value.downcase.gsub("v", "")
57
+ SUPPORTED_WOOCOMMERCE_API_VERSIONS.include?(v) ? v : raise(ArgumentError, "WooCommerce API version #{value} is not supported")
58
+ end)
55
59
 
56
60
  setting(:print_graphql_requests, default:ENV['EPLAT_PRINT_GRAPHQL_REQUESTS'] || false)
57
61
 
62
+ setting(:mute_woocommerce_variant_warnings, default: ENV['EPLAT_MUTE_WOOCOMMERCE_VARIANT_WARNINGS'] || false)
63
+
58
64
  def self.api_display_name
59
65
  apis = Struct.new(:shopify, :bigcommerce, :woocommerce)
60
66
  apis.new(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: e_plat
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0.pre.rc.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - oliwoodsuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-14 00:00:00.000000000 Z
11
+ date: 2025-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -303,6 +303,21 @@ files:
303
303
  - lib/e_plat/mapping/virtual_collection/base.rb
304
304
  - lib/e_plat/mapping/virtual_collection/bigcommerce/order_line_items.rb
305
305
  - lib/e_plat/mapping/virtual_collection/shopify/product/variant/option_value.rb
306
+ - lib/e_plat/mapping/woocommerce/v_3/metafield.rb
307
+ - lib/e_plat/mapping/woocommerce/v_3/order.rb
308
+ - lib/e_plat/mapping/woocommerce/v_3/order/billing_address.rb
309
+ - lib/e_plat/mapping/woocommerce/v_3/order/line_item.rb
310
+ - lib/e_plat/mapping/woocommerce/v_3/order/shipping_address.rb
311
+ - lib/e_plat/mapping/woocommerce/v_3/order/shipping_line.rb
312
+ - lib/e_plat/mapping/woocommerce/v_3/product.rb
313
+ - lib/e_plat/mapping/woocommerce/v_3/product/image.rb
314
+ - lib/e_plat/mapping/woocommerce/v_3/product/option.rb
315
+ - lib/e_plat/mapping/woocommerce/v_3/product/variant.rb
316
+ - lib/e_plat/mapping/woocommerce/v_3/product/variant/option_value.rb
317
+ - lib/e_plat/mapping/woocommerce/v_3/script_tag.rb
318
+ - lib/e_plat/mapping/woocommerce/v_3/shop.rb
319
+ - lib/e_plat/mapping/woocommerce/v_3/webhook.rb
320
+ - lib/e_plat/paginated/woocommerce_pagination.rb
306
321
  - lib/e_plat/resource/attribute_interface.rb
307
322
  - lib/e_plat/resource/base.rb
308
323
  - lib/e_plat/resource/collection.rb
@@ -396,6 +411,20 @@ files:
396
411
  - lib/e_plat/resource/platform_specific/shopify_webhook/script_tag.rb
397
412
  - lib/e_plat/resource/platform_specific/shopify_webhook/shop.rb
398
413
  - lib/e_plat/resource/platform_specific/shopify_webhook/webhook.rb
414
+ - lib/e_plat/resource/platform_specific/woocommerce/metafield.rb
415
+ - lib/e_plat/resource/platform_specific/woocommerce/order.rb
416
+ - lib/e_plat/resource/platform_specific/woocommerce/order/billing_address.rb
417
+ - lib/e_plat/resource/platform_specific/woocommerce/order/line_item.rb
418
+ - lib/e_plat/resource/platform_specific/woocommerce/order/shipping_address.rb
419
+ - lib/e_plat/resource/platform_specific/woocommerce/order/shipping_line.rb
420
+ - lib/e_plat/resource/platform_specific/woocommerce/product.rb
421
+ - lib/e_plat/resource/platform_specific/woocommerce/product/image.rb
422
+ - lib/e_plat/resource/platform_specific/woocommerce/product/option.rb
423
+ - lib/e_plat/resource/platform_specific/woocommerce/product/variant.rb
424
+ - lib/e_plat/resource/platform_specific/woocommerce/product/variant/option_value.rb
425
+ - lib/e_plat/resource/platform_specific/woocommerce/script_tag.rb
426
+ - lib/e_plat/resource/platform_specific/woocommerce/shop.rb
427
+ - lib/e_plat/resource/platform_specific/woocommerce/webhook.rb
399
428
  - lib/e_plat/resource/product.rb
400
429
  - lib/e_plat/resource/product/image.rb
401
430
  - lib/e_plat/resource/product/option.rb
@@ -409,6 +438,7 @@ files:
409
438
  - lib/e_plat/session.rb
410
439
  - lib/e_plat/type_coercer.rb
411
440
  - lib/e_plat/types.rb
441
+ - lib/e_plat/utils/money.rb
412
442
  - lib/e_plat/version.rb
413
443
  - lib/hash.rb
414
444
  - lib/tasks/e_plat_tasks.rake