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
@@ -1,38 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2012
2
- # Author :: Tom Statter
3
- # Date :: Dec 2014
4
- # License:: MIT.
5
- #
6
- # Note, not DataShift, case sensitive, create namespace for command line : datashift
7
- require 'thor'
8
-
9
- module DataShift
10
-
11
- class DSThorBase < Thor
12
-
13
- include DataShift::Logging
14
-
15
- no_commands do
16
-
17
- def start_connections()
18
-
19
- # TODO - We're assuming run from a rails app/top level dir...
20
-
21
- if(File.exists?(File.expand_path('config/environment.rb')))
22
- begin
23
- require File.expand_path('config/environment.rb')
24
- rescue => e
25
- logger.error("Failed to initialise ActiveRecord : #{e.message}")
26
- raise ConnectionError.new("No config/environment.rb found - cannot initialise ActiveRecord")
27
- end
28
-
29
- else
30
- raise PathError.new("No config/environment.rb found - cannot initialise ActiveRecord")
31
- # TODO make this more robust ? e.g what about when using active record but not in Rails app, Sinatra etc
32
- end
33
- end
34
- end
35
-
36
- end
37
-
38
- end
@@ -1,112 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2015
2
- # Author :: Tom Statter
3
- # Date :: Aug 2015
4
- # License:: MIT
5
- #
6
- # Details:: Create mappings between systems
7
- #
8
- require 'generator_base'
9
-
10
- module DataShift
11
-
12
- class MappingGenerator < GeneratorBase
13
-
14
- include DataShift::Logging
15
- include ExcelBase
16
-
17
- def initialize(filename)
18
- super(filename)
19
- end
20
-
21
- # Create an YAML template for mapping headers
22
- #
23
- # Options:
24
- #
25
- # * <tt>:model_as_dest</tt> - Override default treatment of using model as the SOURCE
26
- #
27
- # * <tt>:remove</tt> - Array of header names to remove
28
- #
29
- # Rails columns like id, created_at etc are added to the remove list by default
30
- #
31
- # * <tt>:include_rails</tt> - Specify to keep Rails columns in mappings
32
- #
33
- # * <tt>:associations</tt> - Additionally include all Associations
34
- #
35
- # * <tt>:exclude</tt> - Association TYPE(s) to exclude.
36
- #
37
- # Possible association_type values are given by MethodDetail::supported_types_enum
38
- # ... [:assignment, :belongs_to, :has_one, :has_many]
39
- #
40
- # * <tt>:file</tt> - Write mappings direct to file name provided
41
- #
42
- def generate(model = nil, options = {})
43
-
44
- mappings = "mappings:\n"
45
-
46
- if(model)
47
-
48
- klass = DataShift::ModelMapper.class_from_string_or_raise( model )
49
-
50
- MethodDictionary.find_operators( klass )
51
-
52
- MethodDictionary.build_method_details( klass )
53
-
54
- prepare_model_headers(MethodDictionary.method_details_mgrs[klass], options)
55
-
56
- if(options[:model_as_dest])
57
- headers.each_with_index do |s, i| mappings += " #srcs_column_heading_#{i}: #{s}\n" end
58
- else
59
- headers.each_with_index do |s, i| mappings += " #{s}: #dest_column_heading_#{i}\n" end
60
- end
61
- else
62
- mappings += <<EOS
63
- ##source_column_heading_0: #dest_column_heading_0
64
- ##source_column_heading_1: #dest_column_heading_1
65
- ##source_column_heading_2: #dest_column_heading_2
66
-
67
- EOS
68
- end
69
-
70
- File.open(options[:file], 'w') do |f| f << mappings end if(options[:file])
71
-
72
- mappings
73
-
74
- end
75
-
76
- # Create an YAML template from a Excel spreadsheet for mapping headers
77
- #
78
- # * <tt>:model_as_dest</tt> - Override default treatment of using model as the SOURCE
79
- #
80
- # * <tt>:file</tt> - Write mappings direct to file name provided
81
- #
82
- def generate_from_excel(excel_file_name, options = {})
83
-
84
- excel = Excel.new
85
-
86
- puts "\n\n\nGenerating mapping from Excel file: #{excel_file_name}"
87
-
88
- excel.open(excel_file_name)
89
-
90
- sheet_number = options[:sheet_number] || 0
91
-
92
- sheet = excel.worksheet( sheet_number )
93
-
94
- parse_headers(sheet, options[:header_row])
95
-
96
- mappings = "mappings:\n"
97
-
98
- if(options[:model_as_dest])
99
- excel_headers.each_with_index do |s, i| mappings += " #srcs_column_heading_#{i}: #{s}\n" end
100
- else
101
- excel_headers.each_with_index do |s, i| mappings += " #{s}: #dest_column_heading_#{i}\n" end
102
- end
103
-
104
- File.open(options[:file], 'w') do |f| f << mappings end if(options[:file])
105
-
106
- mappings
107
-
108
- end
109
-
110
- end
111
-
112
- end # DataShift
@@ -1,33 +0,0 @@
1
- # Copyright:: Autotelik Media Ltd
2
- # Author :: Tom Statter
3
- # Date :: July 2010
4
- # License::
5
- #
6
- # Details:: Simple internal representation of Csv File
7
-
8
- require 'csv'
9
-
10
- class CSV
11
-
12
- include DataShift::ColumnPacker
13
-
14
- # Helpers for dealing with Active Record models and collections
15
- # Specify array of operators/associations to include - possible values are :
16
- # [:assignment, :belongs_to, :has_one, :has_many]
17
-
18
- def ar_to_headers( records, associations = nil, options = {} )
19
- add_row( to_headers(records, associations, options) )
20
- end
21
-
22
- # Convert an AR instance to a set of CSV columns
23
- # Additional non instance data can be included by supplying list of methods to call
24
- # on the record
25
- def ar_to_csv(record, options = {})
26
- csv_data = record.serializable_hash.values.collect { |c| escape_for_csv(c) }
27
-
28
- [*options[:methods]].each { |x| csv_data << escape_for_csv(record.send(x)) if(record.respond_to?(x)) } if(options[:methods])
29
-
30
- add_row(csv_data)
31
- end
32
-
33
- end
@@ -1,24 +0,0 @@
1
- class Object
2
- def to_b
3
- case self
4
- when true, false then self
5
- when nil then false
6
- else
7
- to_i != 0
8
- end
9
- end
10
- end
11
-
12
- class String
13
- TRUE_REGEXP = /^(yes|true|on|t|1|\-1)$/i.freeze
14
- FALSE_REGEXP = /^(no|false|off|f|0)$/i.freeze
15
-
16
- def to_b
17
- case self
18
- when TRUE_REGEXP then true
19
- when FALSE_REGEXP then false
20
- else
21
- to_i != 0
22
- end
23
- end
24
- end
@@ -1,58 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
2
- # Author :: Tom Statter
3
- # Date :: Dec 2012
4
- # License:: MIT
5
- #
6
- # Details:: Store and report stats
7
- #
8
- module DataShift
9
-
10
-
11
- class Reporter
12
-
13
- include DataShift::Logging
14
-
15
- # actual data rows/objects inbound
16
- attr_accessor :processed_object_count
17
- alias_method :processed_inbound_count, :processed_object_count
18
-
19
- # DB objects created, updated etc
20
- attr_accessor :loaded_objects, :failed_objects
21
-
22
- # actual data rows/objects inbound
23
- attr_accessor :success_inbound_count, :failed_inbound_count
24
-
25
- def initialize()
26
- reset
27
- end
28
-
29
- def reset()
30
- @processed_object_count = 0
31
- @loaded_objects, @failed_objects = [], []
32
- @success_inbound_count, @failed_inbound_count = 0,0
33
- end
34
-
35
- def add_loaded_object(object)
36
- @loaded_objects << object.id unless(object.nil? || @loaded_objects.include?(object))
37
- end
38
-
39
- def add_failed_object(object)
40
- @failed_objects << object unless( object.nil? || @failed_objects.include?(object))
41
- end
42
-
43
- def report
44
- loaded_objects.compact! if(loaded_objects)
45
-
46
- puts "\nProcessing Summary Report"
47
- puts ">>>>>>>>>>>>>>>>>>>>>>>>>\n"
48
- puts "Processed total of #{processed_object_count} inbound #{processed_object_count > 1 ? 'entries' : 'entry'}"
49
- puts "#{loaded_objects.size}\tdatabase objects were successfully processed."
50
- puts "#{success_inbound_count}\tinbound rows were successfully processed."
51
-
52
- puts "There were NO failures." if failed_objects.empty?
53
-
54
- puts "WARNING : Check logs : #{failed_objects.size} rows contained errors" unless failed_objects.empty?
55
- end
56
-
57
- end
58
- end
@@ -1,175 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2012
2
- # Author :: Tom Statter
3
- # Date :: April 2012
4
- # License:: MIT.
5
- #
6
- # Usage::
7
- #
8
- # To pull Datashift commands into your main application :
9
- #
10
- # require 'datashift'
11
- #
12
- # DataShift::load_commands
13
- #
14
- # Cmd Line:
15
- #
16
- # => bundle exec thor datashift:export:excel -m <active record class> -r <output_template.xls> -a
17
- #
18
- require 'thor_base'
19
-
20
-
21
- require 'datashift'
22
-
23
- # Note, for thor not DataShift, case sensitive, want namespace for cmd line to be : datashift
24
- module Datashift
25
-
26
-
27
- class Export < DataShift::DSThorBase
28
-
29
- desc "excel", "export any active record model (with optional associations)"
30
- method_option :model, :aliases => '-m', :required => true, :desc => "The active record model to export"
31
- method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
32
- method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
33
- method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
34
-
35
- def excel()
36
-
37
- start_connections
38
-
39
- require 'excel_exporter'
40
-
41
- model = options[:model]
42
- result = options[:result]
43
-
44
- logger.info "Datashift: Start Excel export to #{result}"
45
-
46
- klass = DataShift::ModelMapper::class_from_string(model) #Kernel.const_get(model)
47
-
48
- raise "ERROR: No such Model [#{model}] found - check valid model supplied via -model <Class>" if(klass.nil?)
49
-
50
- begin
51
- gen = DataShift::ExcelExporter.new(result)
52
-
53
- if(options[:assoc])
54
- opts = (options[:exclude]) ? {:exclude => options[:exclude]} : {}
55
- logger.info("Datashift: Exporting with associations")
56
- gen.export_with_associations(klass, klass.all, opts)
57
- else
58
- gen.export(klass.all, :sheet_name => klass.name)
59
- end
60
- rescue => e
61
- puts e
62
- puts e.backtrace
63
- puts "Warning: Error during export, data may be incomplete"
64
- end
65
-
66
- end
67
-
68
- desc "csv", "export any active record model (with optional associations)"
69
- method_option :model, :aliases => '-m', :required => true, :desc => "The active record model to export"
70
- method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
71
- method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
72
- method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
73
- method_option :methods, :aliases => '-c', :type => :array, :desc => "List of additional methods to call on model, useful for situations like delegated methods"
74
-
75
- def csv()
76
-
77
- # TODO - We're assuming run from a rails app/top level dir...
78
- # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
79
- require File.expand_path('config/environment.rb')
80
-
81
- require 'csv_exporter'
82
-
83
- model = options[:model]
84
- result = options[:result]
85
-
86
- logger.info "Datashift: Start CSV export to #{result}"
87
-
88
- klass = DataShift::ModelMapper::class_from_string(model) #Kernel.const_get(model)
89
-
90
- raise "ERROR: No such Model [#{model}] found - check valid model supplied via -model <Class>" if(klass.nil?)
91
-
92
- begin
93
- gen = DataShift::CsvExporter.new(result)
94
-
95
- if(options[:assoc])
96
- logger.info("Datashift: Exporting with associations")
97
- gen.export_with_associations(klass, klass.all, options)
98
- else
99
- gen.export(klass.all, options)
100
- end
101
- rescue => e
102
- puts e
103
- puts e.backtrace
104
- puts "Warning: Error during export, data may be incomplete"
105
- end
106
-
107
- end
108
-
109
- desc "db", "Export every Active Record model"
110
-
111
- method_option :result, :aliases => '-r', :required => true, :desc => "Path in which to create excel files"
112
- method_option :csv, :aliases => '-c', :desc => "Export to CSV instead - Excel is default."
113
- method_option :prefix, :aliases => '-p', :desc => "For namespaced tables/models specify the table prefix e.g spree_"
114
- method_option :module, :aliases => '-m', :desc => "For namespaced tables/models specify the Module name e.g Spree"
115
- method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
116
- method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
117
-
118
- def db()
119
-
120
- require File.expand_path('config/environment.rb')
121
-
122
- require 'excel_exporter'
123
- require 'csv_exporter'
124
-
125
- exporter = options[:csv] ? DataShift::CsvExporter.new(nil) : DataShift::ExcelExporter.new(nil)
126
-
127
- ext = options[:csv] ? '.csv' : '.xls'
128
-
129
- # Hmmm not many models appear - Rails uses autoload !
130
- #ActiveRecord::Base.send(:subclasses).each do |model|
131
- # puts model.name
132
- #end
133
-
134
- parent = options[:module] ? Object.const_get(options[:module]) : Object
135
-
136
- ActiveRecord::Base.connection.tables.each do |table|
137
-
138
- table.sub!(options[:prefix],'') if(options[:prefix])
139
-
140
- @result = File.join(options[:result], "#{table}#{ext}")
141
-
142
- begin
143
- @klass = parent.const_get(table.classify)
144
- rescue => e
145
- puts e.inspect
146
- puts "WARNING: Could not find an AR model for Table #{table}"
147
- next
148
- end
149
-
150
- puts "Datashift: Start export to #{@result}"
151
-
152
- exporter.filename = @result
153
-
154
- raise "ERROR: No such Model [#{@klass}] found - check valid model supplied via -model <Class>" if(@klass.nil?)
155
-
156
- begin
157
-
158
- if(options[:assoc])
159
- opts = (options[:exclude]) ? {:exclude => options[:exclude]} : {}
160
- logger.info("Datashift: Exporting with associations")
161
- exporter.export_with_associations(@klass, @klass.all, opts)
162
- else
163
- exporter.export(@klass.all, :sheet_name => @klass.name)
164
- end
165
- rescue => e
166
- puts e
167
- puts e.backtrace
168
- puts "Warning: Error during export, data may be incomplete"
169
- end
170
- end
171
- end
172
-
173
- end
174
-
175
- end
@@ -1,191 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2012
2
- # Author :: Tom Statter
3
- # Date :: Mar 2012
4
- # License:: MIT.
5
- #
6
- # Usage::
7
- #
8
- # To pull Datashift commands into your main application :
9
- #
10
- # require 'datashift'
11
- #
12
- # DataShift::load_commands
13
- #
14
- # Cmd Line:
15
- #
16
- # => bundle exec thor list datashift
17
- # bundle exec thor help datashift:generate:excel
18
- #
19
- require 'datashift'
20
- require 'generators/excel_generator'
21
-
22
- # Note, not DataShift, case sensitive, create namespace for command line : datashift
23
- module Datashift
24
-
25
-
26
- class Generate < Thor
27
-
28
- include DataShift::Logging
29
-
30
- desc "excel", "generate a template from an active record model (with optional associations)"
31
- method_option :model, :aliases => '-m', :required => true, :desc => "The active record model to export"
32
- method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
33
- method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
34
- method_option :exclude, :aliases => '-x', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
35
- method_option :remove, :aliases => '-e', :type => :array, :desc => "Don't generate in template the supplied fields"
36
- method_option :remove_rails, :type => :boolean, :desc => "Don't generate in template the standard Rails fields: #{DataShift::GeneratorBase::rails_columns.inspect}"
37
-
38
-
39
- def excel()
40
-
41
- # TODO - We're assuming run from a rails app/top level dir...
42
- # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
43
- require File.expand_path('config/environment.rb')
44
-
45
- model = options[:model]
46
- result = options[:result]
47
-
48
- logger.info "Datashift: Start Excel template generation in #{result}"
49
-
50
- klass = DataShift::ModelMapper.class_from_string_or_raise( model )
51
-
52
- begin
53
- gen = DataShift::ExcelGenerator.new(result)
54
-
55
- opts = { :remove => options[:remove],
56
- :remove_rails => options[:remove_rails]
57
- }
58
-
59
- if(options[:assoc])
60
-
61
- opts[:exclude] = options[:exclude]
62
-
63
- logger.info("Datashift: Generating with associations")
64
- gen.generate_with_associations(klass, opts)
65
- else
66
- gen.generate(klass, opts)
67
- end
68
- rescue => e
69
- puts e
70
- puts e.backtrace
71
- puts "Warning: Error during generation, template may be incomplete"
72
- end
73
-
74
- end
75
-
76
-
77
- desc "csv", "generate a template from an active record model (with optional associations)"
78
- method_option :model, :aliases => '-m', :required => true, :desc => "The active record model to export"
79
- method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
80
- method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
81
- method_option :exclude, :aliases => '-x', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
82
-
83
- def csv()
84
-
85
- # TODO - We're assuming run from a rails app/top level dir...
86
- # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
87
- require File.expand_path('config/environment.rb')
88
-
89
- require 'csv_generator'
90
-
91
- model = options[:model]
92
- result = options[:result]
93
-
94
- logger.info "Datashift: Start CSV template generation in #{result}"
95
-
96
- begin
97
- # support modules e.g "Spree::Property")
98
- klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
99
- rescue NameError => e
100
- puts e
101
- raise Thor::Error.new("ERROR: No such Model [#{model}] found - check valid model supplied")
102
- end
103
-
104
- raise Thor::Error.new("ERROR: No such Model [#{model}] found - check valid model supplied") unless(klass)
105
-
106
- begin
107
- gen = DataShift::CsvGenerator.new(result)
108
-
109
- if(options[:assoc])
110
- opts = (options[:exclude]) ? {:exclude => options[:exclude]} : {}
111
- logger.info("Datashift: Generating with associations")
112
- gen.generate_with_associations(klass, opts)
113
- else
114
- gen.generate(klass)
115
- end
116
- rescue => e
117
- puts e
118
- puts e.backtrace
119
- puts "Warning: Error during generation, template may be incomplete"
120
- end
121
-
122
- end
123
-
124
- desc "db", "Generate a template for every Active Record model"
125
-
126
- method_option :result, :aliases => '-r', :required => true, :desc => "Path in which to create excel files"
127
- method_option :csv, :aliases => '-c', :desc => "Export to CSV instead - Excel is default."
128
- method_option :prefix, :aliases => '-p', :desc => "For namespaced tables/models specify the table prefix e.g spree_"
129
- method_option :module, :aliases => '-m', :desc => "For namespaced tables/models specify the Module name e.g Spree"
130
- method_option :assoc, :aliases => '-a', :type => :boolean, :desc => "Include all associations in the template"
131
- method_option :exclude, :aliases => '-x', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
132
- method_option :remove, :aliases => '-e', :type => :array, :desc => "Don't generate the user supplied fields"
133
- method_option :remove_rails, :type => :boolean, :desc => "Don't generate the standard Rails fields: #{DataShift::GeneratorBase::rails_columns.inspect}"
134
-
135
- def db()
136
-
137
- require File.expand_path('config/environment.rb')
138
-
139
- require 'excel_exporter'
140
- require 'csv_exporter'
141
-
142
- exporter = options[:csv] ? DataShift::CsvGenerator.new(nil) : DataShift::ExcelGenerator.new(nil)
143
-
144
- ext = options[:csv] ? '.csv' : '.xls'
145
-
146
- parent = options[:module] ? Object.const_get(options[:module]) : Object
147
-
148
- ActiveRecord::Base.connection.tables.each do |table|
149
-
150
- table.sub!(options[:prefix],'') if(options[:prefix])
151
-
152
- @result = File.join(options[:result], "#{table}#{ext}")
153
-
154
- begin
155
- @klass = parent.const_get(table.classify)
156
- rescue => e
157
- puts e.inspect
158
- puts "WARNING: Could not find an AR model for Table #{table}"
159
- next
160
- end
161
-
162
- puts "Datashift: Start template generation to #{@result}"
163
-
164
- raise "ERROR: No such Model [#{@klass}] found - check valid model supplied via -model <Class>" if(@klass.nil?)
165
-
166
- begin
167
- opts = { :filename => @result,
168
- :remove => options[:remove],
169
- :remove_rails => options[:remove_rails],
170
- :sheet_name => @klass.name
171
- }
172
-
173
- if(options[:assoc])
174
- opts[:exclude] = options[:exclude]
175
- logger.info("Datashift: Generating with associations")
176
- exporter.generate_with_associations(@klass, opts)
177
- else
178
- exporter.generate(@klass, opts)
179
- end
180
- rescue => e
181
- puts e
182
- puts e.backtrace
183
- puts "Warning: Error during export, data may be incomplete"
184
- end
185
- end
186
- end
187
-
188
-
189
- end
190
-
191
- end