datashift 0.0.1 → 0.0.2
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/.document +5 -5
- data/Gemfile +28 -25
- data/LICENSE.txt +26 -26
- data/README.markdown +302 -285
- data/README.rdoc +19 -19
- data/Rakefile +93 -95
- data/VERSION +5 -5
- data/datashift.gemspec +162 -178
- data/lib/applications/jruby/jexcel_file.rb +396 -396
- data/lib/applications/jruby/word.rb +79 -79
- data/lib/datashift.rb +152 -113
- data/lib/datashift/exceptions.rb +11 -11
- data/lib/datashift/file_definitions.rb +353 -353
- data/lib/datashift/mapping_file_definitions.rb +87 -87
- data/lib/datashift/method_detail.rb +236 -236
- data/lib/datashift/method_mapper.rb +256 -256
- data/lib/generators/csv_generator.rb +36 -36
- data/lib/generators/excel_generator.rb +121 -121
- data/lib/generators/generator_base.rb +13 -13
- data/lib/helpers/core_ext/to_b.rb +24 -24
- data/lib/helpers/spree_helper.rb +131 -131
- data/lib/java/poi-3.7/LICENSE +507 -507
- data/lib/java/poi-3.7/NOTICE +21 -21
- data/lib/java/poi-3.7/RELEASE_NOTES.txt +115 -115
- data/lib/loaders/csv_loader.rb +98 -98
- data/lib/loaders/excel_loader.rb +154 -149
- data/lib/loaders/loader_base.rb +403 -331
- data/lib/loaders/spreadsheet_loader.rb +136 -136
- data/lib/loaders/spree/image_loader.rb +45 -45
- data/lib/loaders/spree/product_loader.rb +224 -224
- data/spec/csv_loader_spec.rb +30 -30
- data/spec/datashift_spec.rb +26 -26
- data/spec/db/migrate/20110803201325_create_test_bed.rb +85 -85
- data/spec/excel_generator_spec.rb +78 -78
- data/spec/excel_loader_spec.rb +204 -176
- data/spec/file_definitions.rb +141 -141
- data/spec/fixtures/.~lock.ProjectsSingleCategories.xls# +1 -0
- data/spec/fixtures/ProjectsDefaults.yml +29 -0
- data/spec/fixtures/config/database.yml +24 -24
- data/spec/fixtures/interact_models_db.sqlite +0 -0
- data/spec/fixtures/interact_spree_db.sqlite +0 -0
- data/spec/fixtures/negative/SpreeProdMiss1Mandatory.csv +4 -4
- data/spec/fixtures/negative/SpreeProdMissManyMandatory.csv +4 -4
- data/spec/fixtures/spree/SpreeProducts.csv +4 -4
- data/spec/fixtures/spree/SpreeProductsMultiColumn.csv +4 -4
- data/spec/fixtures/spree/SpreeProductsSimple.csv +4 -4
- data/spec/fixtures/spree/SpreeZoneExample.csv +5 -5
- data/spec/fixtures/test_model_defs.rb +57 -57
- data/spec/loader_spec.rb +120 -120
- data/spec/method_mapper_spec.rb +237 -237
- data/spec/spec_helper.rb +115 -115
- data/spec/spree_generator_spec.rb +64 -64
- data/spec/spree_loader_spec.rb +310 -310
- data/spec/spree_method_mapping_spec.rb +214 -214
- data/tasks/config/seed_fu_product_template.erb +15 -15
- data/tasks/config/tidy_config.txt +12 -12
- data/tasks/db_tasks.rake +65 -64
- data/tasks/excel_generator.rake +78 -78
- data/tasks/file_tasks.rake +36 -36
- data/tasks/import/csv.rake +49 -49
- data/tasks/import/excel.rake +71 -66
- data/tasks/spree/image_load.rake +108 -108
- data/tasks/spree/product_loader.rake +43 -43
- data/tasks/word_to_seedfu.rake +166 -166
- data/test/helper.rb +18 -18
- data/test/test_interact.rb +7 -7
- metadata +7 -38
- data/Gemfile.lock +0 -211
- data/bin/autospec +0 -16
- data/bin/convert_to_should_syntax +0 -16
- data/bin/erubis +0 -16
- data/bin/htmldiff +0 -16
- data/bin/jeweler +0 -16
- data/bin/ldiff +0 -16
- data/bin/nokogiri +0 -16
- data/bin/rackup +0 -16
- data/bin/rails +0 -16
- data/bin/rake +0 -16
- data/bin/rake2thor +0 -16
- data/bin/ri +0 -16
- data/bin/rspec +0 -16
- data/bin/spree +0 -16
- data/bin/thor +0 -16
- data/bin/tilt +0 -16
- data/bin/tt +0 -16
data/spec/csv_loader_spec.rb
CHANGED
@@ -1,31 +1,31 @@
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
-
# Author :: Tom Statter
|
3
|
-
# Date :: Aug 2011
|
4
|
-
# License:: MIT
|
5
|
-
#
|
6
|
-
# Details:: Specs for Excel aspect of Active Record Loader
|
7
|
-
#
|
8
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
-
|
10
|
-
require 'erb'
|
11
|
-
require 'excel_loader'
|
12
|
-
|
13
|
-
describe 'CSV Loader' do
|
14
|
-
|
15
|
-
before(:all) do
|
16
|
-
|
17
|
-
# load our test model definitions - Project etc
|
18
|
-
require File.join($DataShiftFixturePath, 'test_model_defs')
|
19
|
-
|
20
|
-
db_connect( 'test_file' ) # , test_memory, test_mysql
|
21
|
-
migrate_up
|
22
|
-
@klazz = Project
|
23
|
-
end
|
24
|
-
|
25
|
-
before(:each) do
|
26
|
-
MethodMapper.clear
|
27
|
-
MethodMapper.find_operators( @klazz )
|
28
|
-
MethodMapper.find_operators( @assoc_klazz )
|
29
|
-
end
|
30
|
-
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
+
# Author :: Tom Statter
|
3
|
+
# Date :: Aug 2011
|
4
|
+
# License:: MIT
|
5
|
+
#
|
6
|
+
# Details:: Specs for Excel aspect of Active Record Loader
|
7
|
+
#
|
8
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
+
|
10
|
+
require 'erb'
|
11
|
+
require 'excel_loader'
|
12
|
+
|
13
|
+
describe 'CSV Loader' do
|
14
|
+
|
15
|
+
before(:all) do
|
16
|
+
|
17
|
+
# load our test model definitions - Project etc
|
18
|
+
require File.join($DataShiftFixturePath, 'test_model_defs')
|
19
|
+
|
20
|
+
db_connect( 'test_file' ) # , test_memory, test_mysql
|
21
|
+
migrate_up
|
22
|
+
@klazz = Project
|
23
|
+
end
|
24
|
+
|
25
|
+
before(:each) do
|
26
|
+
MethodMapper.clear
|
27
|
+
MethodMapper.find_operators( @klazz )
|
28
|
+
MethodMapper.find_operators( @assoc_klazz )
|
29
|
+
end
|
30
|
+
|
31
31
|
end
|
data/spec/datashift_spec.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
-
# Author :: Tom Statter
|
3
|
-
# Date :: Oct 2011
|
4
|
-
# License:: MIT
|
5
|
-
#
|
6
|
-
# Details:: Specs for high level apsects of DataShift library
|
7
|
-
#
|
8
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
-
|
10
|
-
describe 'DataShift' do
|
11
|
-
|
12
|
-
before(:each) do
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should provide gem version" do
|
16
|
-
DataShift::gem_version
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should provide gem name" do
|
20
|
-
DataShift::gem_name.should == 'datashift'
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should provide root_path" do
|
24
|
-
DataShift.root_path.should_not be_empty
|
25
|
-
end
|
26
|
-
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
+
# Author :: Tom Statter
|
3
|
+
# Date :: Oct 2011
|
4
|
+
# License:: MIT
|
5
|
+
#
|
6
|
+
# Details:: Specs for high level apsects of DataShift library
|
7
|
+
#
|
8
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
+
|
10
|
+
describe 'DataShift' do
|
11
|
+
|
12
|
+
before(:each) do
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should provide gem version" do
|
16
|
+
DataShift::gem_version
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should provide gem name" do
|
20
|
+
DataShift::gem_name.should == 'datashift'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should provide root_path" do
|
24
|
+
DataShift.root_path.should_not be_empty
|
25
|
+
end
|
26
|
+
|
27
27
|
end
|
@@ -1,85 +1,85 @@
|
|
1
|
-
# Author :: Tom Statter
|
2
|
-
# Date :: Aug 2011
|
3
|
-
# License:: MIT
|
4
|
-
#
|
5
|
-
# Details:: Migration to create a test database that exercises all aspects of Active Record models
|
6
|
-
#
|
7
|
-
|
8
|
-
class CreateTestBed < ActiveRecord::Migration
|
9
|
-
|
10
|
-
def self.up
|
11
|
-
|
12
|
-
# has many :milestones
|
13
|
-
create_table :projects do |t|
|
14
|
-
t.string :title
|
15
|
-
t.string :value_as_string
|
16
|
-
t.text :value_as_text
|
17
|
-
t.boolean :value_as_boolean, :default => false
|
18
|
-
t.datetime :value_as_datetime, :default => nil
|
19
|
-
t.integer :value_as_integer, :default => 0
|
20
|
-
t.decimal :value_as_double, :precision => 8, :scale => 2, :default => 0.0
|
21
|
-
t.timestamps
|
22
|
-
end
|
23
|
-
|
24
|
-
# belongs_to :project, project => has_many
|
25
|
-
create_table :milestones do |t|
|
26
|
-
t.string :name
|
27
|
-
t.datetime :datetime, :default => nil
|
28
|
-
t.decimal :cost, :precision => 8, :scale => 2, :default => 0.0
|
29
|
-
t.references :project
|
30
|
-
t.timestamps
|
31
|
-
end
|
32
|
-
|
33
|
-
# belongs_to :project, project => has_one
|
34
|
-
create_table :owners do |t|
|
35
|
-
t.string :name
|
36
|
-
t.references :project
|
37
|
-
t.timestamps
|
38
|
-
end
|
39
|
-
|
40
|
-
# has_belongs_to_many :project
|
41
|
-
create_table :categories do |t|
|
42
|
-
t.string :reference
|
43
|
-
t.timestamps
|
44
|
-
end
|
45
|
-
|
46
|
-
# testing has_belongs_to_many (hence no id)
|
47
|
-
create_table :categories_projects, :id => false do |t|
|
48
|
-
t.references :category
|
49
|
-
t.references :project
|
50
|
-
end
|
51
|
-
|
52
|
-
create_table :versions do |t|
|
53
|
-
t.string :name
|
54
|
-
t.timestamps
|
55
|
-
end
|
56
|
-
|
57
|
-
# testing project has_many release + versions :through
|
58
|
-
create_table :loader_releases do |t|
|
59
|
-
t.string :name
|
60
|
-
t.references :project
|
61
|
-
t.references :version
|
62
|
-
t.timestamps
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
create_table :long_and_complex_table_linked_to_versions do |t|
|
67
|
-
t.references :version
|
68
|
-
end
|
69
|
-
|
70
|
-
create_table :empties do |t|
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.down
|
76
|
-
drop_table :projects
|
77
|
-
drop_table :categories
|
78
|
-
drop_table :loader_releases
|
79
|
-
drop_table :versions
|
80
|
-
drop_table :categories_projectss
|
81
|
-
drop_table :milestones
|
82
|
-
drop_table :long_and_complex_table_linked_to_versions
|
83
|
-
drop_table :empties
|
84
|
-
end
|
85
|
-
end
|
1
|
+
# Author :: Tom Statter
|
2
|
+
# Date :: Aug 2011
|
3
|
+
# License:: MIT
|
4
|
+
#
|
5
|
+
# Details:: Migration to create a test database that exercises all aspects of Active Record models
|
6
|
+
#
|
7
|
+
|
8
|
+
class CreateTestBed < ActiveRecord::Migration
|
9
|
+
|
10
|
+
def self.up
|
11
|
+
|
12
|
+
# has many :milestones
|
13
|
+
create_table :projects do |t|
|
14
|
+
t.string :title
|
15
|
+
t.string :value_as_string
|
16
|
+
t.text :value_as_text
|
17
|
+
t.boolean :value_as_boolean, :default => false
|
18
|
+
t.datetime :value_as_datetime, :default => nil
|
19
|
+
t.integer :value_as_integer, :default => 0
|
20
|
+
t.decimal :value_as_double, :precision => 8, :scale => 2, :default => 0.0
|
21
|
+
t.timestamps
|
22
|
+
end
|
23
|
+
|
24
|
+
# belongs_to :project, project => has_many
|
25
|
+
create_table :milestones do |t|
|
26
|
+
t.string :name
|
27
|
+
t.datetime :datetime, :default => nil
|
28
|
+
t.decimal :cost, :precision => 8, :scale => 2, :default => 0.0
|
29
|
+
t.references :project
|
30
|
+
t.timestamps
|
31
|
+
end
|
32
|
+
|
33
|
+
# belongs_to :project, project => has_one
|
34
|
+
create_table :owners do |t|
|
35
|
+
t.string :name
|
36
|
+
t.references :project
|
37
|
+
t.timestamps
|
38
|
+
end
|
39
|
+
|
40
|
+
# has_belongs_to_many :project
|
41
|
+
create_table :categories do |t|
|
42
|
+
t.string :reference
|
43
|
+
t.timestamps
|
44
|
+
end
|
45
|
+
|
46
|
+
# testing has_belongs_to_many (hence no id)
|
47
|
+
create_table :categories_projects, :id => false do |t|
|
48
|
+
t.references :category
|
49
|
+
t.references :project
|
50
|
+
end
|
51
|
+
|
52
|
+
create_table :versions do |t|
|
53
|
+
t.string :name
|
54
|
+
t.timestamps
|
55
|
+
end
|
56
|
+
|
57
|
+
# testing project has_many release + versions :through
|
58
|
+
create_table :loader_releases do |t|
|
59
|
+
t.string :name
|
60
|
+
t.references :project
|
61
|
+
t.references :version
|
62
|
+
t.timestamps
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
create_table :long_and_complex_table_linked_to_versions do |t|
|
67
|
+
t.references :version
|
68
|
+
end
|
69
|
+
|
70
|
+
create_table :empties do |t|
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.down
|
76
|
+
drop_table :projects
|
77
|
+
drop_table :categories
|
78
|
+
drop_table :loader_releases
|
79
|
+
drop_table :versions
|
80
|
+
drop_table :categories_projectss
|
81
|
+
drop_table :milestones
|
82
|
+
drop_table :long_and_complex_table_linked_to_versions
|
83
|
+
drop_table :empties
|
84
|
+
end
|
85
|
+
end
|
@@ -1,79 +1,79 @@
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
-
# Author :: Tom Statter
|
3
|
-
# Date :: Aug 2011
|
4
|
-
# License:: MIT
|
5
|
-
#
|
6
|
-
# Details:: Specs for Excel aspect of Active Record Loader
|
7
|
-
#
|
8
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
-
|
10
|
-
if(Guards::jruby?)
|
11
|
-
require 'erb'
|
12
|
-
require 'excel_generator'
|
13
|
-
|
14
|
-
include DataShift
|
15
|
-
|
16
|
-
describe 'Excel Generator' do
|
17
|
-
|
18
|
-
before(:all) do
|
19
|
-
db_connect( 'test_file' ) # , test_memory, test_mysql
|
20
|
-
|
21
|
-
# load our test model definitions - Project etc
|
22
|
-
require File.join($DataShiftFixturePath, 'test_model_defs')
|
23
|
-
|
24
|
-
# handle migration changes or reset of test DB
|
25
|
-
migrate_up
|
26
|
-
|
27
|
-
db_clear() # todo read up about proper transactional fixtures
|
28
|
-
results_clear()
|
29
|
-
|
30
|
-
@klazz = Project
|
31
|
-
@assoc_klazz = Category
|
32
|
-
end
|
33
|
-
|
34
|
-
before(:each) do
|
35
|
-
MethodMapper.clear
|
36
|
-
MethodMapper.find_operators( @klazz )
|
37
|
-
MethodMapper.find_operators( @assoc_klazz )
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should be able to create a new excel generator" do
|
41
|
-
generator = ExcelGenerator.new( 'dummy.xls' )
|
42
|
-
|
43
|
-
generator.should_not be_nil
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should generate template .xls file from model" do
|
47
|
-
|
48
|
-
expect = result_file('project_template_spec.xls')
|
49
|
-
|
50
|
-
gen = ExcelGenerator.new( expect )
|
51
|
-
|
52
|
-
gen.generate(Project)
|
53
|
-
|
54
|
-
File.exists?(expect).should be_true
|
55
|
-
|
56
|
-
puts "Can manually check file @ #{expect}"
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should export a simple model to .xls spreedsheet" do
|
60
|
-
|
61
|
-
Project.create( :value_as_string => 'Value as Text', :value_as_boolean => true, :value_as_double => 75.672)
|
62
|
-
#001 Demo string blah blah 2011-02-14 1.00 320.00
|
63
|
-
|
64
|
-
expect= result_file('simple_export_spec.xls')
|
65
|
-
|
66
|
-
gen = ExcelGenerator.new(expect)
|
67
|
-
|
68
|
-
items = Project.all
|
69
|
-
|
70
|
-
gen.export(items)
|
71
|
-
|
72
|
-
File.exists?(expect).should be_true
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
else
|
78
|
-
puts "WARNING: skipped excel_generator_spec : Requires JRUBY - JExcelFile requires JAVA"
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
+
# Author :: Tom Statter
|
3
|
+
# Date :: Aug 2011
|
4
|
+
# License:: MIT
|
5
|
+
#
|
6
|
+
# Details:: Specs for Excel aspect of Active Record Loader
|
7
|
+
#
|
8
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
+
|
10
|
+
if(Guards::jruby?)
|
11
|
+
require 'erb'
|
12
|
+
require 'excel_generator'
|
13
|
+
|
14
|
+
include DataShift
|
15
|
+
|
16
|
+
describe 'Excel Generator' do
|
17
|
+
|
18
|
+
before(:all) do
|
19
|
+
db_connect( 'test_file' ) # , test_memory, test_mysql
|
20
|
+
|
21
|
+
# load our test model definitions - Project etc
|
22
|
+
require File.join($DataShiftFixturePath, 'test_model_defs')
|
23
|
+
|
24
|
+
# handle migration changes or reset of test DB
|
25
|
+
migrate_up
|
26
|
+
|
27
|
+
db_clear() # todo read up about proper transactional fixtures
|
28
|
+
results_clear()
|
29
|
+
|
30
|
+
@klazz = Project
|
31
|
+
@assoc_klazz = Category
|
32
|
+
end
|
33
|
+
|
34
|
+
before(:each) do
|
35
|
+
MethodMapper.clear
|
36
|
+
MethodMapper.find_operators( @klazz )
|
37
|
+
MethodMapper.find_operators( @assoc_klazz )
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to create a new excel generator" do
|
41
|
+
generator = ExcelGenerator.new( 'dummy.xls' )
|
42
|
+
|
43
|
+
generator.should_not be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should generate template .xls file from model" do
|
47
|
+
|
48
|
+
expect = result_file('project_template_spec.xls')
|
49
|
+
|
50
|
+
gen = ExcelGenerator.new( expect )
|
51
|
+
|
52
|
+
gen.generate(Project)
|
53
|
+
|
54
|
+
File.exists?(expect).should be_true
|
55
|
+
|
56
|
+
puts "Can manually check file @ #{expect}"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should export a simple model to .xls spreedsheet" do
|
60
|
+
|
61
|
+
Project.create( :value_as_string => 'Value as Text', :value_as_boolean => true, :value_as_double => 75.672)
|
62
|
+
#001 Demo string blah blah 2011-02-14 1.00 320.00
|
63
|
+
|
64
|
+
expect= result_file('simple_export_spec.xls')
|
65
|
+
|
66
|
+
gen = ExcelGenerator.new(expect)
|
67
|
+
|
68
|
+
items = Project.all
|
69
|
+
|
70
|
+
gen.export(items)
|
71
|
+
|
72
|
+
File.exists?(expect).should be_true
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
else
|
78
|
+
puts "WARNING: skipped excel_generator_spec : Requires JRUBY - JExcelFile requires JAVA"
|
79
79
|
end # jruby
|
data/spec/excel_loader_spec.rb
CHANGED
@@ -1,177 +1,205 @@
|
|
1
|
-
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
-
# Author :: Tom Statter
|
3
|
-
# Date :: Aug 2011
|
4
|
-
# License:: MIT
|
5
|
-
#
|
6
|
-
# Details:: Specs for Excel aspect of Active Record Loader
|
7
|
-
#
|
8
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
-
|
10
|
-
if(Guards::jruby?)
|
11
|
-
|
12
|
-
require 'erb'
|
13
|
-
require 'excel_loader'
|
14
|
-
|
15
|
-
include DataShift
|
16
|
-
|
17
|
-
describe 'Excel Loader' do
|
18
|
-
|
19
|
-
before(:all) do
|
20
|
-
db_connect( 'test_file' ) # , test_memory, test_mysql
|
21
|
-
|
22
|
-
# load our test model definitions - Project etc
|
23
|
-
require File.join($DataShiftFixturePath, 'test_model_defs')
|
24
|
-
|
25
|
-
# handle migration changes or reset of test DB
|
26
|
-
migrate_up
|
27
|
-
|
28
|
-
db_clear() # todo read up about proper transactional fixtures
|
29
|
-
|
30
|
-
|
31
|
-
@klazz = Project
|
32
|
-
@assoc_klazz = Category
|
33
|
-
end
|
34
|
-
|
35
|
-
before(:each) do
|
36
|
-
|
37
|
-
Project.delete_all
|
38
|
-
|
39
|
-
%w{category_001 category_002 category_003}.each do |cat|
|
40
|
-
@assoc_klazz.find_or_create_by_reference(cat)
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
MethodMapper.clear
|
45
|
-
MethodMapper.find_operators( @klazz )
|
46
|
-
MethodMapper.find_operators( @assoc_klazz )
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should be able to create a new excel loader and load object" do
|
50
|
-
loader = ExcelLoader.new( @klazz)
|
51
|
-
|
52
|
-
loader.load_object.should_not be_nil
|
53
|
-
loader.load_object.should be_is_a(@klazz)
|
54
|
-
loader.load_object.new_record?.should be_true
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should process a simple .xls spreedsheet" do
|
58
|
-
|
59
|
-
loader = ExcelLoader.new(@klazz)
|
60
|
-
|
61
|
-
count = @klazz.count
|
62
|
-
loader.perform_load( $DataShiftFixturePath + '/SimpleProjects.xls')
|
63
|
-
|
64
|
-
loader.loaded_count.should == (@klazz.count - count)
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should process multiple associationss from single column" do
|
69
|
-
|
70
|
-
@klazz.find_by_title('001').should be_nil
|
71
|
-
count = @klazz.count
|
72
|
-
|
73
|
-
loader = ExcelLoader.new(@klazz)
|
74
|
-
|
75
|
-
loader.perform_load( $DataShiftFixturePath + '/ProjectsSingleCategories.xls')
|
76
|
-
|
77
|
-
loader.loaded_count.should be > 3
|
78
|
-
loader.loaded_count.should == (@klazz.count - count)
|
79
|
-
|
80
|
-
{'001' => 2, '002' => 1, '003' => 3, '099' => 0 }.each do|title, expected|
|
81
|
-
project = @klazz.find_by_title(title)
|
82
|
-
|
83
|
-
project.should_not be_nil
|
84
|
-
puts "#{project.inspect} [#{project.categories.size}]"
|
85
|
-
|
86
|
-
project.should have(expected).categories
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should process multiple associations in excel spreedsheet" do
|
91
|
-
|
92
|
-
loader = ExcelLoader.new(Project)
|
93
|
-
|
94
|
-
count = Project.count
|
95
|
-
loader.perform_load( $DataShiftFixturePath + '/ProjectsMultiCategories.xls')
|
96
|
-
|
97
|
-
loader.loaded_count.should == (Project.count - count)
|
98
|
-
|
99
|
-
{'004' => 3, '005' => 1, '006' => 0, '007' => 1 }.each do|title, expected|
|
100
|
-
project = @klazz.find_by_title(title)
|
101
|
-
|
102
|
-
project.should_not be_nil
|
103
|
-
|
104
|
-
project.should have(expected).categories
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
|
-
it "should process excel spreedsheet with extra undefined columns" do
|
110
|
-
loader = ExcelLoader.new(Project)
|
111
|
-
lambda {loader.perform_load( ifixture_file('BadAssociationName.xls') ) }.should_not raise_error
|
112
|
-
end
|
113
|
-
|
114
|
-
it "should NOT process excel spreedsheet with extra undefined columns when strict mode" do
|
115
|
-
loader = ExcelLoader.new(Project)
|
116
|
-
expect {loader.perform_load( ifixture_file('BadAssociationName.xls'), :strict => true)}.to raise_error(MappingDefinitionError)
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should raise an error when mandatory columns missing" do
|
120
|
-
loader = ExcelLoader.new(Project)
|
121
|
-
expect {loader.perform_load($DataShiftFixturePath + '/ProjectsMultiCategories.xls', :mandatory => ['not_an_option', 'must_be_there'] )}.to raise_error(DataShift::MissingMandatoryError)
|
122
|
-
end
|
123
|
-
|
124
|
-
it "should provide facility to set default values", :focus => true do
|
125
|
-
loader = ExcelLoader.new(Project)
|
126
|
-
|
127
|
-
loader.set_default_value('value_as_string', 'some default text' )
|
128
|
-
loader.set_default_value('value_as_double', 45.467 )
|
129
|
-
loader.set_default_value('value_as_boolean', true )
|
130
|
-
|
131
|
-
texpected = Time.now.to_s(:db)
|
132
|
-
|
133
|
-
loader.set_default_value('value_as_datetime', texpected )
|
134
|
-
|
135
|
-
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
136
|
-
|
137
|
-
loader.perform_load($DataShiftFixturePath + '/ProjectsSingleCategories.xls')
|
138
|
-
|
139
|
-
p = Project.find_by_title( '099' )
|
140
|
-
|
141
|
-
p.should_not be_nil
|
142
|
-
|
143
|
-
p.value_as_string.should == 'some default text'
|
144
|
-
p.value_as_double.should == 45.467
|
145
|
-
p.value_as_boolean.should == true
|
146
|
-
p.value_as_datetime.should == texpected
|
147
|
-
|
148
|
-
p_no_defs = Project.first
|
149
|
-
|
150
|
-
p_no_defs.value_as_string.should_not == 'some default text'
|
151
|
-
p_no_defs.value_as_double.should_not == 45.467
|
152
|
-
p_no_defs.value_as_datetime.should_not == texpected
|
153
|
-
|
154
|
-
end
|
155
|
-
|
156
|
-
it "should provide facility to set pre and post fix values"
|
157
|
-
loader = ExcelLoader.new(Project)
|
158
|
-
|
159
|
-
loader.set_prefix('value_as_string', 'myprefix' )
|
160
|
-
loader.set_postfix('value_as_string', 'my post fix' )
|
161
|
-
|
162
|
-
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
163
|
-
|
164
|
-
loader.perform_load($DataShiftFixturePath + '/ProjectsSingleCategories.xls')
|
165
|
-
|
166
|
-
p = Project.find_by_title( '001' )
|
167
|
-
|
168
|
-
p.should_not be_nil
|
169
|
-
|
170
|
-
p.value_as_string.should == 'myprefixDemo stringmy post fix'
|
171
|
-
end
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
1
|
+
# Copyright:: (c) Autotelik Media Ltd 2011
|
2
|
+
# Author :: Tom Statter
|
3
|
+
# Date :: Aug 2011
|
4
|
+
# License:: MIT
|
5
|
+
#
|
6
|
+
# Details:: Specs for Excel aspect of Active Record Loader
|
7
|
+
#
|
8
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
9
|
+
|
10
|
+
if(Guards::jruby?)
|
11
|
+
|
12
|
+
require 'erb'
|
13
|
+
require 'excel_loader'
|
14
|
+
|
15
|
+
include DataShift
|
16
|
+
|
17
|
+
describe 'Excel Loader' do
|
18
|
+
|
19
|
+
before(:all) do
|
20
|
+
db_connect( 'test_file' ) # , test_memory, test_mysql
|
21
|
+
|
22
|
+
# load our test model definitions - Project etc
|
23
|
+
require File.join($DataShiftFixturePath, 'test_model_defs')
|
24
|
+
|
25
|
+
# handle migration changes or reset of test DB
|
26
|
+
migrate_up
|
27
|
+
|
28
|
+
db_clear() # todo read up about proper transactional fixtures
|
29
|
+
|
30
|
+
|
31
|
+
@klazz = Project
|
32
|
+
@assoc_klazz = Category
|
33
|
+
end
|
34
|
+
|
35
|
+
before(:each) do
|
36
|
+
|
37
|
+
Project.delete_all
|
38
|
+
|
39
|
+
%w{category_001 category_002 category_003}.each do |cat|
|
40
|
+
@assoc_klazz.find_or_create_by_reference(cat)
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
MethodMapper.clear
|
45
|
+
MethodMapper.find_operators( @klazz )
|
46
|
+
MethodMapper.find_operators( @assoc_klazz )
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be able to create a new excel loader and load object" do
|
50
|
+
loader = ExcelLoader.new( @klazz)
|
51
|
+
|
52
|
+
loader.load_object.should_not be_nil
|
53
|
+
loader.load_object.should be_is_a(@klazz)
|
54
|
+
loader.load_object.new_record?.should be_true
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should process a simple .xls spreedsheet" do
|
58
|
+
|
59
|
+
loader = ExcelLoader.new(@klazz)
|
60
|
+
|
61
|
+
count = @klazz.count
|
62
|
+
loader.perform_load( $DataShiftFixturePath + '/SimpleProjects.xls')
|
63
|
+
|
64
|
+
loader.loaded_count.should == (@klazz.count - count)
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should process multiple associationss from single column" do
|
69
|
+
|
70
|
+
@klazz.find_by_title('001').should be_nil
|
71
|
+
count = @klazz.count
|
72
|
+
|
73
|
+
loader = ExcelLoader.new(@klazz)
|
74
|
+
|
75
|
+
loader.perform_load( $DataShiftFixturePath + '/ProjectsSingleCategories.xls')
|
76
|
+
|
77
|
+
loader.loaded_count.should be > 3
|
78
|
+
loader.loaded_count.should == (@klazz.count - count)
|
79
|
+
|
80
|
+
{'001' => 2, '002' => 1, '003' => 3, '099' => 0 }.each do|title, expected|
|
81
|
+
project = @klazz.find_by_title(title)
|
82
|
+
|
83
|
+
project.should_not be_nil
|
84
|
+
puts "#{project.inspect} [#{project.categories.size}]"
|
85
|
+
|
86
|
+
project.should have(expected).categories
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should process multiple associations in excel spreedsheet" do
|
91
|
+
|
92
|
+
loader = ExcelLoader.new(Project)
|
93
|
+
|
94
|
+
count = Project.count
|
95
|
+
loader.perform_load( $DataShiftFixturePath + '/ProjectsMultiCategories.xls')
|
96
|
+
|
97
|
+
loader.loaded_count.should == (Project.count - count)
|
98
|
+
|
99
|
+
{'004' => 3, '005' => 1, '006' => 0, '007' => 1 }.each do|title, expected|
|
100
|
+
project = @klazz.find_by_title(title)
|
101
|
+
|
102
|
+
project.should_not be_nil
|
103
|
+
|
104
|
+
project.should have(expected).categories
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should process excel spreedsheet with extra undefined columns" do
|
110
|
+
loader = ExcelLoader.new(Project)
|
111
|
+
lambda {loader.perform_load( ifixture_file('BadAssociationName.xls') ) }.should_not raise_error
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should NOT process excel spreedsheet with extra undefined columns when strict mode" do
|
115
|
+
loader = ExcelLoader.new(Project)
|
116
|
+
expect {loader.perform_load( ifixture_file('BadAssociationName.xls'), :strict => true)}.to raise_error(MappingDefinitionError)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should raise an error when mandatory columns missing" do
|
120
|
+
loader = ExcelLoader.new(Project)
|
121
|
+
expect {loader.perform_load($DataShiftFixturePath + '/ProjectsMultiCategories.xls', :mandatory => ['not_an_option', 'must_be_there'] )}.to raise_error(DataShift::MissingMandatoryError)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should provide facility to set default values", :focus => true do
|
125
|
+
loader = ExcelLoader.new(Project)
|
126
|
+
|
127
|
+
loader.set_default_value('value_as_string', 'some default text' )
|
128
|
+
loader.set_default_value('value_as_double', 45.467 )
|
129
|
+
loader.set_default_value('value_as_boolean', true )
|
130
|
+
|
131
|
+
texpected = Time.now.to_s(:db)
|
132
|
+
|
133
|
+
loader.set_default_value('value_as_datetime', texpected )
|
134
|
+
|
135
|
+
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
136
|
+
|
137
|
+
loader.perform_load($DataShiftFixturePath + '/ProjectsSingleCategories.xls')
|
138
|
+
|
139
|
+
p = Project.find_by_title( '099' )
|
140
|
+
|
141
|
+
p.should_not be_nil
|
142
|
+
|
143
|
+
p.value_as_string.should == 'some default text'
|
144
|
+
p.value_as_double.should == 45.467
|
145
|
+
p.value_as_boolean.should == true
|
146
|
+
p.value_as_datetime.should == texpected
|
147
|
+
|
148
|
+
p_no_defs = Project.first
|
149
|
+
|
150
|
+
p_no_defs.value_as_string.should_not == 'some default text'
|
151
|
+
p_no_defs.value_as_double.should_not == 45.467
|
152
|
+
p_no_defs.value_as_datetime.should_not == texpected
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should provide facility to set pre and post fix values" do
|
157
|
+
loader = ExcelLoader.new(Project)
|
158
|
+
|
159
|
+
loader.set_prefix('value_as_string', 'myprefix' )
|
160
|
+
loader.set_postfix('value_as_string', 'my post fix' )
|
161
|
+
|
162
|
+
#value_as_string Value as Text value as datetime value_as_boolean value_as_double category
|
163
|
+
|
164
|
+
loader.perform_load($DataShiftFixturePath + '/ProjectsSingleCategories.xls')
|
165
|
+
|
166
|
+
p = Project.find_by_title( '001' )
|
167
|
+
|
168
|
+
p.should_not be_nil
|
169
|
+
|
170
|
+
p.value_as_string.should == 'myprefixDemo stringmy post fix'
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should provide facility to set default values via YAML configuration", :excel => true do
|
174
|
+
loader = ExcelLoader.new(Project)
|
175
|
+
|
176
|
+
loader.configure_from( File.join($DataShiftFixturePath, 'ProjectsDefaults.yml') )
|
177
|
+
|
178
|
+
|
179
|
+
loader.perform_load( File.join($DataShiftFixturePath, 'ProjectsSingleCategories.xls') )
|
180
|
+
|
181
|
+
p = Project.find_by_title( '099' )
|
182
|
+
|
183
|
+
p.should_not be_nil
|
184
|
+
|
185
|
+
p.value_as_string.should == "Default Project Value"
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
it "should provide facility to over ride values via YAML configuration", :excel => true do
|
190
|
+
loader = ExcelLoader.new(Project)
|
191
|
+
|
192
|
+
loader.configure_from( File.join($DataShiftFixturePath, 'ProjectsDefaults.yml') )
|
193
|
+
|
194
|
+
|
195
|
+
loader.perform_load( File.join($DataShiftFixturePath, 'ProjectsSingleCategories.xls') )
|
196
|
+
|
197
|
+
Project.all.each {|p| p.value_as_double.should == 99.23546 }
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
else
|
204
|
+
puts "WARNING: skipped excel_loader_spec : Requires JRUBY - JExcelFile requires JAVA"
|
177
205
|
end # jruby
|