csv_import_magic 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (327) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +36 -0
  4. data/app/assets/javascripts/csv_import_magic/application.js +13 -0
  5. data/app/assets/stylesheets/csv_import_magic/_theme.scss +75 -0
  6. data/app/assets/stylesheets/csv_import_magic/application.scss +1 -0
  7. data/app/controllers/csv_import_magic/base_controller.rb +4 -0
  8. data/app/controllers/csv_import_magic/importers_controller.rb +64 -0
  9. data/app/models/importer.rb +77 -0
  10. data/app/services/csv_import_magic/failure.rb +54 -0
  11. data/app/services/csv_import_magic/importer.rb +53 -0
  12. data/app/views/csv_import_magic/importers/edit.html.erb +43 -0
  13. data/app/views/csv_import_magic/importers/show.html.erb +31 -0
  14. data/app/views/layouts/csv_import_magic.html.erb +31 -0
  15. data/app/workers/csv_import_magic/importer_worker.rb +13 -0
  16. data/config/initializers/initializer.rb +1 -0
  17. data/config/locales/en.yml +71 -0
  18. data/config/routes.rb +3 -0
  19. data/db/migrate/20170111145652_create_companies.rb +15 -0
  20. data/db/migrate/20170111145657_create_importers.rb +15 -0
  21. data/db/migrate/20170112125734_create_user.rb +8 -0
  22. data/lib/csv_import_magic/engine.rb +5 -0
  23. data/lib/csv_import_magic/models.rb +18 -0
  24. data/lib/csv_import_magic/orm/active_record.rb +5 -0
  25. data/lib/csv_import_magic/version.rb +3 -0
  26. data/lib/csv_import_magic.rb +12 -0
  27. data/lib/generators/active_record/csv_import_magic_generator.rb +35 -0
  28. data/lib/generators/active_record/templates/csv_parser.rb +19 -0
  29. data/lib/generators/csv_import_magic/controllers_generator.rb +14 -0
  30. data/lib/generators/csv_import_magic/csv_import_magic_generator.rb +17 -0
  31. data/lib/generators/csv_import_magic/install_generator.rb +58 -0
  32. data/lib/generators/csv_import_magic/orm_helpers.rb +19 -0
  33. data/lib/generators/csv_import_magic/views_generator.rb +65 -0
  34. data/lib/generators/templates/migration.rb +10 -0
  35. data/lib/generators/templates/views/shareds/_csv_importer.html.erb +19 -0
  36. data/spec/controllers/csv_import_magic/importers_controller_spec.rb +106 -0
  37. data/spec/dummy/README.rdoc +28 -0
  38. data/spec/dummy/Rakefile +6 -0
  39. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  40. data/spec/dummy/app/assets/stylesheets/application.css +16 -0
  41. data/spec/dummy/app/controllers/application_controller.rb +7 -0
  42. data/spec/dummy/app/csv_parsers/company_parser.rb +15 -0
  43. data/spec/dummy/app/csv_parsers/foo_parser.rb +9 -0
  44. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  45. data/spec/dummy/app/models/company.rb +5 -0
  46. data/spec/dummy/app/models/user.rb +4 -0
  47. data/spec/dummy/app/views/application/index.html.erb +22 -0
  48. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  49. data/spec/dummy/bin/bundle +3 -0
  50. data/spec/dummy/bin/rails +4 -0
  51. data/spec/dummy/bin/rake +4 -0
  52. data/spec/dummy/bin/setup +29 -0
  53. data/spec/dummy/config/application.rb +26 -0
  54. data/spec/dummy/config/boot.rb +5 -0
  55. data/spec/dummy/config/database.yml +25 -0
  56. data/spec/dummy/config/environment.rb +5 -0
  57. data/spec/dummy/config/environments/development.rb +41 -0
  58. data/spec/dummy/config/environments/production.rb +79 -0
  59. data/spec/dummy/config/environments/test.rb +42 -0
  60. data/spec/dummy/config/initializers/assets.rb +11 -0
  61. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  62. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  63. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  64. data/spec/dummy/config/initializers/inflections.rb +16 -0
  65. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  66. data/spec/dummy/config/initializers/session_store.rb +3 -0
  67. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  68. data/spec/dummy/config/locales/csv_import_magic.pt-BR.yml +71 -0
  69. data/spec/dummy/config/locales/pt-BR.yml +271 -0
  70. data/spec/dummy/config/routes.rb +5 -0
  71. data/spec/dummy/config/secrets.yml +22 -0
  72. data/spec/dummy/config.ru +4 -0
  73. data/spec/dummy/db/development.sqlite3 +0 -0
  74. data/spec/dummy/db/schema.rb +51 -0
  75. data/spec/dummy/db/test.sqlite3 +0 -0
  76. data/spec/dummy/log/development.log +5489 -0
  77. data/spec/dummy/log/test.log +87086 -0
  78. data/spec/dummy/public/404.html +67 -0
  79. data/spec/dummy/public/422.html +67 -0
  80. data/spec/dummy/public/500.html +66 -0
  81. data/spec/dummy/public/favicon.ico +0 -0
  82. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-37276-r4n40q.csv +2 -0
  83. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-38136-8h3q2p.csv +2 -0
  84. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-38466-1nr5kco.csv +2 -0
  85. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-39668-101mi6q.csv +2 -0
  86. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-40284-81g0ud.csv +2 -0
  87. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-40408-17a0uvl.csv +2 -0
  88. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-40523-pj6wl4.csv +2 -0
  89. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42084-10luep0.csv +2 -0
  90. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42191-11tldaf.csv +2 -0
  91. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42321-baundn.csv +2 -0
  92. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42420-1qm2isf.csv +2 -0
  93. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42570-gywnhk.csv +2 -0
  94. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42696-1pg04re.csv +2 -0
  95. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42823-vekf7j.csv +2 -0
  96. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42910-ewzmcp.csv +2 -0
  97. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-43235-1fa52ga.csv +2 -0
  98. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-43323-p159hh.csv +2 -0
  99. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-45345-1r8v081.csv +2 -0
  100. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-46182-1dx0tpn.csv +2 -0
  101. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-46278-fd4m8e.csv +2 -0
  102. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-46382-9y135a.csv +2 -0
  103. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-48570-1k4k7t0.csv +2 -0
  104. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56058-b7otnp.csv +2 -0
  105. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56173-187smu1.csv +2 -0
  106. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56280-ax6el0.csv +2 -0
  107. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56372-pyd0uc.csv +2 -0
  108. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56475-16dw7ov.csv +2 -0
  109. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56578-odd4y0.csv +2 -0
  110. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56672-l11ojb.csv +2 -0
  111. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56794-88h4nd.csv +2 -0
  112. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-10138-13br6m2.csv +2 -0
  113. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19400-ra06q5.csv +2 -0
  114. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19543-rfxxty.csv +2 -0
  115. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19652-1neho6l.csv +2 -0
  116. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19786-rxjv36.csv +2 -0
  117. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-21648-ssn05e.csv +2 -0
  118. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-23496-ddy2xt.csv +2 -0
  119. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-30892-1c27rs4.csv +2 -0
  120. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-30994-qfqs3h.csv +2 -0
  121. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32470-1mk1udp.csv +2 -0
  122. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32716-13g9myq.csv +2 -0
  123. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32807-12b8cgg.csv +2 -0
  124. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32901-1vp2axx.csv +2 -0
  125. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32992-1jwfjfd.csv +2 -0
  126. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-33081-1j1d591.csv +2 -0
  127. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-33180-36l1t8.csv +2 -0
  128. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-33299-13p8l1x.csv +2 -0
  129. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-38626-sigf3m.csv +2 -0
  130. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-38797-1kqkwkw.csv +2 -0
  131. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39057-1x8b2fn.csv +2 -0
  132. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39157-1087rtq.csv +2 -0
  133. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39268-168s29f.csv +2 -0
  134. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39355-s8x1si.csv +2 -0
  135. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39483-r08bs.csv +2 -0
  136. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-40181-vdjtbv.csv +2 -0
  137. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-42041-w1imo1.csv +2 -0
  138. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-42229-1e22hz4.csv +2 -0
  139. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-42996-9neptt.csv +2 -0
  140. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-43889-584l0q.csv +2 -0
  141. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-44738-ew2i2a.csv +2 -0
  142. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-7981-1uei1o4.csv +2 -0
  143. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8075-15sar1.csv +2 -0
  144. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8167-zc1h0z.csv +2 -0
  145. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8265-bnndjd.csv +2 -0
  146. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8364-4u0il1.csv +2 -0
  147. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-22243-b3wyrt.csv +2 -0
  148. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-22711-1uvny32.csv +2 -0
  149. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-56031-votbjp.csv +2 -0
  150. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-56135-j5mcgr.csv +2 -0
  151. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-56240-l2w835.csv +2 -0
  152. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-57815-i1ahvu.csv +2 -0
  153. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-58056-66wtac.csv +2 -0
  154. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-58268-1dty7ny.csv +2 -0
  155. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-63803-1mc7fo4.csv +2 -0
  156. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-74528-duefru.csv +2 -0
  157. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-82684-glhzzy.csv +2 -0
  158. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-82810-wamt7d.csv +2 -0
  159. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-82946-1vdlbhd.csv +2 -0
  160. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-83065-1u153xf.csv +2 -0
  161. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-83165-1c32fyg.csv +2 -0
  162. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-84188-1wch9sz.csv +2 -0
  163. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-86886-1erfhrx.csv +2 -0
  164. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-87029-1vof5gs.csv +2 -0
  165. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12481-joulms.csv +2 -0
  166. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12708-h8hiiu.csv +2 -0
  167. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12804-h1kvkh.csv +2 -0
  168. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12985-tjysyw.csv +2 -0
  169. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-13084-3zodzd.csv +2 -0
  170. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-13449-1bpmult.csv +2 -0
  171. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-13540-2g5zwb.csv +2 -0
  172. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-15095-wb4mk0.csv +2 -0
  173. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-15202-8ib7ha.csv +2 -0
  174. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-16523-1s896hk.csv +2 -0
  175. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-16637-eboq9e.csv +2 -0
  176. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-87818-1j4mz4q.csv +2 -0
  177. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-65471-17j2vti.csv +2 -0
  178. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-65694-1kptcuq.csv +2 -0
  179. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66245-crezgc.csv +2 -0
  180. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66415-1krzmy1.csv +2 -0
  181. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66524-ndzegu.csv +2 -0
  182. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66655-pjqteu.csv +2 -0
  183. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66854-r2dyv2.csv +2 -0
  184. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67000-1t9vfos.csv +2 -0
  185. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67391-15d0sso.csv +2 -0
  186. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67538-1gbudl.csv +2 -0
  187. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67640-p8dmlm.csv +2 -0
  188. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68349-ziyxe9.csv +2 -0
  189. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68617-14k1fap.csv +2 -0
  190. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68815-v1izav.csv +2 -0
  191. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68984-wcittg.csv +2 -0
  192. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-69642-1hi7zb2.csv +2 -0
  193. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-69802-mq57e0.csv +2 -0
  194. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-73509-mbxhb6.csv +2 -0
  195. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-80682-oask81.csv +2 -0
  196. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-80872-1vkh6vb.csv +2 -0
  197. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-81056-63swkp.csv +2 -0
  198. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-81212-1k8weuv.csv +2 -0
  199. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-81379-6lpon9.csv +2 -0
  200. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-82575-1eioq1a.csv +2 -0
  201. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-84919-1qnjxhv.csv +2 -0
  202. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-85131-1g8jrl5.csv +2 -0
  203. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-85343-yezbz5.csv +2 -0
  204. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-85513-1l2pzgy.csv +2 -0
  205. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86070-pwkn99.csv +2 -0
  206. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86277-14ckax5.csv +2 -0
  207. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86458-1u26pb1.csv +2 -0
  208. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86599-q2d5io.csv +2 -0
  209. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86739-hfrzzf.csv +2 -0
  210. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-87110-1ky9gnk.csv +2 -0
  211. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27355-hl9693.csv +2 -0
  212. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27618-1pqa3bs.csv +2 -0
  213. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27755-1di5xra.csv +2 -0
  214. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27974-cx2o7z.csv +2 -0
  215. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28133-1q0tz4z.csv +2 -0
  216. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28419-1ia3064.csv +2 -0
  217. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28556-veg3ez.csv +2 -0
  218. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28784-15yhmp3.csv +2 -0
  219. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29002-igofgq.csv +2 -0
  220. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29143-1v25x8a.csv +2 -0
  221. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29291-1qs4kex.csv +2 -0
  222. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29522-5i1a.csv +2 -0
  223. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29660-165adk7.csv +2 -0
  224. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29945-1lvmnay.csv +2 -0
  225. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30103-9qqoc.csv +2 -0
  226. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30381-1de3q2.csv +2 -0
  227. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30864-1mthr0r.csv +2 -0
  228. data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30993-wxw7ja.csv +2 -0
  229. data/spec/dummy/public/system/importers/attachment_errors/000/000/002/original/failures20170119-55532-1ujy7xh.csv +2 -0
  230. data/spec/dummy/public/system/importers/attachment_errors/000/000/003/original/failures20170119-87695-1j8psm5.csv +2 -0
  231. data/spec/dummy/public/system/importers/attachment_errors/000/000/003/original/failures20170125-84785-u7rdmo.csv +2 -0
  232. data/spec/dummy/public/system/importers/attachment_errors/000/000/006/original/failures20170118-40447-4jsf3l.csv +2 -0
  233. data/spec/dummy/public/system/importers/attachment_errors/000/000/007/original/failures20170118-44958-l51x0w.csv +2 -0
  234. data/spec/dummy/public/system/importers/attachments/000/000/001/original/companies.csv +3 -0
  235. data/spec/dummy/public/system/importers/attachments/000/000/001/original/companies_invalid.csv +3 -0
  236. data/spec/dummy/public/system/importers/attachments/000/000/002/original/companies.csv +3 -0
  237. data/spec/dummy/public/system/importers/attachments/000/000/002/original/companies_invalid.csv +3 -0
  238. data/spec/dummy/public/system/importers/attachments/000/000/003/original/companies.csv +3 -0
  239. data/spec/dummy/public/system/importers/attachments/000/000/003/original/companies_invalid.csv +3 -0
  240. data/spec/dummy/public/system/importers/attachments/000/000/004/original/companies.csv +3 -0
  241. data/spec/dummy/public/system/importers/attachments/000/000/005/original/companies.csv +3 -0
  242. data/spec/dummy/public/system/importers/attachments/000/000/006/original/companies_invalid.csv +3 -0
  243. data/spec/dummy/public/system/importers/attachments/000/000/007/original/companies_invalid.csv +3 -0
  244. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-A/-AzUQ_sdncLrgXJW-mT29l7lXefApIPQNpdCv9ETYkI.cache +0 -0
  245. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0f/0fmItA1G7uruwRE5HZE9TzG9K4A0NbbxGakdWz0cpDE.cache +0 -0
  246. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2M/2MSWm1oJk8doLU2cxusKHCU78PUDwQ1lrIlu5gXMx_U.cache +1 -0
  247. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2k/2kXdUd2P4uN67x_E2mUy-AtGn9Fn_h5rQ0PJZi9HzBU.cache +1 -0
  248. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4b/4bvq3aQAVWrr_CUPXfVFCwfZMnmX-ecl9ZtwAisBlFI.cache +1 -0
  249. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6-/6-dQ3OmAEd4QXytW4TS1xdUNozHlLKSCawN0oN1oEYw.cache +1 -0
  250. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/63/63b-SgBWtX-UDgRq-Bsol3W40ijIWiT7uxcHRoVXS-M.cache +1 -0
  251. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7l/7lUIJIvW1FW_GFVqqnVsKSxpeMaZ3noc0g8Eca5eHhQ.cache +0 -0
  252. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9S/9S1VAatjEVICqM1Cojv-CKBUvl0oELWaNfTyFr_S700.cache +0 -0
  253. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/A9/A9Vpp3VfKYpkCR6f1lAoM4J-w6QQ3fyn3x3TncKXf7U.cache +3 -0
  254. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Av/AvR3LtLvNoPexMzvvUDPuM1V-yuaMddpBdG1RVgQh9Y.cache +0 -0
  255. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Df/Dfad3HZGzx9mtzeig2tWlnuHQl9vAzoUutfVJwWKC5I.cache +0 -0
  256. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dh/DhZ6bJZj4K7QCbNBTmMjFy3HDpC58SqfiPPoCCsAro4.cache +1 -0
  257. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hw/HwRNsYmzR0cy4L_V_8SLZiZ9_G6_8E7XiaDV21i9sjA.cache +0 -0
  258. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/I9/I97QBZ0SyWLebPjfYrwCNlM-Omla1LKRTGiTgmMKi2Q.cache +0 -0
  259. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/J7/J7Ihmq6t6WbnmJaBScToEb-AR0U1NqHePsGdxAdJoLo.cache +0 -0
  260. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KF/KFqlYW7ohx2fJX05v2au1k6Gw7wuzN7UWz2BN90RsAQ.cache +1 -0
  261. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LL/LLb4gLbgLgFS-LgcrmKXC--d1IaGB8XM_Yrm48bkwdw.cache +0 -0
  262. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LX/LXS-BomSubWXJSpkNXCH8m0l2y4sB66BaFb2UuAx14o.cache +1 -0
  263. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lq/LqbLgHiwEzXq7mJX3Dtq5XicBULM8CtvDJdv4Ye45ZY.cache +1 -0
  264. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nh/Nhtorvc2xM84CWBcqtMIxoqKR4NCkCksOUQ_3UiyegA.cache +1 -0
  265. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oy/OyEUtus13InbtOxcvt5WdsbydEkrviBwJXD6z9GQaRA.cache +1 -0
  266. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/P6/P6-U-RxLXuRTDz8kHA2kBc3jUHSnNlbEHBOnUa97wyY.cache +1 -0
  267. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Po/Pos0iHsH-rUXDrrdalDi2H6yWVQTcz2ZPyRmQ_RnBPM.cache +1 -0
  268. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Q1/Q1xmk8Ni14zSYsTX_IvrbX1vbGANki_Udrwx7OBgh9w.cache +0 -0
  269. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qo/QogFhnK16HrvDyiH323Z3xlwwofVibvzgZDmBjqh5VQ.cache +3 -0
  270. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RI/RIagqSB7X-LbJU0ZwntNWf_KMkOm3kCkc7zR57rP1Bc.cache +1 -0
  271. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T4/T4WcrrL47jCKFOb5Q1cmn1keh_w3X2OguI_ifzRpS3k.cache +1 -0
  272. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TA/TAbsAe1o7EI19gckGhtzbtjqOoSVRRLQrc5n3mnCT28.cache +0 -0
  273. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TG/TGe7XAuizvtm9LtzDo5fR7GrEnyWPL8nBr2eESxA0x0.cache +0 -0
  274. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V8/V8kjWO7PZcVGI9mBNq17FYWc_muWwcDQF9xWGfnSOjM.cache +1 -0
  275. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VV/VVtm8HzHyOByhegKNGl09Ak3sHcSr0e70iHSmy75T6A.cache +0 -0
  276. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vb/VbBBjIpX-u1j_Fko8QfFQ61-bfDS8BaYgGATVKIfp3I.cache +0 -0
  277. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WR/WRP18y_66NlZHU4W5qM0P1MN8oS5eAlN9UEZrXh3vd0.cache +1 -0
  278. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wd/WdUHknjRY-ueTBCEgU4-NzM_BFaTimaeFED6MbFfQLE.cache +0 -0
  279. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bo/bopbSF0DLQEMLjRvN8Mn4xd-mGx46j9yvENVDA8R9jk.cache +0 -0
  280. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/e4/e4DrxyTxBlZlpP4PQ0zELpYhl4G2eiBksI0_HwQhrVY.cache +0 -0
  281. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZp3uXMHuYQC4hzCr7bQfetKNdJAtbQmg3so2KpW1Dw.cache +2 -0
  282. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +2 -0
  283. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iK/IKrFvYc5CMyfkKHP7JFW_bS4-tOG1rVwPFcC-OUpENU.cache +0 -0
  284. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iK/IkTLxpKuWrwxrM98yl3Ddv4RjOLzyUS5QHQvZ0Cniv8.cache +1 -0
  285. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iK/iKpMoxBcOmuavL2xUzgc7LQLnT7EKCaZirHx4KMbdw8.cache +1 -0
  286. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/je/jeA_WQ150_Af65U1CnVdHsqqZefOHl2ObGMLRQp--sc.cache +2 -0
  287. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/l1/l1LHMvhocUYdhOc0tOfdy4slQYK2SD4fj6x4mH4wkvI.cache +0 -0
  288. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lo/loI7P5Fiwnq6YZdxqJFAErc6rV61HWRuL5tVaffS3JY.cache +1 -0
  289. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m9/m95ShgmvfDO8RuwZpC7gUW0i-FO-k914CWkXd5-LO3I.cache +1 -0
  290. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/my/myHmSL0lcXz8Mgm5gNVoigImnF7acMaTlwl3z_g2lPM.cache +0 -0
  291. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oo/oocXRRNDTZPTtm859sgr9TxpBrPby6ND88ROtiCfgSU.cache +0 -0
  292. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/p-/p-3_4sMWwoC1eQcdH2fmcIdmlxQBFx6evUCdgfgPyKM.cache +1 -0
  293. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +2 -0
  294. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rn/rnSEYPKQcSZ-D3R7o3aM_1AtiXyLciuL3S3Qa6k_EfI.cache +0 -0
  295. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sV/sVzlvz069Fh5_GPu0TcrgDBWIHhnwEZ2Rg1AtpEqA9s.cache +0 -0
  296. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uV/uVH7RdIENZh9BUaGeb6OUciC9H0hTIKsRpAxXMG5R28.cache +1 -0
  297. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xQ/xQEI_TWc5k3ouSH2fSRrrWRpsLyeG7QQxmcgPjkwbc8.cache +0 -0
  298. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xQ/xQUUINnLqsr-zxPaIIULgXPE5jh2QtmbdRSYCnhpER4.cache +0 -0
  299. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xb/xblMCu_z727eCkuWjKJEyre92sVUkcGCpQqGThWe2bk.cache +2 -0
  300. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yg/ygMyHfDIhhvlowOd5aTDhtXbZCLisqxhDWpdvXd8O5M.cache +0 -0
  301. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yg/ygrgsR6-nQLxLaFwAquCXfjIZgUTEoYbI5EFH0KlfW0.cache +1 -0
  302. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yh/yh3Aqjs6HjjQubE9-htvIwUg4cFhMRCl7JyBFYBt0xo.cache +1 -0
  303. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z0/z0QrtOYRAsWOTFYmpCJqXXyGlHxHUxxKBV3_LMxKV2Y.cache +0 -0
  304. data/spec/examples.txt +50 -0
  305. data/spec/factories/importer.rb +10 -0
  306. data/spec/factories/user.rb +6 -0
  307. data/spec/fixtures/companies.csv +3 -0
  308. data/spec/fixtures/companies_invalid.csv +3 -0
  309. data/spec/lib/csv_import_magic/models_spec.rb +51 -0
  310. data/spec/lib/generators/active_record/csv_import_magic_generator_spec.rb +74 -0
  311. data/spec/lib/generators/active_record/namespaced/csv_import_magic_generator_spec.rb +78 -0
  312. data/spec/lib/generators/csv_import_magic/controllers_generator_spec.rb +34 -0
  313. data/spec/lib/generators/csv_import_magic/install_generator_spec.rb +79 -0
  314. data/spec/lib/generators/csv_import_magic/rails_5/install_generator_spec.rb +62 -0
  315. data/spec/lib/generators/csv_import_magic/views_generator_spec.rb +204 -0
  316. data/spec/models/importer_spec.rb +82 -0
  317. data/spec/rails_helper.rb +61 -0
  318. data/spec/services/csv_import_magic/failure_spec.rb +23 -0
  319. data/spec/services/csv_import_magic/importer_spec.rb +57 -0
  320. data/spec/spec_helper.rb +70 -0
  321. data/spec/support/database_cleaner.rb +12 -0
  322. data/spec/support/factory_girl.rb +12 -0
  323. data/spec/support/paperclip.rb +3 -0
  324. data/spec/support/shoulda_matchers.rb +6 -0
  325. data/spec/support/simplecov.rb +12 -0
  326. data/spec/workers/csv_import_magic/importer_worker_spec.rb +31 -0
  327. metadata +758 -0
@@ -0,0 +1,3 @@
1
+ nome,rua,numero,bairro,cidade ,estado ,cod,pais
2
+ foo,R: Teste,1,Joao de Barro,Birigui,SP ,,Brasil
3
+ bar,R: Teste,2,Joao de Barro,Aracatuba,SP ,,Brasil
@@ -0,0 +1,3 @@
1
+ nome,rua,numero,bairro,cidade ,estado ,cod,pais
2
+ foo,R: Teste,1,Joao de Barro,Birigui,SP ,,Brasil
3
+ bar,R: Teste,2a,Joao de Barro,Aracatuba,SP ,,Brasil
@@ -0,0 +1,51 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe CsvImportMagic::Models, type: :lib do
4
+ context 'with normal parser' do
5
+ let(:foo_model) do
6
+ class FooParser; end
7
+
8
+ Class.new do
9
+ extend CsvImportMagic::Models
10
+ csv_import_magic foo: [:foo, :bar]
11
+
12
+ def self.name
13
+ 'Foo'
14
+ end
15
+ end
16
+ end
17
+
18
+ describe '#csv_parser_names' do
19
+ it { expect(foo_model.new.csv_parser_names).to eq('foo_parser' => FooParser) }
20
+ end
21
+
22
+ describe '#columns_names' do
23
+ it { expect(foo_model.columns_names(:foo)).to match_array([:foo, :bar]) }
24
+ end
25
+
26
+ describe '#csv_parser_default_name' do
27
+ it { expect(foo_model.csv_parser_default_name).to eq('foo_parser') }
28
+ end
29
+ end
30
+
31
+ context 'with multiple parser' do
32
+ let(:bar_model) do
33
+ class BarParser; end
34
+ class FooParser; end
35
+
36
+ Class.new do
37
+ extend CsvImportMagic::Models
38
+ csv_import_magic foo: [:foo, :bar], bar: [:foo]
39
+ end
40
+ end
41
+
42
+ describe '#csv_parser_names' do
43
+ it { expect(bar_model.new.csv_parser_names).to eq('foo_parser' => FooParser, 'bar_parser' => BarParser) }
44
+ end
45
+
46
+ describe '#columns_names' do
47
+ it { expect(bar_model.columns_names(:foo)).to match_array([:foo, :bar]) }
48
+ it { expect(bar_model.columns_names(:bar)).to match_array([:foo]) }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,74 @@
1
+ require 'rails_helper'
2
+ require 'generators/active_record/csv_import_magic_generator'
3
+
4
+ RSpec.describe ActiveRecord::Generators::CsvImportMagicGenerator, type: :generator do
5
+ destination File.expand_path('../../../../../tmp', __FILE__)
6
+ arguments ['foo', '-c', 'foo', 'bar']
7
+
8
+ before do
9
+ prepare_destination
10
+
11
+ FileUtils.mkdir_p('tmp/app/models')
12
+ out_file = File.new(File.join(ENGINE_RAILS_ROOT, 'tmp/app/models/foo.rb'), 'w+')
13
+ out_file.puts("class Foo\nend")
14
+ out_file.close
15
+
16
+ run_generator
17
+ end
18
+
19
+ after { prepare_destination }
20
+
21
+ specify 'check structure of model' do
22
+ model_content = <<-EOF
23
+ class Foo
24
+ csv_import_magic :foo, :bar
25
+ end
26
+ EOF
27
+
28
+ expect(destination_root).to have_structure {
29
+ directory 'app' do
30
+ directory 'models' do
31
+ file 'foo.rb' do
32
+ contains model_content
33
+ end
34
+ end
35
+ end
36
+ }
37
+ end
38
+
39
+ specify 'check structure of parser' do
40
+ parser_content = <<-EOF
41
+ class FooParser
42
+ include ::CSVImporter
43
+
44
+ model Foo
45
+
46
+ # will update_or_create via :foo
47
+ identifier :foo
48
+
49
+ # Examples of columns declaration
50
+ # column :foo, to: ->(foo) { foo.downcase }, required: true
51
+ # column :foo, as: [ /first.?name/i, /pr(é|e)nom/i ]
52
+ # column :foo, as: [ /last.?name/i, "nom" ]
53
+ # column :foo, to: ->(foo, record) { record.foo = foo ? 'a' : 'b' }
54
+
55
+ column :foo, required: true
56
+
57
+ column :bar, required: true
58
+
59
+ # or :abort
60
+ # when_invalid :skip
61
+ end
62
+ EOF
63
+
64
+ expect(destination_root).to have_structure {
65
+ directory 'app' do
66
+ directory 'csv_parsers' do
67
+ file 'foo_parser.rb' do
68
+ contains parser_content
69
+ end
70
+ end
71
+ end
72
+ }
73
+ end
74
+ end
@@ -0,0 +1,78 @@
1
+ require 'rails_helper'
2
+ require 'generators/active_record/csv_import_magic_generator'
3
+
4
+ RSpec.describe ActiveRecord::Generators::CsvImportMagicGenerator, type: :generator do
5
+ destination File.expand_path('../../../../../tmp', __FILE__)
6
+ arguments ['foo::bar', '-c', 'foo', 'bar']
7
+
8
+ before do
9
+ prepare_destination
10
+
11
+ FileUtils.mkdir_p('tmp/app/models/foo')
12
+ out_file = File.new(File.join(ENGINE_RAILS_ROOT, 'tmp/app/models/foo/bar.rb'), 'w+')
13
+ out_file.puts("class Foo::Bar\nend")
14
+ out_file.close
15
+
16
+ run_generator
17
+ end
18
+
19
+ after { prepare_destination }
20
+
21
+ specify 'check structure of model' do
22
+ model_content = <<-EOF
23
+ class Foo::Bar < ActiveRecord::Base
24
+ csv_import_magic :foo, :bar
25
+ end
26
+ EOF
27
+
28
+ expect(destination_root).to have_structure {
29
+ directory 'app' do
30
+ directory 'models' do
31
+ directory 'foo' do
32
+ file 'bar.rb' do
33
+ contains model_content
34
+ end
35
+ end
36
+ end
37
+ end
38
+ }
39
+ end
40
+
41
+ specify 'check structure of parser' do
42
+ parser_content = <<-EOF
43
+ class Foo::BarParser
44
+ include ::CSVImporter
45
+
46
+ model Foo::Bar
47
+
48
+ # will update_or_create via :foo
49
+ identifier :foo
50
+
51
+ # Examples of columns declaration
52
+ # column :foo, to: ->(foo) { foo.downcase }, required: true
53
+ # column :foo, as: [ /first.?name/i, /pr(é|e)nom/i ]
54
+ # column :foo, as: [ /last.?name/i, "nom" ]
55
+ # column :foo, to: ->(foo, record) { record.foo = foo ? 'a' : 'b' }
56
+
57
+ column :foo, required: true
58
+
59
+ column :bar, required: true
60
+
61
+ # or :abort
62
+ # when_invalid :skip
63
+ end
64
+ EOF
65
+
66
+ expect(destination_root).to have_structure {
67
+ directory 'app' do
68
+ directory 'csv_parsers' do
69
+ directory 'foo' do
70
+ file 'bar_parser.rb' do
71
+ contains parser_content
72
+ end
73
+ end
74
+ end
75
+ end
76
+ }
77
+ end
78
+ end
@@ -0,0 +1,34 @@
1
+ require 'rails_helper'
2
+ require 'generators/csv_import_magic/controllers_generator'
3
+
4
+ RSpec.describe CsvImportMagic::Generators::ControllersGenerator, type: :generator do
5
+ destination File.expand_path('../../../../../tmp', __FILE__)
6
+
7
+ before do
8
+ prepare_destination
9
+ run_generator
10
+ end
11
+
12
+ after { prepare_destination }
13
+
14
+ specify 'check structure of base_controller' do
15
+ base_controller_content = <<-EOF
16
+ module CsvImportMagic
17
+ class BaseController < ActionController::Base
18
+ end
19
+ end
20
+ EOF
21
+
22
+ expect(destination_root).to have_structure {
23
+ directory 'app' do
24
+ directory 'controllers' do
25
+ directory 'csv_import_magic' do
26
+ file 'base_controller.rb' do
27
+ contains base_controller_content
28
+ end
29
+ end
30
+ end
31
+ end
32
+ }
33
+ end
34
+ end
@@ -0,0 +1,79 @@
1
+ require 'rails_helper'
2
+ require 'generators/csv_import_magic/install_generator'
3
+
4
+ RSpec.describe CsvImportMagic::Generators::InstallGenerator, type: :generator do
5
+ destination File.expand_path('../../../../../tmp', __FILE__)
6
+
7
+ before do
8
+ travel_to Time.zone.parse('20170101235959')
9
+ prepare_destination
10
+
11
+ FileUtils.mkdir_p('tmp/config')
12
+
13
+ out_file = File.new(File.join(ENGINE_RAILS_ROOT, 'tmp/config/routes.rb'), 'w+')
14
+ out_file.puts("Rails.application.routes.draw do\nend")
15
+ out_file.close
16
+
17
+ run_generator
18
+ end
19
+
20
+ after do
21
+ prepare_destination
22
+ travel_back
23
+ end
24
+
25
+ specify 'check structure of routes' do
26
+ expect(destination_root).to have_structure {
27
+ directory 'config' do
28
+ file 'routes.rb' do
29
+ contains "mount CsvImportMagic::Engine => '/csv_import_magic'"
30
+ end
31
+ end
32
+ }
33
+ end
34
+
35
+ specify 'check structure of migrateion' do
36
+ migration_content = <<-EOF
37
+ class CreateImporters < ActiveRecord::Migration
38
+ def change
39
+ create_table :importers do |t|
40
+ t.attachment :attachment
41
+ t.attachment :attachment_error
42
+ t.string :source
43
+ t.string :parser
44
+ t.string :columns
45
+ t.string :message
46
+ t.string :status, default: 'pending'
47
+ t.references :importable, polymorphic: true
48
+ t.timestamps null: false
49
+ end
50
+
51
+ add_index :importers, [:importable_id, :importable_type]
52
+ end
53
+ end
54
+ EOF
55
+
56
+ expect(destination_root).to have_structure {
57
+ directory 'db' do
58
+ directory 'migrate' do
59
+ file '20170101235959_create_importers.rb'
60
+ migration 'create_importers' do
61
+ contains migration_content
62
+ end
63
+ end
64
+ end
65
+ }
66
+ end
67
+
68
+ specify 'check structure of locale' do
69
+ expect(destination_root).to have_structure {
70
+ directory 'config' do
71
+ directory 'locales' do
72
+ file 'csv_import_magic.en.yml' do
73
+ contains 'en:'
74
+ end
75
+ end
76
+ end
77
+ }
78
+ end
79
+ end
@@ -0,0 +1,62 @@
1
+ require 'rails_helper'
2
+ require 'generators/csv_import_magic/install_generator'
3
+
4
+ RSpec.describe CsvImportMagic::Generators::InstallGenerator, type: :generator do
5
+ destination File.expand_path('../../../../../../tmp', __FILE__)
6
+
7
+ before do
8
+ travel_to Time.zone.parse('20170101235959')
9
+
10
+ allow(Rails).to receive(:version).and_return('5.1')
11
+ Rails::VERSION::MAJOR = 5
12
+ Rails::VERSION::MINOR = 1
13
+
14
+ prepare_destination
15
+
16
+ FileUtils.mkdir_p('tmp/config')
17
+
18
+ out_file = File.new(File.join(ENGINE_RAILS_ROOT, 'tmp/config/routes.rb'), 'w+')
19
+ out_file.puts("Rails.application.routes.draw do\nend")
20
+ out_file.close
21
+
22
+ run_generator
23
+ end
24
+
25
+ after do
26
+ travel_back
27
+ prepare_destination
28
+ end
29
+
30
+ specify 'check migrations' do
31
+ migration_content = <<-EOF
32
+ class CreateImporters < ActiveRecord::Migration[5.1]
33
+ def change
34
+ create_table :importers do |t|
35
+ t.attachment :attachment
36
+ t.attachment :attachment_error
37
+ t.string :source
38
+ t.string :parser
39
+ t.string :columns
40
+ t.string :message
41
+ t.string :status, default: 'pending'
42
+ t.references :importable, polymorphic: true
43
+ t.timestamps null: false
44
+ end
45
+
46
+ add_index :importers, [:importable_id, :importable_type]
47
+ end
48
+ end
49
+ EOF
50
+
51
+ expect(destination_root).to have_structure {
52
+ directory 'db' do
53
+ directory 'migrate' do
54
+ file '20170101235959_create_importers.rb'
55
+ migration 'create_importers' do
56
+ contains migration_content
57
+ end
58
+ end
59
+ end
60
+ }
61
+ end
62
+ end
@@ -0,0 +1,204 @@
1
+ require 'rails_helper'
2
+ require 'generators/csv_import_magic/views_generator'
3
+
4
+ RSpec.describe CsvImportMagic::Generators::ViewsGenerator, type: :generator do
5
+ destination File.expand_path('../../../../../tmp', __FILE__)
6
+ arguments ['foo']
7
+
8
+ before do
9
+ prepare_destination
10
+ run_generator
11
+ end
12
+
13
+ after { prepare_destination }
14
+
15
+ specify 'check structure of show view' do
16
+ show_content = <<-EOF
17
+ <h2 class='page-title'>
18
+ <%= t('csv_import_magic.views.importers.show.title', model_translated: t("activemodel.models.#\{@importer.source\}.other")) %>
19
+ </h2>
20
+
21
+ <form style='text-align: center'>
22
+ <div class='form-row' id="<%= @importer.status %>">
23
+ <% if @importer.status == 'pending' %>
24
+ <%= t('csv_import_magic.views.importers.show.waiting') %>
25
+ <% else %>
26
+ <%= @importer.message %>
27
+ <% end %>
28
+ </div>
29
+
30
+ <% if @importer.status == 'pending' %>
31
+ <span class='loading'></span>
32
+ <% end %>
33
+
34
+ <% if @importer.attachment_error.present? %>
35
+ <%= link_to t('csv_import_magic.views.importers.show.buttons.error_file'), @importer.attachment_error.url, class: 'button button--secondary' %>
36
+ <% end %>
37
+
38
+ <%= link_to t('csv_import_magic.views.importers.show.buttons.back'), '/', class: 'button button--primary' %>
39
+ </form>
40
+
41
+ <script>
42
+ if (document.getElementById('pending') != void 0) {
43
+ setInterval(function(){
44
+ location.reload();
45
+ }, 5000);
46
+ }
47
+ </script>
48
+ EOF
49
+
50
+ expect(destination_root).to have_structure {
51
+ directory 'app' do
52
+ directory 'views' do
53
+ directory 'csv_import_magic' do
54
+ directory 'importers' do
55
+ file 'show.html.erb' do
56
+ contains show_content
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ }
63
+ end
64
+
65
+ specify 'check structure of edit view' do
66
+ edit_content = <<-EOF
67
+ <% columns = @importer.importable_columns(@importer.parser).map { |column| [@importer.source_klass.human_attribute_name(column), column] }.unshift([t('csv_import_magic.views.importers.edit.ignore_column_label'), :ignore]) %>
68
+
69
+ <h3 class='page-title'>
70
+ <%= t('csv_import_magic.views.importers.edit.title') %>
71
+ </br>
72
+ <small><%= t('csv_import_magic.views.importers.edit.description') %></small>
73
+ </h3>
74
+
75
+ <%= simple_form_for @importer, url: importer_path(@importer) do |f| %>
76
+ <div class="row csv_import">
77
+ <% import_file_csv.headers.each_with_index do |header, i| %>
78
+ <div class="column">
79
+ <div class="portlet light bordered">
80
+ <div class="portlet-body form">
81
+ <header>
82
+ <%= t('csv_import_magic.views.importers.edit.column') %> <b><%= header %></b>
83
+ </header>
84
+
85
+ <% selected = columns.find { |c| c.join(' ').match(/#\{header\}/i) }.try(:last).presence || :ignore %>
86
+ <%= f.input "columns][", as: :select, collection: columns, label: false, hint: t('csv_import_magic.views.importers.edit.hint'), include_blank: false, selected: f.object.columns[i] || selected %>
87
+
88
+ <header class="examples"><%= t('csv_import_magic.views.importers.edit.example_of_values') %></header>
89
+ <table>
90
+ <tbody>
91
+ <% import_file_csv.first(5).each_with_index do |row, c| %>
92
+ <tr>
93
+ <td class="number"><%= c + 1 %></td>
94
+ <td><%= row[header] || t('csv_import_magic.views.importers.edit.empty_values') %></td>
95
+ </tr>
96
+ <% end %>
97
+ </tbody>
98
+ </table>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ <% end %>
103
+ </div>
104
+ EOF
105
+
106
+ expect(destination_root).to have_structure {
107
+ directory 'app' do
108
+ directory 'views' do
109
+ directory 'csv_import_magic' do
110
+ directory 'importers' do
111
+ file 'edit.html.erb' do
112
+ contains edit_content
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ }
119
+ end
120
+
121
+ specify 'check structure of layout view' do
122
+ layout_content = <<-EOF
123
+ <!DOCTYPE html>
124
+ <html lang="pt">
125
+ <head>
126
+ <meta charset="utf-8">
127
+ <title>Title</title>
128
+
129
+ <link href="/favicon.ico" rel="shortcut icon">
130
+
131
+ <%= stylesheet_link_tag "application", :media => "all" %>
132
+ <%= csrf_meta_tags %>
133
+ </head>
134
+
135
+ <body class="csv_import_magic">
136
+ <%- if flash %>
137
+ <% flash.each do |key, value| %>
138
+ <div class="flash-message <%= key %>"><%= value %></div>
139
+ <% end %>
140
+ <% end %>
141
+
142
+ <div class="wrapper">
143
+ <main>
144
+ <div class="container">
145
+ <%= yield %>
146
+ </div>
147
+ </main>
148
+ </div>
149
+
150
+ <%= javascript_include_tag "application" %>
151
+ <%= yield :javascript %>
152
+ </body>
153
+ </html>
154
+ EOF
155
+
156
+ expect(destination_root).to have_structure {
157
+ directory 'app' do
158
+ directory 'views' do
159
+ directory 'layouts' do
160
+ file 'csv_import_magic.html.erb' do
161
+ contains layout_content
162
+ end
163
+ end
164
+ end
165
+ end
166
+ }
167
+ end
168
+
169
+ specify 'check structure of partial view' do
170
+ partial_view_content = <<-EOF
171
+ <h1 class="page-title">
172
+ <%= t('csv_import_magic.views.importers.new.title', model_translated: t('activemodel.models.foo.other')) %>
173
+ <br/>
174
+ <small><%= t('csv_import_magic.views.importers.new.description', model_translated: t('activemodel.models.foo.other').downcase) %></small>
175
+ </h1>
176
+
177
+ <%= simple_form_for(Importer.new, url: csv_import_magic.importers_path) do |f| %>
178
+ <%= f.input :importable_type, as: :hidden, input_html: { value: '<change this value>' } %>
179
+ <%= f.input :importable_id, as: :hidden, input_html: { value: '<change this value>' } %>
180
+ <%= f.input :source, as: :hidden, input_html: { value: 'foo' } %>
181
+
182
+ <div class="form-row">
183
+ <%= f.input :attachment, as: :file, hint: t('csv_import_magic.views.importers.new.hint').html_safe, required: true %>
184
+ </div>
185
+
186
+ <div class='form-row actions'>
187
+ <%= f.submit t('csv_import_magic.views.importers.new.buttons.import'), class: 'button button--primary' %>
188
+ </div>
189
+ <% end %>
190
+ EOF
191
+
192
+ expect(destination_root).to have_structure {
193
+ directory 'app' do
194
+ directory 'views' do
195
+ directory 'foos' do
196
+ file '_csv_importer.html.erb' do
197
+ contains partial_view_content
198
+ end
199
+ end
200
+ end
201
+ end
202
+ }
203
+ end
204
+ end
@@ -0,0 +1,82 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Importer, type: :model do
4
+ describe 'validations' do
5
+ subject { build(:importer, parser: 'company_parser') }
6
+
7
+ it { is_expected.to validate_presence_of(:source) }
8
+ it { is_expected.to validate_inclusion_of(:status).in_array(%w(pending success error)) }
9
+ it { is_expected.to have_attached_file(:attachment) }
10
+ it { is_expected.to validate_attachment_presence(:attachment) }
11
+ it do
12
+ is_expected.to validate_attachment_content_type(:attachment)
13
+ .allowing('text/plain', 'text/csv', 'application/vnd.ms-excel')
14
+ .rejecting('image/png', 'image/gif', 'text/xml')
15
+ end
16
+
17
+ it { is_expected.to have_attached_file(:attachment_error) }
18
+ it do
19
+ is_expected.to validate_attachment_content_type(:attachment_error)
20
+ .allowing('text/plain', 'text/csv', 'application/vnd.ms-excel')
21
+ .rejecting('image/png', 'image/gif', 'text/xml')
22
+ end
23
+
24
+ context '#uniqueness_columns' do
25
+ it 'not accept the same column name unless is ignore' do
26
+ expect(build(:importer, columns: %w(name number city state))).to be_valid
27
+ expect(build(:importer, columns: %w(name number city state state))).to be_invalid
28
+ end
29
+ end
30
+
31
+ context '#required_columns' do
32
+ it 'not accept no select columns are required' do
33
+ importer = create(:importer, columns: [])
34
+
35
+ importer.columns = %w(name number city state)
36
+ expect(importer).to be_valid
37
+
38
+ importer.columns = %w(name number city ignore)
39
+ expect(importer).to be_invalid
40
+ end
41
+ end
42
+ end
43
+
44
+ describe 'associations' do
45
+ it { is_expected.to belong_to(:importable) }
46
+ end
47
+
48
+ describe 'callbacks' do
49
+ context '.before_validation #set_parser' do
50
+ let(:importer) { build(:importer, parser: nil) }
51
+
52
+ it 'set default parser when nil' do
53
+ expect do
54
+ importer.save
55
+ importer.reload
56
+ end.to change(importer, :parser).from(nil).to('company_parser')
57
+ end
58
+
59
+ it 'not change when parser is present' do
60
+ class Foo
61
+ end
62
+
63
+ expect do
64
+ importer.parser = 'foo_parser'
65
+ importer.save
66
+ importer.reload
67
+ end.to change(importer, :parser).to('foo_parser')
68
+ end
69
+ end
70
+ end
71
+
72
+ context '#source_klass' do
73
+ let(:importer) { create(:importer, source: 'company') }
74
+
75
+ it { expect(importer.source_klass).to eq(Company) }
76
+ end
77
+
78
+ context '#importable_columns' do
79
+ let(:importer) { create(:importer, source: 'company') }
80
+ it { expect(importer.importable_columns).to match_array([:name, :street, :number, :neighborhood, :city, :state, :country]) }
81
+ end
82
+ end