table_importer 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/table_importer/copy_and_paste.rb +1 -1
- data/lib/table_importer/csv.rb +37 -30
- data/lib/table_importer/source.rb +18 -4
- data/lib/table_importer/version.rb +1 -1
- data/spec/sources/copy_and_paste_spec.rb +15 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c087a98855e71813798c295fcf9af1d402ffce0
|
4
|
+
data.tar.gz: 9cdbe7a64cd81f9f4e3e1620cee27b4aea356b7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f95de40eb290cc724f13b9916fdf2fd82f59f2919cb8c71e4cf84fd39dc7dd204c18155f39b07a28c730c368af7b7bd44b88e8c38413eb1a4fbde85f45f6a03
|
7
|
+
data.tar.gz: 9d307ff0c93fbce3d07a0d9a5fad25b225b2efd7670488b977acb53b92cea85ee425400785fc507fbba8d0111c057982339b92126d67f7c18edc548e6cdb862c
|
@@ -4,7 +4,7 @@ module TableImporter
|
|
4
4
|
|
5
5
|
def initialize(data)
|
6
6
|
@data = assign_data(data[:content])
|
7
|
-
@column_separator, @record_separator = assign_separators(data[:
|
7
|
+
@column_separator, @record_separator = assign_separators(data[:column_separator], data[:record_separator])
|
8
8
|
@headers, @headers_present = assign_headers(data[:headers], data[:headers_present])
|
9
9
|
@compulsory_headers = data[:compulsory_headers]
|
10
10
|
@delete_empty_columns = @data.length < 50000
|
data/lib/table_importer/csv.rb
CHANGED
@@ -7,8 +7,7 @@ module TableImporter
|
|
7
7
|
def initialize(data)
|
8
8
|
@headers_present = data[:headers_present] # user has indicated headers are provided
|
9
9
|
@headers = data[:headers]
|
10
|
-
@column_separator =
|
11
|
-
@record_separator = !data[:record_separator].nil? && data[:record_separator].length > 0 ? SEPARATORS[data[:record_separator].to_sym] : "\n"
|
10
|
+
@column_separator, @record_separator = initialize_separators(data[:column_separator], data[:record_separator])
|
12
11
|
@compulsory_headers = data[:compulsory_headers]
|
13
12
|
@file = data[:content]
|
14
13
|
@delete_empty_columns = File.size(@file) < 100000
|
@@ -18,7 +17,7 @@ module TableImporter
|
|
18
17
|
raise ArgumentError
|
19
18
|
end
|
20
19
|
get_column_separator(first_line)
|
21
|
-
|
20
|
+
raise TableImporter::EmptyFileImportError.new unless file_has_content
|
22
21
|
@headers = @headers_present ? first_line.split(@column_separator) : default_headers(100) if @headers.blank?
|
23
22
|
rescue ArgumentError
|
24
23
|
@file = clean_file(@file)
|
@@ -26,6 +25,12 @@ module TableImporter
|
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
28
|
+
def initialize_separators(col_sep, rec_sep)
|
29
|
+
col_sep = SEPARATORS[col_sep.to_sym] if !col_sep.nil?
|
30
|
+
rec_sep = !rec_sep.nil? && rec_sep.length > 0 ? SEPARATORS[rec_sep.to_sym] : "\n"
|
31
|
+
return col_sep, rec_sep
|
32
|
+
end
|
33
|
+
|
29
34
|
def get_first_line
|
30
35
|
begin
|
31
36
|
SmarterCSV.process(@file.path, default_options({:col_sep => @column_separator.present? ? @column_separator : "\n", :row_sep => @record_separator != nil ? @record_separator : "\n", :chunk_size => 8})) do |chunk|
|
@@ -40,16 +45,16 @@ module TableImporter
|
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
43
|
-
def
|
48
|
+
def file_has_content
|
44
49
|
begin
|
45
50
|
lines = get_preview_lines
|
46
51
|
if lines.blank? || lines == 0
|
47
|
-
|
52
|
+
return false
|
48
53
|
else
|
49
|
-
return
|
54
|
+
return true
|
50
55
|
end
|
51
56
|
rescue NoMethodError
|
52
|
-
|
57
|
+
false
|
53
58
|
end
|
54
59
|
end
|
55
60
|
|
@@ -77,13 +82,8 @@ module TableImporter
|
|
77
82
|
|
78
83
|
def get_preview_lines
|
79
84
|
begin
|
80
|
-
return clean_chunks([@preview_lines], @compulsory_headers, @delete_empty_columns)[0].symbolize_keys[:lines] if !@preview_lines.blank?
|
81
|
-
if @delete_empty_columns
|
82
|
-
chunks = SmarterCSV.process(@file.path, default_options({:row_sep => @record_separator != nil ? @record_separator : "\n", :chunk_size => 50}))
|
83
|
-
return clean_chunks(chunks, @compulsory_headers, true)[0].symbolize_keys[:lines][0..7]
|
84
|
-
end
|
85
85
|
SmarterCSV.process(@file.path, default_options({:row_sep => @record_separator != nil ? @record_separator : "\n", :chunk_size => 8})) do |chunk|
|
86
|
-
return clean_chunks([chunk], @compulsory_headers)[0].symbolize_keys[:lines][0..7]
|
86
|
+
return clean_chunks([chunk], @compulsory_headers, @delete_empty_columns)[0].symbolize_keys[:lines][0..7]
|
87
87
|
end
|
88
88
|
rescue SmarterCSV::HeaderSizeMismatch
|
89
89
|
raise TableImporter::HeaderMismatchError.new
|
@@ -97,14 +97,7 @@ module TableImporter
|
|
97
97
|
|
98
98
|
def get_chunks(chunk_size)
|
99
99
|
begin
|
100
|
-
chunks =
|
101
|
-
if @headers_present
|
102
|
-
key_mapping = convert_headers(SmarterCSV.process(@file.path, default_options).first.keys, @headers, @headers_present).delete_if{ |key, value| value.blank?}
|
103
|
-
chunks = SmarterCSV.process(@file.path, default_options({:chunk_size => chunk_size, :key_mapping => key_mapping, :remove_unmapped_keys => true, :user_provided_headers => nil}))
|
104
|
-
else
|
105
|
-
user_provided_headers = convert_headers(SmarterCSV.process(@file.path, default_options).first.keys, @headers, @headers_present).values
|
106
|
-
chunks = SmarterCSV.process(@file.path, default_options({:chunk_size => chunk_size, :user_provided_headers => user_provided_headers, :remove_empty_values => true}))
|
107
|
-
end
|
100
|
+
chunks = @headers_present ? chunks_with_headers(chunk_size) : chunks_without_headers(chunk_size)
|
108
101
|
clean_chunks(chunks, @compulsory_headers, @delete_empty_columns)
|
109
102
|
rescue ArgumentError
|
110
103
|
@file = clean_file(@file)
|
@@ -112,23 +105,35 @@ module TableImporter
|
|
112
105
|
end
|
113
106
|
end
|
114
107
|
|
108
|
+
def chunks_with_headers(chunk_size)
|
109
|
+
key_mapping = convert_headers(SmarterCSV.process(@file.path, default_options).first.keys, @headers, @headers_present).delete_if{ |key, value| value.blank?}
|
110
|
+
SmarterCSV.process(@file.path, default_options({:chunk_size => chunk_size, :key_mapping => key_mapping, :remove_unmapped_keys => true, :user_provided_headers => nil}))
|
111
|
+
end
|
112
|
+
|
113
|
+
def chunks_without_headers(chunk_size)
|
114
|
+
user_provided_headers = convert_headers(SmarterCSV.process(@file.path, default_options).first.keys, @headers, @headers_present).values
|
115
|
+
SmarterCSV.process(@file.path, default_options({:chunk_size => chunk_size, :user_provided_headers => user_provided_headers, :remove_empty_values => true}))
|
116
|
+
end
|
117
|
+
|
115
118
|
def convert_headers(provided_headers, mapped_headers, headers_present)
|
116
119
|
new_headers = []
|
117
120
|
old_headers = headers_present ? provided_headers : default_headers
|
118
121
|
old_headers.each_with_index do |key, index|
|
119
|
-
|
120
|
-
mapped_headers.each do |new_key, value|
|
121
|
-
if value.to_s == index.to_s
|
122
|
-
key_to_add = new_key
|
123
|
-
end
|
124
|
-
end
|
125
|
-
new_headers << key_to_add
|
122
|
+
new_headers << map_headers(mapped_headers, index)
|
126
123
|
end
|
127
124
|
Hash[old_headers.zip(new_headers)]
|
128
125
|
end
|
129
126
|
|
130
|
-
|
131
|
-
|
127
|
+
def map_headers(mapped_headers, index)
|
128
|
+
key_to_add = "column_#{index}".to_sym
|
129
|
+
mapped_headers.each do |new_key, value|
|
130
|
+
if value.to_s == index.to_s
|
131
|
+
key_to_add = new_key
|
132
|
+
end
|
133
|
+
end
|
134
|
+
key_to_add
|
135
|
+
end
|
136
|
+
|
132
137
|
def default_options(options = {})
|
133
138
|
{:col_sep => @column_separator, :row_sep => @record_separator, :force_simple_split => true, :strip_chars_from_headers => /[\-"]/, :remove_empty_values => false,
|
134
139
|
:verbose => false, :headers_in_file => @headers_present, :convert_values_to_numeric => false,
|
@@ -140,6 +145,8 @@ module TableImporter
|
|
140
145
|
import = Tempfile.new(["import", ".xls"], :encoding => "UTF-8")
|
141
146
|
import.write(contents.force_encoding('UTF-8').encode('UTF-16', :invalid => :replace, :replace => '?').encode('UTF-8').gsub!(/\r\n|\r/, "\n"))
|
142
147
|
import.close
|
148
|
+
SEPARATORS.except!(:newline_windows, :old_newline_mac)
|
149
|
+
@record_separator = "\n"
|
143
150
|
return import
|
144
151
|
end
|
145
152
|
end
|
@@ -2,7 +2,7 @@ module TableImporter
|
|
2
2
|
|
3
3
|
class Source
|
4
4
|
|
5
|
-
SEPARATORS = {comma: ",", space: " ", tab: "\t", newline_mac: "\n", semicolon: ";",
|
5
|
+
SEPARATORS = {comma: ",", space: " ", tab: "\t", newline_mac: "\n", semicolon: ";", newline_windows: "\r\n", old_newline_mac: "\r"}
|
6
6
|
|
7
7
|
def initialize (data)
|
8
8
|
case data[:type]
|
@@ -77,7 +77,7 @@ module TableImporter
|
|
77
77
|
chunks.each do |chunk|
|
78
78
|
new_chunk = { :lines => [], :errors => []}
|
79
79
|
chunk.each_with_index do |line, index|
|
80
|
-
line_empty = line_empty?(line)
|
80
|
+
line, line_empty = line_empty?(line)
|
81
81
|
no_compulsory_headers, missing_header = check_compulsory_headers?(line, compulsory_headers)
|
82
82
|
if line_empty || no_compulsory_headers
|
83
83
|
new_chunk[:errors] << format_error(line, line_empty, no_compulsory_headers, compulsory_headers, missing_header)
|
@@ -85,7 +85,7 @@ module TableImporter
|
|
85
85
|
if delete_empty_columns
|
86
86
|
line.each do |key, value|
|
87
87
|
if value.present? && value.to_s.gsub(/[^A-Za-z0-9]/, '').present?
|
88
|
-
empty_headers.delete(key)
|
88
|
+
empty_headers.delete(clean_item(key).to_sym)
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
@@ -102,7 +102,20 @@ module TableImporter
|
|
102
102
|
|
103
103
|
private
|
104
104
|
def line_empty?(line)
|
105
|
-
line
|
105
|
+
line = clean_line(line)
|
106
|
+
return line, line.all?{ |item_key, item_value| line_item_is_garbage?(item_value)} && line.all?{ |item_key, item_value| line_item_is_garbage?(item_key)}
|
107
|
+
end
|
108
|
+
|
109
|
+
def clean_line(line)
|
110
|
+
map = {}
|
111
|
+
line.each_pair do |key,value|
|
112
|
+
map[clean_item(key).to_sym] = clean_item(value)
|
113
|
+
end
|
114
|
+
map
|
115
|
+
end
|
116
|
+
|
117
|
+
def clean_item(item)
|
118
|
+
item.to_s.delete("\u0000").to_s.delete("\x00")
|
106
119
|
end
|
107
120
|
|
108
121
|
def check_compulsory_headers?(line, compulsory_headers)
|
@@ -148,3 +161,4 @@ end
|
|
148
161
|
require 'table_importer/csv'
|
149
162
|
require 'table_importer/copy_and_paste'
|
150
163
|
require 'table_importer/excel'
|
164
|
+
require 'table_importer/exceptions'
|
@@ -6,30 +6,34 @@ describe TableImporter::Source do
|
|
6
6
|
context 'when source is a string it' do
|
7
7
|
|
8
8
|
before(:each) do
|
9
|
-
@source = TableImporter::Source.new({
|
9
|
+
@source = TableImporter::Source.new({
|
10
|
+
:content => "nick@pr.co\ndennis@pr.co\nlorenzo@pr.co",
|
11
|
+
:headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :column_separator => "", :record_separator => "", :compulsory_headers => {:email => true}})
|
10
12
|
end
|
11
13
|
|
12
14
|
it "creates a source object" do
|
13
|
-
TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :
|
15
|
+
TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :column_separator => "", :record_separator => "", :compulsory_headers => {:email => true}})
|
14
16
|
end
|
15
17
|
|
16
18
|
it "gets the correct copy and paste chunks" do
|
17
|
-
source = TableImporter::Source.new({
|
19
|
+
source = TableImporter::Source.new({
|
20
|
+
:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co",
|
21
|
+
:headers_present => false, :headers => {"first_name"=>"", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"0", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :column_separator => :space, :record_separator => :comma, :compulsory_headers => {:email => true}})
|
18
22
|
source.get_chunks.first[:lines].first[:email].should eql("nick@pr.co")
|
19
23
|
end
|
20
24
|
|
21
25
|
it "has the correct number of lines" do
|
22
|
-
source = TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => {"first_name"=>"", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"0", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :
|
26
|
+
source = TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => {"first_name"=>"", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"0", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :column_separator => :space, :record_separator => :comma, :compulsory_headers => {:email => true}})
|
23
27
|
source.get_chunks(1).count.should eql(3)
|
24
28
|
end
|
25
29
|
|
26
30
|
it "has the correct number of chunks" do
|
27
|
-
source = TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => {"first_name"=>"", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"0", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :
|
31
|
+
source = TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => {"first_name"=>"", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"0", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :column_separator => :space, :record_separator => :comma, :compulsory_headers => {:email => true}})
|
28
32
|
source.get_chunks(2).count.should eql(2)
|
29
33
|
end
|
30
34
|
|
31
35
|
it "does not have extra spaces in the final chunk" do
|
32
|
-
source = TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => {"first_name"=>"", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"0", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :
|
36
|
+
source = TableImporter::Source.new({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => {"first_name"=>"", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"0", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :column_separator => :space, :record_separator => :comma, :compulsory_headers => {:email => true}})
|
33
37
|
last_chunk = source.get_chunks(2).last
|
34
38
|
(last_chunk[:lines].count + last_chunk[:errors].count).should eql(1)
|
35
39
|
end
|
@@ -39,11 +43,11 @@ describe TableImporter::Source do
|
|
39
43
|
end
|
40
44
|
|
41
45
|
it "can get the correct record separator" do
|
42
|
-
@source.get_record_separator.should eql(:
|
46
|
+
@source.get_record_separator.should eql(:newline_mac)
|
43
47
|
end
|
44
48
|
|
45
49
|
it "can get the correct column separator" do
|
46
|
-
@source.get_column_separator.should eql(:
|
50
|
+
@source.get_column_separator.should eql(:space)
|
47
51
|
end
|
48
52
|
|
49
53
|
it "has the correct type" do
|
@@ -58,7 +62,7 @@ describe TableImporter::Source do
|
|
58
62
|
context 'when source is a different string' do
|
59
63
|
|
60
64
|
before(:each) do
|
61
|
-
@source = TableImporter::Source.new({:content => "Nick Dowse <nick@pr.co>, Dennis van der Vliet <dennis@pr.co>, Jeroen Bos <jeroen@pr.co>", :headers_present => false, :headers => {"first_name"=>"0", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"1", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :
|
65
|
+
@source = TableImporter::Source.new({:content => "Nick Dowse <nick@pr.co>, Dennis van der Vliet <dennis@pr.co>, Jeroen Bos <jeroen@pr.co>", :headers_present => false, :headers => {"first_name"=>"0", "last_name"=>"", "salutation"=>"", "tag_list"=>"", "email"=>"1", "organization"=>"", "url"=>"", "phone"=>"", "job_title"=>"", "second_url"=>"", "notes"=>"", "twitter_username"=>"", "skype_username"=>"", "pinterest_username"=>"", "instagram_username"=>"", "facebook_username"=>"", "last_name_prefix"=>"", "second_email"=>"", "phone_mobile"=>"", "street"=>"", "street_number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, :user_headers => nil, :type => "copy_and_paste", :column_separator => "", :record_separator => "", :compulsory_headers => {:email => true}})
|
62
66
|
end
|
63
67
|
|
64
68
|
it "gets the correct chunks" do
|
@@ -103,7 +107,7 @@ describe TableImporter::Source do
|
|
103
107
|
|
104
108
|
lorenzo,\"lorenzo@pr.co\"
|
105
109
|
HÐ, “nick¯â@test”, ¾,€",
|
106
|
-
:headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :
|
110
|
+
:headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :column_separator => :comma, :record_separator => :newline_mac, :compulsory_headers => {:email => true}})
|
107
111
|
end
|
108
112
|
|
109
113
|
it "has the correct number of lines" do
|
@@ -127,7 +131,7 @@ describe TableImporter::Source do
|
|
127
131
|
context 'when string is empty' do
|
128
132
|
it 'raises an error when creating a source object' do
|
129
133
|
expect{
|
130
|
-
TableImporter::Source.new({:content => "", :headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :
|
134
|
+
TableImporter::Source.new({:content => "", :headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :column_separator => :comma, :record_separator => :newline_mac, :compulsory_headers => {:email => true}})
|
131
135
|
}.to raise_error(TableImporter::EmptyFileImportError)
|
132
136
|
end
|
133
137
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_importer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Dowse
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spreadsheet
|