queryable_pstore 0.0.10 → 0.0.11

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: ed900a27718914479aaea9502f5d7dcb01aa4aa6
4
- data.tar.gz: c2b26e0ef5b614f96b9534fe00e3026b3b3bf87a
3
+ metadata.gz: 3b23893d697cf9c96836e24472b374949340eeb8
4
+ data.tar.gz: 8413c0ab01438990d730789c768226a9c298e6a3
5
5
  SHA512:
6
- metadata.gz: b614f00f32213a2a8d2ff2c89706c4b0b624538321713680e4c3c6440e8d1ac1be30b04dc73b02dbb98b32bcd0b03580601906f3921a2cefdc9bb39151dd5372
7
- data.tar.gz: 20a6a804585c402dd6b8c46568ed68ca6a73aa07bc6c839490f8a4d7690371079464713b44210c2102ac4b5812908bb7c52df7780e1782ae2cf333e39054bd1b
6
+ metadata.gz: 586899fbb166d695f06c48e93896c1db697f9d57ce3465ae5a9be60def4963219708c019b0af183ffb8cdbc20ea95da567bb5d4de4b8130ff86a870d21fd97f7
7
+ data.tar.gz: 7c6530e9745705aaf10fd772b95d29f3cd19e5bb2e348d51d54fd19693b5ff6597e46e8b26eebf247ff18ec844b0419296134785b4460e87f3741d092e6eb5b2
data/lib/csv_converter.rb CHANGED
@@ -10,6 +10,8 @@ class CSVConverter
10
10
  hash[@key] = hash[@key].to_i
11
11
  when :float
12
12
  hash[@key] = hash[@key].to_f
13
+ when :string
14
+ # nop, default
13
15
  else
14
16
  raise ArgumentError.new("Unknown converter: `#{@conversion}`")
15
17
  end
data/lib/csv_importer.rb CHANGED
@@ -1,28 +1,33 @@
1
+ require 'pry'
2
+
1
3
  class CSVImporter
2
4
  CURRENT_DIRECTORY = "./".freeze
3
5
 
4
6
  attr_reader :original_headers, :headers_and_type
5
7
 
6
8
  def import_csv(filename, opts = {})
7
- csv = CSV.read(File.open(filename), headers: true, header_converters: -> (header) { convert_header_to_methodable_name(header) })
9
+ csv = CSV.read(File.open(filename), headers: true, header_converters: -> (header) { convert_header_to_methodable_name(header, track_original: true) })
8
10
  store = create_pstore(csv, opts, filename)
9
11
  store.csv_importer = self
10
- set_headers_and_type(@original_headers, store)
11
12
 
12
13
  store
13
14
  end
14
15
 
15
16
  def import_csv_from_string(string, opts = {})
16
- csv = CSV.parse(string, headers: true, header_converters: -> (header) { convert_header_to_methodable_name(header) })
17
+ csv = CSV.parse(string, headers: true, header_converters: -> (header) { convert_header_to_methodable_name(header, track_original: true) })
17
18
  store = create_pstore(csv, opts)
18
19
  store.csv_importer = self
19
- set_headers_and_type(@original_headers, store)
20
20
 
21
21
  store
22
22
  end
23
23
 
24
24
  def create_pstore(csv, opts = {}, filename = SecureRandom.uuid)
25
- csv_converters = opts.fetch(:convert, []).map { |conversion| CSVConverter.new(conversion) }
25
+ conversion_required = opts.fetch(:convert, [])
26
+ if opts.fetch(:convert, nil) == :best_guess
27
+ conversion_required = guess_conversion_types(csv)
28
+ end
29
+
30
+ csv_converters = conversion_required.map { |header, desired_format| CSVConverter.new(header => desired_format) }
26
31
  file_save_location = opts[:save_to_location] || CURRENT_DIRECTORY
27
32
 
28
33
  store = QueryablePStore.new("#{file_save_location}#{filename}.pstore")
@@ -32,12 +37,61 @@ class CSVImporter
32
37
  end
33
38
  end
34
39
 
40
+ if opts.fetch(:convert, nil) == :best_guess
41
+ original_headers = @original_headers.clone
42
+
43
+ original_headers.each do |original_header|
44
+ @headers_and_type ||= {}
45
+ @headers_and_type[original_header] = symbol_to_class(
46
+ conversion_required[
47
+ convert_header_to_methodable_name(original_header)
48
+ ]
49
+ )
50
+ end
51
+ else
52
+ set_headers_and_type(@original_headers, store)
53
+ end
54
+
35
55
  store
36
56
  end
37
57
 
38
- def convert_header_to_methodable_name(header)
39
- @original_headers ||= []
40
- @original_headers << header
58
+ def symbol_to_class(symbol)
59
+ case symbol
60
+ when :integer
61
+ Integer
62
+ when :float
63
+ Float
64
+ when :string
65
+ String
66
+ else
67
+ raise "Unknown symbol: #{symbol}"
68
+ end
69
+ end
70
+
71
+ def guess_conversion_types(csv)
72
+ headers = csv.headers
73
+ headers_and_type = {}
74
+
75
+ csv.each do |row|
76
+ headers.each do |header|
77
+ if row[header].match(/\A(\d)+\z/) && (headers_and_type[header].nil? || headers_and_type[header] == :integer)
78
+ headers_and_type[header] = :integer
79
+ elsif row[header].match(/^\d*\.\d+$/) && (headers_and_type[header].nil? || headers_and_type[header] == :float)
80
+ headers_and_type[header] = :float
81
+ else
82
+ headers_and_type[header] = :string
83
+ end
84
+ end
85
+ end
86
+
87
+ headers_and_type
88
+ end
89
+
90
+ def convert_header_to_methodable_name(header, track_original: false)
91
+ if track_original
92
+ @original_headers ||= []
93
+ @original_headers << header
94
+ end
41
95
 
42
96
  header.downcase.gsub(/[^a-z]/, "_").to_sym
43
97
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: queryable_pstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Smith