table_importer 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|