csv2psql 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/csv2psql/analyzer/analyzer.rb +8 -6
- data/lib/csv2psql/analyzer/types/bigint.rb +11 -4
- data/lib/csv2psql/analyzer/types/character.rb +22 -0
- data/lib/csv2psql/analyzer/types/decimal.rb +11 -4
- data/lib/csv2psql/analyzer/types/null.rb +22 -0
- data/lib/csv2psql/analyzer/types/uuid.rb +23 -0
- data/lib/csv2psql/cli/app.rb +3 -3
- data/lib/csv2psql/cli/cmd/analyze_cmd.rb +12 -4
- data/lib/csv2psql/extensions/string.rb +4 -1
- data/lib/csv2psql/processor/processor.rb +0 -1
- data/lib/csv2psql/version.rb +2 -2
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c574fd6b1d061c440819ab604708ccba37066764
|
4
|
+
data.tar.gz: 303669c9e29f0ac4d6acb3486c571b1292a48019
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 885032b508c06b0a2cbe0596aeda0e6a07df4a1d0f5f6ae8ba566d8fdb5e37724120a937eb9722bcad25b0cee25290502c90aff5bf725700d31d8a40300494cb
|
7
|
+
data.tar.gz: 37e881ed5a62e9eaf6f82c3496964f7c05db63693bad55348f2f2e48f5f838787be4fc5e0c003396fbc50e8c56751d87890823347b758d5f3105088290b3406f
|
@@ -69,19 +69,21 @@ module Csv2Psql
|
|
69
69
|
create_column(data, column)
|
70
70
|
end
|
71
71
|
|
72
|
+
def load_analyze_class(analyzer_class)
|
73
|
+
Object.const_get('Csv2Psql')
|
74
|
+
.const_get('Analyzers')
|
75
|
+
.const_get(analyzer_class)
|
76
|
+
end
|
77
|
+
|
72
78
|
def load_analyzers
|
73
79
|
Dir[ANALYZERS_DIR + '**/*.rb'].map do |path|
|
74
80
|
fname = File.basename(path, '.rb')
|
75
81
|
analyzer_class = fname.camel_case
|
76
82
|
require(path)
|
77
83
|
|
78
|
-
klass = Object.const_get('Csv2Psql')
|
79
|
-
.const_get('Analyzers')
|
80
|
-
.const_get(analyzer_class)
|
81
|
-
|
82
84
|
{
|
83
|
-
:
|
84
|
-
:
|
85
|
+
name: analyzer_class,
|
86
|
+
class: load_analyze_class(analyzer_class)
|
85
87
|
}
|
86
88
|
end
|
87
89
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Csv2Psql
|
4
4
|
module Analyzers
|
5
|
+
# Bigint value matcher
|
5
6
|
class Bigint
|
6
7
|
TYPE = :bigint
|
7
8
|
|
@@ -14,11 +15,17 @@ module Csv2Psql
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def analyze(val)
|
17
|
-
|
18
|
-
return if match.nil?
|
18
|
+
return unless val.is_a?(Integer) || (val && val.match(/^\d+$/))
|
19
19
|
|
20
|
-
val
|
21
|
-
|
20
|
+
update(convert(val))
|
21
|
+
end
|
22
|
+
|
23
|
+
def convert(val)
|
24
|
+
val.to_i
|
25
|
+
end
|
26
|
+
|
27
|
+
def update(val)
|
28
|
+
@count += 1
|
22
29
|
@min = val if @min.nil? || val < @min
|
23
30
|
@max = val if @max.nil? || val > @max
|
24
31
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Csv2Psql
|
4
|
+
module Analyzers
|
5
|
+
# Character value matcher
|
6
|
+
class Character
|
7
|
+
TYPE = :bigint
|
8
|
+
|
9
|
+
attr_reader :count
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@count = 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def analyze(val)
|
16
|
+
match = val && val.to_s.length == 1
|
17
|
+
return unless match
|
18
|
+
@count += 1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Csv2Psql
|
4
4
|
module Analyzers
|
5
|
+
# Decimal value matcher
|
5
6
|
class Decimal
|
6
7
|
TYPE = :decimal
|
7
8
|
|
@@ -14,11 +15,17 @@ module Csv2Psql
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def analyze(val)
|
17
|
-
|
18
|
-
return if match.nil?
|
18
|
+
return unless val.is_a?(Float) || (val && val.match(/(\d+[,.]\d+)/))
|
19
19
|
|
20
|
-
val
|
21
|
-
|
20
|
+
update(convert(val))
|
21
|
+
end
|
22
|
+
|
23
|
+
def convert(val)
|
24
|
+
val.to_f
|
25
|
+
end
|
26
|
+
|
27
|
+
def update(val)
|
28
|
+
@count += 1
|
22
29
|
@min = val if @min.nil? || val < @min
|
23
30
|
@max = val if @max.nil? || val > @max
|
24
31
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Csv2Psql
|
4
|
+
module Analyzers
|
5
|
+
# Null value matcher
|
6
|
+
class Null
|
7
|
+
TYPE = :null
|
8
|
+
|
9
|
+
attr_reader :count
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@count = 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def analyze(val)
|
16
|
+
match = val.nil? || val.empty?
|
17
|
+
return unless match
|
18
|
+
@count += 1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Csv2Psql
|
4
|
+
module Analyzers
|
5
|
+
# UUID value matcher
|
6
|
+
class Uuid
|
7
|
+
TYPE = :uuid
|
8
|
+
RE = /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/ # rubocop:disable Metrics/LineLength
|
9
|
+
|
10
|
+
attr_reader :count
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@count = 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def analyze(val)
|
17
|
+
match = val && val.match(RE)
|
18
|
+
return if match.nil?
|
19
|
+
@count += 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/csv2psql/cli/app.rb
CHANGED
@@ -49,9 +49,9 @@ flag [:s, :separator], cmds[:s]
|
|
49
49
|
|
50
50
|
module Csv2Psql
|
51
51
|
# Apollon CLI
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
module Cli
|
53
|
+
# CLI Application
|
54
|
+
class App
|
55
55
|
extend Csv2Psql::Cli::Shared
|
56
56
|
|
57
57
|
cmds = File.absolute_path(File.join(File.dirname(__FILE__), 'cmd'))
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'gli'
|
4
4
|
require 'pp'
|
5
|
+
require 'terminal-table'
|
5
6
|
|
6
7
|
include GLI::App
|
7
8
|
|
@@ -9,9 +10,6 @@ require_relative '../shared'
|
|
9
10
|
require_relative '../../convert/convert'
|
10
11
|
require_relative '../../processor/processor'
|
11
12
|
|
12
|
-
cmds = {
|
13
|
-
}
|
14
|
-
|
15
13
|
desc 'Analyze csv file'
|
16
14
|
command :analyze do |c|
|
17
15
|
c.action do |global_options, options, args|
|
@@ -19,6 +17,16 @@ command :analyze do |c|
|
|
19
17
|
|
20
18
|
opts = {}.merge(global_options).merge(options)
|
21
19
|
res = Csv2Psql::Convert.analyze(args, opts)
|
22
|
-
|
20
|
+
|
21
|
+
res.files.each do |_file, details|
|
22
|
+
header = ['column'] + res.analyzers.map { |a| a[:name] }
|
23
|
+
|
24
|
+
rows = details[:columns].map do |k, v|
|
25
|
+
[k] + v.keys.map { |name| v[name].count }
|
26
|
+
end
|
27
|
+
|
28
|
+
table = Terminal::Table.new headings: header, rows: rows
|
29
|
+
puts table
|
30
|
+
end
|
23
31
|
end
|
24
32
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# String class
|
1
4
|
class String
|
2
5
|
def camel_case
|
3
6
|
return self if self !~ /_/ && self =~ /[A-Z]+.*/
|
@@ -5,6 +8,6 @@ class String
|
|
5
8
|
end
|
6
9
|
|
7
10
|
def camel_case_lower
|
8
|
-
|
11
|
+
split('_').reduce([]) { |a, e| a.push(a.empty? ? e : e.capitalize) }.join
|
9
12
|
end
|
10
13
|
end
|
data/lib/csv2psql/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv2psql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomas Korcak
|
@@ -199,7 +199,10 @@ files:
|
|
199
199
|
- lib/csv2psql.rb
|
200
200
|
- lib/csv2psql/analyzer/analyzer.rb
|
201
201
|
- lib/csv2psql/analyzer/types/bigint.rb
|
202
|
+
- lib/csv2psql/analyzer/types/character.rb
|
202
203
|
- lib/csv2psql/analyzer/types/decimal.rb
|
204
|
+
- lib/csv2psql/analyzer/types/null.rb
|
205
|
+
- lib/csv2psql/analyzer/types/uuid.rb
|
203
206
|
- lib/csv2psql/cli/app.rb
|
204
207
|
- lib/csv2psql/cli/cli.rb
|
205
208
|
- lib/csv2psql/cli/cmd/analyze_cmd.rb
|