importable 0.0.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.
Files changed (227) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/javascripts/importable/application.js +7 -0
  5. data/app/assets/javascripts/importable/spreadsheets.js +2 -0
  6. data/app/assets/stylesheets/importable/application.css +7 -0
  7. data/app/assets/stylesheets/importable/spreadsheets.css +4 -0
  8. data/app/controllers/importable/application_controller.rb +4 -0
  9. data/app/controllers/importable/spreadsheets_controller.rb +74 -0
  10. data/app/models/importable/spreadsheet.rb +88 -0
  11. data/app/views/importable/spreadsheets/_actions.erb +6 -0
  12. data/app/views/importable/spreadsheets/_choose_worksheet_step.erb +23 -0
  13. data/app/views/importable/spreadsheets/_errors.erb +11 -0
  14. data/app/views/importable/spreadsheets/_form.html.erb +1 -0
  15. data/app/views/importable/spreadsheets/_upload_file_step.erb +12 -0
  16. data/app/views/importable/spreadsheets/new.html.erb +3 -0
  17. data/app/views/importable/spreadsheets/show.html.erb +3 -0
  18. data/config/routes.rb +16 -0
  19. data/db/development.sqlite3 +0 -0
  20. data/db/migrate/20110915001957_create_importable_spreadsheets.rb +10 -0
  21. data/lib/importable/engine.rb +5 -0
  22. data/lib/importable/exceptions.rb +3 -0
  23. data/lib/importable/mapper.rb +40 -0
  24. data/lib/importable/multi_step/import_helpers.rb +39 -0
  25. data/lib/importable/uploader.rb +13 -0
  26. data/lib/importable/validator.rb +16 -0
  27. data/lib/importable/version.rb +3 -0
  28. data/lib/importable.rb +12 -0
  29. data/lib/tasks/importable_tasks.rake +0 -0
  30. data/spec/acceptance/import_spreadsheet_spec.rb +33 -0
  31. data/spec/controllers/importable/spreadsheets_controller_spec.rb +152 -0
  32. data/spec/dummy/Rakefile +7 -0
  33. data/spec/dummy/app/assets/javascripts/application.js +7 -0
  34. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  35. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  36. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  37. data/spec/dummy/app/imports/foo_mapper.rb +5 -0
  38. data/spec/dummy/app/imports/foo_required_field_mapper.rb +5 -0
  39. data/spec/dummy/app/imports/plural_widgets_mapper.rb +5 -0
  40. data/spec/dummy/app/imports/singular_widget_mapper.rb +5 -0
  41. data/spec/dummy/app/models/foo.rb +2 -0
  42. data/spec/dummy/app/models/foo_required_field.rb +3 -0
  43. data/spec/dummy/app/views/layouts/importable/application.html.erb +18 -0
  44. data/spec/dummy/config/application.rb +45 -0
  45. data/spec/dummy/config/boot.rb +10 -0
  46. data/spec/dummy/config/database.yml +11 -0
  47. data/spec/dummy/config/environment.rb +5 -0
  48. data/spec/dummy/config/environments/development.rb +30 -0
  49. data/spec/dummy/config/environments/production.rb +60 -0
  50. data/spec/dummy/config/environments/test.rb +42 -0
  51. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  52. data/spec/dummy/config/initializers/inflections.rb +10 -0
  53. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  54. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  55. data/spec/dummy/config/initializers/session_store.rb +8 -0
  56. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  57. data/spec/dummy/config/locales/en.yml +5 -0
  58. data/spec/dummy/config/routes.rb +3 -0
  59. data/spec/dummy/config.ru +4 -0
  60. data/spec/dummy/db/development.sqlite3 +0 -0
  61. data/spec/dummy/db/migrate/20110913175340_create_foo_required_fields.rb +10 -0
  62. data/spec/dummy/db/migrate/20110913175348_create_foos.rb +20 -0
  63. data/spec/dummy/db/schema.rb +45 -0
  64. data/spec/dummy/db/test.sqlite3 +0 -0
  65. data/spec/dummy/log/development.log +1440 -0
  66. data/spec/dummy/log/test.log +12899 -0
  67. data/spec/dummy/public/404.html +26 -0
  68. data/spec/dummy/public/422.html +26 -0
  69. data/spec/dummy/public/500.html +26 -0
  70. data/spec/dummy/public/favicon.ico +0 -0
  71. data/spec/dummy/script/rails +6 -0
  72. data/spec/dummy/tmp/cache/assets/C84/C40/sprockets%2F7f0912160518f10045d9e488fc7436af +0 -0
  73. data/spec/dummy/tmp/cache/assets/C92/520/sprockets%2F22333678e07cb97428c92fe9a9f33283 +0 -0
  74. data/spec/dummy/tmp/cache/assets/CAD/170/sprockets%2F96fb203c710450777e6c21c337e5a9d3 +0 -0
  75. data/spec/dummy/tmp/cache/assets/CC8/800/sprockets%2F804f348fd27bfb7555b2e9977494612e +0 -0
  76. data/spec/dummy/tmp/cache/assets/CEC/F40/sprockets%2Feef825d9227d8044ea22a9ce75328574 +0 -0
  77. data/spec/dummy/tmp/cache/assets/D0F/F30/sprockets%2F1c0c77bdf759cb307e0d9a071367476b +0 -0
  78. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  79. data/spec/dummy/tmp/cache/assets/D4D/A30/sprockets%2F256edbd7ad8e5d6e144e648e82150b89 +0 -0
  80. data/spec/dummy/tmp/cache/assets/D4F/9D0/sprockets%2Fd1cf18a7bc4837a9f12a55e76608f79e +0 -0
  81. data/spec/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
  82. data/spec/dummy/tmp/cache/assets/D7B/2D0/sprockets%2F67457fb6359b5cc7faf0ad1e432996db +0 -0
  83. data/spec/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
  84. data/spec/dummy/tmp/cache/assets/DAC/950/sprockets%2Fbc53a3fdde9e5350798e72aa7f78ab28 +0 -0
  85. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  86. data/spec/dummy/tmp/capybara/capybara-201109142003362645406331.html +14 -0
  87. data/spec/dummy/tmp/capybara/capybara-201109142004009667888038.html +14 -0
  88. data/spec/dummy/uploads/importable/spreadsheet/file/foo/503/foo_single_worksheet.xlsx +0 -0
  89. data/spec/dummy/uploads/importable/spreadsheet/file/foo/504/foo_multi_worksheet.xlsx +0 -0
  90. data/spec/dummy/uploads/importable/spreadsheet/file/foo/505/foo_multi_worksheet.xlsx +0 -0
  91. data/spec/dummy/uploads/importable/spreadsheet/file/foo/506/foo_multi_worksheet.xlsx +0 -0
  92. data/spec/dummy/uploads/importable/spreadsheet/file/foo/507/foo_multi_worksheet.xlsx +0 -0
  93. data/spec/dummy/uploads/importable/spreadsheet/file/foo/508/foo_multi_worksheet.xlsx +0 -0
  94. data/spec/dummy/uploads/importable/spreadsheet/file/foo/509/foo_multi_worksheet.xlsx +0 -0
  95. data/spec/dummy/uploads/importable/spreadsheet/file/foo/510/foo_multi_worksheet.xlsx +0 -0
  96. data/spec/dummy/uploads/importable/spreadsheet/file/foo/511/foo_multi_worksheet.xlsx +0 -0
  97. data/spec/dummy/uploads/importable/spreadsheet/file/foo/512/foo_multi_worksheet.xlsx +0 -0
  98. data/spec/dummy/uploads/importable/spreadsheet/file/foo/513/foo_multi_worksheet.xlsx +0 -0
  99. data/spec/dummy/uploads/importable/spreadsheet/file/foo/514/foo_multi_worksheet.xlsx +0 -0
  100. data/spec/dummy/uploads/importable/spreadsheet/file/foo/515/foo_multi_worksheet.xlsx +0 -0
  101. data/spec/dummy/uploads/importable/spreadsheet/file/foo/516/foo_multi_worksheet.xlsx +0 -0
  102. data/spec/dummy/uploads/importable/spreadsheet/file/foo/517/foo_multi_worksheet.xlsx +0 -0
  103. data/spec/dummy/uploads/importable/spreadsheet/file/foo/518/foo_multi_worksheet.xlsx +0 -0
  104. data/spec/dummy/uploads/importable/spreadsheet/file/foo/519/foo_multi_worksheet.xlsx +0 -0
  105. data/spec/dummy/uploads/importable/spreadsheet/file/foo/520/foo_multi_worksheet.xlsx +0 -0
  106. data/spec/dummy/uploads/importable/spreadsheet/file/foo/521/foo_single_worksheet.xlsx +0 -0
  107. data/spec/dummy/uploads/importable/spreadsheet/file/foo/522/foo_multi_worksheet.xlsx +0 -0
  108. data/spec/dummy/uploads/importable/spreadsheet/file/foo/523/foo_multi_worksheet.xlsx +0 -0
  109. data/spec/dummy/uploads/importable/spreadsheet/file/foo/524/foo_multi_worksheet.xlsx +0 -0
  110. data/spec/dummy/uploads/importable/spreadsheet/file/foo/525/foo_multi_worksheet.xlsx +0 -0
  111. data/spec/dummy/uploads/importable/spreadsheet/file/foo/526/foo_multi_worksheet.xlsx +0 -0
  112. data/spec/dummy/uploads/importable/spreadsheet/file/foo/527/foo_multi_worksheet.xlsx +0 -0
  113. data/spec/dummy/uploads/importable/spreadsheet/file/foo/528/foo_multi_worksheet.xlsx +0 -0
  114. data/spec/dummy/uploads/importable/spreadsheet/file/foo/529/foo_multi_worksheet.xlsx +0 -0
  115. data/spec/dummy/uploads/importable/spreadsheet/file/foo/530/foo_multi_worksheet.xlsx +0 -0
  116. data/spec/dummy/uploads/importable/spreadsheet/file/foo/531/foo_multi_worksheet.xlsx +0 -0
  117. data/spec/dummy/uploads/importable/spreadsheet/file/foo/532/foo_multi_worksheet.xlsx +0 -0
  118. data/spec/dummy/uploads/importable/spreadsheet/file/foo/533/foo_multi_worksheet.xlsx +0 -0
  119. data/spec/dummy/uploads/importable/spreadsheet/file/foo/534/foo_multi_worksheet.xlsx +0 -0
  120. data/spec/dummy/uploads/importable/spreadsheet/file/foo/535/foo_multi_worksheet.xlsx +0 -0
  121. data/spec/dummy/uploads/importable/spreadsheet/file/foo/536/foo_multi_worksheet.xlsx +0 -0
  122. data/spec/dummy/uploads/importable/spreadsheet/file/foo/537/foo_multi_worksheet.xlsx +0 -0
  123. data/spec/dummy/uploads/importable/spreadsheet/file/foo/538/foo_multi_worksheet.xlsx +0 -0
  124. data/spec/dummy/uploads/importable/spreadsheet/file/foo/539/foo_single_worksheet.xlsx +0 -0
  125. data/spec/dummy/uploads/importable/spreadsheet/file/foo/540/foo_multi_worksheet.xlsx +0 -0
  126. data/spec/dummy/uploads/importable/spreadsheet/file/foo/541/foo_multi_worksheet.xlsx +0 -0
  127. data/spec/dummy/uploads/importable/spreadsheet/file/foo/542/foo_multi_worksheet.xlsx +0 -0
  128. data/spec/dummy/uploads/importable/spreadsheet/file/foo/543/foo_multi_worksheet.xlsx +0 -0
  129. data/spec/dummy/uploads/importable/spreadsheet/file/foo/544/foo_multi_worksheet.xlsx +0 -0
  130. data/spec/dummy/uploads/importable/spreadsheet/file/foo/545/foo_multi_worksheet.xlsx +0 -0
  131. data/spec/dummy/uploads/importable/spreadsheet/file/foo/546/foo_multi_worksheet.xlsx +0 -0
  132. data/spec/dummy/uploads/importable/spreadsheet/file/foo/547/foo_multi_worksheet.xlsx +0 -0
  133. data/spec/dummy/uploads/importable/spreadsheet/file/foo/548/foo_multi_worksheet.xlsx +0 -0
  134. data/spec/dummy/uploads/importable/spreadsheet/file/foo/549/foo_multi_worksheet.xlsx +0 -0
  135. data/spec/dummy/uploads/importable/spreadsheet/file/foo/550/foo_multi_worksheet.xlsx +0 -0
  136. data/spec/dummy/uploads/importable/spreadsheet/file/foo/551/foo_multi_worksheet.xlsx +0 -0
  137. data/spec/dummy/uploads/importable/spreadsheet/file/foo/552/foo_multi_worksheet.xlsx +0 -0
  138. data/spec/dummy/uploads/importable/spreadsheet/file/foo/553/foo_multi_worksheet.xlsx +0 -0
  139. data/spec/dummy/uploads/importable/spreadsheet/file/foo/554/foo_multi_worksheet.xlsx +0 -0
  140. data/spec/dummy/uploads/importable/spreadsheet/file/foo/555/foo_multi_worksheet.xlsx +0 -0
  141. data/spec/dummy/uploads/importable/spreadsheet/file/foo/556/foo_multi_worksheet.xlsx +0 -0
  142. data/spec/dummy/uploads/importable/spreadsheet/file/foo/557/foo_single_worksheet.xlsx +0 -0
  143. data/spec/dummy/uploads/importable/spreadsheet/file/foo/558/foo_multi_worksheet.xlsx +0 -0
  144. data/spec/dummy/uploads/importable/spreadsheet/file/foo/559/foo_multi_worksheet.xlsx +0 -0
  145. data/spec/dummy/uploads/importable/spreadsheet/file/foo/560/foo_multi_worksheet.xlsx +0 -0
  146. data/spec/dummy/uploads/importable/spreadsheet/file/foo/561/foo_multi_worksheet.xlsx +0 -0
  147. data/spec/dummy/uploads/importable/spreadsheet/file/foo/562/foo_multi_worksheet.xlsx +0 -0
  148. data/spec/dummy/uploads/importable/spreadsheet/file/foo/563/foo_multi_worksheet.xlsx +0 -0
  149. data/spec/dummy/uploads/importable/spreadsheet/file/foo/564/foo_multi_worksheet.xlsx +0 -0
  150. data/spec/dummy/uploads/importable/spreadsheet/file/foo/565/foo_multi_worksheet.xlsx +0 -0
  151. data/spec/dummy/uploads/importable/spreadsheet/file/foo/566/foo_multi_worksheet.xlsx +0 -0
  152. data/spec/dummy/uploads/importable/spreadsheet/file/foo/567/foo_multi_worksheet.xlsx +0 -0
  153. data/spec/dummy/uploads/importable/spreadsheet/file/foo/568/foo_multi_worksheet.xlsx +0 -0
  154. data/spec/dummy/uploads/importable/spreadsheet/file/foo/569/foo_multi_worksheet.xlsx +0 -0
  155. data/spec/dummy/uploads/importable/spreadsheet/file/foo/570/foo_multi_worksheet.xlsx +0 -0
  156. data/spec/dummy/uploads/importable/spreadsheet/file/foo/571/foo_multi_worksheet.xlsx +0 -0
  157. data/spec/dummy/uploads/importable/spreadsheet/file/foo/572/foo_multi_worksheet.xlsx +0 -0
  158. data/spec/dummy/uploads/importable/spreadsheet/file/foo/573/foo_multi_worksheet.xlsx +0 -0
  159. data/spec/dummy/uploads/importable/spreadsheet/file/foo/574/foo_multi_worksheet.xlsx +0 -0
  160. data/spec/dummy/uploads/importable/spreadsheet/file/foo/575/foo_single_worksheet.xlsx +0 -0
  161. data/spec/dummy/uploads/importable/spreadsheet/file/foo/576/foo_multi_worksheet.xlsx +0 -0
  162. data/spec/dummy/uploads/importable/spreadsheet/file/foo/577/foo_multi_worksheet.xlsx +0 -0
  163. data/spec/dummy/uploads/importable/spreadsheet/file/foo/578/foo_multi_worksheet.xlsx +0 -0
  164. data/spec/dummy/uploads/importable/spreadsheet/file/foo/579/foo_multi_worksheet.xlsx +0 -0
  165. data/spec/dummy/uploads/importable/spreadsheet/file/foo/580/foo_multi_worksheet.xlsx +0 -0
  166. data/spec/dummy/uploads/importable/spreadsheet/file/foo/581/foo_multi_worksheet.xlsx +0 -0
  167. data/spec/dummy/uploads/importable/spreadsheet/file/foo/582/foo_multi_worksheet.xlsx +0 -0
  168. data/spec/dummy/uploads/importable/spreadsheet/file/foo/583/foo_multi_worksheet.xlsx +0 -0
  169. data/spec/dummy/uploads/importable/spreadsheet/file/foo/584/foo_multi_worksheet.xlsx +0 -0
  170. data/spec/dummy/uploads/importable/spreadsheet/file/foo/585/foo_multi_worksheet.xlsx +0 -0
  171. data/spec/dummy/uploads/importable/spreadsheet/file/foo/586/foo_multi_worksheet.xlsx +0 -0
  172. data/spec/dummy/uploads/importable/spreadsheet/file/foo/587/foo_multi_worksheet.xlsx +0 -0
  173. data/spec/dummy/uploads/importable/spreadsheet/file/foo/588/foo_multi_worksheet.xlsx +0 -0
  174. data/spec/dummy/uploads/importable/spreadsheet/file/foo/589/foo_multi_worksheet.xlsx +0 -0
  175. data/spec/dummy/uploads/importable/spreadsheet/file/foo/590/foo_multi_worksheet.xlsx +0 -0
  176. data/spec/dummy/uploads/importable/spreadsheet/file/foo/591/foo_multi_worksheet.xlsx +0 -0
  177. data/spec/dummy/uploads/importable/spreadsheet/file/foo/592/foo_multi_worksheet.xlsx +0 -0
  178. data/spec/dummy/uploads/importable/spreadsheet/file/foo/593/foo_single_worksheet.xlsx +0 -0
  179. data/spec/dummy/uploads/importable/spreadsheet/file/foo/594/foo_multi_worksheet.xlsx +0 -0
  180. data/spec/dummy/uploads/importable/spreadsheet/file/foo/595/foo_multi_worksheet.xlsx +0 -0
  181. data/spec/dummy/uploads/importable/spreadsheet/file/foo/596/foo_multi_worksheet.xlsx +0 -0
  182. data/spec/dummy/uploads/importable/spreadsheet/file/foo/597/foo_multi_worksheet.xlsx +0 -0
  183. data/spec/dummy/uploads/importable/spreadsheet/file/foo/598/foo_multi_worksheet.xlsx +0 -0
  184. data/spec/dummy/uploads/importable/spreadsheet/file/foo/599/foo_multi_worksheet.xlsx +0 -0
  185. data/spec/dummy/uploads/importable/spreadsheet/file/foo/600/foo_multi_worksheet.xlsx +0 -0
  186. data/spec/dummy/uploads/importable/spreadsheet/file/foo/601/foo_multi_worksheet.xlsx +0 -0
  187. data/spec/dummy/uploads/importable/spreadsheet/file/foo/602/foo_multi_worksheet.xlsx +0 -0
  188. data/spec/dummy/uploads/importable/spreadsheet/file/foo/603/foo_multi_worksheet.xlsx +0 -0
  189. data/spec/dummy/uploads/importable/spreadsheet/file/foo/604/foo_multi_worksheet.xlsx +0 -0
  190. data/spec/dummy/uploads/importable/spreadsheet/file/foo/605/foo_multi_worksheet.xlsx +0 -0
  191. data/spec/dummy/uploads/importable/spreadsheet/file/foo/606/foo_multi_worksheet.xlsx +0 -0
  192. data/spec/dummy/uploads/importable/spreadsheet/file/foo/607/foo_multi_worksheet.xlsx +0 -0
  193. data/spec/dummy/uploads/importable/spreadsheet/file/foo/608/foo_multi_worksheet.xlsx +0 -0
  194. data/spec/dummy/uploads/importable/spreadsheet/file/foo/609/foo_multi_worksheet.xlsx +0 -0
  195. data/spec/dummy/uploads/importable/spreadsheet/file/foo/610/foo_multi_worksheet.xlsx +0 -0
  196. data/spec/dummy/uploads/importable/spreadsheet/file/foo/611/foo_single_worksheet.xlsx +0 -0
  197. data/spec/dummy/uploads/importable/spreadsheet/file/foo/612/foo_multi_worksheet.xlsx +0 -0
  198. data/spec/dummy/uploads/importable/spreadsheet/file/foo/613/foo_multi_worksheet.xlsx +0 -0
  199. data/spec/dummy/uploads/importable/spreadsheet/file/foo/614/foo_multi_worksheet.xlsx +0 -0
  200. data/spec/dummy/uploads/importable/spreadsheet/file/foo/615/foo_multi_worksheet.xlsx +0 -0
  201. data/spec/dummy/uploads/importable/spreadsheet/file/foo/616/foo_multi_worksheet.xlsx +0 -0
  202. data/spec/dummy/uploads/importable/spreadsheet/file/foo/617/foo_multi_worksheet.xlsx +0 -0
  203. data/spec/dummy/uploads/importable/spreadsheet/file/foo/618/foo_multi_worksheet.xlsx +0 -0
  204. data/spec/dummy/uploads/importable/spreadsheet/file/foo/619/foo_multi_worksheet.xlsx +0 -0
  205. data/spec/dummy/uploads/importable/spreadsheet/file/foo/620/foo_multi_worksheet.xlsx +0 -0
  206. data/spec/dummy/uploads/importable/spreadsheet/file/foo/621/foo_multi_worksheet.xlsx +0 -0
  207. data/spec/dummy/uploads/importable/spreadsheet/file/foo/622/foo_multi_worksheet.xlsx +0 -0
  208. data/spec/dummy/uploads/importable/spreadsheet/file/foo/623/foo_multi_worksheet.xlsx +0 -0
  209. data/spec/dummy/uploads/importable/spreadsheet/file/foo/624/foo_multi_worksheet.xlsx +0 -0
  210. data/spec/dummy/uploads/importable/spreadsheet/file/foo/625/foo_multi_worksheet.xlsx +0 -0
  211. data/spec/dummy/uploads/importable/spreadsheet/file/foo/626/foo_multi_worksheet.xlsx +0 -0
  212. data/spec/dummy/uploads/importable/spreadsheet/file/foo/627/foo_multi_worksheet.xlsx +0 -0
  213. data/spec/dummy/uploads/importable/spreadsheet/file/foo/628/foo_multi_worksheet.xlsx +0 -0
  214. data/spec/lib/mapper_spec.rb +70 -0
  215. data/spec/lib/multi_step/import_helpers_spec.rb +94 -0
  216. data/spec/lib/uploader_spec.rb +28 -0
  217. data/spec/lib/validator_spec.rb +29 -0
  218. data/spec/models/spreadsheet_spec.rb +149 -0
  219. data/spec/spec_helper.rb +20 -0
  220. data/spec/support/foo_multi_worksheet.xls +0 -0
  221. data/spec/support/foo_multi_worksheet.xlsx +0 -0
  222. data/spec/support/foo_required_field_invalid.xlsx +0 -0
  223. data/spec/support/foo_required_field_valid.xlsx +0 -0
  224. data/spec/support/foo_single_worksheet.xls +0 -0
  225. data/spec/support/foo_single_worksheet.xlsx +0 -0
  226. data/spec/support/text.txt +1 -0
  227. metadata +584 -0
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ module MultiStep
4
+ class FooMultiStepImport
5
+ include MultiStep::ImportHelpers
6
+
7
+ def sheets
8
+ # multiple fake sheets
9
+ [nil, nil]
10
+ end
11
+ end
12
+
13
+ describe ImportHelpers do
14
+ let(:foo_multi_step_import) { FooMultiStepImport.new }
15
+
16
+ describe "#steps" do
17
+ it "should return a list of import steps" do
18
+ steps = foo_multi_step_import.steps
19
+ steps[0].should eq 'upload_file'
20
+ steps[1].should eq 'choose_worksheet'
21
+ steps[2].should eq 'import_data'
22
+ end
23
+ end
24
+
25
+ describe "#current_step" do
26
+ it "should initially return 'upload_file'" do
27
+ foo_multi_step_import.current_step.should eq 'upload_file'
28
+ end
29
+
30
+ it "should return whatever the current step is set to" do
31
+ foo_multi_step_import.current_step = 'moof'
32
+ foo_multi_step_import.current_step.should eq 'moof'
33
+ end
34
+ end
35
+
36
+ describe "#first_step?" do
37
+ it "should return true if current step is 'upload_file'" do
38
+ foo_multi_step_import.current_step = 'upload_file'
39
+ foo_multi_step_import.first_step?.should be_true
40
+ foo_multi_step_import.current_step = 'moof'
41
+ foo_multi_step_import.first_step?.should be_false
42
+ end
43
+ end
44
+
45
+ describe "#last_step?" do
46
+ it "should return true if current step is 'import_data'" do
47
+ foo_multi_step_import.current_step = 'import_data'
48
+ foo_multi_step_import.last_step?.should be_true
49
+ foo_multi_step_import.current_step = 'moof'
50
+ foo_multi_step_import.last_step?.should be_false
51
+ end
52
+ end
53
+
54
+ describe "#next_step" do
55
+ it "should step through each available step" do
56
+ foo_multi_step_import.current_step.should eq 'upload_file'
57
+ foo_multi_step_import.next_step
58
+ foo_multi_step_import.current_step.should eq 'choose_worksheet'
59
+ foo_multi_step_import.next_step
60
+ foo_multi_step_import.current_step.should eq 'import_data'
61
+ end
62
+
63
+ it "should step skip choosing worksheet if there's only one" do
64
+ foo_multi_step_import.stub(:sheets).and_return(['one fake worksheet'])
65
+
66
+ foo_multi_step_import.current_step.should eq 'upload_file'
67
+ foo_multi_step_import.next_step
68
+ foo_multi_step_import.current_step.should eq 'import_data'
69
+ end
70
+ end
71
+
72
+ describe "#previous_step" do
73
+ before do
74
+ # fast forward
75
+ foo_multi_step_import.current_step = 'import_data'
76
+ end
77
+
78
+ it "should step through each available step backwards" do
79
+ foo_multi_step_import.previous_step
80
+ foo_multi_step_import.current_step.should eq 'choose_worksheet'
81
+ foo_multi_step_import.previous_step
82
+ foo_multi_step_import.current_step.should eq 'upload_file'
83
+ end
84
+
85
+ it "should step skip choosing worksheet if there's only one" do
86
+ foo_multi_step_import.stub(:sheets).and_return(['one fake worksheet'])
87
+
88
+ foo_multi_step_import.current_step.should eq 'import_data'
89
+ foo_multi_step_import.previous_step
90
+ foo_multi_step_import.current_step.should eq 'upload_file'
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ module Importable
4
+ describe Uploader do
5
+
6
+ let(:importable_spreadsheet) { Spreadsheet.new }
7
+
8
+ before do
9
+ Importable::Uploader.enable_processing = false
10
+ @uploader = Importable::Uploader.new(importable_spreadsheet, :file)
11
+ end
12
+
13
+ after do
14
+ Importable::Uploader.enable_processing = true
15
+ end
16
+
17
+ it "should not allow storing files that are not Excel spreadsheets" do
18
+ text_file = File.open support_file('text.txt')
19
+
20
+ lambda {
21
+ @uploader.store!(text_file)
22
+ }.should raise_error(
23
+ CarrierWave::IntegrityError,
24
+ 'You are not allowed to upload "txt" files, allowed types: ["xls", "xlsx"]'
25
+ )
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ module Importable
4
+ describe Validator do
5
+ let(:valid_spreadsheet) do
6
+ spreadsheet_file = support_file('foo_required_field_valid.xlsx')
7
+ Spreadsheet.new(file: File.open(spreadsheet_file), object_type: 'foo_required_field')
8
+ end
9
+ let(:invalid_spreadsheet) do
10
+ spreadsheet_file = support_file('foo_required_field_invalid.xlsx')
11
+ Spreadsheet.new(file: File.open(spreadsheet_file), object_type: 'foo_required_field')
12
+ end
13
+
14
+ it "should be invalid if any underlying objects are invalid" do
15
+ invalid_spreadsheet.should_not be_valid
16
+ end
17
+
18
+ it "should generate a list of meaningful error messages" do
19
+ invalid_spreadsheet.valid?
20
+ messages = invalid_spreadsheet.errors.messages[:doof]
21
+ messages[0].should eq "can't be blank (line 3)"
22
+ messages[1].should eq "can't be blank (line 4)"
23
+ end
24
+
25
+ it "should be valid if all underlying objects are valid" do
26
+ valid_spreadsheet.should be_valid
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+
3
+ module Importable
4
+ describe Spreadsheet do
5
+ let(:single_worksheet_importable_spreadsheet) do
6
+ spreadsheet_file = File.open support_file('foo_single_worksheet.xlsx')
7
+ Spreadsheet.new(object_type: 'foo', file: spreadsheet_file)
8
+ end
9
+
10
+ let(:multi_worksheet_importable_spreadsheet) do
11
+ spreadsheet_file = File.open support_file('foo_multi_worksheet.xlsx')
12
+ Spreadsheet.new(file: spreadsheet_file)
13
+ end
14
+
15
+ let(:older_excel_importable_spreadsheet) do
16
+ spreadsheet_file = File.open support_file('foo_single_worksheet.xls')
17
+ Spreadsheet.new(file: spreadsheet_file)
18
+ end
19
+
20
+ it "should be valid with valid attributes" do
21
+ single_worksheet_importable_spreadsheet.should be_valid
22
+ end
23
+
24
+ it "should be invalid without a file" do
25
+ spreadsheet = Spreadsheet.new(object_type: 'foo')
26
+ spreadsheet.should_not be_valid
27
+ end
28
+
29
+ describe "#headers" do
30
+ it "should return a list of header values" do
31
+ single_worksheet_importable_spreadsheet.headers.should eq %w[ a b c d ]
32
+ end
33
+ end
34
+
35
+ describe "#import!" do
36
+ it "should initialize a mapper to handle the actual importing" do
37
+ data = single_worksheet_importable_spreadsheet.rows
38
+ mapper = FooMapper.new(data)
39
+
40
+ FooMapper.should_receive(:new).and_return(mapper)
41
+
42
+ single_worksheet_importable_spreadsheet.import!
43
+ end
44
+ end
45
+
46
+ describe "#sheets" do
47
+ it "should return a list of header values" do
48
+ multi_worksheet_importable_spreadsheet.sheets.should eq %w[ Sheet1 Sheet2 ]
49
+ end
50
+ end
51
+
52
+ describe "#spreadsheet" do
53
+ it "should be an Excel spreadsheet object if the file is an xls file" do
54
+ older_excel_importable_spreadsheet.spreadsheet.should be_an Excel
55
+ end
56
+
57
+ it "should be an Excelx spreadsheet object if the file is an xlsx file" do
58
+ multi_worksheet_importable_spreadsheet.spreadsheet.should be_an Excelx
59
+ end
60
+ end
61
+
62
+ describe "#spreadsheet_class" do
63
+ it "should be an Excel class object if the file is an xls file" do
64
+ older_excel_importable_spreadsheet.spreadsheet_class.should eq Excel
65
+ end
66
+
67
+ it "should be an Excelx class object if the file is an xlsx file" do
68
+ multi_worksheet_importable_spreadsheet.spreadsheet_class.should eq Excelx
69
+ end
70
+ end
71
+
72
+ describe "#rows" do
73
+ it "should return the spreadsheet rows as a list of hashes" do
74
+ rows = single_worksheet_importable_spreadsheet.rows
75
+
76
+ rows.each do |row|
77
+ row.keys.should eq %w[ a b c d ]
78
+ end
79
+
80
+ rows[0].values.should eq [1, 2, 3, 4]
81
+ rows[1].values.should eq [2, 3, 4, 5]
82
+ rows[2].values.should eq [3, 4, 5, 6]
83
+ rows[3].values.should eq [4, 5, 6, 7]
84
+ end
85
+ end
86
+
87
+ describe "#mapper_class" do
88
+ it "should return the mapper class for the spreadsheet" do
89
+ mapper_class = single_worksheet_importable_spreadsheet.mapper_class
90
+ mapper_class.should eq FooMapper
91
+ end
92
+
93
+ it "should not care if the mappers have pluralization" do
94
+ spreadsheet_file = File.open support_file('foo_single_worksheet.xlsx')
95
+ spreadsheet = Spreadsheet.new(object_type: 'singular_widgets', file: spreadsheet_file)
96
+ spreadsheet.mapper_class.should eq SingularWidgetMapper
97
+ spreadsheet = Spreadsheet.new(object_type: 'singular_widget', file: spreadsheet_file)
98
+ spreadsheet.mapper_class.should eq SingularWidgetMapper
99
+ spreadsheet = Spreadsheet.new(object_type: 'plural_widgets', file: spreadsheet_file)
100
+ spreadsheet.mapper_class.should eq PluralWidgetsMapper
101
+ spreadsheet = Spreadsheet.new(object_type: 'plural_widget', file: spreadsheet_file)
102
+ spreadsheet.mapper_class.should eq PluralWidgetsMapper
103
+ end
104
+ end
105
+
106
+ describe "#mapper" do
107
+ it "should return the mapper instance for the spreadsheet" do
108
+ mapper = single_worksheet_importable_spreadsheet.mapper
109
+ mapper.should be_a FooMapper
110
+ end
111
+ end
112
+
113
+ describe "self#mapper_files" do
114
+ it "should list the available mapper files" do
115
+ Spreadsheet.mapper_files[0].ends_with?('foo_mapper.rb').should be_true
116
+ Spreadsheet.mapper_files[1].ends_with?('foo_required_field_mapper.rb').should be_true
117
+ end
118
+ end
119
+
120
+ describe "self#mapper_types" do
121
+ it "should list the available mapper types" do
122
+ Spreadsheet.mapper_types[0].should eq 'foo'
123
+ Spreadsheet.mapper_types[1].should eq 'foo_required_field'
124
+ end
125
+ end
126
+
127
+ describe "self#mapper_type_exists?" do
128
+ it "should return true if the supplied mapper type exists" do
129
+ Spreadsheet.mapper_type_exists?('foo').should be_true
130
+ Spreadsheet.mapper_type_exists?('foo_required_field').should be_true
131
+ end
132
+
133
+ it "should return false if the supplied mapper type doesn't exist" do
134
+ Spreadsheet.mapper_type_exists?('bar').should be_false
135
+ Spreadsheet.mapper_type_exists?('').should be_false
136
+ Spreadsheet.mapper_type_exists?(nil).should be_false
137
+ end
138
+
139
+ it "should not care about pluralization" do
140
+ Spreadsheet.mapper_type_exists?('singular_widget').should be_true
141
+ Spreadsheet.mapper_type_exists?('singular_widgets').should be_true
142
+ Spreadsheet.mapper_type_exists?('plural_widget').should be_true
143
+ Spreadsheet.mapper_type_exists?('plural_widgets').should be_true
144
+ Spreadsheet.mapper_type_exists?('foos').should be_true
145
+ Spreadsheet.mapper_type_exists?('foo_required_fields').should be_true
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,20 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require 'rspec/rails'
6
+ require 'capybara/rspec'
7
+
8
+ Rails.backtrace_cleaner.remove_silencers!
9
+
10
+ # Load support files
11
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
12
+
13
+ RSpec.configure do |config|
14
+ config.mock_with :rspec
15
+ config.use_transactional_fixtures = false
16
+ end
17
+
18
+ def support_file(name)
19
+ File.expand_path("spec/support/#{name}")
20
+ end
@@ -0,0 +1 @@
1
+ text