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,44 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ # Date :: Feb 2016
4
+ # License:: MIT
5
+ #
6
+ # Details:: Class to manage the removal of unwanted columns or data
7
+ #
8
+
9
+ module DataShift
10
+
11
+ module Transformation
12
+
13
+ class Remove
14
+
15
+ def remove_list
16
+ @remove_list ||= DataShift::Configuration.call.prep_remove_list
17
+ end
18
+
19
+ def association?(mm)
20
+ return false unless(mm.association_type?)
21
+ DataShift::Configuration.call.exclude_associations.include?(mm.operator)
22
+ end
23
+
24
+ # Specify columns to remove via DataShift::Exporters::Configuration
25
+ #
26
+ def unwanted_columns( columns )
27
+ columns.delete_if { |r| remove_list.include?( r.to_sym ) } unless remove_list.empty?
28
+ end
29
+
30
+ def unwanted_headers( headers )
31
+ headers.delete_if { |r| remove_list.include?( r.source.to_sym ) } unless remove_list.empty?
32
+ end
33
+
34
+ # Specify columns to remove via DataShift::Exporters::Configuration
35
+ #
36
+ def unwanted_model_methods( model_methods )
37
+ model_methods.delete_if { |r| remove_list.include?( r.operator.to_sym ) } unless remove_list.empty?
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,3 @@
1
+ module DataShift
2
+ VERSION = '0.40.0'.freeze
3
+ end
@@ -0,0 +1,84 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Feb 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Read mappings and provide cache type services for source=>destination mappings
7
+ #
8
+ require 'erubis'
9
+
10
+ module DataShift
11
+
12
+ module Exporters
13
+
14
+ class Configuration < DataShift::Configuration
15
+
16
+ # @param [Boolean] Stop processing and abort if a row fails to export
17
+ # Default is false
18
+ # @return [Boolean]
19
+ #
20
+ attr_accessor :abort_on_failure
21
+
22
+ # @param [Char] Char to use as the column delimter for csv format
23
+ # @return [Char]
24
+ #
25
+ attr_accessor :csv_delimiter
26
+
27
+ # @param [Boolean] Export association data in single column in JSON format
28
+ # @return [Boolean]
29
+ #
30
+ attr_accessor :json
31
+
32
+ # @param [String] Name for worksheet, otherwise uses Class name
33
+ # @return [String]
34
+ #
35
+ attr_accessor :sheet_name
36
+
37
+ def initialize
38
+ super
39
+ @abort_on_failure = false
40
+ @csv_delimiter = ','
41
+ @json = false
42
+ @sheet_name = ''
43
+ end
44
+
45
+ # @return [DataShift::Exporters::Configuration] DataShift's current configuration
46
+ def self.call
47
+ @configuration ||= Exporters::Configuration.new
48
+ end
49
+
50
+ def self.reset
51
+ @configuration = Exporters::Configuration.new
52
+ end
53
+
54
+ # Set DataShift's configure
55
+ # @param config [DataShift::Exporters::Configuration]
56
+ class << self
57
+ attr_writer :configuration
58
+ end
59
+
60
+ # Modify DataShift's current Export configuration
61
+ # ```
62
+ # DataShift::Exporters::Configuration.configure do |config|
63
+ # config.abort_on_failure = false
64
+ # end
65
+ # ```
66
+ def self.configure
67
+ yield call
68
+ end
69
+
70
+ # Modify DataShift's current Export configuration from an options hash
71
+
72
+ def self.from_hash( options )
73
+
74
+ DataShift::Configuration.from_hash(options)
75
+
76
+ DataShift::Exporters::Configuration.configure do |config|
77
+ config.csv_delimiter = options[:csv_delimiter] if(options[:csv_delimiter])
78
+ end
79
+ end
80
+
81
+ end
82
+ end
83
+
84
+ end
@@ -1,13 +1,10 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
2
  # Author :: Tom Statter
3
- # Date :: Aug 2011
4
3
  # License:: MIT
5
4
  #
6
5
  # Details:: Export a model to CSV
7
6
  #
8
7
  #
9
- require 'exporter_base'
10
- require 'csv_file'
11
8
 
12
9
  module DataShift
13
10
 
@@ -16,92 +13,97 @@ module DataShift
16
13
  include DataShift::Logging
17
14
  include DataShift::ColumnPacker
18
15
 
19
- def initialize(filename)
20
- super(filename)
16
+ def initialize
17
+ super
18
+
19
+ @csv_delimiter = ','
21
20
  end
22
21
 
23
22
  # Create CSV file from set of ActiveRecord objects
23
+ #
24
24
  # Options :
25
- # => :filename
26
- # => :text_delim => Char to use to delim columns, useful when data contain embedded ','
27
- # => ::methods => List of methods to additionally call on each record
28
25
  #
29
- def export(export_records, options = {})
26
+ # :csv_delim => Char to use to delim columns, useful when data contain embedded ','
27
+ #
28
+ def export(file_name, export_records, options = {})
29
+
30
+ @file_name = file_name
30
31
 
31
32
  records = [*export_records]
32
33
 
33
- unless(records && records.size > 0)
34
- logger.warn("No objects supplied for export")
34
+ unless records && !records.empty?
35
+ logger.warn('No objects supplied for export')
35
36
  return
36
37
  end
37
38
 
38
39
  first = records[0]
39
40
 
40
- raise ArgumentError.new('Please supply set of ActiveRecord objects to export') unless(first.is_a?(ActiveRecord::Base))
41
+ raise ArgumentError.new('Please supply set of ActiveRecord objects to export') unless first.is_a?(ActiveRecord::Base)
42
+
43
+ @csv_delimiter = options[:csv_delim] if options[:csv_delim]
41
44
 
42
- Delimiters.text_delim = options[:text_delim] if(options[:text_delim])
45
+ headers = Headers.klass_to_headers(first.class)
43
46
 
44
- CSV.open( (options[:filename] || filename), "w" ) do |csv|
47
+ logger.debug "Writing out CSV Export. Columns delimited by [#{csv_delimiter}]"
45
48
 
46
- csv.ar_to_headers( records )
49
+ remove_list = DataShift::Transformation::Remove.new.remove_list
50
+
51
+ CSV.open(file_name, 'w', col_sep: csv_delimiter ) do |csv|
52
+ csv << headers.sources
47
53
 
48
54
  records.each do |r|
49
- next unless(r.is_a?(ActiveRecord::Base))
50
- csv.ar_to_csv(r, options)
55
+ next unless r.is_a?(ActiveRecord::Base)
56
+ csv.ar_to_row(r, remove_list)
51
57
  end
52
58
  end
59
+
60
+ logger.info "CSV export completed for #{records.size} records"
53
61
  end
54
62
 
55
- # Create an Excel file from list of ActiveRecord objects
56
- # Specify which associations to export via :with or :exclude
57
- # Possible values are : [:assignment, :belongs_to, :has_one, :has_many]
63
+ # Create CSV file from list of ActiveRecord objects
64
+ #
65
+ # Options :
58
66
  #
59
- def export_with_associations(klass, records, options = {})
67
+ # :csv_delim => Char to use to delim columns, useful when data contain embedded ','
68
+ #
69
+ def export_with_associations(file_name, klass, records, options = {})
60
70
 
61
- Delimiters.text_delim = options[:text_delim] if(options[:text_delim])
71
+ state = DataShift::Configuration.call.with
62
72
 
63
- MethodDictionary.find_operators( klass )
73
+ DataShift::Configuration.call.with = :all
64
74
 
65
- MethodDictionary.build_method_details( klass )
75
+ @file_name = file_name
66
76
 
67
- only = options[:only] ? [*options[:only]] : nil
77
+ @csv_delimiter = options[:csv_delim] if(options[:csv_delim])
68
78
 
69
- # For each type belongs has_one, has_many etc find the operators
70
- # and create headers, then for each record call those operators
71
- operators = options[:with] || MethodDetail::supported_types_enum
79
+ headers = Headers.klass_to_headers(klass)
72
80
 
73
- CSV.open( (options[:filename] || filename), "w" ) do |csv|
81
+ schema = DataFlowSchema.new
74
82
 
75
- csv.ar_to_headers( records, operators, options)
83
+ model_methods = schema.klass_to_model_methods( klass )
76
84
 
77
- details_mgr = MethodDictionary.method_details_mgrs[klass]
85
+ logger.debug "Writing out CSV Export for #{klass} with Associations. Columns delimited by [#{csv_delimiter}]"
78
86
 
79
- records.each do |obj|
87
+ CSV.open(file_name, 'w', col_sep: csv_delimiter ) do |csv|
88
+ csv << headers.sources
80
89
 
90
+ records.each do |record|
81
91
  row = []
82
92
 
83
- operators.each do |op_type|
84
-
85
- operators_for_type = details_mgr.get_list(op_type)
86
-
87
- next if(operators_for_type.nil? || operators_for_type.empty?)
88
-
89
- operators_for_type.each do |md|
90
-
91
- next if(only && !only.include?( md.name.to_sym ) )
92
-
93
- if(MethodDetail.is_association_type?(op_type))
94
- row << record_to_column( obj.send( md.operator )) # pack association into single column
95
- else
96
- row << escape_for_csv( obj.send( md.operator ) )
97
- end
98
- end
93
+ model_methods.each do |model_method|
94
+ row << if model_method.association_type?
95
+ record_to_column( record.send(model_method.operator) )
96
+ else
97
+ escape_for_csv( record.send(model_method.operator) )
98
+ end
99
99
  end
100
-
101
- csv << row # next record
100
+ csv.add_row(row)
102
101
  end
103
102
  end
104
103
 
105
- end
104
+ ensure
105
+ DataShift::Configuration.call.with = state
106
+ end # end write file
107
+
106
108
  end
107
109
  end
@@ -1,130 +1,149 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
2
  # Author :: Tom Statter
3
- # Date :: Aug 2011
3
+ # Date :: Mar 2016
4
4
  # License:: MIT
5
5
  #
6
6
  # Details:: Export a model to Excel '97(-2007) file format.
7
7
  #
8
- # TOD : Can we switch between .xls and XSSF (POI implementation of Excel 2007 OOXML (.xlsx) file format.)
8
+ # TODO: Can we switch between .xls and XSSF (POI implementation of Excel 2007 OOXML (.xlsx) file format.)
9
9
  #
10
10
  #
11
11
  module DataShift
12
12
 
13
- require 'exporter_base'
14
-
15
- require 'excel'
16
-
17
13
  class ExcelExporter < ExporterBase
18
14
 
19
15
  include DataShift::Logging
20
16
  include DataShift::ColumnPacker
21
17
 
22
- def initialize(filename)
23
- @filename = filename
18
+ include DataShift::ExcelBase
19
+
20
+ # Optional, otherwise uses the standard collection of Model Methods for supplied klass
21
+ attr_accessor :data_flow_schema
22
+
23
+ def initialize
24
+ super
25
+
26
+ @data_flow_schema = nil
24
27
  end
25
28
 
26
29
  # Create an Excel file from list of ActiveRecord objects
27
- def export(export_records, options = {})
30
+ def export(file_name, export_records, options = {})
31
+
32
+ @file_name = file_name
28
33
 
29
34
  records = [*export_records]
30
35
 
31
- unless(records && records.size > 0)
32
- logger.warn("No objects supplied for export")
36
+ if(records.nil? || records.empty?)
37
+ logger.warn('Excel Export - No objects supplied for export - no file written')
33
38
  return
34
39
  end
35
40
 
36
41
  first = records[0]
37
42
 
38
- logger.info("Exporting #{records.size} #{first.class} to Excel")
43
+ raise(ArgumentError, 'Please supply set of ActiveRecord objects to export') unless first.is_a?(ActiveRecord::Base)
39
44
 
40
- raise ArgumentError.new('Please supply set of ActiveRecord objects to export') unless(first.is_a?(ActiveRecord::Base))
45
+ klass = first.class
41
46
 
47
+ excel = start_excel(klass, options)
42
48
 
43
- raise ArgumentError.new('Please supply array of records to export') unless records.is_a? Array
49
+ prepare_data_flow_schema(klass)
44
50
 
45
- excel = Excel.new
51
+ export_headers(klass)
46
52
 
47
- if(options[:sheet_name] )
48
- excel.create_worksheet( :name => options[:sheet_name] )
49
- else
50
- excel.create_worksheet( :name => records.first.class.name )
51
- end
52
-
53
- excel.ar_to_headers(records)
53
+ logger.info("Exporting #{records.size} #{klass} to Excel")
54
54
 
55
55
  excel.ar_to_xls(records)
56
56
 
57
- excel.write( filename() )
57
+ logger.info("Writing Excel to file [#{file_name}]")
58
+
59
+ excel.write( file_name )
60
+ end
61
+
62
+ def export_headers(klass)
63
+
64
+ headers = if(data_flow_schema)
65
+ data_flow_schema.sources
66
+ else
67
+ Headers.klass_to_headers(klass)
68
+ end
69
+
70
+ excel.set_headers( headers )
71
+
72
+ logger.info("Wrote headers for #{klass} to Excel")
73
+ headers
74
+ end
75
+
76
+ def prepare_data_flow_schema(klass)
77
+ @data_flow_schema = DataShift::DataFlowSchema.new
78
+ @data_flow_schema.prepare_from_klass( klass )
79
+
80
+ data_flow_schema
58
81
  end
59
82
 
60
83
  # Create an Excel file from list of ActiveRecord objects, includes relationships
61
84
  #
62
- # Options
85
+ # The Associations/relationships to include are driven by Configuration Options
63
86
  #
64
- # only Specify (as symbols) columns (assignments) to export from klass
65
- # with: Specify which association types to export :with
66
- # Possible values are : [:assignment, :belongs_to, :has_one, :has_many]
67
- # with_only Specify (as symbols) columns for association types to export
68
- # sheet_name Else uses Class name
69
- # json: Export association data in single column in JSON format
87
+ # See - lib/exporters/configuration.rb
70
88
  #
71
- def export_with_associations(klass, records, options = {})
72
-
73
- records = [*records]
89
+ def export_with_associations(file_name, klass, records, options = {})
74
90
 
75
- only = options[:only] ? [*options[:only]] : nil
91
+ state = DataShift::Configuration.call.with
76
92
 
77
- excel = Excel.new
93
+ DataShift::Configuration.call.with = :all
78
94
 
79
- if(options[:sheet_name] )
80
- excel.create_worksheet( :name => options[:sheet_name] )
81
- else
82
- excel.create_worksheet( :name => records.first.class.name )
83
- end
95
+ @file_name = file_name
84
96
 
85
- MethodDictionary.find_operators( klass )
97
+ excel = start_excel(klass, options)
86
98
 
87
- MethodDictionary.build_method_details( klass )
99
+ logger.info("Processing [#{records.size}] #{klass} records to Excel")
88
100
 
89
- # For each type belongs has_one, has_many etc find the operators
90
- # and create headers, then for each record call those operators
91
- operators = options[:with] || MethodDetail::supported_types_enum
101
+ prepare_data_flow_schema(klass)
92
102
 
93
- excel.ar_to_headers( records, operators, options)
103
+ export_headers(klass)
94
104
 
95
- details_mgr = MethodDictionary.method_details_mgrs[klass]
105
+ nodes = data_flow_schema.nodes
96
106
 
97
107
  row = 1
98
108
 
99
109
  records.each do |obj|
100
-
101
110
  column = 0
102
111
 
103
- [*operators].each do |op_type| # belongs_to, has_one, has_many etc
104
-
105
- operators_for_type = details_mgr.get_list(op_type)
112
+ nodes.each do |node|
106
113
 
107
- next if(operators_for_type.nil? || operators_for_type.empty?)
114
+ logger.info("Send to Excel: #{node.inspect}")
108
115
 
109
- operators_for_type.each do |md| # actual associations on obj
116
+ model_method = node.model_method
110
117
 
111
- next if(only && !only.include?( md.name.to_sym ) )
118
+ logger.info("Send to Excel: #{model_method.pp}")
112
119
 
113
- if(MethodDetail.is_association_type?(op_type))
114
- excel[row, column] = record_to_column( obj.send( md.operator ), options ) # pack association into single column
120
+ begin
121
+ # pack association instances into single column
122
+ if model_method.association_type?
123
+ logger.info("Processing #{model_method.inspect} associations")
124
+ excel[row, column] = record_to_column( obj.send( model_method.operator ), configuration.json )
115
125
  else
116
- excel[row, column] = obj.send( md.operator )
126
+ excel[row, column] = obj.send( model_method.operator )
117
127
  end
118
- column += 1
128
+ rescue => x
129
+ logger.error("Failed to write #{model_method.inspect} to Excel")
130
+ logger.error(x.inspect)
119
131
  end
132
+
133
+ column += 1
120
134
  end
121
135
 
122
136
  row += 1
123
137
  end
124
138
 
125
- excel.write( filename() )
139
+ logger.info("Writing Excel to file [#{file_name}]")
140
+ excel.write( file_name )
141
+
142
+ ensure
143
+ DataShift::Configuration.call.with = state
126
144
 
127
145
  end
146
+
128
147
  end # ExcelGenerator
129
148
 
130
- end # DataShift
149
+ end # DataShift