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 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