active_admin_import 4.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72a624e96a7c740179d82959a81d6eceee7987813a6dbed662a5113eb41e76d2
4
- data.tar.gz: 07ddbc628d18fa4b3a006a2709858001146f86d94f487368eca2c6e247f03ece
3
+ metadata.gz: ba919b0429b44accf46af4dcdc52ef1ddcf691a446cddf1bc434b38982c6b0c2
4
+ data.tar.gz: b54c35f3d81a3b170a8a27b657f1c0b8137c49716fab6b1ba0717845f1b15649
5
5
  SHA512:
6
- metadata.gz: '08f7de1d997ace9ecb6e741e95f66be1a14bb1b044683f41d0c27d24ec4b1bd995f0a5e2feb2f20dca07704416e809a5735aa39dc153c7497bbbce650003db4b'
7
- data.tar.gz: 8fc7ac974e5d03f6982fba484cc3ed2c54b9f5c9e3a38dd7a9ec1241100bb95e055639a75ffe79a9b3fffffbe06f3ab7c4a3ac162b8e63cd4316c7a73af2d7c8
6
+ metadata.gz: d949ae03350ff838eb97856d4c34afb610708dde36bee45d32b56de0bd1bf48a5e0adb4e67aaa549e1e35393cca146be755258fbc213422ab9a91b299769688e
7
+ data.tar.gz: 4ddc52d5273f06837f54a3806e56ebdad52c2a60581aa452b196de25885697348b13af8f56e27716ed2234b3771072f3f93e365035cdfc02b1539e7aa8385fb1
data/.gitignore CHANGED
@@ -13,4 +13,7 @@ capybara-*.html
13
13
  /spec/tmp/*
14
14
  **.orig
15
15
  rerun.txt
16
- pickle-email-*.html
16
+ pickle-email-*.html
17
+ pkg
18
+ spec/rails
19
+ Gemfile.lock
data/.travis.yml CHANGED
@@ -1,8 +1,14 @@
1
1
  script: bundle exec rspec spec
2
2
  env:
3
3
  matrix:
4
- - RAILS=5.0.0
5
- - RAILS=5.1.0
4
+ - RAILS=5.2.6
5
+ - RAILS=6.0.4
6
+ - RAILS=6.1.4
6
7
  rvm:
7
- - 2.2.5
8
- - 2.3.1
8
+ - 2.6.7
9
+ - 2.7.4
10
+ - 3.0.2
11
+ jobs:
12
+ exclude:
13
+ - rvm: 3.0.1
14
+ env: RAILS=5.2.6
data/CHANGELOG.md CHANGED
@@ -1,4 +1,21 @@
1
1
  # Changelog
2
+ ## [5.0.0] - 2021-11-16
3
+ - Ruby 3 compatibility added #190 | @clinejj
4
+ - Support for a non UTF-8 file when zip uploading #185| @naokirin
5
+ - Rails 6 supported #183 | @pnghai
6
+ - Drop ruby 2.4 support #192 | @Fivell
7
+
8
+
9
+ ## [4.2.0] - 2020-02-05
10
+ - generic exception for import added #175 | @linqueta
11
+
12
+ ## [4.1.2] - 2019-12-16
13
+ - allow application/octet-stream content-type #172 | @dmitry-sinina
14
+ - Allow activerecord-import >= 0.27 #171 | @sagium
15
+
16
+ ## [4.1.1] - 2019-09-20
17
+ - Fix column slicing #168 | @doredesign
18
+ - Handle errors on base #163
2
19
 
3
20
  ## [4.1.0] - 2019-01-15
4
21
  - Upgrade dependencies: `activerecord-import` to >=0.27.1 | @jkowens
data/Gemfile CHANGED
@@ -6,12 +6,13 @@ gemspec
6
6
 
7
7
 
8
8
  group :test do
9
- default_rails_version = "~> 5.1"
9
+ default_rails_version = "~> 5.2.4"
10
10
  rails_version = ENV['RAILS'] || default_rails_version
11
+ gem 'sassc-rails'
11
12
  gem 'rails', rails_version
12
13
  gem 'rspec-rails'
13
14
  gem 'coveralls', require: false # Test coverage website. Go to https://coveralls.io
14
- gem 'sqlite3'
15
+ gem "sqlite3", "~> 1.4.0"
15
16
  gem 'launchy'
16
17
  gem 'database_cleaner'
17
18
  gem 'capybara'
@@ -15,8 +15,8 @@ Gem::Specification.new do |gem|
15
15
  gem.name = 'active_admin_import'
16
16
  gem.require_paths = ['lib']
17
17
  gem.version = ActiveAdminImport::VERSION
18
- gem.add_runtime_dependency 'activerecord-import', '~> 0.27'
19
- gem.add_runtime_dependency 'rchardet', '~> 1.6'
20
- gem.add_runtime_dependency 'rubyzip', '~> 1.2'
21
- gem.add_dependency 'activeadmin', '>= 1.0.0.pre2'
18
+ gem.add_runtime_dependency 'activerecord-import', '>= 0.27'
19
+ gem.add_runtime_dependency 'rchardet', '>= 1.6'
20
+ gem.add_runtime_dependency 'rubyzip', '>= 1.2'
21
+ gem.add_dependency 'activeadmin', '>= 1.0.0'
22
22
  end
@@ -92,7 +92,11 @@ module ActiveAdminImport
92
92
  else
93
93
  instance_exec result, options, &DEFAULT_RESULT_PROC
94
94
  end
95
- rescue ActiveRecord::Import::MissingColumnError, NoMethodError, ActiveRecord::StatementInvalid, CSV::MalformedCSVError => e
95
+ rescue ActiveRecord::Import::MissingColumnError,
96
+ NoMethodError,
97
+ ActiveRecord::StatementInvalid,
98
+ CSV::MalformedCSVError,
99
+ ActiveAdminImport::Exception => e
96
100
  Rails.logger.error(I18n.t('active_admin_import.file_error', message: e.message))
97
101
  Rails.logger.error(e.backtrace.join("\n"))
98
102
  flash[:error] = I18n.t('active_admin_import.file_error', message: e.message[0..200])
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ActiveAdminImport
3
+ class Exception < StandardError
4
+ end
5
+ end
@@ -33,7 +33,10 @@ module ActiveAdminImport
33
33
  limit = options[:limit] || failed.count
34
34
  failed.first(limit).map do |record|
35
35
  errors = record.errors
36
- (errors.full_messages.zip errors.keys.map { |k| record.send k }).map { |ms| ms.join(' - ') }.join(', ')
36
+ failed_values = errors.keys.map do |key|
37
+ key == :base ? nil : record.public_send(key)
38
+ end
39
+ errors.full_messages.zip(failed_values).map { |ms| ms.compact.join(' - ') }.join(', ')
37
40
  end.join(' ; ')
38
41
  end
39
42
  end
@@ -37,7 +37,7 @@ module ActiveAdminImport
37
37
  end
38
38
 
39
39
  def cycle(lines)
40
- @csv_lines = CSV.parse(lines.join, @csv_options)
40
+ @csv_lines = CSV.parse(lines.join, **@csv_options)
41
41
  import_result.add(batch_import, lines.count)
42
42
  end
43
43
 
@@ -70,7 +70,7 @@ module ActiveAdminImport
70
70
  end
71
71
  end
72
72
 
73
- # Use it when CSV file contain redundant columns
73
+ # Use this method when CSV file contains unnecessary columns
74
74
  #
75
75
  # Example:
76
76
  #
@@ -81,16 +81,22 @@ module ActiveAdminImport
81
81
  # end
82
82
  #
83
83
  def batch_slice_columns(slice_columns)
84
- use_indexes = []
85
- headers.values.each_with_index do |val, index|
86
- use_indexes << index if val.in?(slice_columns)
84
+ # Only set @use_indexes for the first batch so that @use_indexes are in correct
85
+ # position for subsequent batches
86
+ unless defined?(@use_indexes)
87
+ @use_indexes = []
88
+ headers.values.each_with_index do |val, index|
89
+ @use_indexes << index if val.in?(slice_columns)
90
+ end
91
+ return csv_lines if @use_indexes.empty?
92
+
93
+ # slice CSV headers
94
+ @headers = headers.to_a.values_at(*@use_indexes).to_h
87
95
  end
88
- return csv_lines if use_indexes.empty?
89
- # slice CSV headers
90
- @headers = headers.to_a.values_at(*use_indexes).to_h
96
+
91
97
  # slice CSV values
92
98
  csv_lines.map! do |line|
93
- line.values_at(*use_indexes)
99
+ line.values_at(*@use_indexes)
94
100
  end
95
101
  end
96
102
 
@@ -109,7 +115,7 @@ module ActiveAdminImport
109
115
  batch_size = options[:batch_size].to_i
110
116
  File.open(file.path) do |f|
111
117
  # capture headers if not exist
112
- prepare_headers { CSV.parse(f.readline, @csv_options).first }
118
+ prepare_headers { CSV.parse(f.readline, **@csv_options).first }
113
119
  f.each_line do |line|
114
120
  lines << line if line.present?
115
121
  if lines.size == batch_size || f.eof?
@@ -21,6 +21,7 @@ module ActiveAdminImport
21
21
  application/csv
22
22
  application/vnd.ms-excel
23
23
  application/vnd.msexcel
24
+ application/octet-stream
24
25
  text/tsv
25
26
  text/x-tsv
26
27
  text/tab-separated-values
@@ -109,7 +110,7 @@ module ActiveAdminImport
109
110
 
110
111
  def unzip_file
111
112
  Zip::File.open(file_path) do |zip_file|
112
- self.file = Tempfile.new(CONST::TMP_FILE)
113
+ self.file = Tempfile.new(CONST::TMP_FILE, binmode: true)
113
114
  data = zip_file.entries.select(&:file?).first.get_input_stream.read
114
115
  file << data
115
116
  file.close
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveAdminImport
4
- VERSION = '4.1.0'
4
+ VERSION = '5.0.0'
5
5
  end
@@ -3,6 +3,7 @@ require 'activerecord-import'
3
3
  require 'active_admin'
4
4
  require 'active_admin_import/version'
5
5
  require 'active_admin_import/engine'
6
+ require 'active_admin_import/exception'
6
7
  require 'active_admin_import/import_result'
7
8
  require 'active_admin_import/options'
8
9
  require 'active_admin_import/dsl'
@@ -1,3 +1,3 @@
1
- Name,Last name,Birthday
2
- John,Doe,1986-05-01
3
- Jane,Roe,1988-11-16
1
+ Birthday,Name,Last name
2
+ 1986-05-01,John,Doe
3
+ 1988-11-16,Jane,Roe
@@ -5,17 +5,18 @@ describe ActiveAdminImport::ImportResult do
5
5
  context 'failed_message' do
6
6
  let(:import_result) { ActiveAdminImport::ImportResult.new }
7
7
 
8
- before do
9
- Author.create(name: 'John', last_name: 'Doe')
10
- Author.create(name: 'Jane', last_name: 'Roe')
11
8
 
9
+ let(:failed_instances) do
10
+ [
11
+ Author.new(last_name: 'Doe').tap {|r| r.errors.add(:last_name, :taken) },
12
+ Author.new(name: "", last_name: 'Doe').tap {|r| r.errors.add(:name, :blank); r.errors.add(:last_name, :taken) },
13
+ Author.new.tap {|r| r.errors.add(:base, 'custom') }
14
+ ]
15
+ end
16
+
17
+ before do
12
18
  @result = double \
13
- failed_instances: [
14
- # {:last_name=>["has already been taken"]}
15
- Author.create(name: 'Jim', last_name: 'Doe'),
16
- # {:name=>["can't be blank"], :last_name=>["has already been taken"]}
17
- Author.create(name: nil, last_name: 'Doe')
18
- ]
19
+ failed_instances: failed_instances
19
20
  end
20
21
 
21
22
  it 'should work without any failed instances' do
@@ -26,7 +27,7 @@ describe ActiveAdminImport::ImportResult do
26
27
  import_result.add(@result, 4)
27
28
  expect(import_result.failed_message)
28
29
  .to eq(
29
- "Last name has already been taken - Doe ; Name can't be blank - , Last name has already been taken - Doe"
30
+ "Last name has already been taken - Doe ; Name can't be blank - , Last name has already been taken - Doe ; custom"
30
31
  )
31
32
  end
32
33
 
data/spec/import_spec.rb CHANGED
@@ -371,6 +371,20 @@ describe 'import', type: :feature do
371
371
  end
372
372
  end
373
373
  end
374
+
375
+ context 'when zipped with Win1251 file' do
376
+ let(:options) do
377
+ attributes = { force_encoding: :auto }
378
+ { template_object: ActiveAdminImport::Model.new(attributes) }
379
+ end
380
+ it 'should import file' do
381
+ with_zipped_csv(:authors_win1251_win_endline) do
382
+ upload_file!(:authors_win1251_win_endline, :zip)
383
+ expect(page).to have_content 'Successfully imported 2 authors'
384
+ expect(Author.count).to eq(2)
385
+ end
386
+ end
387
+ end
374
388
  end
375
389
 
376
390
  context 'with different header attribute names' do
@@ -430,15 +444,40 @@ describe 'import', type: :feature do
430
444
  upload_file!(:authors)
431
445
  expect(Author.count).to eq(2)
432
446
  end
447
+
448
+ context 'when the option before_import raises a ActiveAdminImport::Exception' do
449
+ let(:options) { { before_import: ->(_) { raise ActiveAdminImport::Exception, 'error message' } } }
450
+
451
+ before { upload_file!(:authors) }
452
+
453
+ it 'should show error' do
454
+ expect(page).to have_content I18n.t('active_admin_import.file_error', message: 'error message')
455
+ expect(Author.count).to eq(0)
456
+ end
457
+ end
458
+
459
+ context 'when the option before_batch_import raises a ActiveAdminImport::Exception' do
460
+ let(:options) { { before_batch_import: ->(_) { raise ActiveAdminImport::Exception, 'error message' } } }
461
+
462
+ before { upload_file!(:authors) }
463
+
464
+ it 'should show error' do
465
+ expect(page).to have_content I18n.t('active_admin_import.file_error', message: 'error message')
466
+ expect(Author.count).to eq(0)
467
+ end
468
+ end
433
469
  end
434
470
  end
435
471
 
436
472
  context "with slice_columns option" do
473
+ let(:batch_size) { 2 }
474
+
437
475
  before do
438
476
  add_author_resource template_object: ActiveAdminImport::Model.new,
439
477
  before_batch_import: lambda { |importer|
440
478
  importer.batch_slice_columns(slice_columns)
441
- }
479
+ },
480
+ batch_size: batch_size
442
481
  visit "/admin/authors/import"
443
482
  upload_file!(:authors)
444
483
  end
@@ -446,13 +485,23 @@ describe 'import', type: :feature do
446
485
  context "slice last column and superfluous column" do
447
486
  let(:slice_columns) { %w(name last_name not_existing_column) }
448
487
 
449
- it "should not fill `birthday` column" do
450
- expect(Author.pluck(:name, :last_name, :birthday)).to match_array(
451
- [
452
- ["Jane", "Roe", nil],
453
- ["John", "Doe", nil]
454
- ]
455
- )
488
+ shared_examples_for "birthday column removed" do
489
+ it "should not fill `birthday` column" do
490
+ expect(Author.pluck(:name, :last_name, :birthday)).to match_array(
491
+ [
492
+ ["Jane", "Roe", nil],
493
+ ["John", "Doe", nil]
494
+ ]
495
+ )
496
+ end
497
+ end
498
+
499
+ it_behaves_like "birthday column removed"
500
+
501
+ context "when doing more than one batch" do
502
+ let(:batch_size) { 1 }
503
+
504
+ it_behaves_like "birthday column removed"
456
505
  end
457
506
  end
458
507
 
data/spec/spec_helper.rb CHANGED
@@ -20,6 +20,7 @@ system 'rake setup' unless File.exist?(ENV['RAILS_ROOT'])
20
20
  require 'active_model'
21
21
  # require ActiveRecord to ensure that Ransack loads correctly
22
22
  require 'active_record'
23
+ require 'action_view'
23
24
  require 'active_admin'
24
25
  ActiveAdmin.application.load_paths = [ENV['RAILS_ROOT'] + '/app/admin']
25
26
  require ENV['RAILS_ROOT'] + '/config/environment.rb'
data/tasks/test.rake CHANGED
@@ -3,5 +3,5 @@ desc 'Creates a test rails app for the specs to run against'
3
3
  task :setup do
4
4
  require 'rails/version'
5
5
  system('mkdir spec/rails') unless File.exist?('spec/rails')
6
- system "bundle exec rails new spec/rails/rails-#{Rails::VERSION::STRING} -m spec/support/rails_template.rb --skip-spring --skip-turbolinks"
6
+ system "bundle exec rails new spec/rails/rails-#{Rails::VERSION::STRING} -m spec/support/rails_template.rb --skip-spring --skip-turbolinks --skip-bootsnap"
7
7
  end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_admin_import
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Fedoronchuk
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-15 00:00:00.000000000 Z
11
+ date: 2021-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-import
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.27'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.27'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rchardet
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rubyzip
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.2'
55
55
  - !ruby/object:Gem::Dependency
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 1.0.0.pre2
61
+ version: 1.0.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 1.0.0.pre2
68
+ version: 1.0.0
69
69
  description: The most efficient way to import for Active Admin
70
70
  email:
71
71
  - fedoronchuk@gmail.com
@@ -99,6 +99,7 @@ files:
99
99
  - lib/active_admin_import/authorization.rb
100
100
  - lib/active_admin_import/dsl.rb
101
101
  - lib/active_admin_import/engine.rb
102
+ - lib/active_admin_import/exception.rb
102
103
  - lib/active_admin_import/import_result.rb
103
104
  - lib/active_admin_import/importer.rb
104
105
  - lib/active_admin_import/model.rb
@@ -133,7 +134,7 @@ homepage: http://github.com/Fivell/active_admin_import
133
134
  licenses:
134
135
  - MIT
135
136
  metadata: {}
136
- post_install_message:
137
+ post_install_message:
137
138
  rdoc_options: []
138
139
  require_paths:
139
140
  - lib
@@ -148,9 +149,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
149
  - !ruby/object:Gem::Version
149
150
  version: '0'
150
151
  requirements: []
151
- rubyforge_project:
152
- rubygems_version: 2.7.7
153
- signing_key:
152
+ rubygems_version: 3.1.6
153
+ signing_key:
154
154
  specification_version: 4
155
155
  summary: ActiveAdmin import based on activerecord-import gem.
156
156
  test_files: