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,123 +1,135 @@
1
- # To change this template, choose Tools | Templates
2
- # and open the template in the editor.
1
+ module DataShift
3
2
 
4
- module ExcelBase
5
-
6
-
7
-
8
- def sanitize_sheet_name( name )
9
- name.gsub(/[\[\]:\*\/\\\?]/, '')
10
- end
3
+ module ExcelBase
11
4
 
5
+ def self.max_columns
6
+ 1024
7
+ end
12
8
 
13
- # TODO -revisit/refactor - maybe this should just be on the base class Excel
14
- # so you can call direct like excel.parse_headers(options[:header_row])
15
- # rather than
16
- # sheet = excel.worksheet( sheet_number )
17
- # parse_headers(sheet, options[:header_row])
9
+ attr_accessor :excel, :sheet
18
10
 
19
- attr_accessor :header_row_index, :excel_headers
11
+ # Create @excel and set @sheet
12
+ #
13
+ # Options :
14
+ #
15
+ # :sheet_name : Create a new worksheet assign to @sheet.
16
+ # Default is class.name
17
+ #
18
+ def start_excel(klass, options = {})
20
19
 
21
- def parse_headers( sheet, header_row = 0 )
20
+ @excel = DataShift::Excel.new
22
21
 
23
- @header_row_index = header_row || 0
22
+ name = options[:sheet_name] ? options[:sheet_name] : klass.name
24
23
 
25
- header_row = sheet.row(header_row_index)
24
+ @sheet = excel.create_worksheet( name: name )
26
25
 
27
- raise MissingHeadersError, "No headers found - Check Sheet #{sheet} is complete and Row #{header_row_index} contains headers" unless(header_row)
26
+ unless sheet
27
+ logger.error("Excel failed to create WorkSheet called [#{name}]")
28
28
 
29
- @excel_headers = []
29
+ raise "Failed to create Excel WorkSheet called [#{name}]"
30
+ end
30
31
 
31
- # TODO - make more robust - currently end on first empty column
32
- # There is no actual max columns in Excel .. you will run out of memory though at some point
33
- (0..1024).each do |column|
34
- cell = header_row[column]
35
- break unless cell
36
- header = "#{cell.to_s}".strip
37
- break if header.empty?
38
- @excel_headers << header
32
+ @excel
39
33
  end
40
34
 
41
- @excel_headers
42
- end
35
+ # Open excel file and assign to @excel and set @sheet
36
+ #
37
+ # Options :
38
+ #
39
+ # :sheet_name : Create a new worksheet assign to @sheet. Default is class.name
40
+ #
41
+ # :sheet_number : Select the sheet by index - sheet_name takes precedence
42
+ #
43
+ def open_excel( file_name, options = {})
43
44
 
44
- # Helpers for dealing with Active Record models and collections
45
- # Specify array of operators/associations to include - possible values are :
46
- # [:assignment, :belongs_to, :has_one, :has_many]
45
+ @excel = DataShift::Excel.new
47
46
 
48
- def ar_to_headers( records, associations = nil, options = {} )
49
- return if( !records.first.is_a?(ActiveRecord::Base) || records.empty?)
47
+ @excel.open(file_name)
50
48
 
51
- only = *options[:only] ? [*options[:only]] : nil
49
+ if options[:sheet_name]
52
50
 
53
- headers =[]
51
+ @sheet = @excel.create_worksheet( name: options[:sheet_name] )
54
52
 
55
- if associations
56
- details_mgr = DataShift::MethodDictionary.method_details_mgrs[records.first.class]
53
+ unless sheet
54
+ logger.error("Excel failed to create WorkSheet for #{name}")
57
55
 
58
- [*associations].each do |a|
56
+ raise "Failed to create Excel WorkSheet for #{name}"
57
+ end
59
58
 
60
- details_mgr.get_list(a).each do |md|
59
+ elsif options[:sheet_number]
60
+ @sheet = @excel.worksheet( options[:sheet_number] )
61
+ else
62
+ @sheet = @excel.worksheets.first
63
+ end
61
64
 
62
- next if(only && !only.include?( md.name.to_sym ) )
65
+ @excel
66
+ end
63
67
 
64
- puts md.name.to_sym.inspect
68
+ def parse_headers( sheet, header_row_idx = 0 )
65
69
 
66
- headers << "#{md.operator}"
70
+ headers = DataShift::Headers.new(:excel, header_row_idx)
67
71
 
68
- end
69
- end if(details_mgr)
72
+ header_row = sheet.row(header_row_idx)
73
+ unless header_row
74
+ raise MissingHeadersError,
75
+ "No headers found - Check Sheet #{sheet} is complete and Row #{header_row_idx} contains headers"
76
+ end
70
77
 
71
- else
78
+ # TODO: - make more robust - currently end on first empty column
79
+ # There is no actual max columns in Excel .. you will run out of memory though at some point
80
+ (0..ExcelBase.max_columns).each do |column|
81
+ cell = header_row[column]
82
+ break unless cell
83
+ header = cell.to_s.strip
84
+ break if header.empty?
85
+ headers << header
86
+ end
72
87
 
73
- headers = records.first.class.columns.collect( &:name )
88
+ headers
74
89
  end
75
90
 
76
- set_headers( headers )
77
- end
78
-
91
+ def sanitize_sheet_name( name )
92
+ name.gsub(/[\[\]:\*\/\\\?]/, '')
93
+ end
79
94
 
80
- # Pass a set of AR records
81
- def ar_to_xls(records, options = {})
82
- return if( ! records.first.is_a?(ActiveRecord::Base) || records.empty?)
95
+ # Pass a set of AR records
96
+ def ar_to_xls(records, options = {})
97
+ return if !records.first.is_a?(ActiveRecord::Base) || records.empty?
83
98
 
84
- row_index =
85
- if(options[:no_headers])
86
- 0
87
- else
88
- ar_to_headers( records )
89
- 1
90
- end
99
+ # assume headers present
100
+ row_index = (options[:start_row]) ? (options[:start_row]) : 1
91
101
 
92
- records.each do |record|
93
- ar_to_xls_row(row_index, 0, record)
102
+ records.each do |record|
103
+ ar_to_xls_row(row_index, 0, record)
94
104
 
95
- row_index += 1
105
+ row_index += 1
106
+ end
96
107
  end
97
- end
98
-
99
108
 
100
- # Save data from an AR record to the current row, based on the record's columns [c1,c2,c3]
101
- # Returns the number of the final column written to
102
- def ar_to_xls_row(row, start_column, record)
103
- return unless( record.is_a?(ActiveRecord::Base))
104
-
105
- column = start_column
106
- record.class.columns.each do |connection_column|
107
- ar_to_xls_cell(row, column, record, connection_column)
108
- column += 1
109
+ # Save data from an AR record to the current row, based on the record's columns [c1,c2,c3]
110
+ # Returns the number of the final column written to
111
+ def ar_to_xls_row(row, start_column, record)
112
+ return unless record.is_a?(ActiveRecord::Base)
113
+
114
+ column = start_column
115
+ record.class.columns.each do |connection_column|
116
+ ar_to_xls_cell(row, column, record, connection_column)
117
+ column += 1
118
+ end
119
+ column
109
120
  end
110
- column
111
- end
112
121
 
113
- def ar_to_xls_cell(row, column, record, connection_column)
114
- begin
122
+ def ar_to_xls_cell(row, column, record, connection_column)
123
+
115
124
  datum = record.send(connection_column.name)
116
125
 
117
126
  self[row, column] = datum
118
127
  rescue => e
119
- puts "Failed to export #{datum} from #{connection_column.inspect} to column #{column}"
120
- puts e, e.backtrace
128
+ logger.error("Failed to export #{datum} from #{connection_column.inspect} to column #{column}")
129
+ logger.error( e.message )
130
+ logger.error(e.backtrace)
131
+
121
132
  end
122
133
  end
134
+
123
135
  end
@@ -1,21 +1,21 @@
1
- # Copyright:: (c) Autotelik Media Ltd 2014
1
+ # Copyright:: (c) Autotelik Media Ltd 2014
2
2
  # Author :: Tom Statter
3
3
  # Date :: June 2014
4
4
  # License:: Free, Open Source.
5
5
  #
6
6
 
7
7
  module DataShift
8
-
8
+
9
9
  class DataShiftException < StandardError
10
10
 
11
11
  include DataShift::Logging
12
-
12
+
13
13
  def initialize( msg )
14
14
  super
15
- logger.error( msg)
15
+ logger.error(msg)
16
16
  end
17
17
 
18
- def self.generate name
18
+ def self.generate(name)
19
19
  new_class = Class.new(DataShiftException) do
20
20
  def initialize( msg )
21
21
  super( msg )
@@ -26,35 +26,37 @@ module DataShift
26
26
  end
27
27
  end
28
28
 
29
- class NilDataSuppliedError < DataShiftException
30
- def initialize( msg )
31
- super( msg )
32
- end
33
- end
34
-
35
- class BadRuby < StandardError; end
36
-
37
- class UnsupportedFileType < StandardError; end
38
- class BadFile < StandardError; end
39
-
40
- class MappingDefinitionError < StandardError; end
29
+ # Non self logging errors
41
30
 
31
+ class BadConfig < StandardError; end
32
+ class BadFile < StandardError; end
33
+ class BadRuby < StandardError; end
34
+ class BadUri < StandardError; end
42
35
 
36
+ class MappingDefinitionError < StandardError; end
43
37
  class MissingHeadersError < StandardError; end
44
38
  class MissingMandatoryError < StandardError; end
45
39
 
46
40
  class PathError < StandardError; end
47
-
48
- class BadUri < StandardError; end
49
41
 
42
+ class RuntimeError < StandardError; end
43
+
44
+ class UnsupportedFileType < StandardError; end
50
45
  end
51
46
 
52
- DataShift::DataShiftException.generate( "ConnectionError")
53
- DataShift::DataShiftException.generate( "CouldNotAssignAssociation")
54
- DataShift::DataShiftException.generate( "CreateAttachmentFailed")
55
- DataShift::DataShiftException.generate( "DataProcessingError")
56
- DataShift::DataShiftException.generate( "FileNotFound")
57
- DataShift::DataShiftException.generate( "NoSuchClassError")
58
- DataShift::DataShiftException.generate( "MissingConfigOptionError")
59
- DataShift::DataShiftException.generate( "RecordNotFound")
60
- DataShift::DataShiftException.generate( "SaveError")
47
+ # Self logging errors
48
+
49
+ DataShift::DataShiftException.generate( 'BadOperatorType')
50
+ DataShift::DataShiftException.generate( 'ConnectionError')
51
+ DataShift::DataShiftException.generate( 'CouldNotAssignAssociation')
52
+ DataShift::DataShiftException.generate( 'CouldNotDeriveAssociationClass')
53
+ DataShift::DataShiftException.generate( 'CreateAttachmentFailed')
54
+ DataShift::DataShiftException.generate( 'DataProcessingError')
55
+ DataShift::DataShiftException.generate( 'FileNotFound')
56
+ DataShift::DataShiftException.generate( 'NilDataSuppliedError')
57
+ DataShift::DataShiftException.generate( 'NoSuchClassError')
58
+ DataShift::DataShiftException.generate( 'NoSuchOperator')
59
+ DataShift::DataShiftException.generate( 'MissingConfigOptionError')
60
+ DataShift::DataShiftException.generate( 'RecordNotFound')
61
+ DataShift::DataShiftException.generate( 'SaveError')
62
+ DataShift::DataShiftException.generate( 'SourceIsNotAClass')
@@ -59,10 +59,10 @@ module FileDefinitions
59
59
  attr_accessor :current_line
60
60
 
61
61
  # Set the delimiter to use when splitting a line - can be either a String, or a Regexp
62
- attr_writer :field_delim
62
+ attr_writer :field_delim
63
63
 
64
- def initialize( line = nil )
65
- @key = String.new
64
+ def initialize( line = nil )
65
+ @key = ''
66
66
  parse(line) unless line.nil?
67
67
  end
68
68
 
@@ -72,10 +72,9 @@ module FileDefinitions
72
72
  end
73
73
 
74
74
  def self.subclasses
75
- @subclasses ||=[]
75
+ @subclasses ||= []
76
76
  end
77
77
 
78
-
79
78
  # Return the field delimiter used when splitting a line
80
79
  def field_delim
81
80
  @field_delim || ','
@@ -84,14 +83,14 @@ module FileDefinitions
84
83
  # Parse each line of a file based on the field definition, yields self for each successive line
85
84
  #
86
85
  def each( file )
87
- File::new(file).each_line do |line|
86
+ File.new(file).each_line do |line|
88
87
  parse( line )
89
88
  yield self
90
89
  end
91
90
  end
92
91
 
93
92
  def fields
94
- @fields = self.class.field_definition.collect {|f| instance_variable_get "@#{f}" }
93
+ @fields = self.class.field_definition.collect { |f| instance_variable_get "@#{f}" }
95
94
  @fields
96
95
  end
97
96
 
@@ -128,16 +127,18 @@ module FileDefinitions
128
127
  def add_field(field, add_accessor = true)
129
128
  @field_definition ||= []
130
129
  @field_definition << field.to_s
131
- attr_accessor field if(add_accessor)
130
+ attr_accessor field if add_accessor
132
131
  end
133
132
 
134
-
135
133
  # Helper to generate methods that return the complete list of fixed width fields
136
134
  # and associated ranges in this File definition, and parse a line.
137
135
  # e.g create_field_definition %w{ trade_id drOrCr ccy costCentre postingDate amount }
138
136
  #
139
137
  def create_fixed_definition( field_range_map )
140
- raise ArgumentError.new('Please supply hash to create_fixed_definition') unless field_range_map.is_a? Hash
138
+
139
+ unless field_range_map.is_a?(Hash)
140
+ raise ArgumentError, 'Please supply hash to create_fixed_definition'
141
+ end
141
142
 
142
143
  keys = field_range_map.keys.collect(&:to_s)
143
144
  string_map = Hash[*keys.zip(field_range_map.values).flatten]
@@ -172,10 +173,9 @@ module FileDefinitions
172
173
 
173
174
  # Create accessors for each field
174
175
  def create_field_attr_accessors
175
- self.field_definition.each {|f| attr_accessor f}
176
+ field_definition.each { |f| attr_accessor f }
176
177
  end
177
178
 
178
-
179
179
  ###############################
180
180
  # PARSING + FILE MANIPULATION #
181
181
  ###############################
@@ -185,15 +185,13 @@ module FileDefinitions
185
185
  limit = options[:limit]
186
186
  count = 0
187
187
  lines = []
188
- File::new(file).each_line do |line|
188
+ File.new(file).each_line do |line|
189
189
  break if limit && ((count += 1) > limit)
190
- lines << self.new( line )
190
+ lines << new( line )
191
191
  end
192
192
  lines
193
193
  end
194
194
 
195
-
196
-
197
195
  # Split a file, whose field definition is represented by self,
198
196
  # into seperate streams, based on the values of one if it's fields.
199
197
  #
@@ -216,9 +214,13 @@ module FileDefinitions
216
214
  unless filtered.empty?
217
215
  log :info, "Writing seperate streams to #{path}"
218
216
 
219
- filtered.each { |strm, objects| RecsBase::write( {"keys_#{field}_#{strm}.csv" => objects.collect(&:key).join("\n")}, path) } if(options.key?(:keys))
217
+ filtered.each do |strm, objects|
218
+ RecsBase.write( { "keys_#{field}_#{strm}.csv" => objects.collect(&:key).join("\n") }, path)
219
+ end if options.key?(:keys)
220
220
 
221
- filtered.each { |strm, objects| RecsBase::write( {"#{field}_#{strm}.csv" => objects.collect(&:current_line).join("\n")}, path) }
221
+ filtered.each do |strm, objects|
222
+ RecsBase.write( { "#{field}_#{strm}.csv" => objects.collect(&:current_line).join("\n") }, path)
223
+ end
222
224
  end
223
225
  end
224
226
 
@@ -247,19 +249,19 @@ module FileDefinitions
247
249
 
248
250
  filtered = {}
249
251
 
250
- if( self.new.respond_to?(field) )
252
+ if new.respond_to?(field)
251
253
 
252
254
  log :info, "Splitting on #{field}"
253
255
 
254
256
  File.open( file_name ) do |t|
255
257
  t.each do |line|
256
- next unless(line && line.chomp!)
257
- x = self.new(line)
258
+ next unless line && line.chomp!
259
+ x = new(line)
258
260
 
259
- value = x.send( field.to_sym ) # the actual field value from the specified field column
261
+ value = x.send( field.to_sym ) # the actual field value from the specified field column
260
262
  next if value.nil?
261
263
 
262
- if( regex.nil? || value.match(regex) )
264
+ if regex.nil? || value.match(regex)
263
265
  filtered[value] ? filtered[value] << x : filtered[value] = [x]
264
266
  end
265
267
  end
@@ -268,11 +270,11 @@ module FileDefinitions
268
270
  log :warn, "Field [#{field}] nor defined for file definition #{self.class.name}"
269
271
  end
270
272
 
271
- if( options[:sort])
273
+ if options[:sort]
272
274
  filtered.values.each( &:sort )
273
275
  return filtered
274
276
  end
275
- return filtered
277
+ filtered
276
278
  end
277
279
 
278
280
  # Open and parse a file, replacing a value in the specfied field.
@@ -291,16 +293,17 @@ module FileDefinitions
291
293
  #
292
294
  def file_set_field_by_map( file_name, fields, value_map, regex = nil )
293
295
 
294
- lines, objects = [],[]
296
+ lines = []
297
+ objects = []
295
298
 
296
- if fields.is_a?(Array)
297
- attribs = fields
298
- else
299
- attribs = "#{fields}".split(',')
300
- end
299
+ attribs = if fields.is_a?(Array)
300
+ fields
301
+ else
302
+ fields.to_s.split(',')
303
+ end
301
304
 
302
305
  attribs.collect! do |attrib|
303
- raise ArgumentError.new("Field: #{attrib} is not a field on #{self.class.name}") unless self.new.respond_to?(attrib)
306
+ raise ArgumentError, "Field: #{attrib} is not a field on #{self.class.name}" unless new.respond_to?(attrib)
304
307
  end
305
308
 
306
309
  log :info, "#{self.class.name} - updating field(s) #{fields} in #{file_name}"
@@ -309,14 +312,16 @@ module FileDefinitions
309
312
  t.each do |line|
310
313
  if line.chomp.empty?
311
314
  lines << line
312
- objects << self.new
315
+ objects << new
313
316
  next
314
317
  end
315
- x = self.new(line)
318
+ x = new(line)
316
319
 
317
320
  attribs.each do |a|
318
321
  old_value = x.instance_variable_get( "@#{a}" )
319
- x.instance_variable_set( "@#{a}", value_map[old_value] ) if value_map[old_value] || (regex && old_value.keys.detect {|k| k.match(regx) })
322
+ if value_map[old_value] || (regex && old_value.keys.detect { |k| k.match(regx) })
323
+ x.instance_variable_set( "@#{a}", value_map[old_value] )
324
+ end
320
325
  end
321
326
 
322
327
  objects << x
@@ -324,9 +329,9 @@ module FileDefinitions
324
329
  end
325
330
  end
326
331
 
327
- return lines, objects
332
+ [lines, objects]
328
333
  end
329
- end # END class methods
334
+ end # END class methods
330
335
 
331
336
  # Open and parse a file, replacing a value in the specfied field.
332
337
  # Does not update the file itself. Does not write a new output file.
@@ -345,9 +350,9 @@ module FileDefinitions
345
350
  #
346
351
  def file_set_field( file_name, field, old_value, new_value, regex = nil )
347
352
 
348
- map = {old_value => new_value}
353
+ map = { old_value => new_value }
349
354
 
350
- return file_set_field_by_map(file_name, field, map, regex)
355
+ file_set_field_by_map(file_name, field, map, regex)
351
356
  end
352
357
 
353
358
  end