solidus_datashift 0.1.0 → 1.0.0.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 362e80b8d0ea07c573738550a300be1713b011a0
4
- data.tar.gz: 21a44f9932e482f9277062ec0d426e8ab4742070
3
+ metadata.gz: f14fbdd695b3d332226f2fe075e282f6d29e07f5
4
+ data.tar.gz: ead11b53fb4445a9cab2aadb12aa557aafb999e8
5
5
  SHA512:
6
- metadata.gz: bb83494d03a0ea9858e36aae66de692e6927d8034ba5eb642eb522ec919d9c14083ead17c6c42265b98303ba4729f5f97bb5db76ee6cc779da98653ca68a21b5
7
- data.tar.gz: 9e6b9ef668bb7d268acce2c83bfe26569cb0862e19b14acdf618893aa7d0d037c07bebf80b0600ca369149f0763b39e43e6a4307ead43c2bed16eda4066cf511
6
+ metadata.gz: 890fbf3a9b74de7f2f0c15d3d5c6901bacca6d41e3f5e00d60258a1cb7a72eda4701f4b549f85c8b0e0aae33608bcf28c1d9d552ec4f39e5bd228e76a011abf4
7
+ data.tar.gz: 05d7b3f468c4ec7e02bf2620f588f0f6f4b7b82faf56673b7d2ef1a97bebcc497fae297b78332c18807dfce8e2fc2eeb46552a5b35e1a546316de842326200a9
data/.gitignore CHANGED
@@ -14,3 +14,4 @@ pkg
14
14
  *.swp
15
15
  spec/dummy
16
16
  log
17
+ *#
@@ -160,6 +160,11 @@ Lint/HandleExceptions:
160
160
  Metrics/AbcSize:
161
161
  Enabled: false
162
162
 
163
+ Metrics/BlockLength:
164
+ Exclude:
165
+ - 'spec/**/*'
166
+ - '*.gemspec'
167
+
163
168
  Metrics/BlockNesting:
164
169
  Enabled: false
165
170
 
@@ -18,6 +18,7 @@ env:
18
18
  - SOLIDUS_BRANCH=v2.2 DB=postgres
19
19
  - SOLIDUS_BRANCH=v2.3 DB=postgres
20
20
  - SOLIDUS_BRANCH=v2.4 DB=postgres
21
+ - SOLIDUS_BRANCH=v2.5 DB=postgres
21
22
  - SOLIDUS_BRANCH=master DB=postgres
22
23
  - SOLIDUS_BRANCH=v1.0 DB=mysql
23
24
  - SOLIDUS_BRANCH=v1.1 DB=mysql
@@ -29,4 +30,5 @@ env:
29
30
  - SOLIDUS_BRANCH=v2.2 DB=mysql
30
31
  - SOLIDUS_BRANCH=v2.3 DB=mysql
31
32
  - SOLIDUS_BRANCH=v2.4 DB=mysql
33
+ - SOLIDUS_BRANCH=v2.5 DB=mysql
32
34
  - SOLIDUS_BRANCH=master DB=mysql
data/Gemfile CHANGED
@@ -7,6 +7,6 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
7
7
  branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
8
8
  gem 'solidus', github: 'solidusio/solidus', branch: branch
9
9
 
10
- gem 'datashift', github: 'ccarruitero/datashift', branch: 'fix_delegator_2.4'
11
-
12
10
  gemspec
11
+
12
+ gem 'solidus_multi_domain', github: 'solidusio/solidus_multi_domain'
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  SolidusDatashift
2
2
  ================
3
3
 
4
- Introduction goes here.
4
+ Allow import data to your solidus store
5
5
 
6
6
  Installation
7
7
  ------------
@@ -12,28 +12,28 @@ Add solidus_datashift to your Gemfile:
12
12
  gem 'solidus_datashift'
13
13
  ```
14
14
 
15
- Bundle your dependencies and run the installation generator:
15
+ Bundle your dependencies
16
16
 
17
17
  ```shell
18
18
  bundle
19
- bundle exec rails g solidus_datashift:install
20
19
  ```
21
20
 
22
- Testing
23
- -------
21
+ Usage
22
+ -----
24
23
 
25
- First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs, and [Rubocop](https://github.com/bbatsov/rubocop) static code analysis. The dummy app can be regenerated by using `rake test_app`.
24
+ This gem include some rake tasks, namespaced into `solidus_datashift`, that let
25
+ you import data to your project.
26
+
27
+ For example for import products you should use the following command
26
28
 
27
- ```shell
28
- bundle
29
- bundle exec rake
29
+ ```
30
+ rake solidus_datashift:product_import[your_file_name]
30
31
  ```
31
32
 
32
- When testing your applications integration with this extension you may use it's factories.
33
- Simply add this require statement to your spec_helper:
33
+ You can check all available importer tasks by running
34
34
 
35
- ```ruby
36
- require 'solidus_datashift/factories'
35
+ ```
36
+ rake -T
37
37
  ```
38
38
 
39
39
  Copyright (c) 2018 [César Carruitero](https://github.com/ccarruitero), released under MIT License
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'solidus_core'
4
+ require 'datashift'
4
5
  require 'solidus_datashift/engine'
5
- require 'solidus_datashift/product_importer'
6
+
7
+ Dir[File.join(File.dirname(__FILE__), 'solidus_datashift/importer/*.rb')].each { |f| require f }
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusDataShift
4
+ class Importer
5
+ def initialize(file_name)
6
+ # TODO: allow receive StringIO
7
+ @file_name = file_name
8
+ @datashift_loader = DataShift::Loader::Factory.get_loader(file_name)
9
+ end
10
+
11
+ def importer_populator; end
12
+
13
+ def inclusion_columns; end
14
+
15
+ def run
16
+ DataShift::PopulatorFactory.global_populator_class = importer_populator if importer_populator
17
+ DataShift::Configuration.call.force_inclusion_of_columns = inclusion_columns if inclusion_columns
18
+ @datashift_loader.run(@file_name, importer_model)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_datashift/importer'
4
+ require 'solidus_datashift/populator/product'
5
+
6
+ module SolidusDataShift
7
+ class Importer::Product < Importer
8
+ def inclusion_columns
9
+ %w[ cost_price images price shipping_category sku stock_items
10
+ count_on_hand taxons]
11
+ end
12
+
13
+ def importer_model
14
+ Spree::Product
15
+ end
16
+
17
+ def importer_populator
18
+ Populator::Product
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_datashift/importer'
4
+ require 'solidus_datashift/populator/variant'
5
+
6
+ module SolidusDataShift
7
+ class Importer::Variant < Importer
8
+ def inclusion_columns
9
+ %w[product_sku price count_on_hand]
10
+ end
11
+
12
+ def importer_model
13
+ Spree::Variant
14
+ end
15
+
16
+ def importer_populator
17
+ Populator::Variant
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_datashift/utils'
4
+
5
+ module SolidusDataShift
6
+ class Populator < DataShift::Populator
7
+ include SolidusDataShift::Utils
8
+ end
9
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_datashift/populator'
4
+
5
+ module SolidusDataShift
6
+ class Populator::Product < Populator
7
+ def prepare_and_assign_method_binding(method_binding, record, data)
8
+ prepare_data(method_binding, data)
9
+ if method_binding.operator?('count_on_hand')
10
+ setup_stock(record, data)
11
+ elsif method_binding.operator?('product_properties')
12
+ setup_product_properties(record, data)
13
+ elsif method_binding.operator?('taxons')
14
+ setup_taxons(record, data)
15
+ elsif method_binding.operator?('stores')
16
+ setup_stores(record, data)
17
+ elsif method_binding.operator?('option_types')
18
+ setup_option_types(record, data)
19
+ elsif method_binding.operator?('images')
20
+ setup_images(record.master, data)
21
+ else
22
+ assign(method_binding, record)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ # Expect taxon's names separated by `|`. Also, could define taxon's childs
29
+ # separeted by `>`.
30
+ # Ex: name|other_name>child>child|an_other_name
31
+ def setup_taxons(record, data)
32
+ taxon_list = split_data(data)
33
+
34
+ taxon_list.each do |taxon_str|
35
+ taxon_names = taxon_str.split(/\s*>\s*/)
36
+ taxonomy = Spree::Taxonomy.find_or_create_by(name: taxon_names.shift)
37
+ parent = taxonomy.root
38
+ associate_to_product(record, 'taxons', parent)
39
+
40
+ taxon_names.each do |taxon_name|
41
+ taxon = Spree::Taxon.find_or_create_by(name: taxon_name,
42
+ taxonomy: taxonomy,
43
+ parent: parent)
44
+ associate_to_product(record, 'taxons', taxon)
45
+ parent = taxon
46
+ end
47
+ end
48
+ end
49
+
50
+ def setup_stores(record, data)
51
+ if record.respond_to?('stores')
52
+ store_names = split_data(data)
53
+ store_names.each do |store_name|
54
+ store = Spree::Store.find_or_create_by(name: store_name) do |obj|
55
+ obj.code = store_name
56
+ obj.url = "#{store_name}.example.com"
57
+ obj.mail_from_address = 'mail@example.com'
58
+ end
59
+
60
+ associate_to_product(record, 'stores', store)
61
+ end
62
+ end
63
+ end
64
+
65
+ def setup_product_properties(record, data)
66
+ properties_names = split_data(data)
67
+
68
+ properties_names.each do |property_name|
69
+ property = Spree::Property.find_or_create_by(name: property_name) do |obj|
70
+ obj.presentation = property_name
71
+ end
72
+
73
+ associate_to_product(record, 'properties', property)
74
+ end
75
+ end
76
+
77
+ def setup_option_types(record, data)
78
+ type_list = split_data(data)
79
+
80
+ type_list.each do |type_str|
81
+ name, values = type_str.split(':')
82
+ option_type = Spree::OptionType.find_or_create_by(name: name) do |obj|
83
+ obj.presentation = name
84
+ end
85
+
86
+ values.split(',').map(&:strip).each do |value|
87
+ option_type.option_values.find_or_create_by(name: value) do |obj|
88
+ obj.presentation = value
89
+ end
90
+ end
91
+
92
+ associate_to_product(record, 'option_types', option_type)
93
+ end
94
+ end
95
+
96
+ def associate_to_product(product, association_name, item)
97
+ association = product.send(association_name)
98
+ association << item unless association.include?(item)
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_datashift/populator'
4
+
5
+ module SolidusDataShift
6
+ class Populator::Variant < Populator
7
+ def prepare_and_assign_method_binding(method_binding, record, data)
8
+ prepare_data(method_binding, data)
9
+ if method_binding.operator?('product_sku')
10
+ setup_product(method_binding, record, data)
11
+ elsif method_binding.operator?('count_on_hand')
12
+ setup_stock(record, data)
13
+ elsif method_binding.operator?('images')
14
+ setup_images(record, data)
15
+ else
16
+ assign(method_binding, record)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def setup_product(method_binding, record, data)
23
+ return unless method_binding.operator?('product_sku') && data.present?
24
+
25
+ master = Spree::Variant.find_by(sku: data)
26
+ record.product = master.product
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mechanize'
4
+
5
+ module SolidusDataShift
6
+ module Utils
7
+ # for count_on_hand we expect two kind of values:
8
+ # * An integer (Ex: 30)
9
+ # In this case all stock locations are populated with the received value
10
+ #
11
+ # * A list of stock locations with stock values
12
+ # (Ex: foo_warehouse:20|bar_warehouse:10)
13
+ # In this case we attempt to find a stock location by name and populate
14
+ # with the asociated value
15
+ def setup_stock(record, data)
16
+ inventory = split_data(data)
17
+
18
+ if inventory.size > 1
19
+ inventory.each do |stock_hash|
20
+ name, stock = stock_hash.split(':')
21
+ stock_location = Spree::StockLocation.where('name LIKE ?', name)
22
+ .first_or_create(name: name)
23
+ populate_stock(stock_location, record, stock)
24
+ end
25
+ else
26
+ Spree::StockLocation.all.each do |stock_location|
27
+ populate_stock(stock_location, record, inventory.first)
28
+ end
29
+ end
30
+ end
31
+
32
+ def setup_images(record, data)
33
+ images = split_data(data)
34
+ images.each do |image_url|
35
+ agent = Mechanize.new
36
+ image_file = agent.get(image_url)
37
+ name, extension = image_file.filename.split('.')
38
+ temp_file = Tempfile.new([name, ".#{extension}"], encoding: 'ascii-8bit')
39
+ begin
40
+ temp_file.write image_file.body_io.string
41
+ temp_file.rewind
42
+ image = Spree::Image.create(attachment: temp_file)
43
+ record.images << image
44
+ ensure
45
+ temp_file.close
46
+ temp_file.unlink
47
+ end
48
+ end
49
+ end
50
+
51
+ def populate_stock(stock_location, variant, count)
52
+ variant.save unless variant.persisted?
53
+ stock_item = Spree::StockItem.find_or_create_by(
54
+ stock_location_id: stock_location.id,
55
+ variant_id: variant.id
56
+ )
57
+ stock_item.set_count_on_hand(count)
58
+ end
59
+
60
+ def split_data(data)
61
+ data.to_s.split('|')
62
+ end
63
+ end
64
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusDatashift
4
- VERSION = '0.1.0'
4
+ VERSION = '1.0.0-alpha'
5
5
  end
@@ -3,6 +3,11 @@
3
3
  namespace :solidus_datashift do
4
4
  desc 'import product to Solidus'
5
5
  task :product_import, [:file] => :environment do |_t, args|
6
- SolidusDatashift::ProductImporter.new(args[:file]).run
6
+ SolidusDataShift::Importer::Product.new(args[:file]).run
7
+ end
8
+
9
+ desc 'import variants to Solidus'
10
+ task :variant_import, [:file] => :environment do |_t, args|
11
+ SolidusDataShift::Importer::Variant.new(args[:file]).run
7
12
  end
8
13
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- $:.push File.expand_path('../lib', __FILE__)
3
+ $:.push File.expand_path('lib', __dir__)
4
4
  require 'solidus_datashift/version'
5
5
 
6
6
  Gem::Specification.new do |s|
@@ -18,11 +18,13 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
 
20
20
  s.add_dependency 'datashift', '~> 0.40'
21
+ s.add_dependency 'mechanize'
21
22
  s.add_dependency 'solidus_core'
22
23
  s.add_dependency 'solidus_support'
23
24
 
24
25
  s.add_development_dependency 'capybara'
25
26
  s.add_development_dependency 'database_cleaner'
27
+ s.add_development_dependency 'factory_bot'
26
28
  s.add_development_dependency 'ffaker'
27
29
  s.add_development_dependency 'mysql2'
28
30
  s.add_development_dependency 'pg'
@@ -31,5 +33,6 @@ Gem::Specification.new do |s|
31
33
  s.add_development_dependency 'rspec-rails'
32
34
  s.add_development_dependency 'rubocop'
33
35
  s.add_development_dependency 'simplecov'
36
+ s.add_development_dependency 'solidus_multi_domain'
34
37
  s.add_development_dependency 'sqlite3'
35
38
  end
@@ -1,4 +1,4 @@
1
- SKU,Name,Description,Available On, Price,cost_price, ShippingCategory,product_properties,Taxons,OptionTypes,Variants,count_on_hand
2
- DEMO_001,Demo Product for AR Loader,blah blah,2011-02-14,399.99,320.00,small,test_pp_001,Paintings|WaterColour,,"mime_type:jpeg,PDF,PNG",12|6|7
3
- DEMO_002,Demo Excel Load via Jruby,less blah,2011-05-14,100.00,30.00,small,test_pp_003,Paintings|Oils|Paintings>Nature>Seascape,"mime_type:jpeg, PDF,PNG",,5|4|2
4
- DEMO_003,Demo third row in future,more blah blah,2012-07-01,50.34,23.34,:name => “Small”,test_pp_002|test_pp_003:Example free value|yet_another_property,Drawings|Paintings>Landscape,,"mime_type:jpeg,PDF,PNG|print_type:black_white,colour",12|4|7|12|18
1
+ SKU,Name,Description,Available On, Price,cost_price, ShippingCategory,product_properties,Taxons,OptionTypes,count_on_hand,stores,images
2
+ DEMO_001,Demo Product for AR Loader,blah blah,2011-02-14,399.99,320,small,test_pp_001,Paintings|WaterColour,"mime_type:jpeg,PDF,PNG",foo:12|bar:6|baz:7,default,http://rubyonrails.org/images/imagine.png
3
+ DEMO_002,Demo Excel Load via Jruby,less blah,2011-05-14,100,30,small,test_pp_003,Paintings|Oils|Paintings>Nature>Seascape,"mime_type:jpeg, PDF,PNG",foo:5|bar:4|baz:2,default|new_store,
4
+ DEMO_003,Demo third row in future,more blah blah,2012-07-01,50.34,23.34,:name => “Small”,test_pp_002|test_pp_003:Example free value|yet_another_property,Drawings|Paintings>Landscape,"mime_type:jpeg,PDF,PNG|print_type:black_white,colour",10,,
@@ -0,0 +1,3 @@
1
+ product_sku,sku, Price,count_on_hand
2
+ FPT02390,FPT02919,430,3
3
+ FPT02390,FPT05979,450,5
@@ -0,0 +1,3 @@
1
+ product_sku,sku, Price,count_on_hand
2
+ FPT02390,FPT02919,430,ny_warehouse:5|ca_warehouse:15
3
+ FPT02390,FPT05979,450,5
@@ -2,16 +2,77 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe SolidusDatashift::ProductImporter do
5
+ describe SolidusDataShift::Importer::Product do
6
6
  context 'with csv file' do
7
7
  let(:importer) { described_class.new(fixture_file('spree_products.csv')) }
8
8
 
9
9
  it 'should successfull upload products' do
10
10
  expect { importer.run }.to change { Spree::Product.count }.by(3)
11
11
  end
12
+
13
+ context 'after run importer' do
14
+ before do
15
+ importer.run
16
+ @product = Spree::Product.first
17
+ end
18
+
19
+ it 'has correct name' do
20
+ expect(@product.name).to eq('Demo Product for AR Loader')
21
+ end
22
+
23
+ it 'has correct sku' do
24
+ expect(@product.sku).to eq('DEMO_001')
25
+ end
26
+
27
+ it 'has correct price' do
28
+ expect(@product.price.to_s).to eq('399.99')
29
+ end
30
+
31
+ it 'has correct cost_price' do
32
+ expect(@product.cost_price.to_s).to eq('320.0')
33
+ end
34
+
35
+ it 'has correct shipping_category' do
36
+ expect(@product.shipping_category.name).to eq('small')
37
+ end
38
+
39
+ it 'has correct taxons' do
40
+ expect(@product.taxons.count).to eq(2)
41
+ expect(@product.taxons.pluck(:name)).to eq(['Paintings', 'WaterColour'])
42
+ end
43
+
44
+ it 'has correct product properties' do
45
+ expect(@product.product_properties.count).to eq(1)
46
+ first_property = @product.product_properties.first.property
47
+ expect(first_property.name).to eq('test_pp_001')
48
+ end
49
+
50
+ it 'has correct option types' do
51
+ expect(@product.option_types.count).to eq(1)
52
+
53
+ option_type = @product.option_types.first
54
+ expect(option_type.option_values.count).to eq(3)
55
+ end
56
+
57
+ it 'has correct count_on_hand' do
58
+ expect(Spree::StockLocation.count).to eq(3)
59
+ first_location = Spree::StockLocation.first
60
+ first_stock_item = @product.stock_items.first
61
+ expect(first_stock_item.stock_location).to eq(first_location)
62
+ expect(first_stock_item.count_on_hand).to eq(12)
63
+ end
64
+
65
+ it 'allow associate stores to product' do
66
+ expect(@product.stores.count).to eq(1) if @product.respond_to?('stores')
67
+ end
68
+
69
+ it 'allow image' do
70
+ expect(@product.images.count).to eq(1)
71
+ end
72
+ end
12
73
  end
13
74
 
14
- context 'with xlc file' do
75
+ context 'with xls file' do
15
76
  let(:importer) { described_class.new(fixture_file('spree_products.xls')) }
16
77
 
17
78
  it 'should successfull upload products' do
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SolidusDataShift::Importer::Variant do
6
+ context 'with csv file' do
7
+ let(:importer) { described_class.new(fixture_file('spree_variants.csv')) }
8
+ let(:product) { create(:product) }
9
+
10
+ before do
11
+ @variant_data = CSV.read(fixture_file('spree_variants.csv'))[1]
12
+ master_sku = @variant_data[0]
13
+ product.master.update(sku: master_sku)
14
+ end
15
+
16
+ it 'should upload variants' do
17
+ expect { importer.run }.to change { Spree::Variant.count }.by(2)
18
+ end
19
+
20
+ it 'should associate variant with product' do
21
+ expect { importer.run }.to change { product.variants.count }.by(2)
22
+ end
23
+
24
+ it 'should store data price correctly' do
25
+ importer.run
26
+ variant = product.variants.find_by(sku: @variant_data[1])
27
+ expect(variant.price.to_f).to eq(@variant_data[2].to_f)
28
+ end
29
+
30
+ it 'should populate stock item' do
31
+ importer.run
32
+ variant = product.variants.find_by(sku: @variant_data[1])
33
+ expect(variant.stock_items.first.count_on_hand).to eq(@variant_data[3].to_i)
34
+ end
35
+
36
+ context 'with multiple stock locations' do
37
+ let!(:stock_location) { create(:stock_location, name: 'CA Warehouse') }
38
+
39
+ context 'with count_on_hand like integer' do
40
+ it 'should populate stock item in all stock locations' do
41
+ importer.run
42
+ variant = product.variants.find_by(sku: @variant_data[1])
43
+ expect(variant.stock_items.count).to eq(2)
44
+
45
+ variant.stock_items.each do |stock_item|
46
+ expect(stock_item.count_on_hand).to eq(@variant_data[3].to_i)
47
+ end
48
+ end
49
+ end
50
+
51
+ context 'with stock_locations list' do
52
+ let(:stock_importer) { described_class.new(fixture_file('spree_variants_multiple_locations.csv')) }
53
+
54
+ before do
55
+ @variant_stock_data = CSV.read(fixture_file('spree_variants_multiple_locations.csv'))[1]
56
+ master_sku = @variant_stock_data[0]
57
+ product.master.update(sku: master_sku)
58
+ stock_importer.run
59
+ end
60
+
61
+ it 'should associate variant with product' do
62
+ expect(product.variants.count).to eq(2)
63
+ end
64
+
65
+ it 'should populate stock item accordingly' do
66
+ variant = product.variants.find_by(sku: @variant_stock_data[1])
67
+ ny_location = Spree::StockLocation.find_by(name: 'NY Warehouse')
68
+ ny_item = Spree::StockItem.find_by(variant_id: variant.id, stock_location_id: ny_location.id)
69
+ expect(ny_item.count_on_hand).to eq(5)
70
+
71
+ ca_location = Spree::StockLocation.find_by(name: 'CA Warehouse')
72
+ ca_item = Spree::StockItem.find_by(variant_id: variant.id, stock_location_id: ca_location.id)
73
+ expect(ca_item.count_on_hand).to eq(15)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -15,7 +15,7 @@ end
15
15
  # Configure Rails Environment
16
16
  ENV['RAILS_ENV'] = 'test'
17
17
 
18
- require File.expand_path('../dummy/config/environment.rb', __FILE__)
18
+ require File.expand_path('dummy/config/environment.rb', __dir__)
19
19
 
20
20
  require 'rspec/rails'
21
21
  require 'database_cleaner'
@@ -31,6 +31,7 @@ require 'spree/testing_support/authorization_helpers'
31
31
  require 'spree/testing_support/capybara_ext'
32
32
  require 'spree/testing_support/controller_requests'
33
33
  require 'spree/testing_support/url_helpers'
34
+ require 'spree/testing_support/factories'
34
35
 
35
36
  RSpec.configure do |config|
36
37
  # Infer an example group's spec type from the file location.
@@ -42,6 +43,7 @@ RSpec.configure do |config|
42
43
  #
43
44
  # visit spree.admin_path
44
45
  # current_path.should eql(spree.products_path)
46
+ config.include FactoryBot::Syntax::Methods
45
47
  config.include Spree::TestingSupport::UrlHelpers
46
48
  config.include FileHelpers
47
49
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_datashift
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0.pre.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - César Carruitero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-10 00:00:00.000000000 Z
11
+ date: 2018-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: datashift
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.40'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mechanize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: solidus_core
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: factory_bot
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: ffaker
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -192,6 +220,20 @@ dependencies:
192
220
  - - ">="
193
221
  - !ruby/object:Gem::Version
194
222
  version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: solidus_multi_domain
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
195
237
  - !ruby/object:Gem::Dependency
196
238
  name: sqlite3
197
239
  requirement: !ruby/object:Gem::Requirement
@@ -225,13 +267,22 @@ files:
225
267
  - config/locales/en.yml
226
268
  - lib/solidus_datashift.rb
227
269
  - lib/solidus_datashift/engine.rb
228
- - lib/solidus_datashift/product_importer.rb
270
+ - lib/solidus_datashift/importer.rb
271
+ - lib/solidus_datashift/importer/product.rb
272
+ - lib/solidus_datashift/importer/variant.rb
273
+ - lib/solidus_datashift/populator.rb
274
+ - lib/solidus_datashift/populator/product.rb
275
+ - lib/solidus_datashift/populator/variant.rb
276
+ - lib/solidus_datashift/utils.rb
229
277
  - lib/solidus_datashift/version.rb
230
278
  - lib/tasks/solidus_datashift.rake
231
279
  - solidus_datashift.gemspec
232
280
  - spec/fixtures/spree_products.csv
233
281
  - spec/fixtures/spree_products.xls
282
+ - spec/fixtures/spree_variants.csv
283
+ - spec/fixtures/spree_variants_multiple_locations.csv
234
284
  - spec/solidus_datashift/product_importer_spec.rb
285
+ - spec/solidus_datashift/variant_importer_spec.rb
235
286
  - spec/spec_helper.rb
236
287
  - spec/support/file_helpers.rb
237
288
  homepage: https://github.com/ccarruitero/solidus_datashift
@@ -249,9 +300,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
249
300
  version: '0'
250
301
  required_rubygems_version: !ruby/object:Gem::Requirement
251
302
  requirements:
252
- - - ">="
303
+ - - ">"
253
304
  - !ruby/object:Gem::Version
254
- version: '0'
305
+ version: 1.3.1
255
306
  requirements: []
256
307
  rubyforge_project:
257
308
  rubygems_version: 2.6.13
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'datashift'
4
-
5
- module SolidusDatashift
6
- class ProductImporter
7
- def initialize(file_name)
8
- @file_name = file_name
9
- @datashift_loader = DataShift::Loader::Factory.get_loader(file_name)
10
- end
11
-
12
- def inclusion_columns
13
- %w[ cost_price images price shipping_category sku stock_items variant_sku
14
- variant_cost_price variant_price variant_images]
15
- end
16
-
17
- def run
18
- DataShift::Configuration.call.force_inclusion_of_columns = inclusion_columns
19
- @datashift_loader.run(@file_name, Spree::Product)
20
- end
21
- end
22
- end