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,266 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Jan 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for Binder aspect of Active Record Loader
7
+ # Binder provides the bridge between 'strings' e.g column headings
8
+ # and a classes different types of assignment operators/associations
9
+ #
10
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
11
+
12
+ module DataShift
13
+
14
+ describe Binder do
15
+ include_context 'ClearThenManageProject'
16
+
17
+ let(:binder) { Binder.new }
18
+
19
+ context 'errors binding headers' do
20
+ let(:headers) { [:value_as_string, :owner, :bad_no_such_column, :value_as_boolean, :value_as_double, :more_rubbish_as_nil] }
21
+
22
+ before(:each) do
23
+ @bindings = binder.map_inbound_headers( Project, headers )
24
+ end
25
+
26
+ let(:bindings) { @bindings }
27
+
28
+ it 'uses NoMethodBinding object methods when no such operator' do
29
+ expect(bindings.size).to eq 6
30
+
31
+ expect(bindings[2]).to be_a NoMethodBinding
32
+ expect(bindings[5]).to be_a NoMethodBinding
33
+
34
+ expect(bindings[0]).to be_a MethodBinding
35
+ end
36
+
37
+ it 'should populate missing_bindings when no such operator' do
38
+ expect(binder.missing_bindings.size).to eq 2
39
+ end
40
+
41
+ it 'should indicate when bindings missing' do
42
+ expect(binder.missing_bindings?).to eq true
43
+ end
44
+
45
+ it 'should indicate names of missing bindings' do
46
+ missing = binder.headers_missing_bindings
47
+
48
+ expect(missing.size).to eq 2
49
+
50
+ expect(missing[0]).to eq 'bad_no_such_column'
51
+ expect(missing[1]).to eq 'more_rubbish_as_nil'
52
+ end
53
+
54
+ it 'should indicate index of missing bindings ' do
55
+ missing = binder.indexes_missing_bindings
56
+
57
+ expect(missing[0]).to eq 2
58
+ expect(missing[1]).to eq 5
59
+ end
60
+
61
+ it 'uses NoMethodBinding object methods when operator has no such lookup field', fail: true do
62
+ # Owner has_many :digitals which has field attachment_file_name
63
+ headers = ['digitals:attachment_file_name',
64
+ 'Digitals:nonsense_lookup_field',
65
+ 'Digitals:nonsense:with a value',
66
+ 'Digitals:nonsense:with a value:and random data']
67
+
68
+ binder.map_inbound_headers( Owner, headers)
69
+
70
+ expect(binder.bindings.size).to eq 4
71
+ expect(binder.missing_bindings.size).to eq 3
72
+
73
+ expect(binder.missing_bindings?).to eq true
74
+ expect(binder.missing_bindings[0].reason).to include 'Field [nonsense_lookup_field] Not Found'
75
+ end
76
+ end
77
+
78
+ let (:headers) { [:value_as_string, :owner, :value_as_boolean, :value_as_double] }
79
+
80
+ it 'should find a set of methods based on a list of column symbols' do
81
+ bindings = binder.map_inbound_headers( Project, headers )
82
+ expect(bindings.size).to eq 4
83
+ end
84
+
85
+ it 'should map a list of column names to a set of method details' do
86
+ headers = %w(value_as_double value_as_string bad_no_such_column value_as_boolean)
87
+
88
+ bindings = binder.map_inbound_headers( Project, headers )
89
+
90
+ expect(bindings.size).to eq 4
91
+
92
+ expect(bindings[2]).to be_a NoMethodBinding
93
+
94
+ expect(bindings[0]).to be_a MethodBinding
95
+ expect(bindings.last).to be_a MethodBinding
96
+ end
97
+
98
+ it 'should populate a method binding instance based on column and database info' do
99
+ headers = [:value_as_string, :owner, :value_as_boolean, :value_as_double]
100
+
101
+ bindings = binder.map_inbound_headers( Project, headers )
102
+
103
+ expect(bindings.size).to eq 4
104
+
105
+ expect(bindings[0]).to be_a MethodBinding
106
+
107
+ headers.each_with_index do |_c, i|
108
+ expect(bindings[i].inbound_index).to eq i
109
+ expect(bindings[i].inbound_column.index).to eq i
110
+ end
111
+ end
112
+
113
+ it 'should map between user name and domain model attribute' do
114
+ headers = ['Value as string', :value_as_string, 'value_as boolean', 'Value_As_Double']
115
+
116
+ operators = %w(value_as_string value_as_string value_as_boolean value_as_double)
117
+
118
+ bindings = binder.map_inbound_headers( Project, headers )
119
+
120
+ expect(bindings.size).to eq headers.size
121
+
122
+ headers.each_with_index do |c, i|
123
+ expect(bindings[i].valid?).to eq true
124
+ expect(bindings[i].inbound_index).to eq i
125
+ expect(bindings[i].inbound_name).to eq c.to_s
126
+ expect(bindings[i].operator).to eq operators[i]
127
+ end
128
+ end
129
+
130
+ it 'should map between user name and domain model has_one association' do
131
+ # Project has_one :owner
132
+ headers = ['owner', 'Owner', :owner]
133
+
134
+ operators = %w(owner owner owner)
135
+
136
+ bindings = binder.map_inbound_headers( Project, headers )
137
+
138
+ expect(bindings.size).to eq headers.size
139
+
140
+ headers.each_with_index do |c, i|
141
+ expect(bindings[i].valid?).to eq true
142
+ expect(bindings[i].inbound_index).to eq i
143
+ expect(bindings[i].inbound_name).to eq c.to_s
144
+ expect(bindings[i].operator).to eq operators[i]
145
+ end
146
+ end
147
+
148
+ it 'should map between user name and domain model has_many association' do
149
+ # Project has_many :loader_releases
150
+ headers = ['loader_releases', 'Loader Releases', :loader_releases]
151
+
152
+ operators = %w(loader_releases loader_releases loader_releases)
153
+
154
+ bindings = binder.map_inbound_headers( Project, headers )
155
+
156
+ expect(bindings.size).to eq headers.size
157
+
158
+ headers.each_with_index do |c, i|
159
+ expect(bindings[i].valid?).to eq true
160
+ expect(bindings[i].inbound_index).to eq i
161
+ expect(bindings[i].inbound_name).to eq c.to_s
162
+ expect(bindings[i].operator).to eq operators[i]
163
+ end
164
+ end
165
+
166
+ it 'should parse header for where fields and make available through inbound_column' do
167
+ # Owner has a name and belongs_to Project which has a title i.e lookup on title
168
+ headers = ['project:title']
169
+
170
+ bindings = binder.map_inbound_headers( Owner, headers )
171
+
172
+ expect(bindings.size).to eq headers.size
173
+
174
+ headers.each_with_index do |_c, i|
175
+ expect(bindings[i].valid?).to eq true
176
+ expect(bindings[i].inbound_column).to be_a InboundData::Column
177
+ expect(bindings[i].inbound_column.lookup_list).to be_a Array
178
+ expect(bindings[i].inbound_column.lookup_list.size).to eq 1
179
+ expect(bindings[i].inbound_column.lookup_list[0]).to be_a InboundData::LookupSupport
180
+ expect(bindings[i].inbound_column.lookups.first).to be_a InboundData::LookupSupport
181
+ expect(bindings[i].inbound_column.lookups.first).to eq bindings[i].inbound_column.lookup_list[0]
182
+ end
183
+ end
184
+
185
+ it 'should parse header for where clause field' do
186
+ # Owner has a name and belongs_to Project which has a title i.e lookup on title
187
+ headers = ['project:title', 'Project:title']
188
+
189
+ bindings = binder.map_inbound_headers( Owner, headers )
190
+
191
+ expect(bindings.size).to eq headers.size
192
+
193
+ headers.each_with_index do |_c, i|
194
+ first_lookup = bindings[i].inbound_column.lookups.first
195
+ expect(first_lookup.klass).to eq Project
196
+ expect(first_lookup.field).to eq 'title'
197
+ expect(first_lookup.where_value).to eq nil
198
+ end
199
+ end
200
+
201
+ it 'should parse header for where clause field & value belongs_to' do
202
+ # Owner has a name and belongs_to Project
203
+ headers = ['project:title:my first project', 'Project:title:my first project']
204
+
205
+ bindings = binder.map_inbound_headers( Owner, headers )
206
+
207
+ expect(bindings.size).to eq headers.size
208
+
209
+ headers.each_with_index do |_c, i|
210
+ first_lookup = bindings[i].inbound_column.lookups.first
211
+ expect(first_lookup.klass).to eq Project
212
+ expect(first_lookup.field).to eq 'title'
213
+ expect(first_lookup.where_value).to eq 'my first project'
214
+ end
215
+ end
216
+
217
+ it 'should parse header for where clause field & value has_one' do
218
+ # class Version < ActiveRecord::Base has_many :releases
219
+ # has_one :long_and_complex_table_linked_to_version
220
+ headers = ['long_and_complex_table_linked_to_version:price:10.2', 'Long_And Complex Table_linked_to_version:price:10.2']
221
+
222
+ bindings = binder.map_inbound_headers( Version, headers )
223
+
224
+ expect(bindings.size).to eq headers.size
225
+
226
+ headers.each_with_index do |_c, i|
227
+ first_lookup = bindings[i].inbound_column.lookups.first
228
+ expect(first_lookup.klass).to eq LongAndComplexTableLinkedToVersion
229
+ expect(first_lookup.field).to eq 'price'
230
+ expect(first_lookup.where_value).to eq '10.2'
231
+ end
232
+ end
233
+
234
+ it 'should parse header for where clause field & value & global data has_many' do
235
+ # Owner has_many :digitals which has field attachment_file_name
236
+ headers = ['digitals:attachment_file_name:my pdf:random data for a loader',
237
+ 'Digitals:attachment_file_name:my pdf:random data for a loader']
238
+
239
+ bindings = binder.map_inbound_headers( Owner, headers )
240
+
241
+ expect(bindings.size).to eq headers.size
242
+
243
+ headers.each_with_index do |_c, i|
244
+ first_lookup = bindings[i].inbound_column.lookups.first
245
+ expect(first_lookup.klass).to eq Digital
246
+ expect(first_lookup.field).to eq 'attachment_file_name'
247
+ expect(first_lookup.where_value).to eq 'my pdf'
248
+ expect(bindings[i].inbound_column.data).to be_a Array
249
+ expect(bindings[i].inbound_column.data).to include 'random data for a loader'
250
+ end
251
+ end
252
+
253
+ it 'should enable us to sort bindings into arbitrary processing order' do
254
+ headers = ['Value as string', :value_as_string, 'value_as boolean', 'Value_As_Double']
255
+
256
+ operators = %w(value_as_string value_as_string value_as_boolean value_as_double)
257
+
258
+ bindings = binder.map_inbound_headers( Project, headers )
259
+
260
+ pending 'sorting methods'
261
+
262
+ bindings.sort
263
+ end
264
+ end
265
+
266
+ end
@@ -0,0 +1,186 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
6
+
7
+ module DataShift
8
+
9
+ describe DataShift::ConfigGenerator do
10
+ include_context 'ClearAllCatalogues'
11
+
12
+ before(:each) do
13
+ results_clear
14
+ end
15
+
16
+ let(:config_generator) { DataShift::ConfigGenerator.new }
17
+
18
+ let(:expected_config_file) { result_file('mapping_service_project.yaml') }
19
+
20
+ let(:generate_config_file) { config_generator.write_import(expected_config_file, Project) }
21
+
22
+ context 'erb generation' do
23
+
24
+ context 'basic templates without a class' do
25
+ it 'should generate an standard ERB template containing default mappings & config' do
26
+ result = config_generator.create_import_config Project
27
+
28
+ expect(result).to be_a String
29
+ expect(result).to include 'Project:'
30
+ expect(result).to include 'nodes:'
31
+ end
32
+
33
+ it 'should have a consistent starting title' do
34
+ result = config_generator.create_import_config Project
35
+
36
+ expect(result).to include 'Project'
37
+ end
38
+ end
39
+
40
+ context 'real mappings' do
41
+ let(:map_file) { result_file('project_mapper.yaml') }
42
+
43
+ it 'should generate a populated mapping doc for a class' do
44
+ generate_config_file
45
+
46
+ expect(File.exist?(expected_config_file)).to be true
47
+ expect( File.read(expected_config_file) ).to include 'Project:'
48
+ end
49
+
50
+ it 'should be able to extract headers from_excel', fail: true do
51
+ config_generator.generate_from_excel(ifixture_file('SimpleProjects.xls') )
52
+
53
+ expect(config_generator.headers.empty?).to eq false
54
+ expect(config_generator.headers.class).to eq Headers
55
+ end
56
+
57
+ it 'should be able to extract headers from_excel' do
58
+ config_generator.generate_from_excel(ifixture_file('SimpleProjects.xls') )
59
+
60
+ # bit flakey need to manually st expected spreadsheet values
61
+ # value_as_string, Value as Text, value as datetime, value_as_boolean, value_as_double
62
+
63
+ expect(config_generator.headers.size).to eq 5
64
+ expect(config_generator.headers[0]).to eq 'value_as_string'
65
+ expect(config_generator.headers[4]).to eq 'value_as_double'
66
+ end
67
+
68
+ it 'should be able to generate a mapping from_excel' do
69
+ expect(File.exist?(map_file)).to be false
70
+
71
+ config_generator.generate_from_excel(ifixture_file('SimpleProjects.xls'), file: map_file )
72
+
73
+ expect(File.exist?(map_file)).to be true
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'Import' do
79
+
80
+ let(:expected_columns) { Project.new.serializable_hash.keys }
81
+
82
+ it 'should be able to write out a basic configuration document for a class' do
83
+ expect(File.exist?(expected_config_file)).to_not be true
84
+
85
+ expect { generate_config_file }.to_not raise_error
86
+
87
+ expect(File.exist?(expected_config_file)).to be true
88
+ end
89
+
90
+ it 'a basic mapping document should contain at least attributes of a class' do
91
+ generate_config_file
92
+
93
+ File.foreach(expected_config_file)
94
+ expect( $.).to be > expected_columns.size
95
+ end
96
+
97
+
98
+ it 'a basic mapping document can be configures to contain associations as well' do
99
+
100
+ DataShift::Exporters::Configuration.configure do |config|
101
+ config.with = [:all]
102
+ end
103
+
104
+ generate_config_file
105
+
106
+ expect(File.exist?(expected_config_file)).to be true
107
+
108
+ File.foreach(expected_config_file)
109
+ expect( $.).to be > expected_columns.size
110
+ end
111
+
112
+ end
113
+
114
+ # TODO: split into two - with and without associations
115
+
116
+ context 'Reading' do
117
+
118
+ let(:data_flow_schema) { DataFlowSchema.new }
119
+
120
+ #let(:config_file) { ifixture_file('ProjectConfiguration.yml') }
121
+
122
+ let(:expected_config_file) { result_file('mapping_service_project.yaml') }
123
+
124
+ let(:options) {
125
+ {
126
+ defaults: {'value_as_string': 'some default text', 'value_as_double': 45.467 },
127
+ overrides: {'value_as_double': 45.467 },
128
+ postfixes: {'value_as_text': 'postfix value_as_text' },
129
+ substitutions: { 'owner' => ['sub this text', 'for some other text'] }
130
+ # prefixs
131
+ }
132
+ }
133
+
134
+ let(:generate_config_file) { config_generator.write_import(expected_config_file, Project, options) }
135
+
136
+ before(:each) do
137
+
138
+ config = generate_config_file
139
+
140
+ expect(config).to be_a String
141
+ expect(config).to_not be_empty
142
+
143
+ expect(File.exist?(expected_config_file)).to be true
144
+
145
+ data_flow_schema.prepare_from_file(expected_config_file)
146
+ end
147
+
148
+ it 'should store the raw mapping data' do
149
+ expect(data_flow_schema.raw_data).to_not be_empty
150
+ expect(data_flow_schema.yaml_data).to_not be_empty
151
+ end
152
+
153
+ it 'should read in the nodes for this data schema' do
154
+ expect(data_flow_schema.nodes).to be_a NodeCollection
155
+ expect(data_flow_schema.nodes).to_not be_empty
156
+
157
+ node = data_flow_schema.nodes[0]
158
+ expect(node).to be_a NodeContext
159
+ end
160
+
161
+ it 'should provide access to details of the schema' do
162
+ expect(data_flow_schema.nodes.doc_context).to be_a DocContext
163
+ expect(data_flow_schema.nodes.doc_context.klass).to eq Project
164
+
165
+ end
166
+
167
+ it 'should have configured the Transformer', duff: true do
168
+
169
+ postfixes = DataShift::Transformation.factory.postfixes_for(Project)
170
+
171
+ expect(postfixes).to be_a Hash
172
+ expect(postfixes.has_key?('value_as_integer')).to eq false
173
+ expect(postfixes.has_key?('value_as_text')).to eq true
174
+ expect(postfixes.size).to eq 1
175
+
176
+ expect(DataShift::Transformation.factory.defaults_for(Project).size).to eq 2
177
+ expect(DataShift::Transformation.factory.overrides_for(Project).size).to eq 1
178
+ expect(DataShift::Transformation.factory.substitutions_for(Project).size).to eq 1
179
+ expect(DataShift::Transformation.factory.prefixes_for(Project).size).to eq 0
180
+
181
+ expect(DataShift::Transformation.factory.get_postfix_on(Project, :value_as_text)).to eq 'postfix value_as_text'
182
+ end
183
+ end
184
+
185
+ end
186
+ end # module