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,66 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2011
2
+ # Author :: Tom Statter
3
+ # Date :: Aug 2011
4
+ # License:: MIT
5
+ #
6
+ # Details:: Specs for base class Loader
7
+ #
8
+ require File.dirname(__FILE__) + '/../spec_helper'
9
+
10
+ module DataShift
11
+
12
+ describe Configuration do
13
+
14
+ let(:defaults) do
15
+ { project:
16
+ { value_as_string: 'Default Project Value',
17
+ category: 'reference:category_002',
18
+ value_as_datetime: Time.now.to_s(:db)
19
+ }
20
+ }
21
+ end
22
+
23
+ before do
24
+ end
25
+
26
+ let(:call) { DataShift::Exporters::Configuration.call }
27
+
28
+ context "with" do
29
+
30
+ it 'defaults to basic attribute data' do
31
+ expect(call.op_types_in_scope).to eq [:assignment, :enum]
32
+ end
33
+
34
+ it 'returns complete list of op types when [:all] specified' do
35
+ DataShift::Exporters::Configuration.configure do |config|
36
+ config.with = [:all]
37
+ end
38
+ expect(call.op_types_in_scope).to eq ModelMethod.supported_types_enum
39
+ end
40
+
41
+ it 'returns complete list of op types when :all specified' do
42
+ DataShift::Exporters::Configuration.configure do |config|
43
+ config.with = :all
44
+ end
45
+ expect(call.op_types_in_scope).to eq ModelMethod.supported_types_enum
46
+ end
47
+
48
+ it 'can be configuresd complete list of op types when :all specified' do
49
+ DataShift::Exporters::Configuration.configure do |config|
50
+ config.with = :all
51
+ end
52
+ expect(call.op_types_in_scope).to eq ModelMethod.supported_types_enum
53
+ end
54
+
55
+ it 'can be configured with custom list of op types to process' do
56
+ DataShift::Exporters::Configuration.configure do |config|
57
+ config.with = [:assignment, :enum, :belongs_to]
58
+ end
59
+ expect(call.op_types_in_scope).to eq [:assignment, :enum, :belongs_to]
60
+ end
61
+
62
+
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,63 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # License:: MIT
4
+ #
5
+ require File.dirname(__FILE__) + '/../spec_helper'
6
+
7
+ module DataShift
8
+
9
+ describe 'Context Factory' do
10
+
11
+ include_context 'ClearThenManageProject'
12
+
13
+ # got burnt by other tests failing if run after this, we are caching stuff in this class
14
+ # that perissts across tests - so ContextFactory design probably a code smell
15
+ after(:all) do
16
+ ContextFactory.clear_populators
17
+ end
18
+
19
+ let(:model_method) { project_collection.search('value_as_string') }
20
+
21
+ let(:method_binding) { MethodBinding.new('column_for_value_as_string', 0, model_method) }
22
+
23
+ let(:another_populator) do
24
+ class AnotherPopulator
25
+ end
26
+
27
+ AnotherPopulator
28
+ end
29
+
30
+ context 'configuring' do
31
+ it 'can be configured to provide a specific Populator per operator' do
32
+ expect {
33
+ ContextFactory.set_populator(method_binding, another_populator)
34
+ }.to change(ContextFactory.populators, :size).by(1)
35
+ end
36
+ end
37
+
38
+ context 'providing populators' do
39
+ before(:each) do
40
+ ContextFactory.clear_populators
41
+
42
+ ContextFactory.set_populator(method_binding, another_populator)
43
+ end
44
+
45
+ it 'should provide a default Populator when none specifically defined' do
46
+
47
+ mb = MethodBinding.new('value_as_boolean', 0, project_collection.search('value_as_boolean'))
48
+
49
+ populator = ContextFactory.get_populator(mb)
50
+
51
+ expect(populator).to be
52
+ expect(populator).to be_a Populator
53
+ end
54
+
55
+ it 'should provide a specific Populator when one defined' do
56
+ populator = ContextFactory.get_populator(method_binding)
57
+
58
+ expect(populator).to_not be_nil
59
+ expect(populator).to be_a AnotherPopulator
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,150 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ module DataShift
4
+
5
+ RSpec.describe DataFlowSchema, type: :model do
6
+
7
+ let(:data_flow_schema) { subject }
8
+
9
+ let(:yaml_text) {
10
+ x=<<-EOS
11
+ data_flow_schema:
12
+ Project:
13
+ nodes:
14
+ - project_title:
15
+ heading:
16
+ source: "title"
17
+ operator: title
18
+ - value_as_string:
19
+ heading:
20
+ source: "Value:"
21
+ operator: value_as_string
22
+ - project_owner_budget:
23
+ heading:
24
+ source: "Budget"
25
+ operator: owner.budget
26
+ - value_as_integer:
27
+ heading:
28
+ source: "This Column goes to value_as_string"
29
+ EOS
30
+ x
31
+ }
32
+
33
+ context "DataFlowSchema" do
34
+
35
+ context("YAML (LOCALE) DSL") do
36
+
37
+ before(:each) do
38
+ @collection = data_flow_schema.prepare_from_string(yaml_text)
39
+ end
40
+
41
+ it "build node collection from a locale based DSL" do
42
+ expect(@collection).to be_instance_of NodeCollection
43
+ expect(@collection.size).to eq operators_in_config.size
44
+ end
45
+
46
+ it "each section is an instance of Node" do
47
+ @collection = data_flow_schema.prepare_from_string(yaml_text)
48
+ expect(@collection.first).to be_instance_of DataShift::NodeContext
49
+ end
50
+
51
+ let(:operators_in_config) { ['title', 'value_as_string', 'owner.budget', ''] }
52
+
53
+
54
+ it "should preserve order of the nodes and cope with nil" do
55
+ @collection.each_with_index {|n, i| expect(n.operator).to eq operators_in_config[i] }
56
+
57
+ operators = @collection.collect(&:operator)
58
+
59
+ expect(operators).to eq operators_in_config
60
+ end
61
+ =begin
62
+ it "each row contains columns required to build view" do
63
+ review_data_column = review_data_sections.first.rows.first
64
+
65
+ expect(review_data_column).to be_instance_of Struct::ReviewDataRow
66
+
67
+ expect(review_data_column.title).to be_instance_of String
68
+ expect(review_data_column.link_state).to be_instance_of String
69
+ end
70
+
71
+ context("Specific YAML") do
72
+ include_examples "clear_and_after_reload_yaml"
73
+
74
+ it "can access methods directly on the model" do
75
+ I18n.backend.store_translations(:en, YAML.load(simple_review_farming_yaml))
76
+
77
+ expect(I18n.exists?("enrollment_review")).to eq true
78
+
79
+ review_data_list = enrollment_review.prepare_from_locale(enrollment)
80
+
81
+ expect(review_data_list.size).to eq 1
82
+
83
+ review_data_section = review_data_list.first
84
+
85
+ expect(review_data_section.heading).to eq "Farming data"
86
+ expect(review_data_section.rows.size).to eq 2
87
+
88
+ row = review_data_section.rows.first
89
+
90
+ expect(row).to be_instance_of Struct::ReviewDataRow
91
+ expect(row.data).to eq enrollment.on_a_farm?
92
+ end
93
+
94
+ it "can access methods on an association of the model", fail: true do
95
+ I18n.backend.store_translations(:en, YAML.load(direct_and_association_review_yaml))
96
+
97
+ expect(I18n.exists?("enrollment_review")).to eq true
98
+
99
+ review_data_list = enrollment_review.prepare_review_data_list
100
+
101
+ expect(review_data_list.size).to eq 2 # 2 sections
102
+ review_data_section = review_data_list.last
103
+
104
+ expect(review_data_section.heading).to eq "Waste Exemption Codes"
105
+ expect(review_data_section.rows.size).to eq enrollment.exemptions.count
106
+
107
+ row = review_data_section.rows.first
108
+
109
+ expect(row).to be_instance_of Struct::ReviewDataRow
110
+
111
+ expect(row.data).to eq enrollment.exemptions.first.code
112
+ expect(row.link_state).to eq "bad_link"
113
+
114
+ expect(row.target(enrollment)).to include "/reviews/"
115
+ expect(row.target(enrollment)).to include "/bad_link/"
116
+ expect(row.target(enrollment)).to include enrollment.id.to_s
117
+ end
118
+
119
+ context("association and method chaining") do
120
+ before(:each) do
121
+ I18n.backend.store_translations(:en, YAML.load(chained_review_yaml))
122
+ end
123
+
124
+ let(:review_data_list) { enrollment_review.prepare_review_data_list }
125
+
126
+ it "can access associated object down the whole association chain on model" do
127
+ expect(review_data_list.size).to eq 2
128
+ organisation_address_section = review_data_list.first
129
+
130
+ row = organisation_address_section.rows.first
131
+
132
+ expect(row.data).to eq enrollment.organisation.contact.email_address
133
+ end
134
+
135
+ it "can access methods down the whole association chain on model" do
136
+ expect(review_data_list.size).to eq 2
137
+ applicant_contact_section = review_data_list.last
138
+
139
+ row = applicant_contact_section.rows.first
140
+
141
+ expect(row.data).to eq enrollment.applicant_contact.business_number.tel_number
142
+ end
143
+ end
144
+ end
145
+ end
146
+ =end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,52 @@
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
+ require 'datashift/version'
11
+
12
+ describe 'DataShift' do
13
+ before(:each) do
14
+ end
15
+
16
+ it 'should provide gem version' do
17
+ expect(DataShift::VERSION).to be_a String
18
+ end
19
+
20
+ it 'should provide gem name' do
21
+ expect(DataShift.gem_name).to eq 'datashift'
22
+ end
23
+
24
+ it 'should provide root_path' do
25
+ expect(DataShift.root_path).to_not be_empty
26
+ end
27
+
28
+ it 'should provide a log' do
29
+ class Blah
30
+ include DataShift::Logging
31
+
32
+ def try_me
33
+ logger.info 'hello datashift spec'
34
+ end
35
+ end
36
+
37
+ b = Blah.new
38
+
39
+ b.logger.info 'try me'
40
+
41
+ b.try_me
42
+ end
43
+
44
+ it 'should provide quick way to create exception class' do
45
+ DataShift::DataShiftException.generate( 'BadRspecError')
46
+
47
+ e = DataShift::BadRspecError.new('my new exception class')
48
+
49
+ expect(e).to be
50
+ expect(e.message).to eq 'my new exception class'
51
+ end
52
+ end
@@ -0,0 +1,57 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ module DataShift
4
+
5
+ module ExcelBase
6
+
7
+ describe 'ExcelBase' do
8
+ before(:each) do
9
+ include DataShift::ExcelBase
10
+ extend DataShift::ExcelBase
11
+ end
12
+
13
+ let(:file_name) { ifixture_file('ProjectsSingleCategories.xls') }
14
+
15
+ it 'should provide fast access to an Excel instance' do
16
+ expect( start_excel(Project) ).to be_a DataShift::Excel
17
+ end
18
+
19
+ it 'should provide fast access to open an existing Excel file' do
20
+ expect( open_excel(file_name) ).to be_a DataShift::Excel
21
+ end
22
+
23
+ let(:sheet_name) { 'RspecTester' }
24
+
25
+ it 'should enable us to add a named worksheet' do
26
+ start_excel(Project, sheet_name: sheet_name)
27
+ expect( excel ).to be_a DataShift::Excel
28
+
29
+ expect( sheet ).to be_a Spreadsheet::Worksheet
30
+ expect( sheet.name ).to eq sheet_name
31
+ end
32
+
33
+ it 'should enable us to add a named worksheet to existing Excel file' do
34
+ open_excel(file_name, sheet_name: sheet_name)
35
+ expect( excel ).to be_a DataShift::Excel
36
+
37
+ expect( sheet ).to be_a Spreadsheet::Worksheet
38
+ expect( sheet.name ).to eq sheet_name
39
+ end
40
+
41
+ context 'Once opened' do
42
+
43
+ before(:each) do
44
+ open_excel(file_name, sheet_number: 0)
45
+ end
46
+
47
+ it 'should provide fast access to current sheet' do
48
+ expect( sheet ).to be_a Spreadsheet::Worksheet
49
+ end
50
+
51
+ it 'should parse headers' do
52
+ parse_headers( sheet )
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,188 @@
1
+ require File.join(File.dirname(__FILE__), '/../spec_helper')
2
+
3
+ require 'excel'
4
+
5
+ module DataShift
6
+
7
+ describe 'Excel Proxy' do
8
+ let(:excel) { Excel.new }
9
+
10
+ it 'should reject .xlsx until spreedsheet gem supports it' do
11
+ expect { excel.open( ifixture_file('ProjectsSingleCategories.xlsx') ) }.to raise_error Ole::Storage::FormatError
12
+ end
13
+
14
+ it 'can open an existing spreadsheet' do
15
+ sheet = excel.open( ifixture_file('ProjectsSingleCategories.xls') )
16
+
17
+ expect(sheet).to_not be_nil
18
+ end
19
+
20
+ it 'can create new un-named worksheet' do
21
+ sheet1 = excel.create_worksheet
22
+
23
+ expect( sheet1.name).to eq 'Worksheet1'
24
+ end
25
+
26
+ it 'can create multiple un-named worksheets' do
27
+ sheet1 = excel.create_worksheet
28
+ sheet2 = excel.create_worksheet
29
+ expect(sheet1.name).to eq 'Worksheet1'
30
+ expect(sheet2.name).to eq 'Worksheet2'
31
+ end
32
+
33
+ it 'can create new named worksheet' do
34
+ sheet = excel.create_worksheet( name: 'daft punk')
35
+ expect( sheet.name).to eq 'daft punk'
36
+
37
+ sheet2 = excel.create_worksheet( name: 'underworld')
38
+ expect( sheet2.name).to eq 'underworld'
39
+ end
40
+
41
+ it 'can sanitize worksheet names as per Excel spec' do
42
+ include DataShift::ExcelBase
43
+ extend DataShift::ExcelBase
44
+
45
+ # name.gsub(/[\[\]:\*\/\\\?]/, '
46
+
47
+ expect(sanitize_sheet_name('aute?chre')).to eq 'autechre'
48
+ expect(sanitize_sheet_name('?autechre')).to eq 'autechre'
49
+ expect(sanitize_sheet_name('aute?chre?')).to eq 'autechre'
50
+
51
+ expect(sanitize_sheet_name('daft: ?punk')).to eq 'daft punk'
52
+ expect(sanitize_sheet_name('guy call[]ed *Gerald')).to eq 'guy called Gerald'
53
+
54
+ expect(sanitize_sheet_name('guy called */Gerald')).to eq 'guy called Gerald'
55
+ end
56
+
57
+ # Pending - inject create_worksheet method into Spreadsheet gem
58
+ if DataShift::Guards.jruby?
59
+ it 'ensures name of worksheet sanitized' do
60
+ sheet = excel.create_worksheet( name: 'daft: ?punk')
61
+ expect( sheet.name).to eq 'daft punk'
62
+
63
+ sheet = excel.create_worksheet( name: 'under[]world')
64
+ expect( sheet.name).to eq 'underworld'
65
+ end
66
+ end
67
+
68
+ it 'can create multiple named worksheets' do
69
+ excel.create_worksheet( name: 'underworld')
70
+ excel.create_worksheet( name: 'jeff mills')
71
+ excel.create_worksheet( name: 'autechre')
72
+ excel.create_worksheet( name: 'swarms')
73
+
74
+ expect(excel.worksheets.size).to eq 4
75
+ end
76
+
77
+ it 'can access a worksheet by index' do
78
+ excel.create_worksheet( name: 'underworld')
79
+ excel.create_worksheet( name: 'jeff mills')
80
+ excel.create_worksheet( name: 'autechre')
81
+
82
+ expect(excel.worksheets[0].name).to eq 'underworld'
83
+ expect(excel.worksheets[2].name).to eq 'autechre'
84
+ end
85
+
86
+ it 'can access a worksheet by ID' do
87
+ excel.create_worksheet( name: 'daft punk')
88
+ excel.create_worksheet( name: 'underworld')
89
+
90
+ expect(excel.worksheet(0).name).to eq 'daft punk'
91
+
92
+ expect(excel.worksheet(1).name).to eq 'underworld'
93
+ end
94
+
95
+ it 'can add data to a specific row and column' do
96
+ excel.create_worksheet( name: 'underworld')
97
+
98
+ excel[0, 1] = 'born slippy'
99
+ expect(excel[0, 1]).to eq 'born slippy'
100
+
101
+ excel[1, 23] = 23.0
102
+ expect(excel[1, 23]).to eq 23.0
103
+
104
+ excel[0, 5] = true
105
+ expect( excel[0, 5]).to eq true
106
+ end
107
+
108
+ it 'can ask a row what index it is' do
109
+ excel.create_worksheet( name: 'underworld')
110
+
111
+ excel[3, 0] = 'do i know who i am?'
112
+ excel[28, 0] = 'who am i?'
113
+
114
+ r1 = excel.row(3)
115
+ expect(r1[0]).to eq 'do i know who i am?'
116
+ expect(r1.idx).to eq 3 # idx (0-based)
117
+
118
+ r2 = excel.row(28)
119
+ expect(r2[0]).to eq 'who am i?'
120
+ expect(r2.idx).to eq 28 # idx (0-based)
121
+ end
122
+
123
+ it 'can iterate over the rows in a worksheet' do
124
+ sheet = excel.create_worksheet
125
+
126
+ excel[0, 1] = 12.30
127
+ excel[1, 1] = 25.30
128
+ excel[3, 1] = 4
129
+
130
+ sheet.each do |row|
131
+ row[0] = "A#{row.idx}"
132
+ end
133
+
134
+ expect(excel[0, 0]).to eq 'A0'
135
+ expect(excel[1, 0]).to eq 'A1'
136
+
137
+ # pending for JRuby ... spreadsheet iterates from 0 to max row, probably
138
+ # dynamically creating rows that have never been referenced ..
139
+ expect(excel[2, 0]).to eq 'A2' unless DataShift::Guards.jruby?
140
+
141
+ expect(excel[3, 0]).to eq 'A3'
142
+
143
+ expect(excel[0, 1]).to eq 12.30
144
+ expect(excel[1, 1]).to eq 25.30
145
+ expect(excel[2, 1]).to satisfy { |x| x == '' || x.nil? }
146
+ expect(excel[3, 1]).to eq 4
147
+ end
148
+
149
+ it 'can iterate over the cells in a row' do
150
+ sheet = excel.create_worksheet
151
+
152
+ values = ['hello world', 12.30, '', 4]
153
+
154
+ values.each_with_index do |v, i|
155
+ excel[0, i] = v
156
+ end
157
+
158
+ row = excel.row(0)
159
+
160
+ row.each { |col| expect(col).to eq values.shift }
161
+ end
162
+
163
+ # it "can support bools" do
164
+ # pending "reading back value sometimes returns "" when cell was set to false"
165
+
166
+ # sheet = excel.create_worksheet
167
+
168
+ # end
169
+
170
+ it 'can write an Excel file' do
171
+ excel = Excel.new
172
+
173
+ sheet1 = excel.create_worksheet
174
+
175
+ excel.create_worksheet( name: 'underworld')
176
+
177
+ excel[0, 1] = 'born slippy'
178
+ expect(excel[0, 1]).to eq 'born slippy'
179
+
180
+ expected = result_file('it_can_save_an_excel_file.xls')
181
+
182
+ excel.write( expected )
183
+
184
+ expect(File.exist?(expected)).to eq true
185
+ end
186
+ end
187
+
188
+ end