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,67 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
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 Failures' do
11
+ include_context 'ClearAllCatalogues'
12
+
13
+ let(:loader) { ExcelLoader.new }
14
+
15
+ let(:expected) { ifixture_file('SimpleProjects.xls') }
16
+
17
+ before(:each) do
18
+ create_list(:category, 5)
19
+ end
20
+
21
+ context 'progress monitor' do
22
+ it 'should process excel spreadsheet with extra undefined columns', duff: true do
23
+ expected = ifixture_file('BadAssociationName.xls')
24
+
25
+ loader.run(expected, Project)
26
+
27
+ puts loader.loaded_count
28
+ puts loader.failed_count
29
+
30
+ end
31
+ end
32
+
33
+ context 'reporters' do
34
+
35
+ it 'should be able to perform reporting' do
36
+ expect(loader.respond_to? :report).to eq true
37
+ end
38
+
39
+ it 'can access list of reporters' do
40
+ expect(loader.reporters).to be_a Array
41
+ end
42
+
43
+
44
+ class MyReporter < DataShift::Reporters::Reporter
45
+ def report
46
+ "Rspec expects this text"
47
+ end
48
+ end
49
+
50
+ let(:reporter) { MyReporter.new }
51
+
52
+ it 'can configure list of reporters' do
53
+ loader.reporters = [reporter]
54
+
55
+ expect(loader.reporters).to eq [reporter]
56
+ end
57
+
58
+ it 'can use a self configured list of reporters' do
59
+ loader.reporters = [reporter]
60
+
61
+ expect(loader.reporters.first.report).to eq "Rspec expects this text"
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,294 @@
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' do
11
+ include_context 'ClearAllCatalogues'
12
+
13
+ before(:each) do
14
+ DataShift::Transformation::Factory.reset
15
+ end
16
+
17
+ let(:loader) { ExcelLoader.new }
18
+
19
+ let(:expected) { ifixture_file('SimpleProjects.xls') }
20
+
21
+ context 'prepare to load' do
22
+
23
+ it 'should be able to create a new excel loader' do
24
+ expect(loader).to be
25
+ end
26
+
27
+ it 'should provide access to a context for the whole document' do
28
+ expect(loader.doc_context).to be_a DocContext
29
+ end
30
+
31
+ it 'should have access to open an Excel file' do
32
+ expect( loader.respond_to?(:start_excel)).to eq true
33
+ expect( loader.open_excel(expected, sheet_number: 0) ).to be_a Excel
34
+ end
35
+ end
36
+
37
+ context 'basic load operations' do
38
+
39
+ before(:each) do
40
+ create_list(:category, 5)
41
+ end
42
+
43
+ it 'should provide access to the file_name' do
44
+ loader.run(expected, Project)
45
+ expect(loader.file_name).to eq expected
46
+ end
47
+
48
+ it 'should parse the headers' do
49
+
50
+ loader.run(expected, Project)
51
+ expect(loader.headers.class).to eq Headers
52
+ # TOFIX flakey - is it possible to read from 'SimpleProjects.xls'
53
+ expect(loader.headers).to eq ['value_as_string', 'Value as Text', 'value as datetime', 'value_as_boolean', 'value_as_double']
54
+ expect(loader.headers.idx).to eq 0
55
+ end
56
+
57
+ it 'should bind headers to real class methods' do
58
+ loader.run(expected, Project)
59
+
60
+ expect(loader.binder).to be
61
+
62
+ binding = loader.binder.bindings[1]
63
+
64
+ expect(binding.valid?).to eq true
65
+ expect(binding.inbound_index).to eq 1
66
+ expect(binding.inbound_name).to eq 'Value as Text'
67
+ expect(binding.operator).to eq 'value_as_text'
68
+
69
+ expect(Project.new.respond_to?(binding.operator)).to eq true
70
+ end
71
+ end
72
+
73
+ context 'creates new records' do
74
+
75
+ it 'should process a simple .xls spreedsheet' do
76
+ count = Project.count
77
+
78
+ loader.run(expected, Project)
79
+
80
+ expect(loader.loaded_count).to eq 3
81
+ expect(Project.count).to eq count + 3
82
+ end
83
+
84
+ # it "should provide access to main subject class of the load" do
85
+ # expect(loader.load_object_class).to eq Project
86
+ # end
87
+ #
88
+ # it "should provide access to main subject of the load" do
89
+ # expect(loader.load_object).to be_a Project
90
+ # expect(loader.load_object.new_record?).to eq true
91
+ # end
92
+
93
+ it 'should populate database objects from a simple .xls spreedsheet' do
94
+ loader.run(expected, Project)
95
+
96
+ loaded = Project.last
97
+
98
+ expect(loaded.value_as_string).to eq '003 Can handle different column naming styles'
99
+ expect(loaded.value_as_text).to eq ''
100
+ expect(loaded.value_as_datetime).to eq '2011-05-19'
101
+ expect(loaded.value_as_boolean).to eq true
102
+ expect(loaded.value_as_double).to eq 520.00
103
+ end
104
+
105
+ it 'should process multiple associations from single column' do
106
+ expect(Project.find_by_title('001')).to be_nil
107
+
108
+ count = Project.count
109
+
110
+ expected = ifixture_file('ProjectsSingleCategories.xls')
111
+
112
+ loader.run(expected, Project)
113
+
114
+ expect(loader.loaded_count).to eq 4
115
+
116
+ expect(loader.loaded_count).to eq (Project.count - count)
117
+
118
+ { '001' => 2, '002' => 1, '003' => 3, '099' => 0 }.each do |title, expected|
119
+ project = Project.find_by_title(title)
120
+
121
+ expect(project).to_not be_nil
122
+
123
+ expect(project.categories.size).to eq expected
124
+ end
125
+ end
126
+
127
+ it 'should process multiple associations in excel spreadsheet' do
128
+ count = Project.count
129
+
130
+ expected = ifixture_file('ProjectsMultiCategories.xls')
131
+
132
+ loader.run(expected, Project)
133
+
134
+ expect(loader.loaded_count).to eq (Project.count - count)
135
+
136
+ { '004' => 3, '005' => 1, '006' => 0, '007' => 1 }.each do |title, expected|
137
+ project = Project.find_by_title(title)
138
+
139
+ expect(project).to_not be_nil
140
+
141
+ expect(project.categories.size).to eq expected
142
+ end
143
+ end
144
+
145
+ it 'should process multiple associations with lookup specified in column from excel spreadsheet' do
146
+ count = Project.count
147
+
148
+ expected = ifixture_file('ProjectsMultiCategoriesHeaderLookup.xls')
149
+
150
+ loader.run(expected, Project)
151
+
152
+ expect(loader.loaded_count).to eq 4
153
+ expect(Project.count).to eq count + 4
154
+
155
+ { '004' => 4, '005' => 1, '006' => 0, '007' => 1 }.each do |title, expected|
156
+ project = Project.find_by_title(title)
157
+
158
+ expect(project).to_not be_nil
159
+
160
+ expect(project.categories.size).to eq expected
161
+ end
162
+ end
163
+
164
+ it 'should process excel spreadsheet with extra undefined columns' do
165
+ expected = ifixture_file('BadAssociationName.xls')
166
+
167
+ expect { loader.run(expected, Project) }.to_not raise_error
168
+ end
169
+
170
+ it 'should NOT process excel spreadsheet with extra undefined columns when strict mode' do
171
+ expected = ifixture_file('BadAssociationName.xls')
172
+
173
+ loader.configuration.strict = true
174
+
175
+ expect { loader.run(expected, Project) }.to raise_error(MappingDefinitionError)
176
+ end
177
+
178
+ it 'should raise an error when mandatory columns missing' do
179
+ expected = ifixture_file('ProjectsMultiCategories.xls')
180
+
181
+ expect {
182
+
183
+ loader.configuration.mandatory = %w(not_an_option must_be_there)
184
+
185
+ loader.run(expected, Project)
186
+ }.to raise_error(DataShift::MissingMandatoryError)
187
+ end
188
+ end
189
+
190
+ context 'update existing records' do
191
+ end
192
+
193
+ context 'internal configuration of loader' do
194
+ let(:expected) { ifixture_file('ProjectsSingleCategories.xls') }
195
+
196
+ before(:each) do
197
+ DataShift::Transformation.factory.clear
198
+ end
199
+
200
+ it 'should use global transforms to set default values' do
201
+ texpected = Time.now.to_s(:db)
202
+
203
+ DataShift::Transformation.factory do |factory|
204
+ factory.set_default_on(Project, 'value_as_string', 'some default text' )
205
+ factory.set_default_on(Project, 'value_as_double', 45.467 )
206
+ factory.set_default_on(Project, 'value_as_boolean', true )
207
+ factory.set_default_on(Project, 'value_as_datetime', texpected )
208
+ end
209
+
210
+ # value_as_string Value as Text value as datetime value_as_boolean value_as_double category
211
+
212
+ loader.run(expected, Project)
213
+
214
+ p = Project.find_by_title( '099' )
215
+
216
+ expect(p).to_not be_nil
217
+
218
+ expect(p.value_as_string).to eq 'some default text'
219
+ expect(p.value_as_double).to eq 45.467
220
+ expect(p.value_as_boolean).to eq true
221
+ expect(p.value_as_datetime.to_s(:db)).to eq texpected
222
+
223
+ # expected: "2012-09-17 10:00:52"
224
+ # got: Mon Sep 17 10:00:52 +0100 2012 (using ==)
225
+
226
+ p_no_defs = Project.first
227
+
228
+ expect(p_no_defs.value_as_string).to_not eq 'some default text'
229
+ expect(p_no_defs.value_as_double).to_not eq 45.467
230
+ expect(p_no_defs.value_as_datetime).to_not eq texpected
231
+ end
232
+
233
+ it 'should use global transforms to set pre and post fix values' do
234
+ DataShift::Transformation.factory do |factory|
235
+ factory.set_prefix_on(Project, 'value_as_string', 'myprefix' )
236
+ factory.set_postfix_on(Project, 'value_as_string', 'my post fix' )
237
+ end
238
+
239
+ loader.run(expected, Project)
240
+
241
+ p = Project.find_by_title( '001' )
242
+
243
+ expect(p).to_not be_nil
244
+
245
+ expect(p.value_as_string).to eq 'myprefixDemo stringmy post fix'
246
+ end
247
+ end
248
+
249
+ context 'external configuration of loader' do
250
+ let(:expected) { ifixture_file('ProjectsSingleCategories.xls') }
251
+
252
+ before(:each) do
253
+ DataShift::Transformation.factory.clear
254
+ loader.setup_load_class(Project)
255
+
256
+ loader.configure_from( ifixture_file('ProjectConfiguration.yml') )
257
+
258
+ expect(Project.where(title: '099').first).to be_nil
259
+
260
+ loader.run(expected, Project)
261
+ end
262
+
263
+ it 'should provide facility to set DEFAULT values via YAML configuration', duff: true do
264
+ loader.run(expected, Project)
265
+
266
+ p = Project.find_by_title( '099' )
267
+
268
+ expect(p).to_not be_nil
269
+
270
+ # yaml has snippet to set Time to 'now' .. at least match the date part
271
+ expect(p.value_as_datetime.to_s).to include(Date.today.to_s)
272
+ end
273
+
274
+ it 'should combine PREFIX and POSTFIX transformations set via YAML configuration' do
275
+ p = Project.find_by_title( '099' )
276
+
277
+ expect(p).to_not be_nil
278
+
279
+ expect(p.value_as_string).to eq 'prefix me every-time Default Project Value postfix me every-time'
280
+ end
281
+
282
+ it 'should provide facility to OVER RIDE values via YAML configuration' do
283
+
284
+ expected = DataShift::Transformation.factory.overrides_for(Project)[:value_as_double]
285
+
286
+ Project.all.each { |p|
287
+ # TOFIX - the scale of the DB column from migration is 4 -- can we get that dynamically ?
288
+ expect(p.value_as_double).to be_within(0.0001).of(expected)
289
+ }
290
+ end
291
+
292
+ end
293
+ end
294
+ end
@@ -0,0 +1,29 @@
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
+ module DataShift
13
+ describe 'LoaderBase' do
14
+ let(:loader) { LoaderBase.new }
15
+
16
+ it 'should be able to create an empty loader with basic load object' do
17
+ expect(loader.load_object).to be_a DataShift::LoadObject
18
+ expect(loader.file_name).to eq ''
19
+ expect(loader.doc_context).to be_a(DocContext)
20
+ expect(loader.binder).to be_a(Binder)
21
+ end
22
+
23
+ it 'should be able to set the file_name ot load' do
24
+ loader.file_name = 'Test.csv'
25
+ expect(loader.file_name).to eq 'Test.csv'
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,106 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ #
6
+ require File.dirname(__FILE__) + '/../spec_helper'
7
+
8
+ require 'paperclip/attachment_loader'
9
+
10
+ Paperclip.options[:command_path] = '/usr/local/bin/'
11
+
12
+ describe 'PaperClip Bulk Loader' do
13
+ include DataShift::Logging
14
+
15
+ before(:each) do
16
+ DataShift::Transformation::Factory.reset
17
+ end
18
+
19
+ module Paperclip
20
+ module Interpolations
21
+
22
+ # Returns the Rails.root constant.
23
+ def rails_root(_attachment, _style_name)
24
+ '.'
25
+ end
26
+ end
27
+ end
28
+
29
+ let(:path) { File.join(fixtures_path, 'images') }
30
+
31
+ let(:common_options) { { verbose: true } }
32
+
33
+ # Owner.where(:name = 'jeff mills').first.digitals << DigitalAttachmentLoadedFromPath
34
+ let(:attachment_options) do
35
+ {
36
+ attach_to_klass: Owner,
37
+ attach_to_find_by_field: :name,
38
+ attach_to_field: :digitals
39
+ }
40
+ end
41
+
42
+ let(:paper_clip_attachment_class) { Digital }
43
+
44
+ let(:loader) { DataShift::Paperclip::AttachmentLoader.new }
45
+
46
+ it 'should create a new paperclip loader to load a directory of attachments' do
47
+ expect(loader).to be
48
+ expect(loader.attach_to_klass).to be_nil
49
+ expect(loader.attach_to_find_by_field).to be_nil
50
+ expect(loader.attach_to_field).to be_nil
51
+ end
52
+
53
+ it 'can be configured via Hash to load attachments against class found via field name, attached to another field' do
54
+ loader.init_from_options(attachment_options)
55
+ expect(loader.attach_to_klass).to eq attachment_options[:attach_to_klass]
56
+ expect(loader.attach_to_find_by_field).to eq attachment_options[:attach_to_find_by_field]
57
+ expect(loader.attach_to_field).to eq attachment_options[:attach_to_field]
58
+ end
59
+
60
+ it 'can be configured to load attachments against class as a String' do
61
+ attachment_options[:attach_to_klass] = 'Owner'
62
+ loader.init_from_options(attachment_options)
63
+ expect(loader.attach_to_klass).to eq Owner
64
+ end
65
+
66
+ it 'can be initialised directly with owning class, found via field name, attached to another field' do
67
+ loader.init(Owner, :image, :digitals)
68
+ expect(loader.attach_to_klass).to eq Owner
69
+ expect(loader.attach_to_find_by_field).to eq :image
70
+ expect(loader.attach_to_field).to eq :digitals
71
+ end
72
+
73
+ context('Loading attachments') do
74
+
75
+ let(:owner_names) { %w(DEMO_001 DEMO_002 DEMO_003 DEMO_004) }
76
+
77
+ before(:each) do
78
+ # these Owner names should be embeeded in the attachment FILE NAME somewhere
79
+ owner_names.each do |n|
80
+ Owner.create( name: n )
81
+ end
82
+
83
+ loader.init_from_options attachment_options
84
+ end
85
+
86
+ it 'should bulk load from a directory file system', duff: true do
87
+ loader.split_file_name_on = '_'
88
+
89
+ loader.run(path, Digital)
90
+
91
+ expect(Owner.first.digitals.size).to be > 0
92
+ end
93
+
94
+ it 'should save failed images to folder when unable to find matching record' do
95
+
96
+ # use a non existent field to cause error
97
+ loader.attach_to_find_by_field = :junk
98
+ loader.split_file_name_on = '_'
99
+
100
+ loader.run(path, Digital)
101
+
102
+ expect(Dir.glob('MissingAttachmentRecords/*.jpeg', File::FNM_CASEFOLD).size).to eq owner_names.size
103
+ end
104
+ end
105
+
106
+ end