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,159 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
2
- # Author :: Tom Statter
3
- # Date :: Aug 2011
4
- # License:: MIT
5
- #
6
- # Details:: Specs for Excel aspect of Active Record Loader
7
- #
8
- require File.dirname(__FILE__) + '/spec_helper'
9
-
10
- require 'erb'
11
- require 'csv_generator'
12
-
13
- include DataShift
14
-
15
- describe 'CSV Generator' do
16
-
17
- before(:all) do
18
- results_clear("*.csv")
19
-
20
- @klazz = Project
21
- @assoc_klazz = Category
22
- end
23
-
24
- before(:each) do
25
- MethodDictionary.clear
26
- MethodDictionary.find_operators( @klazz )
27
- MethodDictionary.find_operators( @assoc_klazz )
28
- end
29
-
30
- it "should be able to create a new csv generator" do
31
- generator = CsvGenerator.new( 'dummy.csv' )
32
-
33
- generator.should_not be_nil
34
- end
35
-
36
- it "should generate template .csv file from model" do
37
-
38
- expected = result_file('project_template_spec.csv')
39
-
40
- gen = CsvGenerator.new( expected )
41
-
42
- gen.generate(Project)
43
-
44
- expect(File.exists?(expected)).to eq true
45
-
46
- puts "Can manually check file @ #{expected}"
47
-
48
- csv = CSV.read(expected)
49
-
50
- headers = csv[0]
51
-
52
- [ "title", "value_as_string", "value_as_text", "value_as_boolean", "value_as_datetime", "value_as_integer", "value_as_double"].each do |check|
53
- headers.include?(check).should == true
54
- end
55
- end
56
-
57
- # has_one :owner
58
- # has_many :milestones
59
- # has_many :loader_releases
60
- # has_many :versions, :through => :loader_releases
61
- # has_and_belongs_to_many :categories
62
-
63
- it "should include all associations in template .csv file from model" do
64
-
65
- expected = result_file('project_plus_assoc_template_spec.csv')
66
-
67
- gen = CsvGenerator.new(expected)
68
-
69
- gen.generate_with_associations(Project)
70
-
71
- expect( File.exists?(expected)).to eq true
72
-
73
- csv = CSV.read(expected)
74
-
75
- headers = csv[0]
76
-
77
- ["owner", "milestones", "loader_releases", "versions", "categories"].each do |check|
78
- headers.include?(check).should == true
79
- end
80
- end
81
-
82
-
83
- it "should enable us to exclude associations by type in template .csv file" do
84
-
85
- expected = result_file('project_plus_some_assoc_template_spec.csv')
86
-
87
- gen = CsvGenerator.new(expected)
88
-
89
- options = {:exclude => :has_many }
90
-
91
- gen.generate_with_associations(Project, options)
92
-
93
- expect(File.exists?(expected)).to eq true #, "Failed to find expected result file #{expected}"
94
-
95
- csv = CSV.read(expected)
96
-
97
- headers = csv[0]
98
-
99
- headers.include?('title').should == true
100
- headers.include?('owner').should == true
101
-
102
- ["milestones", "loader_releases", "versions", "categories"].each do |check|
103
- headers.should_not include check
104
- end
105
-
106
- end
107
-
108
-
109
- it "should enable us to exclude certain associations in template .csv file " do
110
-
111
- expected = result_file('project_plus_some_assoc_template_spec.csv')
112
-
113
- gen = CsvGenerator.new(expected)
114
-
115
- options = {:remove => [:milestones, :versions] }
116
-
117
- gen.generate_with_associations(Project, options)
118
-
119
- expect(File.exists?(expected)).to eq true#, "Failed to find expected result file #{expected}"
120
-
121
- csv = CSV.read(expected)
122
-
123
- headers = csv[0]
124
-
125
- ["title", "loader_releases", "owner", "categories"].each do |check|
126
- headers.should include check
127
- end
128
-
129
-
130
- ["milestones", "versions", ].each do |check|
131
- headers.should_not include check
132
- end
133
-
134
- end
135
-
136
-
137
- it "should enable us to remove standard rails feilds from template .csv file " do
138
-
139
- expected = result_file('project_plus_some_assoc_template_spec.csv')
140
-
141
- gen = CsvGenerator.new(expected)
142
-
143
- options = {:remove_rails => true}
144
-
145
- gen.generate_with_associations(Project, options)
146
-
147
- expect(File.exists?(expected)).to eq true#, "Failed to find expected result file #{expected}"
148
-
149
- csv = CSV.read(expected)
150
-
151
- headers = csv[0]
152
-
153
- ["id", "updated_at", "created_at"].each do |check|
154
- headers.should_not include check
155
- end
156
-
157
-
158
- end
159
- end
@@ -1,212 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
2
- # Author :: Tom Statter
3
- # Date :: Aug 2011
4
- # License:: MIT
5
- #
6
- # Details:: Specs for CSV aspect of Active Record Loader
7
- #
8
- require File.dirname(__FILE__) + '/spec_helper'
9
-
10
- require 'erb'
11
- require 'csv_loader'
12
-
13
- include DataShift
14
-
15
- describe 'Csv Loader' do
16
-
17
- before(:each) do
18
- DataShift::MethodDictionary.clear
19
-
20
- @method_mapper = DataShift::MethodMapper.new
21
- end
22
-
23
-
24
- before(:each) do
25
-
26
- %w{category_001 category_002 category_003 category_004 category_005}.each do |cat|
27
- Category.find_or_create_by(reference: cat)
28
- end
29
-
30
-
31
- end
32
-
33
- it "should be able to create a new csv loader and load object" do
34
- loader = CsvLoader.new(Project)
35
-
36
- loader.load_object.should_not be_nil
37
- loader.load_object.should be_is_a(Project)
38
- expect(loader.load_object.new_record?).to eq true
39
- end
40
-
41
- it "should process a simple .csv spreedsheet" do
42
-
43
- loader = CsvLoader.new(Project)
44
-
45
- count = Project.count
46
- loader.perform_load ifixture_file('csv/SimpleProjects.csv')
47
-
48
- loader.loaded_count.should == (Project.count - count)
49
- end
50
-
51
- it "should process multiple associationss from single column" do
52
-
53
- DataShift::MethodDictionary.find_operators( Category )
54
-
55
- DataShift::MethodDictionary.build_method_details( Category )
56
-
57
- Project.find_by_title('001').should be_nil
58
- count = Project.count
59
-
60
- loader = CsvLoader.new(Project)
61
-
62
- loader.perform_load( ifixture_file('csv/ProjectsSingleCategories.csv') )
63
-
64
- loader.loaded_count.should be > 3
65
- loader.loaded_count.should == (Project.count - count)
66
-
67
- {'001' => 2, '002' => 1, '003' => 3, '099' => 0 }.each do|title, expected|
68
- project = Project.find_by_title(title)
69
-
70
- project.should_not be_nil
71
- #puts "#{project.inspect} [#{project.categories.size}]"
72
-
73
- expect(project.categories.size).to eq expected
74
- end
75
- end
76
-
77
- it "should process multiple associations in csv file" do
78
-
79
- loader = CsvLoader.new(Project)
80
-
81
- count = Project.count
82
- loader.perform_load( ifixture_file('csv/ProjectsMultiCategories.csv' ))
83
-
84
- loader.loaded_count.should == (Project.count - count)
85
-
86
- {'004' => 3, '005' => 1, '006' => 0, '007' => 1 }.each do|title, expected|
87
- project = Project.find_by_title(title)
88
-
89
- project.should_not be_nil
90
-
91
- expect(project.categories.size).to eq expected
92
- end
93
-
94
- end
95
-
96
- it "should process multiple associations with lookup specified in column from excel spreedsheet" do
97
-
98
- loader = CsvLoader.new(Project)
99
-
100
- count = Project.count
101
- loader.perform_load( ifixture_file('csv/ProjectsMultiCategoriesHeaderLookup.csv'))
102
-
103
- expect(loader.loaded_count).to eq (Project.count - count)
104
- loader.loaded_count.should > 3
105
-
106
- {'004' => 4, '005' => 1, '006' => 0, '007' => 1 }.each do|title, expected|
107
- project = Project.find_by_title(title)
108
-
109
- project.should_not be_nil
110
-
111
- expect(project.categories.size).to eq expected
112
- end
113
-
114
- end
115
-
116
- it "should process excel spreedsheet with extra undefined columns" do
117
- loader = CsvLoader.new(Project)
118
- lambda {loader.perform_load( ifixture_file('csv/BadAssociationName.csv') ) }.should_not raise_error
119
- end
120
-
121
- it "should NOT process excel spreedsheet with extra undefined columns when strict mode" do
122
- loader = CsvLoader.new(Project)
123
- expect {loader.perform_load( ifixture_file('csv/BadAssociationName.csv'), :strict => true)}.to raise_error(MappingDefinitionError)
124
- end
125
-
126
- it "should raise an error when mandatory columns missing" do
127
- loader = CsvLoader.new(Project)
128
- expect {loader.perform_load(ifixture_file('csv/ProjectsMultiCategories.csv'), :mandatory => ['not_an_option', 'must_be_there'])}.to raise_error(DataShift::MissingMandatoryError)
129
- end
130
-
131
- it "should provide facility to set default values", :focus => true do
132
- loader = CsvLoader.new(Project)
133
-
134
- populator = loader.populator
135
-
136
- populator.set_default_value('value_as_string', 'some default text' )
137
- populator.set_default_value('value_as_double', 45.467 )
138
- populator.set_default_value('value_as_boolean', true )
139
-
140
- texpected = Time.now.to_s(:db)
141
-
142
- populator.set_default_value('value_as_datetime', texpected )
143
-
144
- #value_as_string Value as Text value as datetime value_as_boolean value_as_double category
145
-
146
- loader.perform_load(ifixture_file('csv/ProjectsSingleCategories.csv'))
147
-
148
- p = Project.find_by_title( '099' )
149
-
150
- p.should_not be_nil
151
-
152
- p.value_as_string.should == 'some default text'
153
- p.value_as_double.should == 45.467
154
- p.value_as_boolean.should == true
155
- p.value_as_datetime.to_s(:db).should == texpected
156
-
157
- # expected: "2012-09-17 10:00:52"
158
- # got: Mon Sep 17 10:00:52 +0100 2012 (using ==)
159
-
160
- p_no_defs = Project.first
161
-
162
- p_no_defs.value_as_string.should_not == 'some default text'
163
- p_no_defs.value_as_double.should_not == 45.467
164
- p_no_defs.value_as_datetime.should_not == texpected
165
-
166
- end
167
-
168
- it "should provide facility to set pre and post fix values" do
169
- loader = CsvLoader.new(Project)
170
-
171
- loader.populator.set_prefix('value_as_string', 'myprefix' )
172
- loader.populator.set_postfix('value_as_string', 'my post fix' )
173
-
174
- #value_as_string Value as Text value as datetime value_as_boolean value_as_double category
175
-
176
- loader.perform_load( ifixture_file('csv/ProjectsSingleCategories.csv'))
177
-
178
- p = Project.find_by_title( '001' )
179
-
180
- p.should_not be_nil
181
-
182
- p.value_as_string.should == 'myprefixDemo stringmy post fix'
183
- end
184
-
185
- it "should provide facility to set default values via YAML configuration" do
186
- loader = CsvLoader.new(Project)
187
-
188
- loader.configure_from( ifixture_file('ProjectsDefaults.yml') )
189
-
190
- loader.perform_load( ifixture_file('csv/ProjectsSingleCategories.csv') )
191
-
192
- p = Project.find_by_title( '099' )
193
-
194
- p.should_not be_nil
195
-
196
- p.value_as_string.should == "Default Project Value"
197
- end
198
-
199
-
200
- it "should provide facility to over ride values via YAML configuration", :fail => true do
201
- loader = CsvLoader.new(Project)
202
-
203
- loader.configure_from( ifixture_file('ProjectsDefaults.yml') )
204
-
205
-
206
- loader.perform_load( ifixture_file('csv/ProjectsSingleCategories.csv') )
207
-
208
- Project.all.each {|p| p.value_as_double.should == 99.23546 }
209
- end
210
-
211
-
212
- end
@@ -1,55 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
2
- # Author :: Tom Statter
3
- # Date :: Oct 2011
4
- # License:: MIT
5
- #
6
- # Details:: Specs for high level apsects of DataShift library
7
- #
8
- require File.dirname(__FILE__) + '/spec_helper'
9
-
10
- describe 'DataShift' do
11
-
12
- before(:each) do
13
- end
14
-
15
- it "should provide gem version" do
16
- DataShift::gem_version
17
- end
18
-
19
- it "should provide gem name" do
20
- DataShift::gem_name.should == 'datashift'
21
- end
22
-
23
- it "should provide root_path" do
24
- DataShift.root_path.should_not be_empty
25
- end
26
-
27
- it "should provide a log" do
28
- class Blah
29
- include DataShift::Logging
30
-
31
- def try_me
32
- logger.info "hello datashift spec"
33
- end
34
- end
35
-
36
-
37
- b = Blah.new()
38
-
39
- b.logger.info "try me"
40
-
41
- b.try_me
42
-
43
-
44
- end
45
-
46
- it "should provide quick way to create exception class" do
47
- DataShift::DataShiftException.generate( "BadRspecError")
48
-
49
- e = DataShift::BadRspecError.new("my new exception class")
50
-
51
- expect(e).to be
52
- expect(e.message).to eq "my new exception class"
53
- end
54
-
55
- end
@@ -1,199 +0,0 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2011
2
- # Author :: Tom Statter
3
- # Date :: Aug 2011
4
- # License:: MIT
5
- #
6
- # Details:: Specs for Excel aspect of Active Record Loader
7
- #
8
- require File.dirname(__FILE__) + '/spec_helper'
9
-
10
-
11
- require 'erb'
12
- require 'excel_exporter'
13
-
14
- include DataShift
15
-
16
- describe 'Excel Exporter' do
17
-
18
- before(:all) do
19
-
20
- results_clear( "exp_*.xls" )
21
-
22
- @klazz = Project
23
- @assoc_klazz = Category
24
- end
25
-
26
- before(:each) do
27
- MethodDictionary.clear
28
- MethodDictionary.find_operators( @klazz )
29
- MethodDictionary.find_operators( @assoc_klazz )
30
-
31
- db_clear() # todo read up about proper transactional fixtures
32
-
33
- end
34
-
35
- context 'simple project' do
36
-
37
- before(:each) do
38
- create( :project )
39
- end
40
-
41
- it "should be able to create a new excel exporter" do
42
- generator = ExcelExporter.new( 'exp_dummy.xls' )
43
-
44
- generator.should_not be_nil
45
- end
46
-
47
- it "should handle bad params to export" do
48
-
49
- expect = result_file('project_first_export_spec.csv')
50
-
51
- exporter = DataShift::ExcelExporter.new( expect )
52
-
53
- expect{ exporter.export(nil) }.not_to raise_error
54
-
55
- expect{ exporter.export([]) }.not_to raise_error
56
-
57
- puts "Can manually check file @ #{expect}"
58
- end
59
-
60
- it "should export model object to .xls file" do
61
-
62
- expected = result_file('exp_project_first_export_spec.xls')
63
-
64
- gen = ExcelExporter.new( expected )
65
-
66
- gen.export(Project.all.first)
67
-
68
- expect(File.exists?(expected)).to eq true
69
-
70
- puts "Can manually check file @ #{expected}"
71
- end
72
-
73
- end
74
-
75
- it "should export collection of model objects to .xls file" do
76
-
77
- create_list(:project, 7)
78
-
79
- expected = result_file('exp_project_export_spec.xls')
80
-
81
- gen = ExcelExporter.new( expected )
82
-
83
- gen.export(Project.all)
84
-
85
- expect( File.exists?(expected)).to eq true
86
-
87
- excel = Excel.new
88
- excel.open(expected)
89
-
90
- expect(excel.num_rows).to eq 8
91
-
92
- end
93
-
94
-
95
- it "should export a model and associations to .xls file" do
96
-
97
- create( :project_user )
98
- create_list(:project, 7)
99
-
100
- expected = result_file('exp_project_plus_assoc.xls')
101
-
102
- gen = ExcelExporter.new(expected)
103
-
104
- items = Project.all
105
-
106
- gen.export_with_associations(Project, items)
107
-
108
- expect(File.exists?(expected)).to eq true
109
-
110
- excel = Excel.new
111
- excel.open(expected)
112
-
113
- expect(excel.row(0)).to include 'owner'
114
- expect(excel.row(0)).to include 'user'
115
-
116
- expect(excel.num_rows).to eq Project.count + 1
117
-
118
- user_inx = excel.row(0).index 'user'
119
-
120
- expect(user_inx).to be > -1
121
-
122
- expect( excel[1, user_inx] ).to include 'mr'
123
-
124
- inx = excel.row(0).index 'owner'
125
-
126
- expect(inx).to be > -1
127
-
128
- expect( excel[1, inx] ).to include '10000.23'
129
- end
130
-
131
- it "should export a model and has_many assocs to .xls file" do
132
-
133
- create( :project_user )
134
- create( :project_with_milestones )
135
- #create( :project_with_milestones, milestones_count: 4 )
136
- create_list(:project, 7)
137
-
138
- expected = result_file('exp_project_plus_has_many_assoc.xls')
139
-
140
- gen = ExcelExporter.new(expected)
141
-
142
- items = Project.all
143
-
144
- gen.export_with_associations(Project, items)
145
-
146
- expect(File.exists?(expected)).to eq true
147
-
148
- excel = Excel.new
149
- excel.open(expected)
150
-
151
- expect(excel.row(0)).to include 'owner'
152
- expect(excel.row(0)).to include 'user'
153
-
154
- expect(excel.num_rows).to eq Project.count + 1
155
-
156
- milestone_inx = excel.row(0).index 'milestones'
157
-
158
- expect(milestone_inx).to be > -1
159
-
160
- puts excel[2, milestone_inx].inspect
161
-
162
- expect( excel[2, milestone_inx].to_s ).to include Delimiters::multi_assoc_delim
163
- expect( excel[2, milestone_inx].to_s ).to include 'milestone 1'
164
-
165
- end
166
-
167
-
168
- it "should export a model and assocs in json to .xls file" do
169
-
170
- create( :project_user )
171
- create( :project_with_milestones )
172
- #create( :project_with_milestones, milestones_count: 4 )
173
- create_list(:project, 7)
174
-
175
- expected = result_file('exp_project_plus_has_many_assoc.xls')
176
-
177
- gen = ExcelExporter.new(expected)
178
-
179
- items = Project.all
180
-
181
- gen.export_with_associations(Project, items, json: true)
182
-
183
- expect(File.exists?(expected)).to eq true
184
-
185
- excel = Excel.new
186
- excel.open(expected)
187
-
188
- expect(excel.num_rows).to eq Project.count + 1
189
-
190
- milestone_inx = excel.row(0).index 'milestones'
191
-
192
- puts excel[2, milestone_inx].inspect
193
-
194
- expect( excel[2, milestone_inx].to_s ).to include '['
195
- expect( excel[2, milestone_inx].to_s ).to include '"name":"milestone 1"'
196
-
197
- end
198
-
199
- end