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,140 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ # Details:: Stores complete collection of ModelMethod instances per mapped class.
6
+ #
7
+ # Mapped to association types as defined by ModelMethod::supported_types_enum
8
+
9
+ # Provides high level find facilities to find a ModelMethod and to list out
10
+ # operators per type (has_one, has_many, belongs_to, instance_method etc)
11
+ # and all possible operators,
12
+ #
13
+ module DataShift
14
+
15
+ module ModelMethods
16
+
17
+ class Collection
18
+
19
+ include DataShift::Logging
20
+ extend DataShift::Logging
21
+
22
+ include Enumerable
23
+
24
+ attr_reader :managed_class
25
+
26
+ # Hash of all available methods by type
27
+ # [:assignment] => [:id, :name], [:belongs_to] => [:user, :address]
28
+ #
29
+ attr_accessor :by_optype
30
+
31
+ attr_accessor :model_method_list
32
+
33
+ extend Forwardable
34
+
35
+ def_delegators :@model_method_list, [], :sort, :sort!, :first, :last
36
+
37
+ def initialize( klass )
38
+ @managed_class = klass
39
+ @model_method_list = []
40
+ @by_optype = {}
41
+ end
42
+
43
+ def managed_class_name
44
+ @managed_class.name
45
+ end
46
+
47
+ alias klass managed_class_name
48
+
49
+ def insert(operator, type)
50
+ mm = ModelMethod.new(managed_class, operator, type)
51
+ add( mm )
52
+ mm
53
+ end
54
+
55
+ def add(model_method)
56
+ model_method_list << model_method
57
+
58
+ maintain_by_optype_helper model_method
59
+ end
60
+
61
+ def maintain_by_optype_helper( model_method )
62
+ # Helper list of all available by type [:belongs_to]
63
+ by_optype[model_method.operator_type.to_sym] ||= []
64
+ by_optype[model_method.operator_type.to_sym] << model_method
65
+ by_optype[model_method.operator_type.to_sym].uniq!
66
+ end
67
+
68
+ def <<(model_method)
69
+ add(model_method)
70
+ end
71
+
72
+ def push(model_method)
73
+ add(model_method)
74
+ end
75
+
76
+ def unshift(model_method)
77
+ model_method_list.unshift model_method
78
+ maintain_by_optype_helper model_method
79
+ end
80
+
81
+ def each
82
+ model_method_list.each { |mm| yield(mm) }
83
+ end
84
+
85
+ # Search for matching ModelMethod for given name across all types in supported_types_enum order
86
+ def search(name)
87
+ ModelMethod.supported_types_enum.each do |type|
88
+ model_method = find_by_name_and_type(name, type)
89
+ return model_method if model_method
90
+ end
91
+
92
+ nil
93
+ end
94
+
95
+ # Return matching ModelMethod for given name and specific type
96
+ def find_by_name_and_type(name, type)
97
+ by_optype = model_method_list.find_all { |mm| mm.operator_type? type }
98
+
99
+ by_optype.find { |mm| mm.operator? name }
100
+ end
101
+
102
+ # Search for matching ModelMethod for given name across Association types
103
+ def find_association(name)
104
+ ModelMethod.association_types_enum.each do |type|
105
+ model_method = find_by_name_and_type(name, type)
106
+ return model_method if model_method
107
+ end
108
+
109
+ nil
110
+ end
111
+
112
+ # Returns all ModelMethod(s) for supplied type e.g :belongs_to
113
+ # type is expected to be one of ModelMethod::supported_types_enum
114
+ def for_type( type )
115
+ model_method_list.find_all { |mm| mm.operator_type? type }
116
+ end
117
+
118
+ # Get list of Rails model operators
119
+ def get_operators(type)
120
+ for_type(type).collect(&:operator)
121
+ end
122
+
123
+ def available_operators
124
+ model_method_list.collect(&:operator)
125
+ end
126
+
127
+ # A reverse map showing all operators with their associated 'type'
128
+ def available_operators_with_type
129
+ h = {}
130
+ by_optype.each { |t, mms| mms.each { |v| h[v.operator] = t } }
131
+
132
+ # this is meant to be more efficient that Hash[h.sort]
133
+ sh = {}
134
+ h.keys.sort.each { |k| sh[k] = h[k] }
135
+ sh
136
+ end
137
+ end
138
+
139
+ end
140
+ end
@@ -0,0 +1,162 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Feb 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: This class holds info on a single Method callable on a domain Model
7
+ # By holding information on the Type inbound data can be manipulated
8
+ # into the right format for the style of operator; simple assignment,
9
+ # appending to an association collection or a method call
10
+ #
11
+ require_relative 'operator'
12
+
13
+ module DataShift
14
+
15
+ class ModelMethod < Operator
16
+
17
+ include DataShift::Logging
18
+
19
+ def self.association_types_enum
20
+ @assoc_type_enum ||= [:belongs_to, :has_one, :has_many]
21
+ @assoc_type_enum
22
+ end
23
+
24
+ def self.association_type?( type )
25
+ association_types_enum.member?( type )
26
+ end
27
+
28
+ # Klass is the class of the 'parent' object i.e with the associations,
29
+ # For example Product which may have operator orders
30
+ attr_accessor :klass
31
+
32
+ # The real column data from the DB - via ActiveRecord::ConnectionAdapters::Column when available
33
+
34
+ attr_reader :connection_adapter_column
35
+
36
+ # Operator is a population type method call on klass
37
+ #
38
+ # Type determines the style of operator call; simple assignment, an association or a method call
39
+ #
40
+ def initialize(klass, operator, type, connection_adapter_column = nil)
41
+
42
+ super(operator, type)
43
+
44
+ @klass = klass
45
+
46
+ # Note : Not all assignments will currently have a column type, for example
47
+ # those that are derived from a delegate_belongs_to
48
+ @connection_adapter_column = klass.columns.find { |col| col.name == operator } if connection_adapter_column.nil?
49
+
50
+ @connection_adapter_column = DataShift::ModelMethods::Catalogue.column_type_for(klass, operator) if connection_adapter_column.nil?
51
+ end
52
+
53
+ # Return the operator's expected class name, if can be derived, else nil
54
+ def operator_class_name
55
+ @operator_class_name ||=
56
+ if operator_for(:has_many) || operator_for(:belongs_to) || operator_for(:has_one)
57
+
58
+ determine_operator_class.name
59
+
60
+ elsif connection_adapter_column
61
+ connection_adapter_column.type.to_s.classify
62
+ else
63
+ ''
64
+ end
65
+
66
+ @operator_class_name
67
+ end
68
+
69
+ # Return the operator's expected class, if can be derived, else nil
70
+ def operator_class
71
+ @operator_class ||= determine_operator_class
72
+ end
73
+
74
+ # Returns true of MM is an association (rather than plain attribute or, enum or method)
75
+ def association_type?
76
+ ModelMethod.association_type?( operator_type )
77
+ end
78
+
79
+ def association_columns
80
+ klass.reflect_on_association(operator).klass.columns
81
+ end
82
+
83
+ def ==(other)
84
+ other.class == self.class && other.state == state
85
+ end
86
+
87
+ include Comparable
88
+
89
+ def <=>(other)
90
+ state <=> other.state
91
+ end
92
+
93
+ alias eql? ==
94
+
95
+ def hash
96
+ state.hash
97
+ end
98
+
99
+ def pp
100
+ x = <<-EOS
101
+ Class [#{klass.name}]
102
+ Operator Type [#{operator_type}]
103
+ Operator [#{operator}]
104
+ EOS
105
+
106
+ if connection_adapter_column.respond_to?(:cast_type)
107
+ x += <<-EOS
108
+ Col/SqlType [#{connection_adapter_column.class} - #{connection_adapter_column.cast_type.class.name}]
109
+ EOS
110
+ end
111
+ x
112
+ end
113
+
114
+ protected
115
+
116
+ # Defines the precedence order.
117
+ # For example in import, generally you want to process attributes first so that by
118
+ # the time you get to associations you have a valid model instance with an ID
119
+ # hence operator_type before operator
120
+ #
121
+ def state
122
+ [klass.name, ModelMethod.supported_types_enum.index(operator_type), operator]
123
+ end
124
+
125
+ private
126
+
127
+ # Return the operator's expected class, if can be derived, else nil
128
+ def determine_operator_class
129
+
130
+ if operator_for(:has_many) || operator_for(:belongs_to) || operator_for(:has_one)
131
+
132
+ result = klass.reflect_on_association(operator)
133
+
134
+ return result.klass if result
135
+
136
+ result = MapperUtils.class_from_string(operator.classify)
137
+
138
+ if result.nil?
139
+ begin
140
+
141
+ first = klass.to_s.split('::').first
142
+ logger.debug "Trying to find operator class with Parent Namespace #{first}"
143
+
144
+ result = MapperUtils.const_get_from_string("#{first}::#{operator.classify}")
145
+ rescue => e
146
+ logger.error("Failed to derive Class for #{operator} (#{@operator_type} - #{e.inspect}")
147
+ end
148
+ end
149
+
150
+ result
151
+
152
+ elsif connection_adapter_column
153
+ begin
154
+ Kernel.const_get(connection_adapter_column.type.to_s.classify)
155
+ rescue
156
+ nil
157
+ end
158
+ end
159
+ end
160
+
161
+ end
162
+ end
@@ -0,0 +1,76 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Feb 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: Just a high level helper to build Collections of model methods
7
+ # and enable quick access via Map of Class => Collection
8
+ #
9
+ module DataShift
10
+
11
+ module ModelMethods
12
+
13
+ class Manager
14
+
15
+ def self.collections
16
+ @collections ||= {}
17
+ end
18
+
19
+ def self.for(klass)
20
+ collections[klass]
21
+ end
22
+
23
+ def self.for?(klass)
24
+ (collections[klass] != nil)
25
+ end
26
+
27
+ # Build a thorough and usable picture of the operators which can be
28
+ # used to import/export data to objects of type 'klass'
29
+ # Stored as a dictionary of ModelMethods objects
30
+ #
31
+ # Subsequent calls with same class will return existing mapping
32
+ # To over ride this behaviour, supply :reload
33
+ #
34
+ # Options: TODO - find we are passing through options to other calls alot - good pattern for this ?
35
+
36
+ # :reload => clear caches and re-perform lookup
37
+ # :instance_methods => if true include instance method type 'setters' as well as model's pure columns
38
+ #
39
+ def self.catalog_class( klass, options = {} )
40
+
41
+ return collections[klass] if collections[klass] && !options[:reload]
42
+
43
+ ModelMethods::Catalogue.populate(klass, options) unless ModelMethods::Catalogue.catalogued?(klass)
44
+
45
+ collection = ModelMethods::Collection.new( klass )
46
+
47
+ DataShift::ModelMethods::Catalogue.assignments_for(klass).each do |n|
48
+ collection << ModelMethod.new(klass, n, :assignment)
49
+ end
50
+
51
+ DataShift::ModelMethods::Catalogue.has_one_for(klass).each do |n|
52
+ collection << ModelMethod.new(klass, n, :has_one)
53
+ end
54
+
55
+ DataShift::ModelMethods::Catalogue.has_many_for(klass).each do |n|
56
+ collection << ModelMethod.new(klass, n, :has_many)
57
+ end
58
+
59
+ DataShift::ModelMethods::Catalogue.belongs_to_for(klass).each do |n|
60
+ collection << ModelMethod.new(klass, n, :belongs_to)
61
+ end
62
+
63
+ collections[klass] = collection
64
+
65
+ collection
66
+
67
+ end
68
+
69
+ def self.clear
70
+ collections.clear
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,62 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Feb 2015
4
+ # License:: MIT
5
+ #
6
+ # Details:: This class holds info on a single Method callable on a domain Model
7
+ # By holding information on the Type inbound data can be manipulated
8
+ # into the right format for the style of operator; simple assignment,
9
+ # appending to an association collection or a method call
10
+ #
11
+ module DataShift
12
+
13
+ class Operator
14
+
15
+ include DataShift::Logging
16
+
17
+ # List of supported operator types e.g :assignment, :belongs_to, :has_one, :has_many etc
18
+ # N.B these are in priority order ie. often prefer to process assignments first, then associations
19
+ #
20
+ def self.supported_types_enum
21
+ @type_enum ||= [:assignment, :enum, :belongs_to, :has_one, :has_many, :method]
22
+ @type_enum
23
+ end
24
+
25
+ # The :operator that can be called to assign e.g orders or Products.new.orders << Order.new
26
+ attr_reader :operator
27
+
28
+ # The type of operator e.g normal method or Rails :assignment, :belongs_to, :has_one, :has_many etc
29
+ attr_reader :operator_type
30
+
31
+ # Operator is a population type method call
32
+ # Type determines the style of operator call; simple assignment, an association or a method call
33
+ #
34
+ def initialize(operator, type = :method)
35
+
36
+ if ModelMethod.supported_types_enum.include?(type.to_sym)
37
+ @operator_type = type.to_sym
38
+ else
39
+ raise BadOperatorType, "No such operator Type [#{type}] cannot instantiate ModelMethod for #{operator}"
40
+ end
41
+
42
+ @operator = operator
43
+ end
44
+
45
+ # Return the actual operator's name for supplied method type
46
+ # where type one of :assignment, :has_one, :belongs_to, :has_many etc
47
+ def operator_for( type )
48
+ return operator if @operator_type == type.to_sym
49
+ nil
50
+ end
51
+
52
+ def operator?(name, case_sensitive = false)
53
+ return false if(name.nil?)
54
+ case_sensitive ? operator == name : operator.casecmp(name.downcase).zero?
55
+ end
56
+
57
+ def operator_type?(type)
58
+ @operator_type == type.to_sym
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,26 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2016
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ # Details:: A collection of DataFlowNodes
6
+
7
+ require 'forwardable'
8
+
9
+ module DataShift
10
+
11
+ # Acts as an array of Node
12
+
13
+ class NodeCollection
14
+
15
+ extend Forwardable
16
+
17
+ attr_accessor :doc_context
18
+
19
+ def_delegators :@nodes, *Array.delegated_methods_for_fwdable
20
+
21
+ def initialize
22
+ @nodes = []
23
+ end
24
+
25
+ end
26
+ end