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.
Files changed (85) hide show
  1. data/.document +5 -5
  2. data/Gemfile +28 -25
  3. data/LICENSE.txt +26 -26
  4. data/README.markdown +302 -285
  5. data/README.rdoc +19 -19
  6. data/Rakefile +93 -95
  7. data/VERSION +5 -5
  8. data/datashift.gemspec +162 -178
  9. data/lib/applications/jruby/jexcel_file.rb +396 -396
  10. data/lib/applications/jruby/word.rb +79 -79
  11. data/lib/datashift.rb +152 -113
  12. data/lib/datashift/exceptions.rb +11 -11
  13. data/lib/datashift/file_definitions.rb +353 -353
  14. data/lib/datashift/mapping_file_definitions.rb +87 -87
  15. data/lib/datashift/method_detail.rb +236 -236
  16. data/lib/datashift/method_mapper.rb +256 -256
  17. data/lib/generators/csv_generator.rb +36 -36
  18. data/lib/generators/excel_generator.rb +121 -121
  19. data/lib/generators/generator_base.rb +13 -13
  20. data/lib/helpers/core_ext/to_b.rb +24 -24
  21. data/lib/helpers/spree_helper.rb +131 -131
  22. data/lib/java/poi-3.7/LICENSE +507 -507
  23. data/lib/java/poi-3.7/NOTICE +21 -21
  24. data/lib/java/poi-3.7/RELEASE_NOTES.txt +115 -115
  25. data/lib/loaders/csv_loader.rb +98 -98
  26. data/lib/loaders/excel_loader.rb +154 -149
  27. data/lib/loaders/loader_base.rb +403 -331
  28. data/lib/loaders/spreadsheet_loader.rb +136 -136
  29. data/lib/loaders/spree/image_loader.rb +45 -45
  30. data/lib/loaders/spree/product_loader.rb +224 -224
  31. data/spec/csv_loader_spec.rb +30 -30
  32. data/spec/datashift_spec.rb +26 -26
  33. data/spec/db/migrate/20110803201325_create_test_bed.rb +85 -85
  34. data/spec/excel_generator_spec.rb +78 -78
  35. data/spec/excel_loader_spec.rb +204 -176
  36. data/spec/file_definitions.rb +141 -141
  37. data/spec/fixtures/.~lock.ProjectsSingleCategories.xls# +1 -0
  38. data/spec/fixtures/ProjectsDefaults.yml +29 -0
  39. data/spec/fixtures/config/database.yml +24 -24
  40. data/spec/fixtures/interact_models_db.sqlite +0 -0
  41. data/spec/fixtures/interact_spree_db.sqlite +0 -0
  42. data/spec/fixtures/negative/SpreeProdMiss1Mandatory.csv +4 -4
  43. data/spec/fixtures/negative/SpreeProdMissManyMandatory.csv +4 -4
  44. data/spec/fixtures/spree/SpreeProducts.csv +4 -4
  45. data/spec/fixtures/spree/SpreeProductsMultiColumn.csv +4 -4
  46. data/spec/fixtures/spree/SpreeProductsSimple.csv +4 -4
  47. data/spec/fixtures/spree/SpreeZoneExample.csv +5 -5
  48. data/spec/fixtures/test_model_defs.rb +57 -57
  49. data/spec/loader_spec.rb +120 -120
  50. data/spec/method_mapper_spec.rb +237 -237
  51. data/spec/spec_helper.rb +115 -115
  52. data/spec/spree_generator_spec.rb +64 -64
  53. data/spec/spree_loader_spec.rb +310 -310
  54. data/spec/spree_method_mapping_spec.rb +214 -214
  55. data/tasks/config/seed_fu_product_template.erb +15 -15
  56. data/tasks/config/tidy_config.txt +12 -12
  57. data/tasks/db_tasks.rake +65 -64
  58. data/tasks/excel_generator.rake +78 -78
  59. data/tasks/file_tasks.rake +36 -36
  60. data/tasks/import/csv.rake +49 -49
  61. data/tasks/import/excel.rake +71 -66
  62. data/tasks/spree/image_load.rake +108 -108
  63. data/tasks/spree/product_loader.rake +43 -43
  64. data/tasks/word_to_seedfu.rake +166 -166
  65. data/test/helper.rb +18 -18
  66. data/test/test_interact.rb +7 -7
  67. metadata +7 -38
  68. data/Gemfile.lock +0 -211
  69. data/bin/autospec +0 -16
  70. data/bin/convert_to_should_syntax +0 -16
  71. data/bin/erubis +0 -16
  72. data/bin/htmldiff +0 -16
  73. data/bin/jeweler +0 -16
  74. data/bin/ldiff +0 -16
  75. data/bin/nokogiri +0 -16
  76. data/bin/rackup +0 -16
  77. data/bin/rails +0 -16
  78. data/bin/rake +0 -16
  79. data/bin/rake2thor +0 -16
  80. data/bin/ri +0 -16
  81. data/bin/rspec +0 -16
  82. data/bin/spree +0 -16
  83. data/bin/thor +0 -16
  84. data/bin/tilt +0 -16
  85. data/bin/tt +0 -16
data/spec/loader_spec.rb CHANGED
@@ -1,121 +1,121 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
2
- # Author :: Tom Statter
3
- # Date :: Aug 2011
4
- # License:: MIT
5
- #
6
- # Details:: Specs for base class Loader
7
- #
8
- require File.dirname(__FILE__) + '/spec_helper'
9
-
10
- require 'erb'
11
-
12
- describe 'Basic Loader' do
13
-
14
- before(:all) do
15
- db_connect( 'test_file' ) # , test_memory, test_mysql
16
-
17
- # load our test model definitions - Project etc
18
- require File.join($DataShiftFixturePath, 'test_model_defs')
19
-
20
- migrate_up
21
- @klazz = Project
22
- end
23
-
24
- before(:each) do
25
- MethodMapper.clear
26
- MethodMapper.find_operators( @klazz )
27
- end
28
-
29
- it "should be able to create a new loader and load object" do
30
- loader = LoaderBase.new( @klazz )
31
-
32
- loader.load_object.should_not be_nil
33
- loader.load_object.should be_is_a(@klazz)
34
- loader.load_object.new_record?.should be_true
35
- end
36
-
37
- it "should process a string field against an assigment method detail" do
38
-
39
- loader = LoaderBase.new(Project)
40
-
41
- column = 'Value As String'
42
- row = 'Another Lazy fox '
43
-
44
- loader.find_and_process(column, row)
45
-
46
- loader.load_object.value_as_string.should == row
47
- end
48
-
49
- it "should process a text field against an assigment method detail" do
50
-
51
- loader = LoaderBase.new(Project)
52
-
53
- column = :value_as_text
54
- row = "Another Lazy fox\nJumped over something and bumped,\nHis head"
55
-
56
- loader.find_and_process(column, row)
57
-
58
- loader.load_object.value_as_text.should == row
59
-
60
- end
61
-
62
- it "should process a boolean field against an assigment method detail" do
63
-
64
- loader = LoaderBase.new(Project)
65
-
66
- column = :value_as_boolean
67
- row = true
68
-
69
- loader.find_and_process(column, row)
70
-
71
- loader.load_object.value_as_boolean.should == row
72
-
73
- row = 'false'
74
-
75
- loader.find_and_process(column, row)
76
-
77
- loader.load_object.value_as_boolean.should == false
78
-
79
-
80
- end
81
-
82
- it "should process a double field against an assigment operator" do
83
- end
84
-
85
- it "should process various date formats against a date assigment operator" do
86
-
87
- loader = LoaderBase.new(Project)
88
-
89
- column = :value_as_datetime
90
-
91
- loader.find_and_process(column, Time.now)
92
- loader.load_object.value_as_datetime.should_not be_nil
93
-
94
- loader.find_and_process(column, "2011-07-23")
95
- loader.load_object.value_as_datetime.should_not be_nil
96
-
97
- loader.find_and_process(column, "Sat Jul 23 09:01:56 +0100 2011")
98
- loader.load_object.value_as_datetime.should_not be_nil
99
-
100
- loader.find_and_process(column, Time.now.to_s(:db))
101
- loader.load_object.value_as_datetime.should_not be_nil
102
-
103
- loader.find_and_process(column, "Jul 23 2011 23:02:59")
104
- loader.load_object.value_as_datetime.should_not be_nil
105
-
106
- if(Guards.jruby?)
107
- loader.find_and_process(column, "07/23/2011") # dd/mm/YYYY
108
- loader.load_object.value_as_datetime.should_not be_nil
109
- end
110
-
111
- # bad casts - TODO - is this really an error needs raising ?
112
- loader.find_and_process(column, "2011 07 23")
113
- loader.load_object.value_as_datetime.should be_nil
114
-
115
-
116
- loader.find_and_process(column, "2011-23-07")
117
- loader.load_object.value_as_datetime.should be_nil
118
-
119
- end
120
-
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Aug 2011
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for base class Loader
7
+ #
8
+ require File.dirname(__FILE__) + '/spec_helper'
9
+
10
+ require 'erb'
11
+
12
+ describe 'Basic Loader' do
13
+
14
+ before(:all) do
15
+ db_connect( 'test_file' ) # , test_memory, test_mysql
16
+
17
+ # load our test model definitions - Project etc
18
+ require File.join($DataShiftFixturePath, 'test_model_defs')
19
+
20
+ migrate_up
21
+ @klazz = Project
22
+ end
23
+
24
+ before(:each) do
25
+ MethodMapper.clear
26
+ MethodMapper.find_operators( @klazz )
27
+ end
28
+
29
+ it "should be able to create a new loader and load object" do
30
+ loader = LoaderBase.new( @klazz )
31
+
32
+ loader.load_object.should_not be_nil
33
+ loader.load_object.should be_is_a(@klazz)
34
+ loader.load_object.new_record?.should be_true
35
+ end
36
+
37
+ it "should process a string field against an assigment method detail" do
38
+
39
+ loader = LoaderBase.new(Project)
40
+
41
+ column = 'Value As String'
42
+ row = 'Another Lazy fox '
43
+
44
+ loader.find_and_process(column, row)
45
+
46
+ loader.load_object.value_as_string.should == row
47
+ end
48
+
49
+ it "should process a text field against an assigment method detail" do
50
+
51
+ loader = LoaderBase.new(Project)
52
+
53
+ column = :value_as_text
54
+ row = "Another Lazy fox\nJumped over something and bumped,\nHis head"
55
+
56
+ loader.find_and_process(column, row)
57
+
58
+ loader.load_object.value_as_text.should == row
59
+
60
+ end
61
+
62
+ it "should process a boolean field against an assigment method detail" do
63
+
64
+ loader = LoaderBase.new(Project)
65
+
66
+ column = :value_as_boolean
67
+ row = true
68
+
69
+ loader.find_and_process(column, row)
70
+
71
+ loader.load_object.value_as_boolean.should == row
72
+
73
+ row = 'false'
74
+
75
+ loader.find_and_process(column, row)
76
+
77
+ loader.load_object.value_as_boolean.should == false
78
+
79
+
80
+ end
81
+
82
+ it "should process a double field against an assigment operator" do
83
+ end
84
+
85
+ it "should process various date formats against a date assigment operator" do
86
+
87
+ loader = LoaderBase.new(Project)
88
+
89
+ column = :value_as_datetime
90
+
91
+ loader.find_and_process(column, Time.now)
92
+ loader.load_object.value_as_datetime.should_not be_nil
93
+
94
+ loader.find_and_process(column, "2011-07-23")
95
+ loader.load_object.value_as_datetime.should_not be_nil
96
+
97
+ loader.find_and_process(column, "Sat Jul 23 09:01:56 +0100 2011")
98
+ loader.load_object.value_as_datetime.should_not be_nil
99
+
100
+ loader.find_and_process(column, Time.now.to_s(:db))
101
+ loader.load_object.value_as_datetime.should_not be_nil
102
+
103
+ loader.find_and_process(column, "Jul 23 2011 23:02:59")
104
+ loader.load_object.value_as_datetime.should_not be_nil
105
+
106
+ if(Guards.jruby?)
107
+ loader.find_and_process(column, "07/23/2011") # dd/mm/YYYY
108
+ loader.load_object.value_as_datetime.should_not be_nil
109
+ end
110
+
111
+ # bad casts - TODO - is this really an error needs raising ?
112
+ loader.find_and_process(column, "2011 07 23")
113
+ loader.load_object.value_as_datetime.should be_nil
114
+
115
+
116
+ loader.find_and_process(column, "2011-23-07")
117
+ loader.load_object.value_as_datetime.should be_nil
118
+
119
+ end
120
+
121
121
  end
@@ -1,238 +1,238 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
2
- # Author :: Tom Statter
3
- # Date :: Aug 2011
4
- # License:: MIT
5
- #
6
- # Details:: Specs for MethodMapper aspect of Active Record Loader
7
- # MethodMapper provides the bridge between 'strings' e.g column headings
8
- # and a classes different types of assignment operators
9
- #
10
- require File.dirname(__FILE__) + '/spec_helper'
11
-
12
- describe 'Method Mapping' do
13
-
14
- before(:all) do
15
- db_connect( 'test_file' ) # , test_memory, test_mysql
16
- migrate_up
17
- @klazz = Project
18
- @assoc_klazz = Milestone
19
- end
20
-
21
- before(:each) do
22
- MethodMapper.clear
23
- MethodMapper.find_operators( @klazz )
24
- MethodMapper.find_operators( @assoc_klazz )
25
- end
26
-
27
- it "should populate method map for a given AR model" do
28
-
29
- MethodMapper.has_many.should_not be_empty
30
- MethodMapper.has_many[Project].should include('milestones')
31
-
32
- MethodMapper.assignments.should_not be_empty
33
- MethodMapper.assignments[Project].should include('id')
34
- MethodMapper.assignments[Project].should include('value_as_string')
35
- MethodMapper.assignments[Project].should include('value_as_text')
36
-
37
- MethodMapper.belongs_to.should_not be_empty
38
- MethodMapper.belongs_to[Project].should be_empty
39
-
40
-
41
- MethodMapper.column_types.should be_is_a(Hash)
42
- MethodMapper.column_types.should_not be_empty
43
- MethodMapper.column_types[Project].size.should == Project.columns.size
44
-
45
-
46
- end
47
-
48
- it "should populate assigment members without the equivalent association names" do
49
-
50
- # we should remove has-many & belongs_to from basic assignment set as they require a DB lookup
51
- # or a Model.create call, not a simple assignment
52
-
53
- MethodMapper.assignments_for(@klazz).should_not include( MethodMapper.belongs_to_for(@klazz) )
54
- MethodMapper.assignments_for(@klazz).should_not include( MethodMapper.has_many_for(@klazz) )
55
- end
56
-
57
-
58
- it "should populate assignment operators for method details for different forms of a column name" do
59
-
60
- [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |format|
61
-
62
- method_details = MethodMapper.find_method_detail( @klazz, format )
63
-
64
- method_details.class.should == MethodDetail
65
-
66
- method_details.name.should eq( format.to_s )
67
-
68
- method_details.operator.should == 'value_as_string'
69
- method_details.operator_for(:assignment).should == 'value_as_string'
70
-
71
- method_details.operator?('value_as_string').should be_true
72
- method_details.operator?('blah_as_string').should be_false
73
-
74
- method_details.operator_for(:belongs_to).should be_nil
75
- method_details.operator_for(:has_many).should be_nil
76
- end
77
- end
78
-
79
-
80
- # Note : Not all assignments will currently have a column type, for example
81
- # those that are derived from a delegate_belongs_to
82
-
83
- it "should populate column types for assignment operators in method details" do
84
-
85
- [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |format|
86
-
87
- method_details = MethodMapper.find_method_detail( @klazz, format )
88
-
89
- method_details.class.should == MethodDetail
90
-
91
- method_details.col_type.should_not be_nil
92
- method_details.col_type.name.should == 'value_as_string'
93
- method_details.col_type.default.should == nil
94
- method_details.col_type.sql_type.should include 'varchar(255)' # db specific, sqlite
95
- method_details.col_type.type.should == :string
96
- end
97
- end
98
-
99
- it "should populate required Class for assignment operators based on column type" do
100
-
101
- [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |format|
102
-
103
- method_details = MethodMapper.find_method_detail( Project, format )
104
-
105
- method_details.operator_class_name.should == 'String'
106
- method_details.operator_class.should be_is_a(Class)
107
- method_details.operator_class.should == String
108
- end
109
-
110
- end
111
-
112
- it "should populate belongs_to operator for method details for different forms of a column name" do
113
-
114
- # milestone.project = project.id
115
- [:project, 'project', "PROJECT", "prOJECt"].each do |format|
116
-
117
- method_details = MethodMapper.find_method_detail( Milestone, format )
118
-
119
- method_details.should_not be_nil
120
-
121
- method_details.operator.should == 'project'
122
- method_details.operator_for(:belongs_to).should == 'project'
123
-
124
- method_details.operator_for(:assignment).should be_nil
125
- method_details.operator_for(:has_many).should be_nil
126
- end
127
-
128
- end
129
-
130
- it "should populate required Class for belongs_to operator method details" do
131
-
132
- MethodMapper.find_operators( LoaderRelease )
133
- MethodMapper.find_operators( LongAndComplexTableLinkedToVersion )
134
-
135
- # release.project = project.id
136
- [:project, 'project', "PROJECT", "prOJECt"].each do |format|
137
-
138
- method_details = MethodMapper.find_method_detail( LoaderRelease, format )
139
-
140
- method_details.operator_class_name.should == 'Project'
141
- method_details.operator_class.should == Project
142
- end
143
-
144
-
145
- #LongAndComplexTableLinkedToVersion.version = version.id
146
-
147
- [:version, "Version", "verSION"].each do |format|
148
- method_details = MethodMapper.find_method_detail( LongAndComplexTableLinkedToVersion, format )
149
-
150
- method_details.operator_type.should == :belongs_to
151
-
152
- method_details.operator_class_name.should == 'Version'
153
- method_details.operator_class.should == Version
154
- end
155
- end
156
-
157
- it "should populate required Class for has_one operator method details" do
158
-
159
- MethodMapper.find_operators( Version )
160
-
161
- # version.long_and_complex_table_linked_to_version = LongAndComplexTableLinkedToVersion.create()
162
-
163
- [:long_and_complex_table_linked_to_version, 'LongAndComplexTableLinkedToVersion', "Long And Complex_Table_Linked To Version", "Long_And_Complex_Table_Linked_To_Version"].each do |format|
164
- method_details = MethodMapper.find_method_detail( Version, format )
165
-
166
- method_details.should_not be_nil
167
-
168
- method_details.operator.should == 'long_and_complex_table_linked_to_version'
169
-
170
- method_details.operator_type.should == :has_one
171
-
172
- method_details.operator_class_name.should == 'LongAndComplexTableLinkedToVersion'
173
- method_details.operator_class.should == LongAndComplexTableLinkedToVersion
174
- end
175
- end
176
-
177
-
178
- it "should find has_many operator for method details" do
179
-
180
- [:milestones, "Mile Stones", 'mileSTONES', 'MileStones'].each do |format|
181
-
182
- method_details = MethodMapper.find_method_detail( Project, format )
183
-
184
- method_details.class.should == MethodDetail
185
-
186
- result = 'milestones'
187
- method_details.operator.should == result
188
- method_details.operator_for(:has_many).should == result
189
-
190
- method_details.operator_for(:belongs_to).should be_nil
191
- method_details.operator_for(:assignments).should be_nil
192
- end
193
-
194
- end
195
-
196
-
197
- it "should return nil when non existent column name" do
198
- ["On sale", 'on_sale'].each do |format|
199
- detail = MethodMapper.find_method_detail( @klazz, format )
200
-
201
- detail.should be_nil
202
- end
203
- end
204
-
205
-
206
- it "should find a set of methods based on a list of column names" do
207
-
208
- mapper = MethodMapper.new
209
-
210
- [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |column_name_format|
211
-
212
- method_details = MethodMapper.find_method_detail( @klazz, column_name_format )
213
-
214
- method_details.class.should == MethodDetail
215
-
216
- method_details.col_type.should_not be_nil
217
- method_details.col_type.name.should == 'value_as_string'
218
- method_details.col_type.default.should == nil
219
- method_details.col_type.sql_type.should include 'varchar(255)' # db specific, sqlite
220
- method_details.col_type.type.should == :string
221
- end
222
- end
223
-
224
- it "should not by default map setter methods", :fail => true do
225
- MethodMapper.assignments[Milestone].should_not include('title')
226
- end
227
-
228
- it "should support reload and inclusion of setter methods", :fail => true do
229
-
230
- MethodMapper.assignments[Milestone].should_not include('title')
231
-
232
- MethodMapper.find_operators( Milestone, :reload => true, :instance_methods => true )
233
-
234
- # Milestone delegates :title to Project
235
- MethodMapper.assignments[Milestone].should include('title')
236
- end
237
-
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Aug 2011
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for MethodMapper aspect of Active Record Loader
7
+ # MethodMapper provides the bridge between 'strings' e.g column headings
8
+ # and a classes different types of assignment operators
9
+ #
10
+ require File.dirname(__FILE__) + '/spec_helper'
11
+
12
+ describe 'Method Mapping' do
13
+
14
+ before(:all) do
15
+ db_connect( 'test_file' ) # , test_memory, test_mysql
16
+ migrate_up
17
+ @klazz = Project
18
+ @assoc_klazz = Milestone
19
+ end
20
+
21
+ before(:each) do
22
+ MethodMapper.clear
23
+ MethodMapper.find_operators( @klazz )
24
+ MethodMapper.find_operators( @assoc_klazz )
25
+ end
26
+
27
+ it "should populate method map for a given AR model" do
28
+
29
+ MethodMapper.has_many.should_not be_empty
30
+ MethodMapper.has_many[Project].should include('milestones')
31
+
32
+ MethodMapper.assignments.should_not be_empty
33
+ MethodMapper.assignments[Project].should include('id')
34
+ MethodMapper.assignments[Project].should include('value_as_string')
35
+ MethodMapper.assignments[Project].should include('value_as_text')
36
+
37
+ MethodMapper.belongs_to.should_not be_empty
38
+ MethodMapper.belongs_to[Project].should be_empty
39
+
40
+
41
+ MethodMapper.column_types.should be_is_a(Hash)
42
+ MethodMapper.column_types.should_not be_empty
43
+ MethodMapper.column_types[Project].size.should == Project.columns.size
44
+
45
+
46
+ end
47
+
48
+ it "should populate assigment members without the equivalent association names" do
49
+
50
+ # we should remove has-many & belongs_to from basic assignment set as they require a DB lookup
51
+ # or a Model.create call, not a simple assignment
52
+
53
+ MethodMapper.assignments_for(@klazz).should_not include( MethodMapper.belongs_to_for(@klazz) )
54
+ MethodMapper.assignments_for(@klazz).should_not include( MethodMapper.has_many_for(@klazz) )
55
+ end
56
+
57
+
58
+ it "should populate assignment operators for method details for different forms of a column name" do
59
+
60
+ [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |format|
61
+
62
+ method_details = MethodMapper.find_method_detail( @klazz, format )
63
+
64
+ method_details.class.should == MethodDetail
65
+
66
+ method_details.name.should eq( format.to_s )
67
+
68
+ method_details.operator.should == 'value_as_string'
69
+ method_details.operator_for(:assignment).should == 'value_as_string'
70
+
71
+ method_details.operator?('value_as_string').should be_true
72
+ method_details.operator?('blah_as_string').should be_false
73
+
74
+ method_details.operator_for(:belongs_to).should be_nil
75
+ method_details.operator_for(:has_many).should be_nil
76
+ end
77
+ end
78
+
79
+
80
+ # Note : Not all assignments will currently have a column type, for example
81
+ # those that are derived from a delegate_belongs_to
82
+
83
+ it "should populate column types for assignment operators in method details" do
84
+
85
+ [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |format|
86
+
87
+ method_details = MethodMapper.find_method_detail( @klazz, format )
88
+
89
+ method_details.class.should == MethodDetail
90
+
91
+ method_details.col_type.should_not be_nil
92
+ method_details.col_type.name.should == 'value_as_string'
93
+ method_details.col_type.default.should == nil
94
+ method_details.col_type.sql_type.should include 'varchar(255)' # db specific, sqlite
95
+ method_details.col_type.type.should == :string
96
+ end
97
+ end
98
+
99
+ it "should populate required Class for assignment operators based on column type" do
100
+
101
+ [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |format|
102
+
103
+ method_details = MethodMapper.find_method_detail( Project, format )
104
+
105
+ method_details.operator_class_name.should == 'String'
106
+ method_details.operator_class.should be_is_a(Class)
107
+ method_details.operator_class.should == String
108
+ end
109
+
110
+ end
111
+
112
+ it "should populate belongs_to operator for method details for different forms of a column name" do
113
+
114
+ # milestone.project = project.id
115
+ [:project, 'project', "PROJECT", "prOJECt"].each do |format|
116
+
117
+ method_details = MethodMapper.find_method_detail( Milestone, format )
118
+
119
+ method_details.should_not be_nil
120
+
121
+ method_details.operator.should == 'project'
122
+ method_details.operator_for(:belongs_to).should == 'project'
123
+
124
+ method_details.operator_for(:assignment).should be_nil
125
+ method_details.operator_for(:has_many).should be_nil
126
+ end
127
+
128
+ end
129
+
130
+ it "should populate required Class for belongs_to operator method details" do
131
+
132
+ MethodMapper.find_operators( LoaderRelease )
133
+ MethodMapper.find_operators( LongAndComplexTableLinkedToVersion )
134
+
135
+ # release.project = project.id
136
+ [:project, 'project', "PROJECT", "prOJECt"].each do |format|
137
+
138
+ method_details = MethodMapper.find_method_detail( LoaderRelease, format )
139
+
140
+ method_details.operator_class_name.should == 'Project'
141
+ method_details.operator_class.should == Project
142
+ end
143
+
144
+
145
+ #LongAndComplexTableLinkedToVersion.version = version.id
146
+
147
+ [:version, "Version", "verSION"].each do |format|
148
+ method_details = MethodMapper.find_method_detail( LongAndComplexTableLinkedToVersion, format )
149
+
150
+ method_details.operator_type.should == :belongs_to
151
+
152
+ method_details.operator_class_name.should == 'Version'
153
+ method_details.operator_class.should == Version
154
+ end
155
+ end
156
+
157
+ it "should populate required Class for has_one operator method details" do
158
+
159
+ MethodMapper.find_operators( Version )
160
+
161
+ # version.long_and_complex_table_linked_to_version = LongAndComplexTableLinkedToVersion.create()
162
+
163
+ [:long_and_complex_table_linked_to_version, 'LongAndComplexTableLinkedToVersion', "Long And Complex_Table_Linked To Version", "Long_And_Complex_Table_Linked_To_Version"].each do |format|
164
+ method_details = MethodMapper.find_method_detail( Version, format )
165
+
166
+ method_details.should_not be_nil
167
+
168
+ method_details.operator.should == 'long_and_complex_table_linked_to_version'
169
+
170
+ method_details.operator_type.should == :has_one
171
+
172
+ method_details.operator_class_name.should == 'LongAndComplexTableLinkedToVersion'
173
+ method_details.operator_class.should == LongAndComplexTableLinkedToVersion
174
+ end
175
+ end
176
+
177
+
178
+ it "should find has_many operator for method details" do
179
+
180
+ [:milestones, "Mile Stones", 'mileSTONES', 'MileStones'].each do |format|
181
+
182
+ method_details = MethodMapper.find_method_detail( Project, format )
183
+
184
+ method_details.class.should == MethodDetail
185
+
186
+ result = 'milestones'
187
+ method_details.operator.should == result
188
+ method_details.operator_for(:has_many).should == result
189
+
190
+ method_details.operator_for(:belongs_to).should be_nil
191
+ method_details.operator_for(:assignments).should be_nil
192
+ end
193
+
194
+ end
195
+
196
+
197
+ it "should return nil when non existent column name" do
198
+ ["On sale", 'on_sale'].each do |format|
199
+ detail = MethodMapper.find_method_detail( @klazz, format )
200
+
201
+ detail.should be_nil
202
+ end
203
+ end
204
+
205
+
206
+ it "should find a set of methods based on a list of column names" do
207
+
208
+ mapper = MethodMapper.new
209
+
210
+ [:value_as_string, 'value_as_string', "VALUE as_STRING", "value as string"].each do |column_name_format|
211
+
212
+ method_details = MethodMapper.find_method_detail( @klazz, column_name_format )
213
+
214
+ method_details.class.should == MethodDetail
215
+
216
+ method_details.col_type.should_not be_nil
217
+ method_details.col_type.name.should == 'value_as_string'
218
+ method_details.col_type.default.should == nil
219
+ method_details.col_type.sql_type.should include 'varchar(255)' # db specific, sqlite
220
+ method_details.col_type.type.should == :string
221
+ end
222
+ end
223
+
224
+ it "should not by default map setter methods", :fail => true do
225
+ MethodMapper.assignments[Milestone].should_not include('title')
226
+ end
227
+
228
+ it "should support reload and inclusion of setter methods", :fail => true do
229
+
230
+ MethodMapper.assignments[Milestone].should_not include('title')
231
+
232
+ MethodMapper.find_operators( Milestone, :reload => true, :instance_methods => true )
233
+
234
+ # Milestone delegates :title to Project
235
+ MethodMapper.assignments[Milestone].should include('title')
236
+ end
237
+
238
238
  end