datashift 0.16.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. checksums.yaml +4 -4
  2. data/{LICENSE.txt → LICENSE} +0 -0
  3. data/Rakefile +1 -20
  4. data/datashift.thor +125 -0
  5. data/lib/applications/apache_poi_extensions.rb +21 -52
  6. data/lib/applications/excel.rb +64 -57
  7. data/lib/applications/hssf_row_extensions.rb +66 -0
  8. data/lib/applications/jexcel_file.rb +99 -95
  9. data/lib/applications/jexcel_file_extensions.rb +76 -83
  10. data/lib/applications/jruby/word.rb +36 -36
  11. data/lib/applications/ruby_poi_translations.rb +34 -32
  12. data/lib/applications/spreadsheet_extensions.rb +21 -19
  13. data/lib/datashift.rb +49 -59
  14. data/lib/datashift/binder.rb +217 -0
  15. data/lib/datashift/column_packer.rb +21 -72
  16. data/lib/datashift/configuration.rb +317 -0
  17. data/lib/datashift/context_factory.rb +88 -0
  18. data/lib/datashift/core_ext/array.rb +15 -0
  19. data/lib/datashift/core_ext/csv_ext.rb +46 -0
  20. data/lib/datashift/core_ext/string.rb +49 -0
  21. data/lib/datashift/core_ext/to_b.rb +11 -0
  22. data/lib/datashift/delimiters.rb +55 -61
  23. data/lib/datashift/doc_context.rb +137 -0
  24. data/lib/datashift/excel_base.rb +93 -81
  25. data/lib/datashift/exceptions.rb +30 -28
  26. data/lib/datashift/file_definitions.rb +44 -39
  27. data/lib/datashift/guards.rb +5 -5
  28. data/lib/datashift/header.rb +25 -0
  29. data/lib/datashift/headers.rb +94 -0
  30. data/lib/datashift/inbound_data/column.rb +44 -0
  31. data/lib/datashift/inbound_data/lookup_support.rb +33 -0
  32. data/lib/datashift/inbound_data/method_binding.rb +139 -0
  33. data/lib/datashift/load_object.rb +37 -12
  34. data/lib/datashift/logging.rb +54 -27
  35. data/lib/datashift/mandatory.rb +39 -0
  36. data/lib/datashift/mapping/data_flow_schema.rb +198 -0
  37. data/lib/datashift/{model_mapper.rb → mapping/mapper_utils.rb} +30 -10
  38. data/lib/datashift/model_methods/catalogue.rb +183 -0
  39. data/lib/datashift/model_methods/collection.rb +140 -0
  40. data/lib/datashift/model_methods/model_method.rb +162 -0
  41. data/lib/datashift/model_methods/model_methods_manager.rb +76 -0
  42. data/lib/datashift/model_methods/operator.rb +62 -0
  43. data/lib/datashift/node_collection.rb +26 -0
  44. data/lib/datashift/node_context.rb +68 -0
  45. data/lib/datashift/populator.rb +308 -282
  46. data/lib/datashift/progress_monitor.rb +91 -0
  47. data/lib/datashift/querying.rb +110 -52
  48. data/lib/datashift/templates/import_export_config.erb +55 -0
  49. data/lib/datashift/transformation/factory.rb +219 -0
  50. data/lib/datashift/transformation/remove.rb +44 -0
  51. data/lib/datashift/version.rb +3 -0
  52. data/lib/exporters/configuration.rb +84 -0
  53. data/lib/exporters/csv_exporter.rb +54 -52
  54. data/lib/exporters/excel_exporter.rb +80 -61
  55. data/lib/exporters/exporter_base.rb +8 -8
  56. data/lib/generators/config_generator.rb +218 -0
  57. data/lib/generators/csv_generator.rb +13 -70
  58. data/lib/generators/excel_generator.rb +23 -111
  59. data/lib/generators/generator_base.rb +15 -70
  60. data/lib/loaders/configuration.rb +90 -0
  61. data/lib/loaders/csv_loader.rb +63 -101
  62. data/lib/loaders/excel_loader.rb +71 -156
  63. data/lib/loaders/failure_data.rb +40 -0
  64. data/lib/loaders/file_loader.rb +16 -0
  65. data/lib/loaders/loader_base.rb +82 -410
  66. data/lib/loaders/loader_factory.rb +42 -0
  67. data/lib/loaders/paperclip/attachment_loader.rb +157 -140
  68. data/lib/loaders/paperclip/datashift_paperclip.rb +18 -35
  69. data/lib/loaders/paperclip/image_loading.rb +40 -35
  70. data/lib/loaders/reporters/basic_stdout_reporter.rb +40 -0
  71. data/lib/loaders/reporters/reporter.rb +26 -0
  72. data/lib/tasks/config.thor +65 -0
  73. data/{tasks → lib/tasks}/config/seed_fu_product_template.erb +0 -0
  74. data/{tasks → lib/tasks}/config/tidy_config.txt +0 -0
  75. data/lib/tasks/export.thor +192 -0
  76. data/lib/tasks/generate.thor +190 -0
  77. data/lib/tasks/import.thor +142 -0
  78. data/lib/{thor → tasks}/paperclip.thor +69 -69
  79. data/{tasks → lib/tasks/to_convert_to_thor}/db_tasks.rake +20 -20
  80. data/lib/tasks/tools.thor +109 -0
  81. data/spec/MissingAttachmentRecords/DEMO_001_ror_bag.jpeg +0 -0
  82. data/spec/MissingAttachmentRecords/DEMO_002_Powerstation.jpeg +0 -0
  83. data/spec/MissingAttachmentRecords/DEMO_003_ror_mug.jpeg +0 -0
  84. data/spec/MissingAttachmentRecords/DEMO_004_ror_ringer.jpeg +0 -0
  85. data/spec/datashift/binder_spec.rb +266 -0
  86. data/spec/datashift/config_generator_spec.rb +186 -0
  87. data/spec/datashift/configuration.rb +66 -0
  88. data/spec/datashift/context_factory_spec.rb +63 -0
  89. data/spec/datashift/data_flow_schema_spec.rb +150 -0
  90. data/spec/datashift/datashift_spec.rb +52 -0
  91. data/spec/datashift/excel_base_spec.rb +57 -0
  92. data/spec/datashift/excel_spec.rb +188 -0
  93. data/spec/datashift/failure_data_spec.rb +27 -0
  94. data/spec/{file_definitions.rb → datashift/file_definitions.rb} +9 -10
  95. data/spec/datashift/headers_spec.rb +56 -0
  96. data/spec/datashift/inbound_data_spec.rb +47 -0
  97. data/spec/datashift/mapper_utils_spec.rb +38 -0
  98. data/spec/datashift/method_binding_spec.rb +60 -0
  99. data/spec/datashift/model_method_spec.rb +109 -0
  100. data/spec/datashift/model_methods_catalogue.rb +111 -0
  101. data/spec/datashift/model_methods_collection_spec.rb +138 -0
  102. data/spec/datashift/model_methods_manager_spec.rb +329 -0
  103. data/spec/datashift/populator_spec.rb +117 -0
  104. data/spec/datashift/thor_spec.rb +314 -0
  105. data/spec/datashift/transformation/factory_spec.rb +195 -0
  106. data/spec/datashift/transformation/transformer_remove_spec.rb +43 -0
  107. data/spec/dummy/Gemfile +53 -0
  108. data/spec/dummy/Gemfile.lock +197 -0
  109. data/spec/dummy/README.rdoc +28 -0
  110. data/spec/dummy/Rakefile +6 -0
  111. data/spec/dummy/app/assets/javascripts/application.js +16 -0
  112. data/spec/dummy/app/assets/javascripts/categories.js +2 -0
  113. data/spec/dummy/app/assets/javascripts/digitals.js +2 -0
  114. data/spec/dummy/app/assets/javascripts/empties.js +2 -0
  115. data/spec/dummy/app/assets/javascripts/loader_releases.js +2 -0
  116. data/spec/dummy/app/assets/javascripts/long_and_complex_table_linked_to_versions.js +2 -0
  117. data/spec/dummy/app/assets/javascripts/milestones.js +2 -0
  118. data/spec/dummy/app/assets/javascripts/owners.js +2 -0
  119. data/spec/dummy/app/assets/javascripts/projects.js +2 -0
  120. data/spec/dummy/app/assets/javascripts/users.js +2 -0
  121. data/spec/dummy/app/assets/javascripts/versions.js +2 -0
  122. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  123. data/spec/dummy/app/assets/stylesheets/categories.css +4 -0
  124. data/spec/dummy/app/assets/stylesheets/digitals.css +4 -0
  125. data/spec/dummy/app/assets/stylesheets/empties.css +4 -0
  126. data/spec/dummy/app/assets/stylesheets/loader_releases.css +4 -0
  127. data/spec/dummy/app/assets/stylesheets/long_and_complex_table_linked_to_versions.css +4 -0
  128. data/spec/dummy/app/assets/stylesheets/milestones.css +4 -0
  129. data/spec/dummy/app/assets/stylesheets/owners.css +4 -0
  130. data/spec/dummy/app/assets/stylesheets/projects.css +4 -0
  131. data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
  132. data/spec/dummy/app/assets/stylesheets/users.css +4 -0
  133. data/spec/dummy/app/assets/stylesheets/versions.css +4 -0
  134. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  135. data/spec/dummy/app/controllers/categories_controller.rb +58 -0
  136. data/spec/dummy/app/controllers/digitals_controller.rb +58 -0
  137. data/spec/dummy/app/controllers/empties_controller.rb +58 -0
  138. data/spec/dummy/app/controllers/loader_releases_controller.rb +58 -0
  139. data/spec/dummy/app/controllers/long_and_complex_table_linked_to_versions_controller.rb +58 -0
  140. data/spec/dummy/app/controllers/milestones_controller.rb +58 -0
  141. data/spec/dummy/app/controllers/owners_controller.rb +58 -0
  142. data/spec/dummy/app/controllers/projects_controller.rb +58 -0
  143. data/spec/dummy/app/controllers/users_controller.rb +58 -0
  144. data/spec/dummy/app/controllers/versions_controller.rb +58 -0
  145. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  146. data/spec/dummy/app/helpers/categories_helper.rb +2 -0
  147. data/spec/dummy/app/helpers/digitals_helper.rb +2 -0
  148. data/spec/dummy/app/helpers/empties_helper.rb +2 -0
  149. data/spec/dummy/app/helpers/loader_releases_helper.rb +2 -0
  150. data/spec/dummy/app/helpers/long_and_complex_table_linked_to_versions_helper.rb +2 -0
  151. data/spec/dummy/app/helpers/milestones_helper.rb +2 -0
  152. data/spec/dummy/app/helpers/owners_helper.rb +2 -0
  153. data/spec/dummy/app/helpers/projects_helper.rb +2 -0
  154. data/spec/dummy/app/helpers/users_helper.rb +2 -0
  155. data/spec/dummy/app/helpers/versions_helper.rb +2 -0
  156. data/spec/dummy/app/models/category.rb +6 -0
  157. data/spec/dummy/app/models/digital.rb +22 -0
  158. data/spec/dummy/app/models/empty.rb +2 -0
  159. data/spec/dummy/app/models/loader_release.rb +10 -0
  160. data/spec/dummy/app/models/long_and_complex_table_linked_to_version.rb +6 -0
  161. data/spec/dummy/app/models/milestone.rb +15 -0
  162. data/spec/dummy/app/models/owner.rb +13 -0
  163. data/spec/dummy/app/models/project.rb +53 -0
  164. data/spec/dummy/app/models/user.rb +5 -0
  165. data/spec/dummy/app/models/version.rb +7 -0
  166. data/spec/dummy/app/views/categories/_form.html.erb +17 -0
  167. data/spec/dummy/app/views/categories/edit.html.erb +6 -0
  168. data/spec/dummy/app/views/categories/index.html.erb +25 -0
  169. data/spec/dummy/app/views/categories/new.html.erb +5 -0
  170. data/spec/dummy/app/views/categories/show.html.erb +4 -0
  171. data/spec/dummy/app/views/digitals/_form.html.erb +17 -0
  172. data/spec/dummy/app/views/digitals/edit.html.erb +6 -0
  173. data/spec/dummy/app/views/digitals/index.html.erb +25 -0
  174. data/spec/dummy/app/views/digitals/new.html.erb +5 -0
  175. data/spec/dummy/app/views/digitals/show.html.erb +4 -0
  176. data/spec/dummy/app/views/empties/_form.html.erb +17 -0
  177. data/spec/dummy/app/views/empties/edit.html.erb +6 -0
  178. data/spec/dummy/app/views/empties/index.html.erb +25 -0
  179. data/spec/dummy/app/views/empties/new.html.erb +5 -0
  180. data/spec/dummy/app/views/empties/show.html.erb +4 -0
  181. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  182. data/spec/dummy/app/views/loader_releases/_form.html.erb +17 -0
  183. data/spec/dummy/app/views/loader_releases/edit.html.erb +6 -0
  184. data/spec/dummy/app/views/loader_releases/index.html.erb +25 -0
  185. data/spec/dummy/app/views/loader_releases/new.html.erb +5 -0
  186. data/spec/dummy/app/views/loader_releases/show.html.erb +4 -0
  187. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/_form.html.erb +17 -0
  188. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/edit.html.erb +6 -0
  189. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/index.html.erb +25 -0
  190. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/new.html.erb +5 -0
  191. data/spec/dummy/app/views/long_and_complex_table_linked_to_versions/show.html.erb +4 -0
  192. data/spec/dummy/app/views/milestones/_form.html.erb +17 -0
  193. data/spec/dummy/app/views/milestones/edit.html.erb +6 -0
  194. data/spec/dummy/app/views/milestones/index.html.erb +25 -0
  195. data/spec/dummy/app/views/milestones/new.html.erb +5 -0
  196. data/spec/dummy/app/views/milestones/show.html.erb +4 -0
  197. data/spec/dummy/app/views/owners/_form.html.erb +17 -0
  198. data/spec/dummy/app/views/owners/edit.html.erb +6 -0
  199. data/spec/dummy/app/views/owners/index.html.erb +25 -0
  200. data/spec/dummy/app/views/owners/new.html.erb +5 -0
  201. data/spec/dummy/app/views/owners/show.html.erb +4 -0
  202. data/spec/dummy/app/views/projects/_form.html.erb +17 -0
  203. data/spec/dummy/app/views/projects/edit.html.erb +6 -0
  204. data/spec/dummy/app/views/projects/index.html.erb +25 -0
  205. data/spec/dummy/app/views/projects/new.html.erb +5 -0
  206. data/spec/dummy/app/views/projects/show.html.erb +4 -0
  207. data/spec/dummy/app/views/users/_form.html.erb +17 -0
  208. data/spec/dummy/app/views/users/edit.html.erb +6 -0
  209. data/spec/dummy/app/views/users/index.html.erb +25 -0
  210. data/spec/dummy/app/views/users/new.html.erb +5 -0
  211. data/spec/dummy/app/views/users/show.html.erb +4 -0
  212. data/spec/dummy/app/views/versions/_form.html.erb +17 -0
  213. data/spec/dummy/app/views/versions/edit.html.erb +6 -0
  214. data/spec/dummy/app/views/versions/index.html.erb +25 -0
  215. data/spec/dummy/app/views/versions/new.html.erb +5 -0
  216. data/spec/dummy/app/views/versions/show.html.erb +4 -0
  217. data/spec/dummy/bin/bundle +3 -0
  218. data/spec/dummy/bin/rails +9 -0
  219. data/spec/dummy/bin/rake +9 -0
  220. data/spec/dummy/bin/setup +29 -0
  221. data/spec/dummy/bin/spring +16 -0
  222. data/spec/dummy/config.ru +4 -0
  223. data/spec/dummy/config/application.rb +26 -0
  224. data/spec/dummy/config/boot.rb +3 -0
  225. data/spec/dummy/config/database.yml +25 -0
  226. data/spec/dummy/config/environment.rb +5 -0
  227. data/spec/dummy/config/environments/development.rb +41 -0
  228. data/spec/dummy/config/environments/production.rb +79 -0
  229. data/spec/dummy/config/environments/test.rb +42 -0
  230. data/spec/dummy/config/initializers/assets.rb +11 -0
  231. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  232. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  233. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  234. data/spec/dummy/config/initializers/inflections.rb +16 -0
  235. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  236. data/spec/dummy/config/initializers/session_store.rb +3 -0
  237. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  238. data/spec/dummy/config/locales/en.yml +23 -0
  239. data/spec/dummy/config/routes.rb +76 -0
  240. data/spec/dummy/config/secrets.yml +22 -0
  241. data/spec/dummy/db/development.sqlite3 +0 -0
  242. data/spec/dummy/db/migrate/20110803201325_create_test_bed.rb +98 -0
  243. data/spec/dummy/db/migrate/20121009161700_add_digitals.rb +24 -0
  244. data/spec/dummy/db/migrate/20161005123106_create_digitals.rb +8 -0
  245. data/spec/dummy/db/migrate/20161005123106_create_long_and_complex_table_linked_to_versions.rb +8 -0
  246. data/spec/dummy/db/migrate/20161005123107_create_loader_releases.rb +8 -0
  247. data/spec/dummy/db/migrate/20161005123108_create_owners.rb +8 -0
  248. data/spec/dummy/db/migrate/20161005123109_create_empties.rb +8 -0
  249. data/spec/dummy/db/migrate/20161005123110_create_projects.rb +8 -0
  250. data/spec/dummy/db/migrate/20161005123111_create_users.rb +8 -0
  251. data/spec/dummy/db/migrate/20161005123111_create_versions.rb +8 -0
  252. data/spec/dummy/db/migrate/20161005123112_create_milestones.rb +8 -0
  253. data/spec/dummy/db/migrate/20161005123113_create_categories.rb +8 -0
  254. data/spec/dummy/db/schema.rb +93 -0
  255. data/spec/dummy/db/seeds.rb +9 -0
  256. data/spec/dummy/db/test.sqlite3 +0 -0
  257. data/spec/dummy/log/test.log +69 -0
  258. data/spec/dummy/public/404.html +67 -0
  259. data/spec/dummy/public/422.html +67 -0
  260. data/spec/dummy/public/500.html +66 -0
  261. data/spec/dummy/public/favicon.ico +0 -0
  262. data/spec/dummy/public/robots.txt +5 -0
  263. data/spec/dummy/sandbox_example.thor +4 -0
  264. data/spec/dummy/test/controllers/categories_controller_test.rb +49 -0
  265. data/spec/dummy/test/controllers/digitals_controller_test.rb +49 -0
  266. data/spec/dummy/test/controllers/empties_controller_test.rb +49 -0
  267. data/spec/dummy/test/controllers/loader_releases_controller_test.rb +49 -0
  268. data/spec/dummy/test/controllers/long_and_complex_table_linked_to_versions_controller_test.rb +49 -0
  269. data/spec/dummy/test/controllers/milestones_controller_test.rb +49 -0
  270. data/spec/dummy/test/controllers/owners_controller_test.rb +49 -0
  271. data/spec/dummy/test/controllers/projects_controller_test.rb +49 -0
  272. data/spec/dummy/test/controllers/users_controller_test.rb +49 -0
  273. data/spec/dummy/test/controllers/versions_controller_test.rb +49 -0
  274. data/spec/dummy/test/factories/categories.rb +5 -0
  275. data/spec/dummy/test/factories/digitals.rb +5 -0
  276. data/spec/dummy/test/factories/empties.rb +5 -0
  277. data/spec/dummy/test/factories/loader_releases.rb +5 -0
  278. data/spec/dummy/test/factories/long_and_complex_table_linked_to_versions.rb +5 -0
  279. data/spec/dummy/test/factories/milestones.rb +5 -0
  280. data/spec/dummy/test/factories/owners.rb +5 -0
  281. data/spec/dummy/test/factories/projects.rb +5 -0
  282. data/spec/dummy/test/factories/users.rb +5 -0
  283. data/spec/dummy/test/factories/versions.rb +5 -0
  284. data/spec/dummy/test/models/category_test.rb +7 -0
  285. data/spec/dummy/test/models/digital_test.rb +7 -0
  286. data/spec/dummy/test/models/empty_test.rb +7 -0
  287. data/spec/dummy/test/models/loader_release_test.rb +7 -0
  288. data/spec/dummy/test/models/long_and_complex_table_linked_to_version_test.rb +7 -0
  289. data/spec/dummy/test/models/milestone_test.rb +7 -0
  290. data/spec/dummy/test/models/owner_test.rb +7 -0
  291. data/spec/dummy/test/models/project_test.rb +7 -0
  292. data/spec/dummy/test/models/user_test.rb +7 -0
  293. data/spec/dummy/test/models/version_test.rb +7 -0
  294. data/spec/dummy/test/test_helper.rb +10 -0
  295. data/spec/exporters/csv_exporter_spec.rb +240 -0
  296. data/spec/exporters/csv_generator_spec.rb +139 -0
  297. data/spec/exporters/excel_exporter_spec.rb +193 -0
  298. data/spec/exporters/excel_generator_spec.rb +181 -0
  299. data/spec/exporters/generator_base_spec.rb +45 -0
  300. data/spec/factories/categories.rb +7 -0
  301. data/spec/factories/factories.rb +18 -0
  302. data/spec/factories/milestone.rb +16 -0
  303. data/spec/factories/projects.rb +41 -0
  304. data/spec/fixtures/BadAssociationName.xls +0 -0
  305. data/spec/fixtures/DemoNegativeTesting.xls +0 -0
  306. data/spec/fixtures/ProjectConfiguration.yml +18 -0
  307. data/spec/fixtures/ProjectsMultiCategories.xls +0 -0
  308. data/spec/fixtures/ProjectsMultiCategoriesHeaderLookup.xls +0 -0
  309. data/spec/fixtures/ProjectsSingleCategories.xls +0 -0
  310. data/spec/fixtures/ProjectsSingleCategories.xlsx +0 -0
  311. data/spec/fixtures/SimpleProjects.xls +0 -0
  312. data/spec/fixtures/config/database.yml +28 -0
  313. data/spec/fixtures/csv/BadAssociationName.csv +6 -0
  314. data/spec/fixtures/csv/DemoNegativeTesting.csv +6 -0
  315. data/spec/fixtures/csv/ProjectsMultiCategories.csv +5 -0
  316. data/spec/fixtures/csv/ProjectsMultiCategoriesHeaderLookup.csv +5 -0
  317. data/spec/fixtures/csv/ProjectsSingleCategories.csv +5 -0
  318. data/spec/fixtures/csv/SimpleProjects.csv +4 -0
  319. data/spec/fixtures/db/migrate/20110803201325_create_test_bed.rb +98 -0
  320. data/spec/fixtures/db/migrate/20121009161700_add_digitals.rb +24 -0
  321. data/spec/fixtures/db/seeds.rb +9 -0
  322. data/spec/fixtures/images/DEMO_001_ror_bag.jpeg +0 -0
  323. data/spec/fixtures/images/DEMO_002_Powerstation.jpeg +0 -0
  324. data/spec/fixtures/images/DEMO_003_ror_mug.jpeg +0 -0
  325. data/spec/fixtures/images/DEMO_004_ror_ringer.jpeg +0 -0
  326. data/spec/fixtures/load_datashift.thor +3 -0
  327. data/spec/fixtures/models/category.rb +6 -0
  328. data/spec/fixtures/models/digital.rb +22 -0
  329. data/spec/fixtures/models/empty.rb +2 -0
  330. data/spec/fixtures/models/loader_release.rb +10 -0
  331. data/spec/fixtures/models/long_and_complex_table_linked_to_version.rb +6 -0
  332. data/spec/fixtures/models/milestone.rb +15 -0
  333. data/spec/fixtures/models/owner.rb +13 -0
  334. data/spec/fixtures/models/project.rb +53 -0
  335. data/spec/fixtures/models/user.rb +5 -0
  336. data/spec/fixtures/models/version.rb +7 -0
  337. data/spec/fixtures/results/exp_project_assoc_headers.xls +0 -0
  338. data/spec/fixtures/results/exp_project_collection_spec.csv +2 -0
  339. data/spec/fixtures/results/exp_project_export.xls +0 -0
  340. data/spec/fixtures/results/exp_project_first_export.xls +0 -0
  341. data/spec/fixtures/results/exp_project_plus_assoc.xls +0 -0
  342. data/spec/fixtures/results/exp_project_plus_assoc_export_spec.csv +9 -0
  343. data/spec/fixtures/results/gen_project_plus_assoc_template.xls +0 -0
  344. data/spec/fixtures/results/gen_project_plus_some_assoc_template.xls +0 -0
  345. data/spec/fixtures/results/gen_project_template.xls +0 -0
  346. data/spec/fixtures/results/project_and_assoc_in_hash_export.xls +0 -0
  347. data/spec/fixtures/results/project_and_assoc_in_json_export.csv +9 -0
  348. data/spec/fixtures/results/project_and_assoc_in_json_export.xls +0 -0
  349. data/spec/fixtures/results/project_export_spec_with_custom_delim_,.csv +2 -0
  350. data/spec/fixtures/results/project_export_spec_with_custom_delim_/302/243.csv +2 -0
  351. data/spec/fixtures/results/project_export_spec_with_custom_delim_/302/247.csv +2 -0
  352. data/spec/fixtures/results/project_plus_assoc_template.csv +1 -0
  353. data/spec/fixtures/results/project_plus_some_assoc_template.csv +1 -0
  354. data/spec/fixtures/results/project_remove_export_spec.csv +2 -0
  355. data/spec/fixtures/results/project_template.csv +1 -0
  356. data/spec/fixtures/results/project_with_methods_export_spec.csv +2 -0
  357. data/spec/fixtures/results/thor_spec_gen_project.csv +1 -0
  358. data/spec/fixtures/sandbox_example.thor +4 -0
  359. data/spec/fixtures/simple_export_spec.xls +0 -0
  360. data/spec/fixtures/simple_template_spec.xls +0 -0
  361. data/spec/fixtures/test_model_defs.rb +7 -0
  362. data/spec/loaders/csv_loader_spec.rb +206 -0
  363. data/spec/loaders/data_flow_excel_loader_spec.rb +290 -0
  364. data/spec/loaders/excel_loader_failures_spec.rb +67 -0
  365. data/spec/loaders/excel_loader_spec.rb +294 -0
  366. data/spec/loaders/loader_base_spec.rb +29 -0
  367. data/spec/loaders/paperclip_loader_spec.rb +106 -0
  368. data/spec/log/datashift.log +14930 -0
  369. data/spec/private/digitals/1/DEMO_003_ror_mug.jpeg +0 -0
  370. data/spec/private/digitals/2/DEMO_002_Powerstation.jpeg +0 -0
  371. data/spec/private/digitals/3/DEMO_004_ror_ringer.jpeg +0 -0
  372. data/spec/private/digitals/4/DEMO_001_ror_bag.jpeg +0 -0
  373. data/spec/spec_helper.rb +26 -230
  374. data/spec/support/clear_and_manage_contexts.rb +25 -0
  375. data/spec/support/database_cleaner.rb +32 -0
  376. data/spec/support/datashift_test_helpers.rb +153 -0
  377. data/spec/support/files_paths_helper.rb +13 -0
  378. data/spec/support/fixtures/results/mapping_template.yaml +15 -0
  379. data/spec/support/sandbox.rb +136 -0
  380. metadata +804 -85
  381. data/README.markdown +0 -274
  382. data/README.rdoc +0 -19
  383. data/VERSION +0 -1
  384. data/datashift.gemspec +0 -48
  385. data/lib/applications/jruby/old_pre_proxy_jexcel_file.rb +0 -437
  386. data/lib/datashift/data_transforms.rb +0 -83
  387. data/lib/datashift/mapping_file_definitions.rb +0 -88
  388. data/lib/datashift/mapping_service.rb +0 -91
  389. data/lib/datashift/method_detail.rb +0 -165
  390. data/lib/datashift/method_details_manager.rb +0 -95
  391. data/lib/datashift/method_dictionary.rb +0 -281
  392. data/lib/datashift/method_mapper.rb +0 -174
  393. data/lib/datashift/thor_base.rb +0 -38
  394. data/lib/generators/mapping_generator.rb +0 -112
  395. data/lib/helpers/core_ext/csv_file.rb +0 -33
  396. data/lib/helpers/core_ext/to_b.rb +0 -24
  397. data/lib/loaders/reporter.rb +0 -58
  398. data/lib/thor/export.thor +0 -175
  399. data/lib/thor/generate.thor +0 -191
  400. data/lib/thor/import.thor +0 -110
  401. data/lib/thor/mapping.thor +0 -65
  402. data/lib/thor/tools.thor +0 -84
  403. data/spec/Gemfile +0 -31
  404. data/spec/Gemfile.lock +0 -134
  405. data/spec/csv_exporter_spec.rb +0 -144
  406. data/spec/csv_generator_spec.rb +0 -159
  407. data/spec/csv_loader_spec.rb +0 -212
  408. data/spec/datashift_spec.rb +0 -55
  409. data/spec/excel_exporter_spec.rb +0 -199
  410. data/spec/excel_generator_spec.rb +0 -203
  411. data/spec/excel_loader_spec.rb +0 -237
  412. data/spec/excel_spec.rb +0 -203
  413. data/spec/loader_base_spec.rb +0 -166
  414. data/spec/mapping_spec.rb +0 -117
  415. data/spec/method_dictionary_spec.rb +0 -300
  416. data/spec/method_mapper_spec.rb +0 -100
  417. data/spec/model_mapper_spec.rb +0 -41
  418. data/spec/paperclip_loader_spec.rb +0 -92
  419. data/spec/populator_spec.rb +0 -128
  420. data/spec/thor_spec.rb +0 -90
  421. data/tasks/file_tasks.rake +0 -37
  422. data/tasks/word_to_seedfu.rake +0 -167
@@ -0,0 +1,2 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at
2
+ 1,Title 29,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,1,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC
@@ -0,0 +1,9 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at,owner,milestones,loader_releases,versions,categories,user
2
+ 1,Title 53,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,1,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"{id: 1,name: i am the owner,budget: 10000.23,project_id: 1,created_at: 2016-10-05 13:14:03 UTC,updated_at: 2016-10-05 13:14:03 UTC}","","","","","{id: 1,title: mr,first_name: ben}"
3
+ 2,Title 54,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,2,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 2,title: mr,first_name: ben}"
4
+ 3,Title 55,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,3,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 3,title: mr,first_name: ben}"
5
+ 4,Title 56,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,4,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 4,title: mr,first_name: ben}"
6
+ 5,Title 57,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,5,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 5,title: mr,first_name: ben}"
7
+ 6,Title 58,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,6,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 6,title: mr,first_name: ben}"
8
+ 7,Title 59,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,7,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 7,title: mr,first_name: ben}"
9
+ 8,Title 60,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,8,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 8,title: mr,first_name: ben}"
@@ -0,0 +1,9 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at,owner,milestones,loader_releases,versions,categories,user
2
+ 1,Title 61,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,1,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"{id: 1,name: i am the owner,budget: 10000.23,project_id: 1,created_at: 2016-10-05 13:14:03 UTC,updated_at: 2016-10-05 13:14:03 UTC}","","","","","{id: 1,title: mr,first_name: ben}"
3
+ 2,Title 62,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,2,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 2,title: mr,first_name: ben}"
4
+ 3,Title 63,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,3,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 3,title: mr,first_name: ben}"
5
+ 4,Title 64,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,4,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 4,title: mr,first_name: ben}"
6
+ 5,Title 65,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,5,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 5,title: mr,first_name: ben}"
7
+ 6,Title 66,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,6,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 6,title: mr,first_name: ben}"
8
+ 7,Title 67,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,7,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 7,title: mr,first_name: ben}"
9
+ 8,Title 68,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,8,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC,"","","","","","{id: 8,title: mr,first_name: ben}"
@@ -0,0 +1,2 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at
2
+ 1,Title 34,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,1,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC
@@ -0,0 +1,2 @@
1
+ id£title£value_as_string£value_as_text£value_as_boolean£value_as_datetime£value_as_integer£value_as_double£user_id£created_at£updated_at
2
+ 1£Title 36£this is a string£some text\n<storing>nonsense</storing>£true£2016-10-05 13:14:01 UTC£23£2.356£1£2016-10-05 13:14:03 UTC£2016-10-05 13:14:03 UTC
@@ -0,0 +1,2 @@
1
+ id§title§value_as_string§value_as_text§value_as_boolean§value_as_datetime§value_as_integer§value_as_double§user_id§created_at§updated_at
2
+ 1§Title 35§this is a string§some text\n<storing>nonsense</storing>§true§2016-10-05 13:14:01 UTC§23§2.356§1§2016-10-05 13:14:03 UTC§2016-10-05 13:14:03 UTC
@@ -0,0 +1 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at,owner,milestones,loader_releases,versions,categories,user
@@ -0,0 +1 @@
1
+ title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,owner,milestones,loader_releases,versions,categories,user
@@ -0,0 +1,2 @@
1
+ id,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_double,user_id,created_at,updated_at
2
+ 1,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,2.356,1,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC
@@ -0,0 +1 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at
@@ -0,0 +1,2 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at
2
+ 1,Title 32,this is a string,some text\n<storing>nonsense</storing>,true,2016-10-05 13:14:01 UTC,23,2.356,1,2016-10-05 13:14:03 UTC,2016-10-05 13:14:03 UTC
@@ -0,0 +1 @@
1
+ id,title,value_as_string,value_as_text,value_as_boolean,value_as_datetime,value_as_integer,value_as_double,user_id,created_at,updated_at
@@ -0,0 +1,4 @@
1
+ require 'thor'
2
+ require 'datashift'
3
+
4
+ DataShift::load_commands
@@ -0,0 +1,7 @@
1
+
2
+
3
+ base = File.join(File.dirname(__FILE__), 'models')
4
+
5
+ Dir[ File.join(base, '*.rb') ].each do |file|
6
+ require File.join(base, File.basename(file, File.extname(file) ))
7
+ end
@@ -0,0 +1,206 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Aug 2015
4
+ # License:: MIT
5
+ #
6
+ require File.dirname(__FILE__) + '/../spec_helper'
7
+
8
+ module DataShift
9
+
10
+ describe 'Csv Loader' do
11
+ include_context 'ClearAllCatalogues'
12
+
13
+ let(:loader) { CsvLoader.new }
14
+
15
+ before(:each) do
16
+ DataShift::Loaders::Configuration.reset
17
+ end
18
+
19
+ context 'prepare to load' do
20
+
21
+ it 'should be able to create a new CSV loader' do
22
+ expect(loader).to be
23
+ end
24
+
25
+ it 'should provide access to a context for the whole document' do
26
+ expect(loader.doc_context).to be_a DocContext
27
+ end
28
+
29
+ end
30
+
31
+ context 'basic load operations' do
32
+ before(:each) do
33
+ create_list(:category, 5)
34
+ end
35
+
36
+ let(:simple_csv) { ifixture_file('csv/SimpleProjects.csv') }
37
+
38
+ it 'should provide access to the file_name' do
39
+ expect(loader.respond_to? :file_name).to eq true
40
+ end
41
+
42
+ it 'should process a simple .csv spreedsheet' do
43
+
44
+ loader.run(simple_csv, Project)
45
+
46
+ expect(loader.headers.class).to eq Headers
47
+ # TOFIX flakey - use CSV to read from SimpleProjects.csv
48
+ expect(loader.headers).to eq ['value_as_string', 'Value as Text', 'value as datetime', 'value_as_boolean', 'value_as_double']
49
+ expect(loader.headers.idx).to eq 0
50
+ end
51
+
52
+ it 'should process multiple associations from single column' do
53
+ expect(Project.where(title: '001').first).to be_nil
54
+ count = Project.count
55
+
56
+ expected = ifixture_file('csv/ProjectsSingleCategories.csv')
57
+
58
+ loader.run(expected, Project)
59
+
60
+ expect(loader.loaded_count).to eq 4
61
+ expect(loader.loaded_count).to eq (Project.count - count)
62
+
63
+ { '001' => 2, '002' => 1, '003' => 3, '099' => 0 }.each do |title, expected|
64
+ project = Project.where(title: title).first
65
+
66
+ expect(project).to_not be_nil
67
+ expect(project.categories.size).to eq expected
68
+ end
69
+ end
70
+
71
+ it 'should process multiple associations in csv file' do
72
+ expected = ifixture_file('csv/ProjectsMultiCategories.csv')
73
+
74
+ count = Project.count
75
+ loader.run(expected, Project)
76
+
77
+ expect(loader.loaded_count).to eq (Project.count - count)
78
+
79
+ { '004' => 3, '005' => 1, '006' => 0, '007' => 1 }.each do |title, expected|
80
+ project = Project.where(title: title).first
81
+
82
+ expect(project).to_not be_nil
83
+ expect(project.categories.size).to eq expected
84
+ end
85
+ end
86
+
87
+ it 'should process multiple associations with lookup specified in column from CSV spreedsheet' do
88
+ expected = ifixture_file('csv/ProjectsMultiCategoriesHeaderLookup.csv')
89
+
90
+ count = Project.count
91
+ loader.run(expected, Project)
92
+
93
+ expect(loader.loaded_count).to eq (Project.count - count)
94
+ expect(loader.loaded_count).to be > 3
95
+
96
+ { '004' => 4, '005' => 1, '006' => 0, '007' => 1 }.each do |title, expected|
97
+ project = Project.where(title: title).first
98
+
99
+ expect(project).to_not be_nil
100
+
101
+ expect(project.categories.size).to eq expected
102
+ end
103
+ end
104
+
105
+ it 'should process CSV with extra undefined columns' do
106
+ expected = ifixture_file('csv/BadAssociationName.csv')
107
+ expect { loader.run(expected, Project) }.to_not raise_error
108
+ end
109
+
110
+ it 'should NOT process CSV with extra undefined columns when strict mode' do
111
+ expected = ifixture_file('csv/BadAssociationName.csv')
112
+ loader.configuration.strict = true
113
+
114
+ expect { loader.run(expected, Project) }.to raise_error(MappingDefinitionError)
115
+ end
116
+
117
+ it 'should raise an error when mandatory columns missing', fail: true do
118
+ expected = ifixture_file('csv/ProjectsMultiCategories.csv')
119
+ expect {
120
+ loader.configuration.mandatory = %w(not_an_option must_be_there)
121
+
122
+ loader.run(expected, Project)
123
+ }.to raise_error(DataShift::MissingMandatoryError)
124
+ end
125
+
126
+ # it "should provide facility to set default values", :focus => true do
127
+ # loader = CsvLoader.new(ifixture_file('csv/ProjectsSingleCategories.csv'))
128
+ #
129
+ # populator = loader.populator
130
+ #
131
+ # populator.set_default_value('value_as_string', 'some default text' )
132
+ # populator.set_default_value('value_as_double', 45.467 )
133
+ # populator.set_default_value('value_as_boolean', true )
134
+ #
135
+ # texpected = Time.now.to_s(:db)
136
+ #
137
+ # populator.set_default_value('value_as_datetime', texpected )
138
+ #
139
+ # #value_as_string Value as Text value as datetime value_as_boolean value_as_double category
140
+ #
141
+ # loader.run(Project)
142
+ #
143
+ # p = Project.where(title: '099' )
144
+ #
145
+ # p.should_not be_nil
146
+ #
147
+ # p.value_as_string).to eq 'some default text'
148
+ # p.value_as_double).to eq 45.467
149
+ # p.value_as_boolean).to eq true
150
+ # p.value_as_datetime.to_s(:db)).to eq texpected
151
+ #
152
+ # # expected: "2012-09-17 10:00:52"
153
+ # # got: Mon Sep 17 10:00:52 +0100 2012 (using ==)
154
+ #
155
+ # p_no_defs = Project.first
156
+ #
157
+ # p_no_defs.value_as_string.should_not == 'some default text'
158
+ # p_no_defs.value_as_double.should_not == 45.467
159
+ # p_no_defs.value_as_datetime.should_not == texpected
160
+ #
161
+ # end
162
+ #
163
+ # it "should provide facility to set pre and post fix values" do
164
+ # loader = CsvLoader.new(ifixture_file('csv/ProjectsSingleCategories.csv'))
165
+ #
166
+ # loader.populator.set_prefix('value_as_string', 'myprefix' )
167
+ # loader.populator.set_postfix('value_as_string', 'my post fix' )
168
+ #
169
+ # #value_as_string Value as Text value as datetime value_as_boolean value_as_double category
170
+ #
171
+ # loader.run(Project)
172
+ #
173
+ # p = Project.where(title: '001' )
174
+ #
175
+ # p.should_not be_nil
176
+ #
177
+ # p.value_as_string).to eq 'myprefixDemo stringmy post fix'
178
+ # end
179
+ #
180
+ # it "should provide facility to set default values via YAML configuration" do
181
+ # loader = CsvLoader.new(ifixture_file('csv/ProjectsSingleCategories.csv'))
182
+ #
183
+ # loader.configure_from( ifixture_file('ProjectConfiguration.yml') )
184
+ #
185
+ # loader.run(Project)
186
+ #
187
+ # p = Project.where(title: '099' )
188
+ #
189
+ # p.should_not be_nil
190
+ #
191
+ # p.value_as_string).to eq "Default Project Value"
192
+ # end
193
+ #
194
+ #
195
+ # it "should provide facility to over ride values via YAML configuration" do
196
+ # loader = CsvLoader.new(ifixture_file('csv/ProjectsSingleCategories.csv'))
197
+ #
198
+ # loader.configure_from( ifixture_file('ProjectConfiguration.yml') )
199
+ #
200
+ # loader.run(Project)
201
+ #
202
+ # Project.all.each {|p| expect(p.value_as_double).to eq 99.23546 }
203
+ # end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,290 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ #
6
+ require File.dirname(__FILE__) + '/../spec_helper'
7
+
8
+ module DataShift
9
+
10
+ describe 'Excel Loader diretced by a DataFlowSchema' do
11
+ include_context 'ClearAllCatalogues'
12
+
13
+ let(:loader) { ExcelLoader.new }
14
+
15
+ let(:expected) { ifixture_file('SimpleProjects.xls') }
16
+
17
+ context 'prepare to load' do
18
+
19
+ it 'should be able to create a new excel loader' do
20
+ expect(loader).to be
21
+ end
22
+
23
+ it 'should provide access to a context for the whole document' do
24
+ expect(loader.doc_context).to be_a DocContext
25
+ end
26
+
27
+ it 'should have access to open an Excel file' do
28
+ expect( loader.respond_to?(:start_excel)).to eq true
29
+ expect( loader.open_excel(expected, sheet_number: 0) ).to be_a Excel
30
+ end
31
+ end
32
+
33
+ context 'basic load operations' do
34
+
35
+ before(:each) do
36
+ create_list(:category, 5)
37
+ end
38
+
39
+ it 'should provide access to the file_name' do
40
+ loader.run(expected, Project)
41
+ expect(loader.file_name).to eq expected
42
+ end
43
+
44
+ it 'should parse the headers' do
45
+
46
+ loader.run(expected, Project)
47
+ expect(loader.headers.class).to eq Headers
48
+ # TOFIX flakey - is it possible to read from 'SimpleProjects.xls'
49
+ expect(loader.headers).to eq ['value_as_string', 'Value as Text', 'value as datetime', 'value_as_boolean', 'value_as_double']
50
+ expect(loader.headers.idx).to eq 0
51
+ end
52
+
53
+ it 'should bind headers to real class methods' do
54
+ loader.run(expected, Project)
55
+
56
+ expect(loader.binder).to be
57
+
58
+ binding = loader.binder.bindings[1]
59
+
60
+ expect(binding.valid?).to eq true
61
+ expect(binding.inbound_index).to eq 1
62
+ expect(binding.inbound_name).to eq 'Value as Text'
63
+ expect(binding.operator).to eq 'value_as_text'
64
+
65
+ expect(Project.new.respond_to?(binding.operator)).to eq true
66
+ end
67
+ end
68
+
69
+ context 'creates new records' do
70
+
71
+ it 'should process a simple .xls spreedsheet' do
72
+ count = Project.count
73
+
74
+ loader.run(expected, Project)
75
+
76
+ expect(loader.loaded_count).to eq 3
77
+ expect(Project.count).to eq count + 3
78
+ end
79
+
80
+ # it "should provide access to main subject class of the load" do
81
+ # expect(loader.load_object_class).to eq Project
82
+ # end
83
+ #
84
+ # it "should provide access to main subject of the load" do
85
+ # expect(loader.load_object).to be_a Project
86
+ # expect(loader.load_object.new_record?).to eq true
87
+ # end
88
+
89
+ it 'should populate database objects from a simple .xls spreedsheet' do
90
+ loader.run(expected, Project)
91
+
92
+ loaded = Project.last
93
+
94
+ expect(loaded.value_as_string).to eq '003 Can handle different column naming styles'
95
+ expect(loaded.value_as_text).to eq ''
96
+ expect(loaded.value_as_datetime).to eq '2011-05-19'
97
+ expect(loaded.value_as_boolean).to eq true
98
+ expect(loaded.value_as_double).to eq 520.00
99
+ end
100
+
101
+ it 'should process multiple associations from single column' do
102
+ expect(Project.find_by_title('001')).to be_nil
103
+
104
+ count = Project.count
105
+
106
+ expected = ifixture_file('ProjectsSingleCategories.xls')
107
+
108
+ loader.run(expected, Project)
109
+
110
+ expect(loader.loaded_count).to eq 4
111
+
112
+ expect(loader.loaded_count).to eq (Project.count - count)
113
+
114
+ { '001' => 2, '002' => 1, '003' => 3, '099' => 0 }.each do |title, expected|
115
+ project = Project.find_by_title(title)
116
+
117
+ expect(project).to_not be_nil
118
+
119
+ expect(project.categories.size).to eq expected
120
+ end
121
+ end
122
+
123
+ it 'should process multiple associations in excel spreadsheet' do
124
+ count = Project.count
125
+
126
+ expected = ifixture_file('ProjectsMultiCategories.xls')
127
+
128
+ loader.run(expected, Project)
129
+
130
+ expect(loader.loaded_count).to eq (Project.count - count)
131
+
132
+ { '004' => 3, '005' => 1, '006' => 0, '007' => 1 }.each do |title, expected|
133
+ project = Project.find_by_title(title)
134
+
135
+ expect(project).to_not be_nil
136
+
137
+ expect(project.categories.size).to eq expected
138
+ end
139
+ end
140
+
141
+ it 'should process multiple associations with lookup specified in column from excel spreadsheet' do
142
+ count = Project.count
143
+
144
+ expected = ifixture_file('ProjectsMultiCategoriesHeaderLookup.xls')
145
+
146
+ loader.run(expected, Project)
147
+
148
+ expect(loader.loaded_count).to eq 4
149
+ expect(Project.count).to eq count + 4
150
+
151
+ { '004' => 4, '005' => 1, '006' => 0, '007' => 1 }.each do |title, expected|
152
+ project = Project.find_by_title(title)
153
+
154
+ expect(project).to_not be_nil
155
+
156
+ expect(project.categories.size).to eq expected
157
+ end
158
+ end
159
+
160
+ it 'should process excel spreadsheet with extra undefined columns' do
161
+ expected = ifixture_file('BadAssociationName.xls')
162
+
163
+ expect { loader.run(expected, Project) }.to_not raise_error
164
+ end
165
+
166
+ it 'should NOT process excel spreadsheet with extra undefined columns when strict mode' do
167
+ expected = ifixture_file('BadAssociationName.xls')
168
+
169
+ loader.configuration.strict = true
170
+
171
+ expect { loader.run(expected, Project) }.to raise_error(MappingDefinitionError)
172
+ end
173
+
174
+ it 'should raise an error when mandatory columns missing' do
175
+ expected = ifixture_file('ProjectsMultiCategories.xls')
176
+
177
+ expect {
178
+
179
+ loader.configuration.mandatory = %w(not_an_option must_be_there)
180
+
181
+ loader.run(expected, Project)
182
+ }.to raise_error(DataShift::MissingMandatoryError)
183
+ end
184
+ end
185
+
186
+ context 'update existing records' do
187
+ end
188
+
189
+ context 'internal configuration of loader' do
190
+ let(:expected) { ifixture_file('ProjectsSingleCategories.xls') }
191
+
192
+ before(:each) do
193
+ DataShift::Transformation.factory.clear
194
+ end
195
+
196
+ it 'should use global transforms to set default values' do
197
+ texpected = Time.now.to_s(:db)
198
+
199
+ DataShift::Transformation.factory do |factory|
200
+ factory.set_default_on(Project, 'value_as_string', 'some default text' )
201
+ factory.set_default_on(Project, 'value_as_double', 45.467 )
202
+ factory.set_default_on(Project, 'value_as_boolean', true )
203
+ factory.set_default_on(Project, 'value_as_datetime', texpected )
204
+ end
205
+
206
+ # value_as_string Value as Text value as datetime value_as_boolean value_as_double category
207
+
208
+ loader.run(expected, Project)
209
+
210
+ p = Project.find_by_title( '099' )
211
+
212
+ expect(p).to_not be_nil
213
+
214
+ expect(p.value_as_string).to eq 'some default text'
215
+ expect(p.value_as_double).to eq 45.467
216
+ expect(p.value_as_boolean).to eq true
217
+ expect(p.value_as_datetime.to_s(:db)).to eq texpected
218
+
219
+ # expected: "2012-09-17 10:00:52"
220
+ # got: Mon Sep 17 10:00:52 +0100 2012 (using ==)
221
+
222
+ p_no_defs = Project.first
223
+
224
+ expect(p_no_defs.value_as_string).to_not eq 'some default text'
225
+ expect(p_no_defs.value_as_double).to_not eq 45.467
226
+ expect(p_no_defs.value_as_datetime).to_not eq texpected
227
+ end
228
+
229
+ it 'should use global transforms to set pre and post fix values' do
230
+ DataShift::Transformation.factory do |factory|
231
+ factory.set_prefix_on(Project, 'value_as_string', 'myprefix' )
232
+ factory.set_postfix_on(Project, 'value_as_string', 'my post fix' )
233
+ end
234
+
235
+ loader.run(expected, Project)
236
+
237
+ p = Project.find_by_title( '001' )
238
+
239
+ expect(p).to_not be_nil
240
+
241
+ expect(p.value_as_string).to eq 'myprefixDemo stringmy post fix'
242
+ end
243
+ end
244
+
245
+ context 'external configuration of loader' do
246
+ let(:expected) { ifixture_file('ProjectsSingleCategories.xls') }
247
+
248
+ before(:each) do
249
+ DataShift::Transformation.factory.clear
250
+ loader.setup_load_class(Project)
251
+
252
+ loader.configure_from( ifixture_file('ProjectConfiguration.yml') )
253
+
254
+ expect(Project.where(title: '099').first).to be_nil
255
+
256
+ loader.run(expected, Project)
257
+ end
258
+
259
+ it 'should provide facility to set DEFAULT values via YAML configuration' do
260
+ loader.run(expected, Project)
261
+
262
+ p = Project.find_by_title( '099' )
263
+
264
+ expect(p).to_not be_nil
265
+
266
+ # yaml has snippet to set Time to 'now' .. at least match the date part
267
+ expect(p.value_as_datetime.to_s).to include(Date.today.to_s)
268
+ end
269
+
270
+ it 'should combine PREFIX and POSTFIX transformations set via YAML configuration' do
271
+ p = Project.find_by_title( '099' )
272
+
273
+ expect(p).to_not be_nil
274
+
275
+ expect(p.value_as_string).to eq 'prefix me every-time Default Project Value postfix me every-time'
276
+ end
277
+
278
+ it 'should provide facility to OVER RIDE values via YAML configuration' do
279
+
280
+ expected = DataShift::Transformation.factory.overrides_for(Project)[:value_as_double]
281
+
282
+ Project.all.each { |p|
283
+ # TOFIX - the scale of the DB column from migration is 4 -- can we get that dynamically ?
284
+ expect(p.value_as_double).to be_within(0.0001).of(expected)
285
+ }
286
+ end
287
+
288
+ end
289
+ end
290
+ end