datashift 0.8.0 → 0.9.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 (37) hide show
  1. data/README.markdown +12 -0
  2. data/Rakefile +4 -2
  3. data/VERSION +1 -1
  4. data/datashift.gemspec +13 -12
  5. data/lib/datashift/delimiters.rb +87 -0
  6. data/lib/datashift/method_detail.rb +5 -0
  7. data/lib/datashift/method_details_manager.rb +5 -1
  8. data/lib/datashift/method_dictionary.rb +3 -1
  9. data/lib/exporters/csv_exporter.rb +158 -10
  10. data/lib/exporters/excel_exporter.rb +6 -2
  11. data/lib/exporters/exporter_base.rb +6 -0
  12. data/lib/helpers/spree_helper.rb +2 -1
  13. data/lib/loaders/paperclip/image_loader.rb +32 -2
  14. data/lib/loaders/spree/product_loader.rb +3 -2
  15. data/lib/thor/export.thor +111 -0
  16. data/lib/thor/{import_excel.thor → import.thor} +40 -2
  17. data/lib/thor/spree/bootstrap_cleanup.thor +7 -4
  18. data/lib/thor/spree/products_images.thor +26 -17
  19. data/lib/thor/spree/reports.thor +30 -40
  20. data/lib/thor/tools.thor +63 -0
  21. data/spec/Gemfile +3 -2
  22. data/spec/csv_exporter_spec.rb +101 -0
  23. data/spec/excel_exporter_spec.rb +1 -1
  24. data/spec/fixtures/datashift_Spree_db.sqlite +0 -0
  25. data/spec/fixtures/datashift_test_models_db.sqlite +0 -0
  26. data/spec/fixtures/test_model_defs.rb +5 -0
  27. data/spec/spree_loader_spec.rb +28 -131
  28. data/spec/spree_method_mapping_spec.rb +1 -1
  29. data/spec/spree_variants_loader_spec.rb +189 -0
  30. metadata +193 -167
  31. data/lib/thor/export_excel.thor +0 -74
  32. data/sandbox/app/controllers/application_controller.rb +0 -3
  33. data/sandbox/config/application.rb +0 -59
  34. data/sandbox/config/database.yml +0 -20
  35. data/sandbox/config/environment.rb +0 -5
  36. data/sandbox/config/environments/development.rb +0 -37
  37. data/tasks/import/csv.rake +0 -51
@@ -27,6 +27,8 @@ module DataShift
27
27
 
28
28
  # Create an Excel file from list of ActiveRecord objects
29
29
  def export(records, options = {})
30
+
31
+ raise ArgumentError.new('Please supply array of records to export') unless records.is_a? Array
30
32
 
31
33
  excel = JExcelFile.new()
32
34
 
@@ -35,11 +37,14 @@ module DataShift
35
37
  else
36
38
  excel.create_sheet( records.first.class.name )
37
39
  end
38
-
40
+
39
41
  excel.ar_to_headers(records)
40
42
 
41
43
  excel.ar_to_xls(records)
42
44
 
45
+
46
+ # => :methods => List of methods to additionally export on each record
47
+
43
48
  excel.save( filename() )
44
49
  end
45
50
 
@@ -90,7 +95,6 @@ module DataShift
90
95
 
91
96
  excel.set_headers( headers )
92
97
 
93
-
94
98
  row_index = 1
95
99
 
96
100
  items.each do |datum|
@@ -10,6 +10,12 @@ module DataShift
10
10
 
11
11
  class ExporterBase
12
12
 
13
+ attr_accessor :filename
14
+
15
+ def initialize(filename)
16
+ @filename = filename
17
+ end
18
+
13
19
  end
14
20
 
15
21
  end
@@ -97,9 +97,10 @@ module DataShift
97
97
 
98
98
  store_path = Dir.pwd
99
99
 
100
- spree_sanbox_app = File.expand_path('../../../sandbox', __FILE__)
100
+ spree_sanbox_app = File.expand_path('../../../spec/sandbox', __FILE__)
101
101
 
102
102
  unless(File.exists?(spree_sanbox_app))
103
+ puts "Creating new Rails sandbox for Spree : #{spree_sanbox_app}"
103
104
  Dir.chdir( File.expand_path( "#{spree_sanbox_app}/..") )
104
105
  system('rails new sandbox')
105
106
  end
@@ -13,10 +13,16 @@ module DataShift
13
13
 
14
14
  include DataShift::Logging
15
15
 
16
+ # Get all image files (based on file extensions) from supplied path.
17
+ # Options :
18
+ # :glob : The glob to use to find files
19
+ # => :recursive : Descend tree looking for files rather than just supplied path
20
+
16
21
  def self.get_files(path, options = {})
17
- glob = (options['recursive'] || options[:recursive]) ? "**/*.{jpg,png,gif}" : "*.{jpg,png,gif}"
22
+ glob = options[:glob] ? options[:glob] : image_magik_glob
23
+ glob = (options['recursive'] || options[:recursive]) ? "**/#{glob}" : glob
18
24
 
19
- Dir.glob("#{path}/#{glob}")
25
+ Dir.glob("#{path}/#{glob}", File::FNM_CASEFOLD)
20
26
  end
21
27
 
22
28
  def get_file( attachment_path )
@@ -70,6 +76,30 @@ module DataShift
70
76
  puts e.inspect, e.backtrace
71
77
  end
72
78
  end
79
+
80
+ # Set of file extensions ImageMagik can process so default glob
81
+ # we use to find image files within directories
82
+ def self.image_magik_glob
83
+ @im_glob ||= %w{*.3FR *.AAI *.AI *.ART *.ARW *.AVI *.AVS *.BGR *.BGRA
84
+ *.BIE *.BMP *.BMP2 *.BMP3 *.BRF *.CAL *.CALS *.CANVAS
85
+ *.CIN *.CIP *.CLIP *.CMYK *.CMYKA *.CR2 *.CRW *.CUR *.CUT *.DCM *.DCR *.DCX
86
+ *.DDS *.DFONT *.DJVU *.DNG *.DOT *.DPS *.DPX
87
+ *.EMF *.EPDF *.EPI *.EPS *.EPS2 *.EPS3 *.EPSF *.EPSI
88
+ *.EPT *.EPT2 *.EPT3 *.ERF *.EXR *.FITS *.FPX *.FTS *.G3 *.GIF *.GIF87
89
+ *.GRAY *.HALD *.HDR *.HRZ *.ICB *.ICO *.ICON *.IPL
90
+ *.ISOBRL *.J2C *.JBG *.JBIG *.JNG *.JP2 *.JPC *.JPEG *.JPG *.JPX *.K25 *.KDC
91
+ *.LABEL *.M2V *.M4V *.MAC *.MAP *.MAT *.MATTE *.MIFF *.MNG *.MONO
92
+ *.MOV *.MP4 *.MPC *.MPEG *.MPG *.MRW *.MSL *.MSVG *.MTV *.MVG *.NEF *.ORF *.OTB *.OTF *.PAL *.PALM
93
+ *.PAM *.PBM *.PCD *.PCDS *.PCL *.PCT *.PCX *.PDB *.PDF *.PDFA *.PEF
94
+ *.PES *.PFA *.PFB *.PFM *.PGM *.PGX *.PICON *.PICT *.PIX *.PJPEG *.PLASMA
95
+ *.PNG *.PNG24 *.PNG32 *.PNG8 *.PNM *.PPM *.PS *.PS2 *.PS3 *.PSB *.PSD *.PTIF *.PWP *.RAF *.RAS *.RGB
96
+ *.RGBA *.RGBO *.RLA *.RLE *.SCR *.SCT *.SFW *.SGI *.SR2 *.SRF
97
+ *.SUN *.SVG *.SVGZ *.TGA *.TIFF *.TIFF64 *.TILE *.TIM *.TTC *.TTF *.UBRL *.UIL *.UYVY *.VDA *.VICAR
98
+ *.VID *.VIFF *.VST *.WBMP *.WEBP *.WMF *.WMV *.WMZ *.WPG *.X3F
99
+ *.XBM *.XC *.XCF *.XPM *.XPS *.XV *.XWD *.YCbCr *.YCbCrA *.YUV
100
+ }
101
+ "{#{@im_glob.join(',')}}"
102
+ end
73
103
  end
74
104
 
75
105
  end
@@ -97,13 +97,14 @@ module DataShift
97
97
  values = current_value.to_s.split(LoaderBase::multi_assoc_delim)
98
98
 
99
99
  if(@load_object.variants.size == values.size)
100
- @load_object.variants.each_with_index {|v, i| v.on_hand = values[i].to_i; v.save; }
100
+ @load_object.variants.each_with_index {|v, i| v.on_hand = values[i].to_i }
101
+ @load_object.save
101
102
  else
102
103
  puts "WARNING: Count on hand entries did not match number of Variants - None Set"
103
104
  end
104
105
  end
105
106
 
106
- # can only set count on hand on Product if no Variants exist, else model throws
107
+ # Can only set count on hand on Product if no Variants exist, else model throws
107
108
 
108
109
  elsif(@load_object.variants.size == 0)
109
110
  if(current_value.to_s.include?(LoaderBase::multi_assoc_delim))
@@ -0,0 +1,111 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2012
2
+ # Author :: Tom Statter
3
+ # Date :: April 2012
4
+ # License:: MIT.
5
+ #
6
+ # Usage::
7
+ #
8
+ # To pull Datashift commands into your main application :
9
+ #
10
+ # require 'datashift'
11
+ #
12
+ # DataShift::load_commands
13
+ #
14
+ # Cmd Line:
15
+ #
16
+ # => bundle exec thor datashift:export:excel -m <active record class> -r <output_template.xls> -a
17
+ #
18
+ require 'datashift'
19
+
20
+ # Note, not DataShift, case sensitive, create namespace for command line : datashift
21
+ module Datashift
22
+
23
+
24
+ class Export < Thor
25
+
26
+ include DataShift::Logging
27
+
28
+ desc "excel", "export any active record model (with optional associations)"
29
+ method_option :model, :aliases => '-m', :required => true, :desc => "The active record model to export"
30
+ method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
31
+ method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
32
+ method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
33
+
34
+ def excel()
35
+
36
+ # TODO - We're assuming run from a rails app/top level dir...
37
+ # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
38
+ require File.expand_path('config/environment.rb')
39
+
40
+ require 'excel_exporter'
41
+
42
+ model = options[:model]
43
+ result = options[:result]
44
+
45
+ logger.info "Datashift: Start Excel export to #{result}"
46
+
47
+ klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
48
+
49
+ raise "ERROR: No such Model [#{model}] found - check valid model supplied via -model <Class>" if(klass.nil?)
50
+
51
+ begin
52
+ gen = DataShift::ExcelExporter.new(result)
53
+
54
+ if(options[:assoc])
55
+ opts = (options[:exclude]) ? {:exclude => options[:exclude]} : {}
56
+ logger.info("Datashift: Exporting with associations")
57
+ gen.export_with_associations(klass, klass.all, opts)
58
+ else
59
+ gen.export(klass.all, :sheet_name => klass.name)
60
+ end
61
+ rescue => e
62
+ puts e
63
+ puts e.backtrace
64
+ puts "Warning: Error during export, data may be incomplete"
65
+ end
66
+
67
+ end
68
+
69
+ desc "csv", "export any active record model (with optional associations)"
70
+ method_option :model, :aliases => '-m', :required => true, :desc => "The active record model to export"
71
+ method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
72
+ method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
73
+ method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
74
+ method_option :methods, :aliases => '-c', :type => :array, :desc => "List of additional methods to call on model, useful for situations like delegated methods"
75
+
76
+ def csv()
77
+
78
+ # TODO - We're assuming run from a rails app/top level dir...
79
+ # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
80
+ require File.expand_path('config/environment.rb')
81
+
82
+ require 'csv_exporter'
83
+
84
+ model = options[:model]
85
+ result = options[:result]
86
+
87
+ logger.info "Datashift: Start CSV export to #{result}"
88
+
89
+ klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
90
+
91
+ raise "ERROR: No such Model [#{model}] found - check valid model supplied via -model <Class>" if(klass.nil?)
92
+
93
+ begin
94
+ gen = DataShift::CsvExporter.new(result)
95
+
96
+ if(options[:assoc])
97
+ logger.info("Datashift: Exporting with associations")
98
+ gen.export_with_associations(klass, klass.all, options)
99
+ else
100
+ gen.export(klass.all, options)
101
+ end
102
+ rescue => e
103
+ puts e
104
+ puts e.backtrace
105
+ puts "Warning: Error during export, data may be incomplete"
106
+ end
107
+
108
+ end
109
+ end
110
+
111
+ end
@@ -33,7 +33,8 @@ module Datashift
33
33
  method_option :config, :aliases => '-c', :desc => "YAML config file with defaults, over-rides etc"
34
34
  method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include any associations supplied in the input"
35
35
  method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
36
-
36
+ method_option :verbose, :aliases => '-v', :type => :boolean, :desc => "Verbose logging"
37
+
37
38
  def excel()
38
39
 
39
40
  # TODO - We're assuming run from a rails app/top level dir...
@@ -70,13 +71,50 @@ module Datashift
70
71
  end
71
72
 
72
73
  logger.info("ARGS #{options.inspect}")
73
- loader.logger.verbose if(ENV['verbose'])
74
+ loader.logger.verbose if(options['verbose'])
74
75
 
75
76
  loader.configure_from( options[:config] ) if(options[:config])
76
77
 
77
78
 
78
79
  loader.perform_load(options[:input])
79
80
  end
81
+
82
+ desc "csv", "import CSV file for specified active record model"
83
+ method_option :model, :aliases => '-m', :required => true, :desc => "The related active record model"
84
+ method_option :input, :aliases => '-i', :required => true, :desc => "The input .xls file"
85
+ method_option :config, :aliases => '-c', :desc => "YAML config file with defaults, over-rides etc"
86
+ method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include any associations supplied in the input"
87
+ method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
88
+ method_option :verbose, :aliases => '-v', :type => :boolean, :desc => "Verbose logging"
89
+
90
+ def csv()
91
+
92
+ # TODO - We're assuming run from a rails app/top level dir...
93
+ # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
94
+ require File.expand_path('config/environment.rb')
95
+
96
+ require 'csv_loader'
97
+
98
+ model = options[:model]
99
+ begin
100
+ # support modules e.g "Spree::Property")
101
+ klass = ModelMapper::class_from_string(model)
102
+ rescue NameError
103
+ raise "ERROR: No such AR Model found - check valid model supplied with -m <Class>"
104
+ end
105
+
106
+ raise "ERROR: No such AR Model found - check valid model supplied with -m <Class>" if(klass.nil?)
107
+
108
+
109
+ loader = DataShift::CsvLoader.new(klass)
110
+
111
+ loader.logger.verbose if(options['verbose'])
112
+
113
+ loader.configure_from( options[:config] ) if(options[:config])
114
+
115
+ loader.perform_load(options[:input])
116
+ end
117
+
80
118
  end
81
119
 
82
120
  end
@@ -9,9 +9,6 @@
9
9
  #
10
10
  # Note, not DataShift, case sensitive, create namespace for command line : datashift
11
11
 
12
- require File.expand_path('config/environment.rb')
13
-
14
-
15
12
  module Datashift
16
13
 
17
14
  class Spreeboot < Thor
@@ -22,6 +19,8 @@ module Datashift
22
19
 
23
20
  def cleanup()
24
21
 
22
+ require File.expand_path('config/environment.rb')
23
+
25
24
  require 'spree_helper'
26
25
 
27
26
  require File.expand_path('config/environment.rb')
@@ -37,7 +36,11 @@ module Datashift
37
36
  klass = DataShift::SpreeHelper::get_spree_class(k)
38
37
  if(klass)
39
38
  puts "Clearing model #{klass}"
40
- klass.delete_all
39
+ begin
40
+ klass.delete_all
41
+ rescue => e
42
+ puts e
43
+ end
41
44
  else
42
45
  puts "WARNING - Could not find AR model for class name #{k}"
43
46
  end
@@ -92,12 +92,13 @@ module Datashift
92
92
  desc "images", "Populate the DB with images from a directory\nwhere image names contain somewhere the Product Sku/Name"
93
93
 
94
94
  # :dummy => dummy run without actual saving to DB
95
- method_option :input, :aliases => '-i', :required => true, :desc => "The input path containing images (.jpg, .gif, .png)"
95
+ method_option :input, :aliases => '-i', :required => true, :desc => "The input path containing images "
96
96
 
97
+ method_option :glob, :aliases => '-g', :desc => 'The glob to use to find files e.g. \'{*.jpg,*.gif,*.png}\' '
97
98
  method_option :recursive, :aliases => '-r', :type => :boolean, :desc => "Scan sub directories of input for images"
98
99
 
99
100
  method_option :sku, :aliases => '-s', :desc => "Lookup Product based on image name starting with sku"
100
- method_option :sku_prefix, :aliases => '-p', :desc => "Prefix to add to each SKU in import file before attempting lookup"
101
+ method_option :sku_prefix, :aliases => '-p', :desc => "SKU prefix to add to each image name before attempting Product lookup"
101
102
  method_option :dummy, :aliases => '-d', :type => :boolean, :desc => "Dummy run, do not actually save Image or Product"
102
103
 
103
104
  method_option :process_when_no_assoc, :aliases => '-f', :type => :boolean, :desc => "Process image even if no Product found - force loading"
@@ -156,36 +157,44 @@ module Datashift
156
157
 
157
158
  # try splitting up filename in various ways looking for the SKU
158
159
  split_on = loader_config['split_file_name_on'] || options[:split_file_name_on]
159
-
160
- puts "Will scan image names splitting on delimiter : #{split_on}"
161
-
160
+
162
161
  image_cache = DataShift::ImageLoading::get_files(@image_path, options)
163
162
 
163
+ puts "Found #{image_cache.size} image files - splitting names on delimiter : #{split_on}"
164
+
164
165
  image_cache.each do |image_name|
165
166
 
166
167
  image_base_name = File.basename(image_name)
167
-
168
+
169
+ logger.info "Processing image file #{image_base_name} "
170
+
168
171
  base_name = File.basename(image_name, '.*')
169
172
  base_name.strip!
170
-
171
- logger.info "Processing image file #{base_name} : #{File.exists?(image_name)}"
172
-
173
+
173
174
  record = nil
174
175
 
175
176
  record = image_loader.get_record_by(attachment_klazz, attachment_field, base_name)
176
-
177
- # try seperate portions of the filename, front -> back
178
- base_name.split(split_on).each do |x|
177
+
178
+ # TODO move into the ImageLoading module
179
+ #
180
+ # try the seperate individual portions of the filename, front -> back
181
+ base_name.split(split_on).each do |x|
182
+ x = "#{options[:sku_prefix]}#{x}" if(options[:sku_prefix])
183
+
179
184
  record = image_loader.get_record_by(attachment_klazz, attachment_field, x)
180
185
  break if record
181
186
  end unless(record)
182
187
 
183
- # this time try sequentially scanning
184
- base_name.split(split_on).inject("") do |str, x|
185
- record = image_loader.get_record_by(attachment_klazz, attachment_field, "#{str}#{x}")
188
+ # this time try sequentially and incrementally scanning
189
+ base_name.split(split_on).inject("") do |str, x|
190
+ z = (options[:sku_prefix]) ? "#{options[:sku_prefix]}#{str}#{x}": "#{str}#{x}"
191
+ puts z
192
+ record = image_loader.get_record_by(attachment_klazz, attachment_field, z)
186
193
  break if record
187
194
  x
188
195
  end unless(record)
196
+
197
+ # END TODO
189
198
 
190
199
  record = record.product if(record && record.respond_to?(:product)) # SKU stored on Variant but we want it's master Product
191
200
 
@@ -225,9 +234,9 @@ module Datashift
225
234
  FileUtils.mkdir_p('MissingRecords') unless File.directory?('MissingRecords')
226
235
 
227
236
  puts "WARNING : #{missing_records.size} of #{image_cache.size} images could not be attached to a Product"
228
- puts 'Copying all images with MISSING Records to ./MissingRecords >>'
237
+ puts 'For your convenience a copy of images with MISSING Products will be saved to : ./MissingRecords'
229
238
  missing_records.each do |i|
230
- puts "Copy #{i} to MissingRecords folder"
239
+ puts "Copying #{i} to MissingRecords folder" if(options[:verbose])
231
240
  FileUtils.cp( i, 'MissingRecords') unless(options[:dummy] == 'true')
232
241
  end
233
242
  else
@@ -4,7 +4,7 @@
4
4
  # License:: MIT. Free, Open Source.
5
5
  #
6
6
  # Usage::
7
- # bundle exec thor help datashift:spreeboot
7
+ # bundle exec thor help datashift:reports:missing_images
8
8
  # bundle exec thor datashift:spreeboot:cleanup
9
9
  #
10
10
  # Note, not DataShift, case sensitive, create namespace for command line : datashift
@@ -13,54 +13,44 @@ require 'excel_exporter'
13
13
 
14
14
  module Datashift
15
15
 
16
- class Reports < Thor
16
+ class Spreereports < Thor
17
17
 
18
- include DataShift::Logging
18
+ include DataShift::Logging
19
19
 
20
- desc "missing_images", "Spree Products without an image"
20
+ desc "no_image", "Spree Products without an image"
21
21
 
22
- def missing_images(report = nil)
22
+ def no_image(report = nil)
23
23
 
24
- require 'spree_helper'
25
- require 'image_loader'
24
+ require 'spree_helper'
25
+ require 'csv_exporter'
26
+ require 'image_loader'
26
27
 
27
- require File.expand_path('config/environment.rb')
28
+ require File.expand_path('config/environment.rb')
28
29
 
29
- klass = DataShift::SpreeHelper::get_spree_class('Product')
30
+ klass = DataShift::SpreeHelper::get_spree_class('Product')
30
31
 
31
- missing = klass.all.find_all {|p| p.images.size == 0 }
32
+ missing = klass.all.find_all {|p| p.images.size == 0 }
32
33
 
33
- puts "There are #{missing.size} Products without an associated Image"
34
+ puts "There are #{missing.size} Products (of #{klass.count}) without an associated Image"
34
35
 
35
- if(DataShift::Guards::jruby?)
36
- fname = report ? report : "missing_images.xls"
37
- DataShift::ExcelExporter.new( fname ).export( missing )
38
- else
39
- puts missing.collect(&:name).inspect
40
- end
36
+ fname = report ? report : "missing_images"
41
37
 
42
- @drop_box = "/home/stattert/Dropbox/DaveWebsiteInfo/"
43
-
44
- @image_list = %w{
45
- 010InafixTheArmourGodAllFolders
46
- 01Figuresurbanlandscapepaintings
47
- 01FinishedArtPrints
48
- 02Seascapespainting
49
- 03Landscapes
50
- 04Spain
51
-
52
- 07SignsJohnAllFolders
53
- 07_Mar
54
- 09Powerpointsermonaids
55
- }
56
-
57
- options = { :recursive => true }
58
-
59
- images = @image_list.collect do |p|
60
- DataShift::ImageLoading::get_files(File.join(@drop_box,p), options)
61
- end
38
+ if(DataShift::Guards::jruby?)
39
+ puts "Creating report #{fname}.xls"
40
+ DataShift::ExcelExporter.new( fname + '.xls' ).export( missing, :methods => ['sku'] )
41
+ else
42
+ puts "Creating report #{fname}.csv"
43
+ DataShift::CsvExporter.new( fname + '.csv' ).export( missing, :methods => ['sku'] )
44
+ puts missing.collect(&:name).join('\n')
45
+ end
62
46
 
63
- puts images.inspect
47
+ # TODO - cross check file locations for possible candidates
48
+ #image_cache = DataShift::ImageLoading::get_files(@cross_check_location, options)
49
+
50
+ # missing.each {
51
+
52
+ # puts images.inspect
53
+ end
64
54
  end
65
- end
66
- end
55
+
56
+ end