magento 0.20.1 → 0.24.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68aa93fb639c7e6d3cab0a521e91c08d38aa28dd7d508f50190ce9e718ed8022
4
- data.tar.gz: ccde7c0ccbe949e12fb97fab1c80d2dfbc18c9e8de80181b0e0dab1c763f0ee6
3
+ metadata.gz: 6cc3c4705cb31c6aab0ee3e39b0513bd9e21fa7f98fa6c0564e832a01c488b68
4
+ data.tar.gz: 20354ed49b5e998940775d8e3f07aea5ca0a0e2be5d482634c77528f3209e330
5
5
  SHA512:
6
- metadata.gz: d5ddc1d9471997748938d0942e97125b0dd6620efda44c2d80d967968677595e6837bbfbcbd43eb92a9992a50fd8c2dbd3adfef880fb84e3f322ac1ba8400bd1
7
- data.tar.gz: 631f5d649fa1bfde37f1b9662685ea400f967792b1ed293fc1d1fb20d5d49f775dacbba332f97736079dada2cc67aaecec8f6cd5ca41012537ef8a76fd61e401
6
+ metadata.gz: 8e927a070c8b469cc0b3019ca27c9d74c51cb270b4165e3fb2343fd3c54d406d0d33507ad2aba9a53250d4c513e70eeb3c92adea579c0b2c775e23667e4fd1c8
7
+ data.tar.gz: f91fd2fcaca2777d599eac5eb665553adf5054eaa8a42593c2bad95226b953c43e14e1e7687e4c64c4351cc9f6e05fc35b3edd1e181fcd99976f481706e2d791
@@ -22,6 +22,7 @@ jobs:
22
22
  touch $HOME/.gem/credentials
23
23
  chmod 0600 $HOME/.gem/credentials
24
24
  printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
25
+ sed "s/'magento'/'magento-ruby'/" magento.gemspec > magento-ruby.gemspec
25
26
  gem build magento-ruby.gemspec
26
27
  gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
27
28
  env:
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,5 @@
1
+ example_id | status | run_time |
2
+ ------------------------------- | ------ | --------------- |
3
+ ./spec/magento_spec.rb[1:1] | passed | 0.00057 seconds |
4
+ ./spec/product_spec.rb[1:1:1:1] | passed | 0.00102 seconds |
5
+ ./spec/product_spec.rb[1:1:2:1] | passed | 0.00111 seconds |
data/Gemfile CHANGED
@@ -4,3 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in magento.gemspec
6
6
  gemspec
7
+
8
+ gem "rake", "~> 12.0"
9
+ gem "rspec", "~> 3.0"
10
+ gem 'byebug', '~> 11.1', '>= 11.1.3'
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  Add in your Gemfile
6
6
 
7
7
  ```rb
8
- gem 'magento', '~> 0.20.1'
8
+ gem 'magento', '~> 0.24.0'
9
9
  ```
10
10
 
11
11
  or run
@@ -614,6 +614,53 @@ Magento::Product.where(name_like: 'some name%').count
614
614
  >> 15
615
615
  ```
616
616
 
617
+ ## Inventory
618
+
619
+ ### Check whether a product is salable
620
+
621
+ ```rb
622
+ Inventory.get_product_salable_quantity(sku: '4321', stock_id: 1)
623
+ >> 1
624
+ ```
625
+
626
+ ### Check whether a product is salable for a specified quantity
627
+
628
+ ```rb
629
+ Inventory.is_product_salable_for_requested_qty(
630
+ sku: '4321',
631
+ stock_id: 1,
632
+ requested_qty: 2
633
+ )
634
+ >> OpenStruct {
635
+ :salable => false,
636
+ :errors => [
637
+ [0] {
638
+ "code" => "back_order-disabled",
639
+ "message" => "Backorders are disabled"
640
+ },
641
+ ...
642
+ ]
643
+ }
644
+ ```
645
+
646
+ ## Update product stock
647
+
648
+ ```rb
649
+ product = Magento::Product.find('sku')
650
+ product.update_stock(qty: 12, is_in_stock: true)
651
+ ```
652
+
653
+ or by class method
654
+
655
+ ```rb
656
+ Magento::Product.update_stock(sku, id, {
657
+ qty: 12,
658
+ is_in_stock: true
659
+ })
660
+ ```
661
+
662
+ see all available attributes in: https://magento.redoc.ly/2.4.1-admin/tag/productsproductSkustockItemsitemId
663
+
617
664
  ___
618
665
 
619
666
  ##TODO:
@@ -633,3 +680,14 @@ Magento::Product.where(name_like: 'some name%').last
633
680
  ```
634
681
 
635
682
  ### Tests
683
+
684
+
685
+ ## Development
686
+
687
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
688
+
689
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
690
+
691
+ ## Contributing
692
+
693
+ Bug reports and pull requests are welcome on GitHub at https://github.com/WallasFaria/nfce_crawler.
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ Bundler::GemHelper.install_tasks name: 'magento'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "magento"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -4,6 +4,7 @@ require 'time'
4
4
  require 'dry/inflector'
5
5
  require 'active_support/core_ext/string/inflections'
6
6
  require 'active_support/core_ext/hash/keys'
7
+ require 'active_support/core_ext/module/delegation'
7
8
 
8
9
  require_relative 'magento/configuration'
9
10
  require_relative 'magento/errors'
@@ -22,6 +23,7 @@ require_relative 'magento/order'
22
23
  require_relative 'magento/invoice'
23
24
  require_relative 'magento/guest_cart'
24
25
  require_relative 'magento/sales_rule'
26
+ require_relative 'magento/inventory'
25
27
  require_relative 'magento/import'
26
28
 
27
29
  Dir[File.expand_path('magento/shared/*.rb', __dir__)].map { |f| require f }
@@ -0,0 +1,40 @@
1
+ module Magento
2
+ class Inventory
3
+ class << self
4
+ #
5
+ # ==== Example
6
+ #
7
+ # Inventory.is_product_salable_for_requested_qty(
8
+ # sku: '4321',
9
+ # stock_id: 1,
10
+ # requested_qty: 2
11
+ # )
12
+ # # =>
13
+ # OpenStruct {
14
+ # :salable => false,
15
+ # :errors => [
16
+ # [0] {
17
+ # "code" => "back_order-disabled",
18
+ # "message" => "Backorders are disabled"
19
+ # },
20
+ # ...
21
+ # ]
22
+ # }
23
+ #
24
+ # @return OpenStruct
25
+ def is_product_salable_for_requested_qty(sku:, stock_id:, requested_qty:)
26
+ result = Request.new.get(
27
+ "inventory/is-product-salable-for-requested-qty/#{sku}/#{stock_id}/#{requested_qty}"
28
+ ).parse
29
+
30
+ OpenStruct.new(result)
31
+ end
32
+
33
+ def get_product_salable_quantity(sku:, stock_id:)
34
+ Request.new.get(
35
+ "inventory/get-product-salable-quantity/#{sku}/#{stock_id}"
36
+ ).parse
37
+ end
38
+ end
39
+ end
40
+ end
@@ -4,33 +4,33 @@ require_relative 'create_custom_attribute'
4
4
  module Magento
5
5
  module Params
6
6
  # Example
7
- #
8
- # params = Magento::Params::CreateProduct.new(
9
- # sku: '556-teste-builder',
10
- # name: 'REFRIGERANTE PET COCA-COLA 1,5L ORIGINAL',
11
- # description: 'Descrição do produto',
12
- # brand: 'Coca-Cola',
13
- # price: 4.99,
14
- # special_price: 3.49,
15
- # quantity: 2,
16
- # weight: 0.3,
17
- # attribute_set_id: 4,
18
- # images: [
19
- # *Magento::Params::CreateImage.new(
20
- # path: 'https://urltoimage.com/image.jpg',
21
- # title: 'REFRIGERANTE PET COCA-COLA 1,5L ORIGINAL',
22
- # position: 0,
23
- # main: true
24
- # ).variants, # it's generate all variants thumbnail => '100x100', small_image => '300x300' and image => '800x800'
25
- # Magento::Params::CreateImage.new(
26
- # path: '/path/to/image.jpg',
27
- # title: 'REFRIGERANTE PET COCA-COLA 1,5L ORIGINAL',
28
- # position: 1
29
- # )
30
- # ]
31
- # )
32
7
  #
33
- # Magento::Product.create(params.to_h)
8
+ # params = Magento::Params::CreateProduct.new(
9
+ # sku: '556-teste-builder',
10
+ # name: 'REFRIGERANTE PET COCA-COLA 1,5L ORIGINAL',
11
+ # description: 'Descrição do produto',
12
+ # brand: 'Coca-Cola',
13
+ # price: 4.99,
14
+ # special_price: 3.49,
15
+ # quantity: 2,
16
+ # weight: 0.3,
17
+ # attribute_set_id: 4,
18
+ # images: [
19
+ # *Magento::Params::CreateImage.new(
20
+ # path: 'https://urltoimage.com/image.jpg',
21
+ # title: 'REFRIGERANTE PET COCA-COLA 1,5L ORIGINAL',
22
+ # position: 0,
23
+ # main: true
24
+ # ).variants, # it's generate all variants thumbnail => '100x100', small_image => '300x300' and image => '800x800'
25
+ # Magento::Params::CreateImage.new(
26
+ # path: '/path/to/image.jpg',
27
+ # title: 'REFRIGERANTE PET COCA-COLA 1,5L ORIGINAL',
28
+ # position: 1
29
+ # )
30
+ # ]
31
+ # )
32
+ #
33
+ # Magento::Product.create(params.to_h)
34
34
  #
35
35
  class CreateProduct < Dry::Struct
36
36
  ProductTypes = Type::String.default('simple'.freeze).enum(
@@ -6,12 +6,34 @@ module Magento
6
6
  attr(m) || super(m, *params, &block)
7
7
  end
8
8
 
9
+ def stock
10
+ extension_attributes&.stock_item
11
+ end
12
+
13
+ def stock_quantity
14
+ stock&.qty
15
+ end
16
+
9
17
  # returns custom_attribute value by custom_attribute code
10
18
  # return nil if custom_attribute is not present
11
19
  def attr(attribute_code)
12
20
  @custom_attributes&.find { |a| a.attribute_code == attribute_code.to_s }&.value
13
21
  end
14
22
 
23
+ def set_custom_attribute(code, value)
24
+ @custom_attributes ||= []
25
+ attribute = @custom_attributes.find { |a| a.attribute_code == code.to_s }
26
+
27
+ if attribute
28
+ attribute.value = value
29
+ else
30
+ @custom_attributes << Magento::CustomAttribute.build(
31
+ attribute_code: code.to_s,
32
+ value: value
33
+ )
34
+ end
35
+ end
36
+
15
37
  def respond_to?(attribute_code)
16
38
  super || @custom_attributes&.any? { |a| a.attribute_code == attribute_code.to_s }
17
39
  end
@@ -44,6 +66,29 @@ module Magento
44
66
  )
45
67
  end
46
68
 
69
+ #
70
+ # Remove tier price
71
+ #
72
+ # product = Magento::Product.find(1)
73
+ # product.remove_tier_price(quantity: 1, customer_group_id: :all)
74
+ #
75
+ # @return {Boolean}
76
+ def remove_tier_price(quantity:, customer_group_id: :all)
77
+ self.class.remove_tier_price(
78
+ sku, quantity: quantity, customer_group_id: customer_group_id
79
+ )
80
+ end
81
+
82
+ # Update product stock
83
+ #
84
+ # product = Magento::Product.find('sku')
85
+ # product.update_stock(qty: 12, is_in_stock: true)
86
+ #
87
+ # see all available attributes in: https://magento.redoc.ly/2.4.1-admin/tag/productsproductSkustockItemsitemId
88
+ def update_stock(attributes)
89
+ self.class.update_stock(sku, id, attributes)
90
+ end
91
+
47
92
  class << self
48
93
  alias_method :find_by_sku, :find
49
94
 
@@ -66,6 +111,29 @@ module Magento
66
111
  "products/#{sku}/group-prices/#{customer_group_id}/tiers/#{quantity}/price/#{price}"
67
112
  ).parse
68
113
  end
114
+
115
+ # Remove tier price
116
+ #
117
+ # Product.remove_tier_price('sku', quantity: 1, customer_group_id: :all)
118
+ #
119
+ # @return {Boolean}
120
+ def remove_tier_price(sku, quantity:, customer_group_id: :all)
121
+ request.delete(
122
+ "products/#{sku}/group-prices/#{customer_group_id}/tiers/#{quantity}"
123
+ ).parse
124
+ end
125
+
126
+ # Update product stock
127
+ #
128
+ # Magento::Product.update_stock(sku, id, {
129
+ # qty: 12,
130
+ # is_in_stock: true
131
+ # })
132
+ #
133
+ # see all available attributes in: https://magento.redoc.ly/2.4.1-admin/tag/productsproductSkustockItemsitemId
134
+ def update_stock(sku, id, attributes)
135
+ request.put("products/#{sku}/stockItems/#{id}", stockItem: attributes).parse
136
+ end
69
137
  end
70
138
  end
71
139
  end
@@ -1,4 +1,5 @@
1
1
  module Magento
2
2
  class CustomAttribute
3
+ include Magento::ModelParser
3
4
  end
4
5
  end
@@ -1,3 +1,3 @@
1
1
  module Magento
2
- VERSION = '0.20.1'
2
+ VERSION = '0.24.0'
3
3
  end
@@ -0,0 +1,5 @@
1
+ RSpec.describe Magento do
2
+ it "has a version number" do
3
+ expect(Magento::VERSION).not_to be nil
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ RSpec.describe Magento::Product do
2
+ describe '#set_custom_attribute' do
3
+ let(:product) { Magento::Product.build(
4
+ sku: 25,
5
+ custom_attributes: [
6
+ { attribute_code: 'description', value: 'Some description' }
7
+ ]
8
+ ) }
9
+
10
+ context 'when the custom attribute already exists' do
11
+ it 'must change the attribute value' do
12
+ expect(product.description).to eql('Some description')
13
+ product.set_custom_attribute(:description, 'description updated')
14
+ expect(product.attr(:description)).to eql('description updated')
15
+ end
16
+ end
17
+
18
+ context 'when the custom attribute does not exists' do
19
+ it 'must add a new attribute' do
20
+ expect(product.attr(:new_attribute)).to be_nil
21
+ expect(product.attr(:other_new_attribute)).to be_nil
22
+
23
+ product.set_custom_attribute(:new_attribute, 'value')
24
+ product.set_custom_attribute('other_new_attribute', [1, 2])
25
+
26
+ expect(product.attr(:new_attribute)).to eql('value')
27
+ expect(product.attr(:other_new_attribute)).to eql([1, 2])
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ require "bundler/setup"
2
+ require 'byebug'
3
+ require "magento"
4
+
5
+ RSpec.configure do |config|
6
+ # Enable flags like --only-failures and --next-failure
7
+ config.example_status_persistence_file_path = ".rspec_status"
8
+
9
+ # Disable RSpec exposing methods globally on `Module` and `main`
10
+ config.disable_monkey_patching!
11
+
12
+ config.expect_with :rspec do |c|
13
+ c.syntax = :expect
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magento
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.1
4
+ version: 0.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wallas Faria
@@ -88,8 +88,13 @@ extra_rdoc_files: []
88
88
  files:
89
89
  - ".github/workflows/gem-push.yml"
90
90
  - ".gitignore"
91
+ - ".rspec"
92
+ - ".rspec_status"
91
93
  - Gemfile
92
94
  - README.md
95
+ - Rakefile
96
+ - bin/console
97
+ - bin/setup
93
98
  - lib/magento.rb
94
99
  - lib/magento/category.rb
95
100
  - lib/magento/configuration.rb
@@ -103,6 +108,7 @@ files:
103
108
  - lib/magento/import/image_finder.rb
104
109
  - lib/magento/import/product.rb
105
110
  - lib/magento/import/template/products.csv
111
+ - lib/magento/inventory.rb
106
112
  - lib/magento/invoice.rb
107
113
  - lib/magento/model.rb
108
114
  - lib/magento/model_mapper.rb
@@ -149,8 +155,10 @@ files:
149
155
  - lib/magento/shared/total.rb
150
156
  - lib/magento/shared/value.rb
151
157
  - lib/magento/version.rb
152
- - magento-ruby.gemspec
153
158
  - magento.gemspec
159
+ - spec/magento_spec.rb
160
+ - spec/product_spec.rb
161
+ - spec/spec_helper.rb
154
162
  homepage: https://github.com/WallasFaria/magento-ruby
155
163
  licenses: []
156
164
  metadata: {}
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
-
6
- require 'magento/version'
7
-
8
- Gem::Specification.new do |s|
9
- s.name = 'magento-ruby'
10
- s.version = Magento::VERSION
11
- s.date = '2020-07-31'
12
- s.summary = 'Magento Ruby library'
13
- s.description = 'Magento Ruby library'
14
- s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
15
- s.authors = ['Wallas Faria']
16
- s.email = 'wallasfaria@hotmail.com'
17
- s.homepage = 'https://github.com/WallasFaria/magento-ruby'
18
- s.require_paths = ['lib']
19
-
20
- s.add_dependency 'dry-inflector', '~> 0.2.0'
21
- s.add_dependency 'http', '~> 4.4'
22
- s.add_dependency 'dry-struct'
23
- s.add_dependency 'activesupport'
24
- s.add_dependency 'mini_magick'
25
- end