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
@@ -6,11 +6,14 @@
6
6
  # Details:: Helper for creating consistent import/export format
7
7
  # of model's attributes/associations
8
8
  #
9
+ require 'datashift/delimiters'
10
+
9
11
  module DataShift
10
12
 
11
13
  module ColumnPacker
12
14
 
13
15
  include Delimiters
16
+ extend Delimiters
14
17
 
15
18
  # Return opposite of text delim - "hello, 'barry'" => '"hello, "barry""'
16
19
  def escape_text_delim
@@ -18,111 +21,57 @@ module DataShift
18
21
  "\'"
19
22
  end
20
23
 
21
-
22
24
  # Ensure a value is written to CSV correctly
23
- # TODO - better ways ?? - see transcoding and String#encode
25
+ # TODO: - better ways ?? - see transcoding and String#encode
24
26
 
25
27
  def escape_for_csv(value)
26
- text = value.to_s.gsub(text_delim, escape_text_delim()).gsub("\n", "\\n")
28
+ return nil if value.blank?
29
+ text = value.to_s.gsub(text_delim, escape_text_delim).gsub("\n", '\\n')
27
30
 
28
- text = "#{text_delim}#{text}#{text_delim}" if(text.include?(Delimiters::csv_delim))
31
+ text = "#{text_delim}#{text}#{text_delim}" if(text.include?(csv_delimiter) && text.present?)
29
32
  text
30
33
  end
31
34
 
32
-
33
- def to_headers( records, associations = nil, options = {} )
34
- return if( !records.first.is_a?(ActiveRecord::Base) || records.empty?)
35
-
36
- only = *options[:only] ? [*options[:only]] : nil
37
-
38
- headers =[]
39
-
40
- if associations
41
- details_mgr = DataShift::MethodDictionary.method_details_mgrs[records.first.class]
42
-
43
- [*associations].each do |a|
44
-
45
- details_mgr.get_list(a).each do |md|
46
-
47
- next if(only && !only.include?( md.name.to_sym ) )
48
-
49
- headers << "#{md.operator}"
50
-
51
- end
52
- end if(details_mgr)
53
-
54
- else
55
-
56
- headers = records.first.class.columns.collect( &:name )
57
- end
58
-
59
- headers
60
- end
61
-
62
-
63
35
  # Convert an AR instance to a single column
64
36
  # e.g User : ":name = > 'tom', :role => 'developer'"
65
37
  #
66
38
  # OPTIONS
67
- # with_only Specify (as symbols) columns for association types to export
68
- # json: Export association data in single column in JSON format
69
39
  #
70
- def record_to_column(record, options = {})
71
-
72
- return "" if(record.nil? || (record.respond_to?(:each) && record.empty?) )
73
-
74
- with_only = *options[:with_only] ? [*options[:with_only]] : nil
40
+ # json: Export association data in single column in JSON format
75
41
 
76
- return record.to_json if(options[:json] && !with_only) # packs associations into single column
42
+ def record_to_column(record, json = false)
77
43
 
78
- if( record.respond_to?(:each) )
44
+ return '' if record.nil? || (record.respond_to?(:each) && record.empty?)
79
45
 
80
- return "" if(record.empty?)
46
+ return record.to_json if json # packs associations into single column
81
47
 
82
- data = []
48
+ data = []
83
49
 
84
- record.each { |r| data << record_to_column(r, options); }
50
+ if record.respond_to?(:each)
51
+ return '' if record.empty?
85
52
 
86
- if(options[:json])
87
- return data.to_json
88
- else
89
- return "#{data.join(Delimiters::multi_assoc_delim)}"
90
- end
53
+ record.each { |r| data << record_to_column(r, json) }
91
54
 
55
+ data.join(multi_assoc_delim).to_s
92
56
  else
93
-
94
- data = options[:json] ? {} : []
95
-
96
57
  record.serializable_hash.each do |name, value|
97
- next if(with_only && !with_only.include?( name.to_sym ) )
98
-
99
- if(options[:json])
100
- data[name] = value
101
- else
102
- data << "#{name.to_sym} #{Delimiters::key_value_sep} #{value.to_s.gsub(text_delim, escape_text_delim)}"
103
- end
104
- end
105
-
106
- if(options[:json])#
107
- return data.to_json
108
- else
109
- "#{Delimiters::attribute_list_start}#{data.join(Delimiters::multi_value_delim)}#{Delimiters::attribute_list_end}"
58
+ text = value.to_s.gsub(text_delim, escape_text_delim)
59
+ data << "#{name}:#{key_value_sep}#{text}"
110
60
  end
111
61
 
62
+ "#{attribute_list_start}#{data.join(multi_value_delim)}#{attribute_list_end}"
112
63
  end
113
64
 
114
65
  end
115
66
 
116
-
117
67
  # Convert an AR instance to a set of CSV columns
118
68
  def record_to_csv(record, options = {})
119
69
  csv_data = record.serializable_hash.values.collect { |value| escape_for_csv(value) }
120
70
 
121
- [*options[:methods]].each { |x| csv_data << escape_for_csv(record.send(x)) if(record.respond_to?(x)) } if(options[:methods])
71
+ [*options[:methods]].each { |x| csv_data << escape_for_csv(record.send(x)) if record.respond_to?(x) } if options[:methods]
122
72
 
123
- csv_data.join( Delimiters::csv_delim )
73
+ csv_data.join( csv_delimiter )
124
74
  end
125
75
 
126
-
127
76
  end
128
77
  end
@@ -0,0 +1,317 @@
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
+ class Configuration
13
+
14
+ # List of association +TYPES+ to INCLUDE [:assignment, :enum, :belongs_to, :has_one, :has_many, :method]
15
+ # Defaults to [:assignment, :enum]
16
+ #
17
+ # @param [Array<#call>] List of association Types to include (:has_one etc)
18
+ # @return [Array<#call>]
19
+ #
20
+ attr_accessor :with
21
+
22
+ # When calling the export with associations methods the default
23
+ # is to include ALL all association TYPES as defined by
24
+ # ModelMethod.supported_types_enum
25
+ #
26
+ # This can be used to reduce this down to only export specific types
27
+ #
28
+ # @param [Array<#call>] List of association Types to EXCLUDE (:has_one etc)
29
+ # @return [Array<#call>]
30
+ #
31
+ attr_accessor :exclude
32
+
33
+ # @param [Array<#call>] List of columns to remove from files
34
+ # @return [Array<#call>]
35
+ #
36
+ attr_accessor :remove_columns
37
+
38
+ # List of headers/columns that are Mandatory i.e must be present in the inbound data
39
+ #
40
+ # @param [Array<#call>] List of headers/columns that are Mandatory
41
+ # @return [Array<#call>]
42
+ #
43
+ attr_accessor :mandatory
44
+
45
+ # @param [Boolean] Remove standard Rails cols like :id, created_at etc
46
+ # Default is false - i.e id, created_at etc are included by default
47
+ # @return [Boolean]
48
+ #
49
+ attr_accessor :remove_rails
50
+
51
+ # When performing import, default is to ignore any columns that cannot be mapped (via headers)
52
+ # To raise an error set strict => true
53
+ # Defaults to `false`. Set to `true` to cause exceptions to be thrown
54
+ # The setting is ignored if routes are disabled.
55
+ # @param [Boolean] value
56
+ # @return [Boolean]
57
+ attr_accessor :strict
58
+
59
+ # When performing writes use update methods that write immediately to DB
60
+ # and use validations.
61
+ #
62
+ # Validations can ensure business logic but this can be far less efficient as writes to DB once per column
63
+ #
64
+ # To raise an error set strict => true
65
+ # Default is to use more efficient but less strict attribute writing,
66
+ # no write to DB/No validations run
67
+ # @param [Boolean] value
68
+ # @return [Boolean]
69
+ attr_accessor :update_and_validate
70
+
71
+ # Controls the amount of information written to the log
72
+ # Defaults to `false`. Set to `true` to cause extensive progress messages to be logged
73
+ # @param [Boolean] value
74
+ # @return [Boolean]
75
+ attr_accessor :verbose
76
+
77
+ # Do everything except commit changes.
78
+ # For import save will not be called on the final object
79
+ # Defaults to `false`. Set to `true` to cause extensive progress messages to be logged
80
+ # @param [Boolean] value
81
+ # @return [Boolean]
82
+ attr_accessor :dummy_run
83
+
84
+ # Expand association data into multiple columns
85
+ #
86
+ # @param [Boolean]
87
+ # @return [Boolean]
88
+ #
89
+ attr_accessor :expand_associations
90
+
91
+ # When importing/exporting associations default is to include ALL associations of included TYPES
92
+ #
93
+ # Specify associations by name to remove
94
+ #
95
+ # @param [Array<#call>] List of association Names to EXCLUDE
96
+ # @return [Array<#call>]
97
+ #
98
+ attr_accessor :exclude_associations
99
+
100
+ # List of external columns that do not map to any operator but should be included in processing.
101
+ #
102
+ # Example use cases
103
+ #
104
+ # Provides the opportunity for loaders to provide specific methods to handle columns
105
+ # that do not map directly to a model's operators or associations
106
+ #
107
+ # Enable handling delegated methods i.e no direct association but method is on a model through it's delegate
108
+ #
109
+ # @param [Array] value
110
+ # @return [Array]
111
+ attr_accessor :force_inclusion_of_columns
112
+
113
+ # All external columns should be included in processing whether or not they automatically map to an operator
114
+ #
115
+ # @param [Boolean]
116
+ # @return [Boolean]
117
+ #
118
+ attr_accessor :include_all_columns
119
+
120
+ def self.rails_columns
121
+ @rails_standard_columns ||= [:id, :created_at, :created_on, :updated_at, :updated_on]
122
+ end
123
+
124
+ def initialize
125
+ @with = [:assignment, :enum]
126
+ @exclude = []
127
+ @remove_columns = []
128
+
129
+ @strict = false
130
+ @verbose = false
131
+ @dummy_run = false
132
+ @force_inclusion_of_columns = []
133
+ @exclude_associations = []
134
+
135
+ @expand_associations = false
136
+
137
+ # default to more efficient attribute writing - no write to DB/no validations run
138
+ @update_and_validate = false
139
+ end
140
+
141
+ # @return [DataShift::Configuration] DataShift's current configuration
142
+ def self.call
143
+ @configuration ||= Configuration.new
144
+ end
145
+
146
+ def self.reset
147
+ @configuration = Configuration.new
148
+ end
149
+
150
+ # Set DataShift's configuration
151
+ # @param config [DataShift::Configuration]
152
+ class << self
153
+ attr_writer :configuration
154
+ end
155
+
156
+ # Modify DataShift's current configuration
157
+ # @yieldparam [DataShift::Configuration] config current DataShift config
158
+ # ```
159
+ # DataShift::Configuration.call do |config|
160
+ # config.verbose = false
161
+ # end
162
+ # ```
163
+ def self.configure
164
+ yield call
165
+ end
166
+
167
+ # Prepare the operators types in scope based on number of configuration attributes
168
+ # Default is assignment only
169
+ #
170
+ # Responds to Configuration params :
171
+ #
172
+ # with: [:assignment, :enum, :belongs_to, :has_one, :has_many, :method]
173
+ #
174
+ # with: :all -> all op types
175
+ #
176
+ # exclude: - Remove any of [::assignment, :enum, :belongs_to, :has_one, :has_many, :method]
177
+ #
178
+ def op_types_in_scope
179
+
180
+ types_in_scope = if with_all?
181
+ ModelMethod.supported_types_enum.dup
182
+ else
183
+ [*@with].dup
184
+ end
185
+
186
+ types_in_scope -= [*@exclude]
187
+
188
+ types_in_scope
189
+ end
190
+
191
+ def op_type_in_scope?( model_method )
192
+ op_types_in_scope.include? model_method.operator_type
193
+ end
194
+
195
+ def with_all?
196
+ [*@with].include?(:all)
197
+ end
198
+
199
+ # Take options and create a list of symbols to remove from headers
200
+ #
201
+ # Rails columns like id, created_at etc are included by default
202
+ # Specify option :remove_rails to remove them from output
203
+ #
204
+ def prep_remove_list
205
+ remove_list = [*remove_columns].compact.collect { |x| x.to_s.downcase.to_sym }
206
+
207
+ remove_list += DataShift::Configuration.rails_columns if remove_rails
208
+
209
+ remove_list
210
+ end
211
+
212
+ # Modify DataShift's current Export configuration from an options hash
213
+ def self.from_hash( options )
214
+ DataShift::Configuration.configure do |config|
215
+ options.each do |key, value|
216
+ config.send("#{key}=", value) if(config.respond_to?(key))
217
+ end
218
+ end
219
+ end
220
+
221
+ end
222
+
223
+ class YamlConfiguration
224
+
225
+ attr_accessor :datashift_defaults, :datashift_populators
226
+
227
+ include DataShift::Logging
228
+
229
+ # N.B @mappings is an OpenStruct data structure
230
+ #
231
+ attr_reader :key
232
+ attr_accessor :yaml_data, :key_config
233
+
234
+ def initialize( key = nil)
235
+ @key = key
236
+
237
+ @config = OpenStruct.new
238
+ end
239
+
240
+ def read( file, key = nil )
241
+
242
+ unless File.exist?(file)
243
+ logger.error "Cannot open configuration file - #{file} - file does not exist."
244
+ raise FileNotFound.new("Cannot open mapping file - #{file}")
245
+ end
246
+
247
+ begin
248
+ # Load application configuration
249
+ set_mapping( file )
250
+
251
+ set_key_config!( key ) if key
252
+ rescue => e
253
+ logger.error e.inspect
254
+ logger.error "Failed to parse config file #{map_file_name} - bad YAML ?"
255
+ raise e
256
+ end
257
+ end
258
+
259
+ # OpenStruct not a hash .. supports form ... config.path, config.full_name etc
260
+ def method_missing(method, *_args, &_block)
261
+ @config.send(method)
262
+ end
263
+
264
+ # Config file can contain sets of entries, identified with a key.
265
+ # e.g
266
+ # A:
267
+ # log_level: 1
268
+ # B:
269
+ # log_level: 2
270
+ #
271
+ # Restrict searches/config entries to single set via key e.g 'A'
272
+ #
273
+ def set_key_config!( key )
274
+ raise MissingConfigOptionError.new("No config entry found for key [#{key}]") unless yaml_data && yaml_data[key].is_a?(Hash)
275
+ @key_config = OpenStruct.new( yaml_config[key] ) # Argument HAS to be a hash
276
+ end
277
+
278
+ # Merge another YAML section (identified by key) into @key_config
279
+ def merge_key_config!( key )
280
+ raise Beeline::MissingConfigOptionError.new("No config entry found for key [#{key}]") unless yaml_data && yaml_data[key].is_a?(Hash)
281
+
282
+ temp = yaml_data[key].merge(@key_config.instance_variable_get('@table') || {})
283
+
284
+ key_config = OpenStruct.new(temp)
285
+ end
286
+
287
+ def set( key, value)
288
+ key_config.instance_variable_get('@table')[key] = value
289
+ end
290
+
291
+ private
292
+
293
+ def set_mapping( file )
294
+
295
+ erb = begin
296
+ Erubis::Eruby.new( File.read(file )).result
297
+ rescue => e
298
+ logger.error "Failed to parse erb template #{file} error: #{e.inspect}"
299
+ raise e
300
+ end
301
+
302
+ begin
303
+ yaml_data = YAML.load(erb)
304
+
305
+ logger.info "Loaded YAML config from [#{file}]"
306
+
307
+ rescue => e
308
+ logger.error "YAML parse error: #{e.inspect}"
309
+ raise e
310
+ end
311
+
312
+ @config = OpenStruct.new(yaml_data)
313
+ end
314
+
315
+ end
316
+
317
+ end