datashift 0.12.0 → 0.12.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.
data/Rakefile CHANGED
@@ -29,26 +29,6 @@ $:.unshift lib unless $:.include?(lib)
29
29
 
30
30
  require 'datashift'
31
31
 
32
- require 'jeweler'
33
- Jeweler::Tasks.new do |gem|
34
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
35
- gem.name = DataShift.gem_name
36
- gem.homepage = "http://github.com/autotelik/datashift"
37
- gem.license = "MIT"
38
- gem.summary = %Q{ Shift data betwen Excel/CSV and any Ruby app}
39
- gem.description = %Q{Comprehensive tools to import/export between Excel/CSV and ActiveRecord databases, Rails apps, and any Ruby project.}
40
- gem.email = "rubygems@autotelik.co.uk"
41
- gem.authors = ["Thomas Statter"]
42
- # dependencies defined in Gemfile
43
- gem.files.exclude ['sandbox/**']
44
- gem.files.exclude ['spec/**/*']
45
-
46
- gem.add_dependency 'spreadsheet'
47
- gem.add_dependency 'rubyzip'
48
-
49
- end
50
- Jeweler::RubygemsDotOrgTasks.new
51
-
52
32
  require 'rake/testtask'
53
33
  Rake::TestTask.new(:test) do |test|
54
34
  test.libs << 'lib' << 'test'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.12.0
1
+ 0.12.1
data/datashift.gemspec CHANGED
@@ -2,11 +2,13 @@ require 'rake'
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "datashift"
5
- s.version = "0.12.0"
5
+ s.version = "0.12.1"
6
+ s.date = Date.today.to_s
6
7
 
7
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
+
8
10
  s.authors = ["Thomas Statter"]
9
- s.date = "2013-01-02"
11
+
10
12
  s.description = "Comprehensive tools to import/export between Excel/CSV and ActiveRecord databases, Rails apps, and any Ruby project."
11
13
  s.email = "rubygems@autotelik.co.uk"
12
14
  s.extra_rdoc_files = [
@@ -83,6 +83,12 @@ module DataShift
83
83
  rescue => e
84
84
  failure( row, true )
85
85
  logger.error "Failed to process row [#{i}] (#{@current_row})"
86
+
87
+ if(verbose)
88
+ puts "Failed to process row [#{i}] (#{@current_row})"
89
+ puts e.inspect
90
+ end
91
+
86
92
  # don't forget to reset the load object
87
93
  new_load_object
88
94
  next
@@ -42,7 +42,6 @@ module DataShift
42
42
 
43
43
  @excel.open(file_name)
44
44
 
45
- #if(options[:verbose])
46
45
  puts "\n\n\nLoading from Excel file: #{file_name}"
47
46
 
48
47
  sheet_number = options[:sheet_number] || 0
@@ -72,7 +71,8 @@ module DataShift
72
71
  # For example if model has an attribute 'price' will map columns called Price, price, PRICE etc to this attribute
73
72
  populate_method_mapper_from_headers( @headers, options )
74
73
 
75
- logger.info "Excel Loader processing #{@sheet.num_rows} rows"
74
+ # currently pointless num_rows rubbish i.e inaccurate!
75
+ #logger.info "Excel Loader processing #{@sheet.num_rows} rows"
76
76
 
77
77
  @reporter.reset
78
78
 
@@ -129,7 +129,14 @@ module DataShift
129
129
  @reporter.processed_object_count += 1
130
130
 
131
131
  failure(@current_row, true)
132
+
133
+ if(verbose)
134
+ puts "Failed to process row [#{i}] (#{@current_row})"
135
+ puts e.inspect
136
+ end
137
+
132
138
  logger.error "Failed to process row [#{i}] (#{@current_row})"
139
+
133
140
  # don't forget to reset the load object
134
141
  new_load_object
135
142
  next
@@ -148,25 +155,25 @@ module DataShift
148
155
  logger.error load_object.errors.inspect if(load_object)
149
156
  else
150
157
  logger.info "Row #{@current_row} succesfully SAVED : ID #{load_object.id}"
151
- @reporter.add_loaded_object(@load_object)
158
+ @reporter.add_loaded_object(@load_object)
152
159
  end
153
160
 
154
161
  # don't forget to reset the object or we'll update rather than create
155
162
  new_load_object
156
163
 
157
164
  end
158
-
159
- raise ActiveRecord::Rollback if(options[:dummy]) # Don't actually create/upload to DB if we are doing dummy run
160
- end
165
+
166
+ if(options[:dummy])
167
+ puts "Excel loading stage complete - Dummy run so Rolling Back."
168
+ raise ActiveRecord::Rollback # Don't actually create/upload to DB if we are doing dummy run
169
+ end
170
+
171
+ end # TRANSACTION N.B ActiveRecord::Rollback does not propagate outside of the containing transaction block
161
172
 
162
- rescue => e
163
-
164
- if e.is_a?(ActiveRecord::Rollback) && options[:dummy]
165
- puts "Excel loading stage complete - Dummy run so Rolling Back."
166
- else
167
- raise e
168
- end
169
- ensure
173
+ rescue => e
174
+ puts "ERROR: Excel loading failed : #{e.inspect}"
175
+ raise e
176
+ ensure
170
177
  report
171
178
  end
172
179
 
@@ -45,6 +45,7 @@ module DataShift
45
45
  #
46
46
  # :reload : Force load of the method dictionary for object_class even if already loaded
47
47
  # :instance_methods : Include setter/delegate style instance methods for assignment, as well as AR columns
48
+ # :verbose : Verboise logging and to STDOUT
48
49
  #
49
50
  def initialize(object_class, find_operators = true, object = nil, options = {})
50
51
  @load_object_class = object_class
@@ -63,6 +64,8 @@ module DataShift
63
64
  @config = options.dup # clone can cause issues like 'can't modify frozen hash'
64
65
 
65
66
  @verbose = @config[:verbose]
67
+
68
+ puts "Verbose Mode" if(verbose)
66
69
  @headers = []
67
70
 
68
71
  @default_data_objects ||= {}
@@ -407,7 +410,7 @@ module DataShift
407
410
  def save
408
411
  return unless( @load_object )
409
412
 
410
- #puts "DEBUG: SAVING #{@load_object.class} : #{@load_object.inspect}" if(@verbose)
413
+ puts "DEBUG: SAVING #{@load_object.class} : #{@load_object.inspect}" if(verbose)
411
414
  begin
412
415
  return @load_object.save
413
416
  rescue => e
@@ -515,9 +518,19 @@ module DataShift
515
518
 
516
519
  private
517
520
 
521
+ # This method usually called during processing to avoid errors with associations like
522
+ # <ActiveRecord::RecordNotSaved: You cannot call create unless the parent is saved>
523
+ # If the object is still invalid at this point probably indicates compulsory
524
+ # columns on model have not been processed before associations on that model
525
+ # TODO smart ordering of columns dynamically ourselves rather than relying on incoming data order
518
526
  def save_if_new
519
- #puts "SAVE", load_object.inspect
520
- save if(load_object.valid? && load_object.new_record?)
527
+ return unless(load_object.new_record?)
528
+
529
+ if(load_object.valid?)
530
+ save
531
+ else
532
+ puts "Cannot Save - Invalid #{load_object.class} - #{load_object.errors.full_messages}" if(verbose)
533
+ end
521
534
  end
522
535
 
523
536
  end
@@ -35,8 +35,9 @@ module DataShift
35
35
  def report
36
36
  loaded_objects.compact! if(loaded_objects)
37
37
 
38
- puts "Processing complete:"
39
- puts "Processed total of #{processed_object_count} entries"
38
+ puts "\nProcessing Summary Report"
39
+ puts ">>>>>>>>>>>>>>>>>>>>>>>>>\n"
40
+ puts "Processed total of #{processed_object_count} #{processed_object_count > 1 ? 'entries' : 'entry'}"
40
41
  puts "#{loaded_objects.size} objects were succesfully processed."
41
42
 
42
43
  puts "There were NO failures." if failed_objects.empty?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datashift
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.12.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-02 00:00:00.000000000 Z
12
+ date: 2013-01-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: spreadsheet