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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7c5fa5aec10db70b4b8391d69151a1da513f755
4
- data.tar.gz: f9664947964a4be3e9921c3e04639af19733eed5
3
+ metadata.gz: 2c087a98855e71813798c295fcf9af1d402ffce0
4
+ data.tar.gz: 9cdbe7a64cd81f9f4e3e1620cee27b4aea356b7d
5
5
  SHA512:
6
- metadata.gz: fa51c6c72fd292b64d0c539f28d86c04608952c3c00701048093d82b881d27e81a408e191011de393e6e948eaabf68bdfac0bc2d29139adc3e3f0a2e75c2253d
7
- data.tar.gz: 87c4d41ce3edd2b0b68c0bd811a6120fc020dd034f1b8e7aa84d9e3b0bfee97c209a6c7a86f6aa4b36647c8797e4695224a2c7fdcefdb721dc81789488124b94
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[:col_sep], data[:rec_sep])
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
@@ -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 = SEPARATORS[data[:column_separator].to_sym] if !data[:column_separator].nil?
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
- @preview_lines = file_has_no_content
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 file_has_no_content
48
+ def file_has_content
44
49
  begin
45
50
  lines = get_preview_lines
46
51
  if lines.blank? || lines == 0
47
- raise TableImporter::EmptyFileImportError.new
52
+ return false
48
53
  else
49
- return lines
54
+ return true
50
55
  end
51
56
  rescue NoMethodError
52
- raise TableImporter::EmptyFileImportError.new
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
- key_to_add = "column_#{index}".to_sym
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
- # fix quote_char
131
- # bit of a hack here to provide the correct number of default headers to the user (rather than just 100)
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: ";", pipe: "|", newline_windows: "\r\n", old_newline_mac: "\r"}
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.all?{ |item_key, item_value| line_item_is_garbage?(item_value)}
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'
@@ -1,3 +1,3 @@
1
1
  module TableImporter
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -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({:content => "nick@pr.co, dennis@pr.co, lorenzo@pr.co", :headers_present => false, :headers => nil, :user_headers => nil, :type => "copy_and_paste", :col_sep => "", :rec_sep => "", :compulsory_headers => {:email => true}})
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", :col_sep => "", :rec_sep => "", :compulsory_headers => {:email => true}})
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({: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", :col_sep => :space, :rec_sep => :comma, :compulsory_headers => {:email => true}})
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", :col_sep => :space, :rec_sep => :comma, :compulsory_headers => {:email => true}})
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", :col_sep => :space, :rec_sep => :comma, :compulsory_headers => {:email => true}})
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", :col_sep => :space, :rec_sep => :comma, :compulsory_headers => {:email => true}})
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(:old_newline_mac)
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(:old_newline_mac)
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", :col_sep => "", :rec_sep => "", :compulsory_headers => {:email => true}})
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", :col_sep => :comma, :rec_sep => :newline_mac, :compulsory_headers => {:email => true}})
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", :col_sep => :comma, :rec_sep => :newline_mac, :compulsory_headers => {:email => true}})
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.6
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-01 00:00:00.000000000 Z
11
+ date: 2014-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spreadsheet