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,117 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ #
6
+ require File.dirname(__FILE__) + '/../spec_helper'
7
+
8
+ module DataShift
9
+
10
+ describe 'Populator' do
11
+ include_context 'ClearThenManageProject'
12
+
13
+ it 'should be able to create a new populator' do
14
+ expect(DataShift::Populator.new).to be
15
+ end
16
+
17
+ it 'should process a DSL string into a real hash' do
18
+ str1 = "{:name => 'the_fox' }"
19
+
20
+ x = DataShift::Populator.string_to_hash( str1 )
21
+
22
+ expect(x).to be_a Hash
23
+ expect(x.size).to eq 1
24
+
25
+ str2 = "{:name => 'the_fox', 'occupation' => 'fantastic', :food => 'duck soup' }"
26
+
27
+ x = DataShift::Populator.string_to_hash( str2 )
28
+
29
+ expect(x.size).to eq 3
30
+ expect(x).to eq('name' => 'the_fox', 'occupation' => 'fantastic', 'food' => 'duck soup')
31
+ end
32
+
33
+ it 'should process simplified syntax string into a real hash' do
34
+ str3 = "{cost_price: '13.45', price: 23, sale_price: 4.23 }"
35
+
36
+ x = DataShift::Populator.string_to_hash( str3 )
37
+
38
+ expect(x.keys).to include 'price'
39
+ expect(x['cost_price']).to eq '13.45'
40
+ expect(x['price']).to eq 23
41
+ expect(x['sale_price']).to eq 4.23
42
+ end
43
+
44
+ it 'should process mixed hash syntax string into a real hash' do
45
+ str = "{:cost_price => '13.45', price: 23, :sale_price => 4.23 }"
46
+
47
+ x = DataShift::Populator.string_to_hash( str )
48
+
49
+ expect(x.size).to eq 3
50
+ expect(x.keys).to include 'cost_price'
51
+ expect(x.keys).to include 'price'
52
+ expect(x['cost_price']).to eq '13.45'
53
+ expect(x['price']).to eq 23
54
+ expect(x['sale_price']).to eq 4.23
55
+ end
56
+
57
+ context 'prepare data' do
58
+ let(:model_method) { project_collection.search('value_as_string') }
59
+
60
+ let(:method_binding) { MethodBinding.new('value_as_string', 1, model_method) }
61
+
62
+ let(:populator) { DataShift::Populator.new }
63
+
64
+ let(:data) { 'some text for the string' }
65
+
66
+ it 'should prepare inbound string data for a method binding' do
67
+ value, attributes = populator.prepare_data(method_binding, data)
68
+
69
+ expect(value).to eq data
70
+ expect(attributes).to be_a Hash
71
+ expect(attributes.empty?).to eq true
72
+ end
73
+
74
+ it 'should prepare inbound array data for a method binding' do
75
+ list = create_list(:milestone, 4)
76
+
77
+ method_binding = MethodBinding.new('milestones', 1, project_collection.search('milestones') )
78
+
79
+ value, attributes = populator.prepare_data(method_binding, list)
80
+
81
+ expect(value).to eq list
82
+ expect(attributes).to be_a Hash
83
+ expect(attributes.empty?).to eq true
84
+ end
85
+
86
+ it 'should prepare inbound active relation a method binding' do
87
+ create_list(:loader_release, 5)
88
+
89
+ list = LoaderRelease.all
90
+
91
+ method_binding = MethodBinding.new('milestones', 1, project_collection.search('milestones') )
92
+
93
+ value, attributes = populator.prepare_data(method_binding, list)
94
+
95
+ expect(value).to be_a Array
96
+ expect(value.size).to eq list.size
97
+
98
+ expect(attributes).to be_a Hash
99
+ expect(attributes.empty?).to eq true
100
+ end
101
+
102
+ it 'should process a string value with attributes' do
103
+ data = 'Get up Lazy fox {:name => \'the_fox\', food: chickens }'
104
+
105
+ value, attributes = populator.prepare_data(method_binding, data)
106
+
107
+ expect(value).to eq 'Get up Lazy fox '
108
+
109
+ expect(attributes).to be_a Hash
110
+ expect(attributes.size).to eq 2
111
+ expect(attributes.keys).to include 'name'
112
+ expect(attributes['name']).to eq 'the_fox'
113
+ end
114
+ end
115
+ end
116
+
117
+ end # module
@@ -0,0 +1,314 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ #
4
+ # License:: MIT - Free, OpenSource
5
+ #
6
+ # Details:: Specification for Thor tasks supplied with datashift
7
+ #
8
+ # Test are often within a call to
9
+ # run_in(rails_sandbox_path)
10
+ # so we can access real model data from the dummy app
11
+ #
12
+ require 'thor'
13
+ require 'thor/group'
14
+ require 'thor/runner'
15
+
16
+ require File.dirname(__FILE__) + '/../spec_helper'
17
+
18
+ module DataShift
19
+
20
+ describe 'Thor high level command line tasks' do
21
+
22
+ context 'Loading commands' do
23
+
24
+ before(:all) do
25
+ DataShift.load_commands
26
+ end
27
+
28
+ it 'should list available datashift thor tasks' do
29
+ x = run_in(rails_sandbox_path) do
30
+ capture_stream(:stdout){ require 'datashift' ; Thor::Runner.start(["list"]) }
31
+ end
32
+
33
+ expect(x).to start_with("datashift\n--------")
34
+
35
+ expect(x).to include "csv"
36
+ expect(x).to include "excel"
37
+ expect(x).to include "csv"
38
+ end
39
+
40
+ it "tasks have been instantiated" do
41
+ expect(Datashift.constants.include?(:Import)).to be
42
+
43
+ expect(Datashift::Generate.new).to be
44
+ expect(Datashift::Config.new).to be
45
+ expect(Datashift::Export.new).to be
46
+ expect(Datashift::Import.new).to be
47
+ expect(Datashift::Generate.new).to be
48
+ expect(Datashift::Paperclip.new).to be
49
+ end
50
+
51
+ end
52
+
53
+ context 'Export CLI' do
54
+
55
+ let(:number_of_projects) { 7 }
56
+
57
+ before(:all) do
58
+ DataShift.load_commands
59
+ end
60
+
61
+ before(:each) do
62
+ clear_everything
63
+
64
+ create_list(:project, number_of_projects)
65
+
66
+ @user = create( :project_with_user ).user # creates a Project with associations
67
+ end
68
+
69
+ it 'should run datashift:export:csv to export a model to CSV file' do
70
+ expected = result_file 'rspec_thor_project_export.csv'
71
+
72
+ args = ['--model', 'Project', '--result', expected, '--associations']
73
+
74
+ run_in(rails_sandbox_path) do
75
+
76
+ capture_stream(:stdout) { Datashift::Export.new.invoke(:csv, [], args) }
77
+
78
+ expect(File.exist?(expected)).to eq true
79
+
80
+ File.foreach(expected) {}
81
+ count = $INPUT_LINE_NUMBER
82
+ expect(count).to eq number_of_projects + 2 # + 2 cos - 1 header row, 1 row for project_with_user
83
+ end
84
+ end
85
+
86
+ it 'should run datashift:export:csv to export a model to a EXCEL file' do
87
+ expected = result_file 'rspec_thor_project_export.xls'
88
+
89
+ args = ['--model', 'Project', '--result', expected, '--associations']
90
+
91
+ run_in(rails_sandbox_path) do
92
+
93
+ capture_stream(:stdout) { Datashift::Export.new.invoke(:excel, [], args) }
94
+
95
+ expect(File.exist?(expected)).to eq true
96
+
97
+ excel = DataShift::Excel.new
98
+ excel.open(expected)
99
+
100
+ expected_rows = Project.count + 1
101
+ last_idx = Project.count
102
+
103
+ expect(excel.num_rows).to eq expected_rows
104
+
105
+ user_column_index = excel.row(0).index 'user'
106
+ owner_column_index = excel.row(0).index 'owner'
107
+
108
+ expect(user_column_index).to be > -1
109
+
110
+ # Factories should have built the project WITHOUT associated owner data first
111
+ expect( excel[1, owner_column_index] ).to be_nil
112
+ expect( excel[1, user_column_index] ).to_not be_nil
113
+
114
+ # Factories should have built the project WITH real associated user data last
115
+ expect( excel[last_idx, user_column_index] ).to include 'mr'
116
+
117
+ owner_idx = excel.row(0).index 'owner'
118
+
119
+ expect(owner_idx).to be > -1
120
+
121
+ expect( excel[last_idx, owner_idx] ).to include '10000.23'
122
+ end
123
+ end
124
+
125
+ it 'should run datashift:export:db to export whole DB to EXCEL', duff: true do
126
+
127
+ # Writes one file per model into a PATH
128
+ expected_path = results_path
129
+
130
+ args = ['--model', 'Project', '--result', expected_path, '--associations']
131
+
132
+ run_in(rails_sandbox_path) do
133
+
134
+ output = capture_stream(:stdout) { Datashift::Export.new.invoke(:db, [], args) }
135
+
136
+ ['users', 'projects', 'milestones', 'owners', 'categories', 'versions', 'loader_releases',
137
+ 'long_and_complex_table_linked_to_versions', 'empties', 'digitals', 'categories'].each do |f|
138
+
139
+ expected = File.join(expected_path, "#{f}.xls")
140
+ expect(File.exist?(expected) ).to be_truthy, "MissingFile\nExport file [#{expected}] not found"
141
+ end
142
+
143
+ excel = Excel.new
144
+ excel.open( expected = File.join(expected_path, "projects.xls") )
145
+
146
+ expected_rows = Project.count + 1
147
+ last_idx = Project.count
148
+
149
+ expect(excel.num_rows).to eq expected_rows
150
+
151
+ user_column_index = excel.row(0).index 'user'
152
+ owner_column_index = excel.row(0).index 'owner'
153
+
154
+ expect(user_column_index).to be > -1
155
+
156
+ # Factories should have built the project WITHOUT associated owner data first
157
+ expect( excel[1, owner_column_index] ).to be_nil
158
+ expect( excel[1, user_column_index] ).to_not be_nil
159
+
160
+ # Factories should have built the project WITH real associated user data last
161
+ expect( excel[last_idx, user_column_index] ).to include 'mr'
162
+
163
+ expect(owner_column_index).to be > -1
164
+ expect( excel[last_idx, owner_column_index] ).to include '10000.23'
165
+ end
166
+ end
167
+
168
+ end # end Export CLi
169
+
170
+ context 'Import CLI' do
171
+
172
+ before(:all) do
173
+ DataShift.load_commands
174
+ end
175
+
176
+ before(:each) do
177
+ clear_everything
178
+ end
179
+
180
+ it 'should run datashift:config:import - generate skeleton import config for a model' do
181
+ expected = result_file('thor_spec_project_config.yaml')
182
+
183
+ expect(File.exists?(expected)).to eq false
184
+
185
+ #t datashift:config:import -m Spree::Variant -r /tmp
186
+
187
+ run_in(rails_sandbox_path) do
188
+ options = ['--model', 'Project', '--result', expected]
189
+
190
+ output = capture_stream(:stdout) { Datashift::Config.new.invoke(:import, [], options) }
191
+
192
+ expect(File.exists?(expected)).to eq true
193
+ expect(output).to include('Creating new configuration file')
194
+ end
195
+ end
196
+
197
+ it 'should run datashift:import:csv to import data from a CSV file' do
198
+
199
+ input_file = ifixture_file('csv/SimpleProjects.csv')
200
+
201
+ options = ['--model', 'Project', '--input', input_file]
202
+
203
+ run_in(rails_sandbox_path) do
204
+ count = Project.count
205
+
206
+ output = capture_stream(:stdout) { Datashift::Import.new.invoke(:csv, [], options) }
207
+
208
+ # TODO for now hard code 3 - should probably count the lines in the file
209
+ expect(Project.count - count).to eq 3
210
+
211
+ expect(output).to include('Processing Summary Report')
212
+ expect(output).to include('There were NO failures')
213
+ end
214
+
215
+ end
216
+
217
+ it 'should run datashift:import:excel to import data from Excel spreadsheet' do
218
+
219
+ input_file = ifixture_file('SimpleProjects.xls')
220
+
221
+ options = ['--model', 'Project', '--input', input_file]
222
+
223
+ run_in(rails_sandbox_path) do
224
+ count = Project.count
225
+
226
+ output = capture_stream(:stdout) { Datashift::Import.new.invoke(:excel, [], options) }
227
+
228
+ # TODO for now hard code 3 - should probably count the lines in the file
229
+ expect(Project.count - count).to eq 3
230
+
231
+ expect(output).to include('Processing Summary Report')
232
+ expect(output).to include('There were NO failures')
233
+ end
234
+
235
+ end
236
+
237
+ end
238
+
239
+ context 'Generate CLI' do
240
+ before(:each) do
241
+ results_clear
242
+ end
243
+
244
+ it 'should provide tasks to generate a mapping doc' do
245
+
246
+ # Access real model in dummy
247
+ run_in(rails_sandbox_path) do
248
+ cmd = ['--model', 'Project', '--result', File.join(results_path, 'thor_spec_gen_project.csv')]
249
+
250
+ output = capture_stream(:stdout) { Datashift::Generate.new.invoke(:csv, [], cmd) }
251
+
252
+ puts output
253
+ expect(File.exists?(File.join(results_path, 'thor_spec_gen_project.csv'))).to eq true
254
+ expect(output).to include('Datashift: CSV Template COMPLETED')
255
+ end
256
+
257
+ end
258
+ end
259
+
260
+ # thor datashift:export:csv -m, --model=MODEL -r, --result=RESULT ...
261
+ # thor datashift:export:excel -m, --model=MODEL -r, --result=RESULT ...
262
+ # thor datashift:generate:excel -m, --model=MODEL -r, --result=RESULT ...
263
+ # thor datashift:import:csv -i, --input=INPUT -m, --model=MODEL ...
264
+ # thor datashift:import:excel -i, --input=INPUT -m, --model=MODEL ...
265
+ # thor datashift:paperclip:attach -a, --attachment-klass=ATTACHMENT_KLASS -f, -... ...
266
+ # thor datashift:tools:zip -p, --path=PATH -r, --results=RESULTS ...
267
+
268
+
269
+ # N.B Tasks that fire up Rails application need to be run in own Thread or else get
270
+ # ... You cannot have more than one Rails::Application
271
+
272
+ it 'should be able to import a model from a complex excel through import CLI' do
273
+ skip 'How to run once rails already initialzed .. error : database configuration does not specify adapter'
274
+
275
+ x = Thread.new {
276
+ run_in(Sandbox.rails_sandbox_path) do
277
+ stdout = capture_stream(:stdout){
278
+ Thor::Runner.start(['datashift:import:excel', '-m', 'Project', '-i', ifixture_file('ProjectsSingleCategories.xls')])
279
+ }
280
+ puts stdout
281
+ end
282
+ }
283
+ x.join
284
+ end
285
+
286
+ it 'should attach Images to a specified Class from a directory' do
287
+ skip 'better understanding of testign thor'
288
+
289
+ # Owner has_many :digitals of type Digital
290
+
291
+ # Owner has a name by which we can id/look it up
292
+
293
+ args = [
294
+ '--attachment-klass', 'Digital',
295
+ '--attach-to-klass', 'Owner',
296
+ '--attach-to-find-by-field', 'name',
297
+ '--attach-to-field', 'digitals']
298
+
299
+ # which boils down to
300
+ #
301
+ # Digital.find_by_name( abc ).digitals << :Digital.new( File.read('abc_001.jpg') )
302
+
303
+ args << '--input' << File.join(fixtures_path, 'images')
304
+
305
+ puts "Running attach with: #{args}"
306
+
307
+ x = capture_stream(:stdout) { Thor::Runner.start(['datashift:paperclip:attach', [], args]) }
308
+
309
+ expect(x).to include "datashift\n--------"
310
+ # x.should =~ / csv -i/
311
+ # x.should =~ / excel -i/
312
+ end
313
+ end
314
+ end
@@ -0,0 +1,195 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ # Details:: Specs around Transforming inbound data
6
+ #
7
+ require File.join(File.dirname(__FILE__), '/../../spec_helper')
8
+
9
+ module DataShift
10
+
11
+ describe Transformation do
12
+ include_context 'ClearThenManageProject'
13
+
14
+ context 'basics' do
15
+
16
+ it 'should create standard method formats for all transformations' do
17
+
18
+ name = DataShift::Transformation::Factory::TRANSFORMERS_HASH_INSTANCE_NAMES.first
19
+
20
+ expect(DataShift::Transformation.factory).to respond_to "#{name}s_for"
21
+
22
+ expect(DataShift::Transformation.factory).to respond_to "defaults_for"
23
+ expect(DataShift::Transformation.factory).to respond_to "set_default"
24
+ expect(DataShift::Transformation.factory).to respond_to "set_default_on"
25
+ expect(DataShift::Transformation.factory).to respond_to "default?"
26
+ expect(DataShift::Transformation.factory).to respond_to "default"
27
+ expect(DataShift::Transformation.factory).to respond_to "get_default_on"
28
+ end
29
+
30
+
31
+ it 'should enable settings to be cleared' do
32
+
33
+ # [:default, :override, :substitution, :prefix, :postfix]
34
+
35
+ DataShift::Transformation.factory do |factory|
36
+ factory.set_default_on(Project, "name", 'default name')
37
+ factory.set_override_on(Project, "name", 'override name')
38
+ factory.set_prefix_on(Project, "name", 'prefix name')
39
+ factory.set_postfix_on(Project, "name", 'postfix name')
40
+
41
+ factory.set_substitution_on(Project, "name", 'if its blah', 'substitution name')
42
+ end
43
+
44
+ expect(DataShift::Transformation.factory.get_default_on(Project, "name")).to eq 'default name'
45
+ expect(DataShift::Transformation.factory.get_override_on(Project, "name")).to eq 'override name'
46
+ expect(DataShift::Transformation.factory.get_prefix_on(Project, "name")).to eq 'prefix name'
47
+ expect(DataShift::Transformation.factory.get_postfix_on(Project, "name")).to eq 'postfix name'
48
+ expect(DataShift::Transformation.factory.get_substitution_on(Project, "name")).to be_a Struct::Substitution
49
+
50
+ DataShift::Transformation.factory.clear
51
+
52
+ expect(DataShift::Transformation.factory.get_default_on(Project, "name")).to be_nil
53
+ expect(DataShift::Transformation.factory.get_override_on(Project, "blah")).to be_nil
54
+ expect(DataShift::Transformation.factory.get_prefix_on(Project, "blah")).to be_nil
55
+ expect(DataShift::Transformation.factory.get_postfix_on(Project, "blah")).to be_nil
56
+ expect(DataShift::Transformation.factory.get_substitution_on(Project, "blah")).to be_nil
57
+ end
58
+ end
59
+
60
+ context 'over-rides' do
61
+ let(:model_method) { project_collection.search('value_as_string') }
62
+
63
+ let(:method_binding) { MethodBinding.new('value_as_string', 1, model_method) }
64
+
65
+ let(:populator) { DataShift::Populator.new }
66
+
67
+ let(:data) { 'some text for the string' }
68
+
69
+ before(:each) do
70
+ DataShift::Transformation.factory.clear
71
+
72
+ DataShift::Exporters::Configuration.reset
73
+ end
74
+
75
+ it 'over-ride should always over-ride value regardless of real value' do
76
+ DataShift::Transformation.factory do |factory|
77
+ factory.set_override(method_binding, 'override text')
78
+ end
79
+
80
+ value, _attributes = populator.prepare_data(method_binding, data)
81
+
82
+ expect(value).to eq 'override text'
83
+ end
84
+
85
+ context 'DefaultValues for Columns' do
86
+ it 'should use default value when nil' do
87
+ DataShift::Transformation.factory do |factory|
88
+ factory.set_default(method_binding, 'default text')
89
+ end
90
+
91
+ value, _attributes = populator.prepare_data(method_binding, nil)
92
+ expect(value).to eq 'default text'
93
+ end
94
+
95
+ it 'should use default value when empty string' do
96
+ DataShift::Transformation.factory do |factory|
97
+ factory.set_default(method_binding, 'default text')
98
+ end
99
+
100
+ value, _attributes = populator.prepare_data(method_binding, '')
101
+ expect(value).to eq 'default text'
102
+ end
103
+ end
104
+
105
+ it 'should use substitution when relevant' do
106
+ DataShift::Transformation.factory do |factory|
107
+ factory.set_substitution(method_binding, 'text', ' replaced with me')
108
+ end
109
+
110
+ value, _attributes = populator.prepare_data(method_binding, data)
111
+ expect(value).to eq 'some replaced with me for the string'
112
+ end
113
+
114
+ it 'should add a prefix' do
115
+ DataShift::Transformation.factory do |factory|
116
+ factory.set_prefix(method_binding, 'added me before')
117
+ end
118
+
119
+ value, _attributes = populator.prepare_data(method_binding, data)
120
+ expect(value).to eq 'added me before' + data
121
+ end
122
+
123
+ it 'should add a postfix' do
124
+ DataShift::Transformation.factory do |factory|
125
+ factory.set_postfix(method_binding, 'added me after')
126
+ end
127
+
128
+ value, _attributes = populator.prepare_data(method_binding, data)
129
+ expect(value).to eq data + 'added me after'
130
+ end
131
+ end
132
+
133
+ let(:config_file) {ifixture_file('ProjectConfiguration.yml') }
134
+
135
+ context 'Configuration of Transformations' do
136
+
137
+ before(:each) do
138
+ DataShift::Transformation.factory.clear
139
+ DataShift::Transformation.factory.configure_from(Project, config_file )
140
+ end
141
+
142
+ it 'should provide facility to set default values via YAML configuration', duff: true do
143
+
144
+ puts DataShift::Transformation.factory.inspect
145
+
146
+ defaults = DataShift::Transformation.factory.defaults_for(Project)
147
+ expect(defaults).to be_a Hash
148
+ expect(defaults.size).to eq 3
149
+ end
150
+
151
+ it 'should provide facility to set override values via YAML configuration' do
152
+ override = DataShift::Transformation.factory.overrides_for(Project )
153
+ expect(override).to be_a Hash
154
+ expect(override.has_key?('value_as_integer')).to eq true
155
+ expect(override.size).to eq 2
156
+ end
157
+
158
+ it 'should provide facility to substitute values via YAML configuration' do
159
+ substitutes = DataShift::Transformation.factory.substitutions_for(Project )
160
+ expect(substitutes).to be_a Hash
161
+ expect(substitutes.has_key?('value_as_text')).to eq true
162
+
163
+ sub = substitutes['value_as_text']
164
+
165
+ expect(sub).to be_a Struct::Substitution
166
+ expect(sub.pattern).to eq "change me"
167
+ expect(sub.replacement).to eq "i only gone and got meself changed by datashift"
168
+
169
+ expect(substitutes.size).to eq 1
170
+ end
171
+
172
+ it 'should provide facility to set prefixes via YAML configuration' do
173
+ prefixes = DataShift::Transformation.factory.prefixes_for(Project )
174
+ expect(prefixes).to be_a Hash
175
+ expect(prefixes.has_key?('value_as_string')).to eq true
176
+ expect(prefixes.size).to eq 1
177
+ end
178
+
179
+ it 'should provide facility to set postfixes via YAML configuration' do
180
+ postfixes = DataShift::Transformation.factory.postfixes_for(Project )
181
+ expect(postfixes).to be_a Hash
182
+ expect(postfixes.has_key?('value_as_integer')).to eq false
183
+ expect(postfixes.has_key?('value_as_string')).to eq true
184
+ expect(postfixes.has_key?('value_as_text')).to eq true
185
+ expect(postfixes.size).to eq 2
186
+ end
187
+
188
+ after(:all) do
189
+ DataShift::Transformation.factory.clear
190
+ end
191
+
192
+ end
193
+ end
194
+
195
+ end