csv_import_magic 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +36 -0
- data/app/assets/javascripts/csv_import_magic/application.js +13 -0
- data/app/assets/stylesheets/csv_import_magic/_theme.scss +75 -0
- data/app/assets/stylesheets/csv_import_magic/application.scss +1 -0
- data/app/controllers/csv_import_magic/base_controller.rb +4 -0
- data/app/controllers/csv_import_magic/importers_controller.rb +64 -0
- data/app/models/importer.rb +77 -0
- data/app/services/csv_import_magic/failure.rb +54 -0
- data/app/services/csv_import_magic/importer.rb +53 -0
- data/app/views/csv_import_magic/importers/edit.html.erb +43 -0
- data/app/views/csv_import_magic/importers/show.html.erb +31 -0
- data/app/views/layouts/csv_import_magic.html.erb +31 -0
- data/app/workers/csv_import_magic/importer_worker.rb +13 -0
- data/config/initializers/initializer.rb +1 -0
- data/config/locales/en.yml +71 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20170111145652_create_companies.rb +15 -0
- data/db/migrate/20170111145657_create_importers.rb +15 -0
- data/db/migrate/20170112125734_create_user.rb +8 -0
- data/lib/csv_import_magic/engine.rb +5 -0
- data/lib/csv_import_magic/models.rb +18 -0
- data/lib/csv_import_magic/orm/active_record.rb +5 -0
- data/lib/csv_import_magic/version.rb +3 -0
- data/lib/csv_import_magic.rb +12 -0
- data/lib/generators/active_record/csv_import_magic_generator.rb +35 -0
- data/lib/generators/active_record/templates/csv_parser.rb +19 -0
- data/lib/generators/csv_import_magic/controllers_generator.rb +14 -0
- data/lib/generators/csv_import_magic/csv_import_magic_generator.rb +17 -0
- data/lib/generators/csv_import_magic/install_generator.rb +58 -0
- data/lib/generators/csv_import_magic/orm_helpers.rb +19 -0
- data/lib/generators/csv_import_magic/views_generator.rb +65 -0
- data/lib/generators/templates/migration.rb +10 -0
- data/lib/generators/templates/views/shareds/_csv_importer.html.erb +19 -0
- data/spec/controllers/csv_import_magic/importers_controller_spec.rb +106 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +16 -0
- data/spec/dummy/app/controllers/application_controller.rb +7 -0
- data/spec/dummy/app/csv_parsers/company_parser.rb +15 -0
- data/spec/dummy/app/csv_parsers/foo_parser.rb +9 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/company.rb +5 -0
- data/spec/dummy/app/models/user.rb +4 -0
- data/spec/dummy/app/views/application/index.html.erb +22 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/csv_import_magic.pt-BR.yml +71 -0
- data/spec/dummy/config/locales/pt-BR.yml +271 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +51 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +5489 -0
- data/spec/dummy/log/test.log +87086 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-37276-r4n40q.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-38136-8h3q2p.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-38466-1nr5kco.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-39668-101mi6q.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-40284-81g0ud.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-40408-17a0uvl.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-40523-pj6wl4.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42084-10luep0.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42191-11tldaf.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42321-baundn.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42420-1qm2isf.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42570-gywnhk.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42696-1pg04re.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42823-vekf7j.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-42910-ewzmcp.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-43235-1fa52ga.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-43323-p159hh.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-45345-1r8v081.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-46182-1dx0tpn.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-46278-fd4m8e.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-46382-9y135a.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-48570-1k4k7t0.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56058-b7otnp.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56173-187smu1.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56280-ax6el0.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56372-pyd0uc.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56475-16dw7ov.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56578-odd4y0.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56672-l11ojb.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170117-56794-88h4nd.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-10138-13br6m2.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19400-ra06q5.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19543-rfxxty.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19652-1neho6l.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-19786-rxjv36.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-21648-ssn05e.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-23496-ddy2xt.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-30892-1c27rs4.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-30994-qfqs3h.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32470-1mk1udp.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32716-13g9myq.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32807-12b8cgg.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32901-1vp2axx.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-32992-1jwfjfd.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-33081-1j1d591.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-33180-36l1t8.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-33299-13p8l1x.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-38626-sigf3m.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-38797-1kqkwkw.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39057-1x8b2fn.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39157-1087rtq.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39268-168s29f.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39355-s8x1si.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-39483-r08bs.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-40181-vdjtbv.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-42041-w1imo1.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-42229-1e22hz4.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-42996-9neptt.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-43889-584l0q.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-44738-ew2i2a.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-7981-1uei1o4.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8075-15sar1.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8167-zc1h0z.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8265-bnndjd.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170118-8364-4u0il1.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-22243-b3wyrt.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-22711-1uvny32.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-56031-votbjp.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-56135-j5mcgr.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-56240-l2w835.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-57815-i1ahvu.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-58056-66wtac.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-58268-1dty7ny.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-63803-1mc7fo4.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-74528-duefru.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-82684-glhzzy.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-82810-wamt7d.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-82946-1vdlbhd.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-83065-1u153xf.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-83165-1c32fyg.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-84188-1wch9sz.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-86886-1erfhrx.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170119-87029-1vof5gs.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12481-joulms.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12708-h8hiiu.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12804-h1kvkh.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-12985-tjysyw.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-13084-3zodzd.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-13449-1bpmult.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-13540-2g5zwb.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-15095-wb4mk0.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-15202-8ib7ha.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-16523-1s896hk.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-16637-eboq9e.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170120-87818-1j4mz4q.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-65471-17j2vti.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-65694-1kptcuq.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66245-crezgc.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66415-1krzmy1.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66524-ndzegu.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66655-pjqteu.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-66854-r2dyv2.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67000-1t9vfos.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67391-15d0sso.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67538-1gbudl.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-67640-p8dmlm.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68349-ziyxe9.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68617-14k1fap.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68815-v1izav.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-68984-wcittg.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-69642-1hi7zb2.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-69802-mq57e0.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-73509-mbxhb6.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-80682-oask81.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-80872-1vkh6vb.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-81056-63swkp.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-81212-1k8weuv.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-81379-6lpon9.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-82575-1eioq1a.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-84919-1qnjxhv.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-85131-1g8jrl5.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-85343-yezbz5.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-85513-1l2pzgy.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86070-pwkn99.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86277-14ckax5.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86458-1u26pb1.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86599-q2d5io.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-86739-hfrzzf.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170125-87110-1ky9gnk.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27355-hl9693.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27618-1pqa3bs.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27755-1di5xra.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-27974-cx2o7z.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28133-1q0tz4z.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28419-1ia3064.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28556-veg3ez.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-28784-15yhmp3.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29002-igofgq.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29143-1v25x8a.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29291-1qs4kex.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29522-5i1a.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29660-165adk7.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-29945-1lvmnay.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30103-9qqoc.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30381-1de3q2.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30864-1mthr0r.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/001/original/failures20170126-30993-wxw7ja.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/002/original/failures20170119-55532-1ujy7xh.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/003/original/failures20170119-87695-1j8psm5.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/003/original/failures20170125-84785-u7rdmo.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/006/original/failures20170118-40447-4jsf3l.csv +2 -0
- data/spec/dummy/public/system/importers/attachment_errors/000/000/007/original/failures20170118-44958-l51x0w.csv +2 -0
- data/spec/dummy/public/system/importers/attachments/000/000/001/original/companies.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/001/original/companies_invalid.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/002/original/companies.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/002/original/companies_invalid.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/003/original/companies.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/003/original/companies_invalid.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/004/original/companies.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/005/original/companies.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/006/original/companies_invalid.csv +3 -0
- data/spec/dummy/public/system/importers/attachments/000/000/007/original/companies_invalid.csv +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-A/-AzUQ_sdncLrgXJW-mT29l7lXefApIPQNpdCv9ETYkI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0f/0fmItA1G7uruwRE5HZE9TzG9K4A0NbbxGakdWz0cpDE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2M/2MSWm1oJk8doLU2cxusKHCU78PUDwQ1lrIlu5gXMx_U.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2k/2kXdUd2P4uN67x_E2mUy-AtGn9Fn_h5rQ0PJZi9HzBU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4b/4bvq3aQAVWrr_CUPXfVFCwfZMnmX-ecl9ZtwAisBlFI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6-/6-dQ3OmAEd4QXytW4TS1xdUNozHlLKSCawN0oN1oEYw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/63/63b-SgBWtX-UDgRq-Bsol3W40ijIWiT7uxcHRoVXS-M.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7l/7lUIJIvW1FW_GFVqqnVsKSxpeMaZ3noc0g8Eca5eHhQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9S/9S1VAatjEVICqM1Cojv-CKBUvl0oELWaNfTyFr_S700.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/A9/A9Vpp3VfKYpkCR6f1lAoM4J-w6QQ3fyn3x3TncKXf7U.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Av/AvR3LtLvNoPexMzvvUDPuM1V-yuaMddpBdG1RVgQh9Y.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Df/Dfad3HZGzx9mtzeig2tWlnuHQl9vAzoUutfVJwWKC5I.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dh/DhZ6bJZj4K7QCbNBTmMjFy3HDpC58SqfiPPoCCsAro4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hw/HwRNsYmzR0cy4L_V_8SLZiZ9_G6_8E7XiaDV21i9sjA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/I9/I97QBZ0SyWLebPjfYrwCNlM-Omla1LKRTGiTgmMKi2Q.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/J7/J7Ihmq6t6WbnmJaBScToEb-AR0U1NqHePsGdxAdJoLo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KF/KFqlYW7ohx2fJX05v2au1k6Gw7wuzN7UWz2BN90RsAQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LL/LLb4gLbgLgFS-LgcrmKXC--d1IaGB8XM_Yrm48bkwdw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LX/LXS-BomSubWXJSpkNXCH8m0l2y4sB66BaFb2UuAx14o.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lq/LqbLgHiwEzXq7mJX3Dtq5XicBULM8CtvDJdv4Ye45ZY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nh/Nhtorvc2xM84CWBcqtMIxoqKR4NCkCksOUQ_3UiyegA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oy/OyEUtus13InbtOxcvt5WdsbydEkrviBwJXD6z9GQaRA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/P6/P6-U-RxLXuRTDz8kHA2kBc3jUHSnNlbEHBOnUa97wyY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Po/Pos0iHsH-rUXDrrdalDi2H6yWVQTcz2ZPyRmQ_RnBPM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Q1/Q1xmk8Ni14zSYsTX_IvrbX1vbGANki_Udrwx7OBgh9w.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qo/QogFhnK16HrvDyiH323Z3xlwwofVibvzgZDmBjqh5VQ.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RI/RIagqSB7X-LbJU0ZwntNWf_KMkOm3kCkc7zR57rP1Bc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T4/T4WcrrL47jCKFOb5Q1cmn1keh_w3X2OguI_ifzRpS3k.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TA/TAbsAe1o7EI19gckGhtzbtjqOoSVRRLQrc5n3mnCT28.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TG/TGe7XAuizvtm9LtzDo5fR7GrEnyWPL8nBr2eESxA0x0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V8/V8kjWO7PZcVGI9mBNq17FYWc_muWwcDQF9xWGfnSOjM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VV/VVtm8HzHyOByhegKNGl09Ak3sHcSr0e70iHSmy75T6A.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vb/VbBBjIpX-u1j_Fko8QfFQ61-bfDS8BaYgGATVKIfp3I.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WR/WRP18y_66NlZHU4W5qM0P1MN8oS5eAlN9UEZrXh3vd0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wd/WdUHknjRY-ueTBCEgU4-NzM_BFaTimaeFED6MbFfQLE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bo/bopbSF0DLQEMLjRvN8Mn4xd-mGx46j9yvENVDA8R9jk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/e4/e4DrxyTxBlZlpP4PQ0zELpYhl4G2eiBksI0_HwQhrVY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZp3uXMHuYQC4hzCr7bQfetKNdJAtbQmg3so2KpW1Dw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iK/IKrFvYc5CMyfkKHP7JFW_bS4-tOG1rVwPFcC-OUpENU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iK/IkTLxpKuWrwxrM98yl3Ddv4RjOLzyUS5QHQvZ0Cniv8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iK/iKpMoxBcOmuavL2xUzgc7LQLnT7EKCaZirHx4KMbdw8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/je/jeA_WQ150_Af65U1CnVdHsqqZefOHl2ObGMLRQp--sc.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/l1/l1LHMvhocUYdhOc0tOfdy4slQYK2SD4fj6x4mH4wkvI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lo/loI7P5Fiwnq6YZdxqJFAErc6rV61HWRuL5tVaffS3JY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m9/m95ShgmvfDO8RuwZpC7gUW0i-FO-k914CWkXd5-LO3I.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/my/myHmSL0lcXz8Mgm5gNVoigImnF7acMaTlwl3z_g2lPM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oo/oocXRRNDTZPTtm859sgr9TxpBrPby6ND88ROtiCfgSU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/p-/p-3_4sMWwoC1eQcdH2fmcIdmlxQBFx6evUCdgfgPyKM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rn/rnSEYPKQcSZ-D3R7o3aM_1AtiXyLciuL3S3Qa6k_EfI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sV/sVzlvz069Fh5_GPu0TcrgDBWIHhnwEZ2Rg1AtpEqA9s.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uV/uVH7RdIENZh9BUaGeb6OUciC9H0hTIKsRpAxXMG5R28.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xQ/xQEI_TWc5k3ouSH2fSRrrWRpsLyeG7QQxmcgPjkwbc8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xQ/xQUUINnLqsr-zxPaIIULgXPE5jh2QtmbdRSYCnhpER4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xb/xblMCu_z727eCkuWjKJEyre92sVUkcGCpQqGThWe2bk.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yg/ygMyHfDIhhvlowOd5aTDhtXbZCLisqxhDWpdvXd8O5M.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yg/ygrgsR6-nQLxLaFwAquCXfjIZgUTEoYbI5EFH0KlfW0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yh/yh3Aqjs6HjjQubE9-htvIwUg4cFhMRCl7JyBFYBt0xo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z0/z0QrtOYRAsWOTFYmpCJqXXyGlHxHUxxKBV3_LMxKV2Y.cache +0 -0
- data/spec/examples.txt +50 -0
- data/spec/factories/importer.rb +10 -0
- data/spec/factories/user.rb +6 -0
- data/spec/fixtures/companies.csv +3 -0
- data/spec/fixtures/companies_invalid.csv +3 -0
- data/spec/lib/csv_import_magic/models_spec.rb +51 -0
- data/spec/lib/generators/active_record/csv_import_magic_generator_spec.rb +74 -0
- data/spec/lib/generators/active_record/namespaced/csv_import_magic_generator_spec.rb +78 -0
- data/spec/lib/generators/csv_import_magic/controllers_generator_spec.rb +34 -0
- data/spec/lib/generators/csv_import_magic/install_generator_spec.rb +79 -0
- data/spec/lib/generators/csv_import_magic/rails_5/install_generator_spec.rb +62 -0
- data/spec/lib/generators/csv_import_magic/views_generator_spec.rb +204 -0
- data/spec/models/importer_spec.rb +82 -0
- data/spec/rails_helper.rb +61 -0
- data/spec/services/csv_import_magic/failure_spec.rb +23 -0
- data/spec/services/csv_import_magic/importer_spec.rb +57 -0
- data/spec/spec_helper.rb +70 -0
- data/spec/support/database_cleaner.rb +12 -0
- data/spec/support/factory_girl.rb +12 -0
- data/spec/support/paperclip.rb +3 -0
- data/spec/support/shoulda_matchers.rb +6 -0
- data/spec/support/simplecov.rb +12 -0
- data/spec/workers/csv_import_magic/importer_worker_spec.rb +31 -0
- metadata +758 -0
@@ -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
|