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
@@ -23,9 +23,8 @@
23
23
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
24
  #++
25
25
 
26
-
27
26
  # Details:: Active Record Loader
28
- #
27
+ #
29
28
  # To pull DataShift commands into your main application :
30
29
  #
31
30
  # require 'datashift'
@@ -33,14 +32,15 @@
33
32
  # DataShift::load_commands
34
33
  #
35
34
  require 'rbconfig'
36
-
35
+
37
36
  module DataShift
38
37
 
39
38
  module Guards
40
39
 
41
40
  def self.jruby?
42
- return RUBY_PLATFORM == "java"
41
+ RUBY_PLATFORM == 'java'
43
42
  end
43
+
44
44
  def self.mac?
45
45
  RbConfig::CONFIG['target_os'] =~ /darwin/i
46
46
  end
@@ -54,4 +54,4 @@ module DataShift
54
54
  end
55
55
 
56
56
  end
57
- end
57
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ # Date :: Feb 2016
4
+ # License:: MIT
5
+ #
6
+ # Details:: A column header
7
+ #
8
+ module DataShift
9
+
10
+ class Header
11
+
12
+ attr_accessor :source, :presentation
13
+
14
+ def initialize(source:)
15
+ @source = source
16
+ @presentation = source
17
+ end
18
+
19
+ def to_s
20
+ presentation
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,94 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ # Details:: Holds the current headers and any pre-processing
6
+ # mapping done on them
7
+ #
8
+ require 'forwardable'
9
+
10
+ module DataShift
11
+
12
+ # Acts as an array
13
+
14
+ class Headers
15
+
16
+ attr_accessor :source
17
+
18
+ # Row Index
19
+ attr_reader :idx
20
+
21
+ extend Forwardable
22
+
23
+ def_delegators :@headers, *Array.delegated_methods_for_fwdable
24
+
25
+ def initialize(source, idx = 0, headers = [])
26
+ @source = source
27
+ @idx = idx
28
+ @headers = headers
29
+ end
30
+
31
+ # Factory for dealing with Active Record models and collections
32
+ # Catalogs the supplied Klass and builds set of expected/valid Headers for Klass
33
+ #
34
+ def self.klass_to_headers(klass)
35
+
36
+ headers = Headers.new(klass)
37
+
38
+ headers.class_source_to_headers
39
+
40
+ DataShift::Transformation::Remove.new.unwanted_headers(headers)
41
+
42
+ headers
43
+ end
44
+
45
+ # Helpers for dealing with source = class, usually an Active Record model
46
+ # Catalogs the supplied Klass and builds set of expected/valid Headers for Klass
47
+ #
48
+ def class_source_to_headers
49
+
50
+ raise SourceIsNotAClass, 'Cannot parse source for headers - source must be a Class' unless source.is_a?(Class)
51
+
52
+ # TODO: This collection can now be sorted
53
+ collection = ModelMethods::Manager.catalog_class(source)
54
+
55
+ configuration = DataShift::Configuration.call
56
+
57
+ collection.each do |mm|
58
+ next if(DataShift::Transformation::Remove.new.association?(mm))
59
+
60
+ if(mm.association_type?)
61
+ association_to_headers(mm)
62
+ else
63
+ add mm.operator
64
+ end if(configuration.op_type_in_scope?(mm))
65
+ end if collection
66
+ end
67
+
68
+ def association_to_headers( model_method )
69
+
70
+ configuration = DataShift::Configuration.call
71
+
72
+ if(configuration.expand_associations)
73
+ model_method.association_columns.each do |c|
74
+ add "#{model_method.operator}::#{c.name}"
75
+ end
76
+ else
77
+ add model_method.operator
78
+ end
79
+ end
80
+
81
+ def add(source)
82
+ @headers << Header.new(source: source)
83
+ end
84
+
85
+ def sources
86
+ @headers.collect(&:source)
87
+ end
88
+
89
+ def row_index
90
+ idx
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ # Details:: The basic raw Header info from a client - column heading, column indexx
6
+ # Column contains additional data such as lookup fields, defaults etc
7
+ #
8
+
9
+ module DataShift
10
+
11
+ module InboundData
12
+
13
+ class Column
14
+
15
+ attr_accessor :header, :index, :lookup_list, :data
16
+
17
+ def initialize(source, index = -1)
18
+
19
+ @header = DataShift::Header.new(source: source)
20
+
21
+ @index = index
22
+ @lookup_list = []
23
+ @data = []
24
+ end
25
+
26
+ delegate :source, to: :header
27
+
28
+ alias lookups lookup_list
29
+
30
+ def add_lookup( klass, field, where_value )
31
+ @lookup_list.unshift( LookupSupport.new(klass, field, where_value) )
32
+ end
33
+
34
+ def find_by_operator
35
+ lookup_list.first ? lookup_list.first.field : ''
36
+ end
37
+
38
+ def find_by_value
39
+ lookup_list.first ? lookup_list.first.value : ''
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,33 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Jan 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Store details of the inbound data from Excel,CSV files etc
7
+
8
+ module DataShift
9
+
10
+ module InboundData
11
+
12
+ # Store data supplied from client to find an instance of an object (e.g find Associations)
13
+
14
+ # Klass.where( @field => @where_value)
15
+
16
+ class LookupSupport
17
+
18
+ attr_reader :klass, :field, :where_value
19
+
20
+ def initialize(klass, in_name, where_value)
21
+ @klass = klass
22
+ @field = in_name
23
+ @where_value = where_value
24
+ end
25
+
26
+ def find
27
+ klass.where( field => where_value )
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,139 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Jan 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Bind incoming data to it's associated domain model
7
+ # Link headers to the details of individual population methods
8
+ #
9
+ # Enables 'loaders' to iterate over the incoming data set, and assign
10
+ # values to domain object, without knowing anything about that receiving object.
11
+ #
12
+ require 'set'
13
+
14
+ module DataShift
15
+
16
+ class MethodBinding
17
+
18
+ include DataShift::Logging
19
+
20
+ attr_reader :model_method
21
+
22
+ attr_reader :inbound_column
23
+
24
+ delegate :source, to: :inbound_column, allow_nil: true
25
+
26
+ # Is this method detail a valid mapping, aids identifying unmapped/unmappable columns
27
+ attr_accessor :valid
28
+
29
+ # Store the raw (client supplied) name against the active record klass(model).
30
+ # Operator is the associated method call on klass,
31
+ # i.e client supplies name 'Price' in a spreadsheet,
32
+ # but true operator to call on klass is price
33
+ #
34
+ # type determines the style of operator call; simple assignment, an association or a method call
35
+ #
36
+ # col_types can typically be derived from klass.columns - set of ActiveRecord::ConnectionAdapters::Column
37
+
38
+ def initialize(name, idx, model_method)
39
+ @inbound_column = InboundData::Column.new(name, idx)
40
+
41
+ @model_method = model_method
42
+
43
+ @valid = (name && model_method) ? true : false
44
+ end
45
+
46
+ # TODO: - use delegators
47
+ def operator
48
+ model_method ? model_method.operator : ''
49
+ end
50
+
51
+ def operator?(name, case_sensitive = false)
52
+ model_method ? model_method.operator?(name, case_sensitive) : false
53
+ end
54
+
55
+ def klass
56
+ model_method.klass
57
+ end
58
+
59
+ def class_name
60
+ model_method.klass.name
61
+ end
62
+
63
+ def inbound_name
64
+ inbound_column.source
65
+ end
66
+
67
+ def inbound_index
68
+ inbound_column.index
69
+ end
70
+
71
+ def add_column_data(data)
72
+ inbound_column.data << data
73
+ end
74
+
75
+ # Example :
76
+ # Project:name:My Best Project
77
+ # User (klass) has_one project lookup where name(field) == 'My Best Project' (value)
78
+ # User.project.where( :name => 'My Best Project')
79
+
80
+ def add_lookup( model_method, field, value)
81
+
82
+ # check the finder method name is a valid field on the actual association class
83
+ klass = model_method.klass
84
+
85
+ association = klass.reflect_on_association(model_method.operator)
86
+
87
+ # TODO: - this is instance methods .. what about class methods ?
88
+ if association && association.klass.new.respond_to?(field)
89
+ inbound_column.add_lookup(association.klass, field, value)
90
+ logger.info("Complex Lookup specified for [#{model_method.operator}] : on field [#{field}] (optional value [#{value}])")
91
+ else
92
+ logger.error("Check MethodBinding [#{inbound_name}](#{inbound_index}) - Association field names are case sensitive")
93
+ raise NoSuchOperator.new("Field [#{field}] Not Found on Association [#{model_method.operator}] within Class #{klass.name}")
94
+ end
95
+ end
96
+
97
+ def valid?
98
+ (@valid == true)
99
+ end
100
+
101
+ def invalid?
102
+ !valid?
103
+ end
104
+
105
+ def pp
106
+ "Binding: Column [#{inbound_index}] : Header [#{inbound_name}] : Operator [#{model_method.operator}]"
107
+ end
108
+
109
+ def spp
110
+ "Column [#{inbound_index}] : Header [#{inbound_name}]"
111
+ end
112
+
113
+ end
114
+
115
+ class NoMethodBinding < MethodBinding
116
+
117
+ attr_accessor :reason
118
+
119
+ def initialize(client_name = '', client_idx = -1, options = {})
120
+ super(client_name, client_idx, nil)
121
+
122
+ @reason = options[:reason] || ''
123
+ end
124
+
125
+ def invalid?
126
+ !valid?
127
+ end
128
+
129
+ def valid?
130
+ false
131
+ end
132
+
133
+ def pp
134
+ "No Binding Found : Row [#{inbound_index}] : Header [#{inbound_name}]"
135
+ end
136
+
137
+ end
138
+
139
+ end
@@ -1,25 +1,50 @@
1
1
  # Copyright:: (c) Autotelik Media Ltd 2015
2
2
  # Author :: Tom Statter
3
3
  # Date :: March 2015
4
- # License:: MIT
4
+ # License:: MI
5
5
  #
6
6
  # Details:: Manage the current loader object
7
7
  #
8
- require 'to_b'
9
- require 'logging'
10
-
8
+ #
11
9
  module DataShift
12
10
 
13
- class LoadObject
14
-
15
- include DataShift::Logging
11
+ class LoadObject < SimpleDelegator
12
+
13
+ attr_accessor :instance
14
+
15
+ def initialize(current_object)
16
+ super
17
+ @instance = current_object
18
+ end
19
+
20
+ # delegate :errors, to: :instance
16
21
 
17
- attr_accessor :load_object
22
+ # This method usually called during processing to avoid errors with associations like
23
+ # <ActiveRecord::RecordNotSaved: You cannot call create unless the parent is saved>
24
+ # If the object is still invalid at this point probably indicates compulsory
25
+ # columns on model have not been processed before associations on that model
26
+ #
27
+ def save_if_new
28
+ return false unless instance && instance.new_record?
18
29
 
19
- def initialize( current_object = nil)
20
- @load_object = current_object
30
+ return instance.save if instance.valid?
31
+
32
+ raise SaveError, "Cannot Save #{instance.class} : #{instance.errors.full_messages.inspect}"
33
+ end
34
+
35
+ private
36
+
37
+ =begin
38
+ def method_missing(method, *args, &block)
39
+ raise "Cannot call [#{method}] on : #{instance.class.name}"
40
+ if instance.respond_to? method
41
+ instance.send(method, *args, &block)
42
+ else
43
+ raise "Cannot call [#{method}] on : #{instance.class.name}"
44
+ end
21
45
  end
22
-
46
+ =end
47
+
23
48
  end
24
-
49
+
25
50
  end
@@ -1,4 +1,4 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2012
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
2
  # Author :: Tom Statter
3
3
  # Date :: Aug 2012
4
4
  # License:: Free, Open Source. MIT.
@@ -6,53 +6,80 @@
6
6
  # Details:: Logging facilities for datashift.
7
7
  #
8
8
  require 'fileutils'
9
-
9
+ require 'singleton'
10
+
10
11
  module DataShift
11
12
 
12
13
  module Logging
13
-
14
+
14
15
  class MultiIO
15
-
16
- def initialize(*targets)
16
+
17
+ include Singleton
18
+
19
+ attr_reader :targets
20
+
21
+ def initialize
17
22
  @targets = []
18
- targets.each {|t| @targets << Logger.new(t) }
23
+ @names = []
19
24
  end
20
25
 
21
- def add(target)
22
- @targets << Logger.new(target)
23
- end
24
-
25
-
26
- def method_missing(method, *args, &block)
27
- @targets.each {|t| t.send(method, *args, &block) }
26
+ def add_file(target)
27
+ unless @names.include?(target)
28
+ puts "Logging going to target [#{target}]"
29
+ add( File.open(target, 'a') )
30
+ @names << target
31
+ end
28
32
  end
29
-
33
+
30
34
  def verbose
31
35
  add(STDOUT)
32
36
  end
33
-
37
+
38
+ def method_missing(method, *args, &block)
39
+ @targets.each { |t| t.send(method, *args, &block) }
40
+ end
41
+
42
+ private
43
+
44
+ def add(target)
45
+ @targets << Logger.new(target)
46
+ end
47
+
34
48
  end
35
-
49
+
36
50
  require 'logger'
37
-
51
+
52
+ def logdir=(x)
53
+ @logdir = x
54
+ end
55
+
38
56
  def logdir
39
57
  @logdir ||= 'log'
40
58
  @logdir
41
59
  end
42
-
60
+
43
61
  def logger
44
- @logger ||= open
45
- @logger
62
+ @mutli_logger ||= open
63
+ @mutli_logger
64
+ end
65
+
66
+ def verbose
67
+ @verbose_logger ||= logger.add(STDOUT)
46
68
  end
47
-
69
+
48
70
  private
49
-
71
+
50
72
  def open( log = 'datashift.log')
51
- return ActiveRecord::Base.logger if(defined?(ActiveRecord) && ActiveRecord::Base.logger)
52
- FileUtils::mkdir(logdir) unless File.directory?(logdir)
53
- log_file = File.open( File.join(logdir(), 'datashift.log'), "a")
54
- MultiIO.new(log_file)
73
+ FileUtils.mkdir(logdir) unless File.directory?(logdir)
74
+
75
+ MultiIO.instance.add_file(File.join(logdir, log))
76
+
77
+ ActiveRecord::Base.logger = MultiIO.instance if defined?(ActiveRecord) && ActiveRecord::Base.logger
78
+
79
+ verbose if(DataShift::Configuration.call.verbose)
80
+
81
+ MultiIO.instance
55
82
  end
56
83
  end
57
-
84
+
58
85
  end