slyce 1.5.1 → 1.6.0
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/bin/slyce +15 -11
- data/bin/slyce3 +1 -1
- data/bin/slyced +58 -29
- data/slyce.gemspec +17 -16
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08dfbd7bd3748e0d4cd69ffe3e4fd3ccc648d6482c213471e4f6ca7152560b06'
|
4
|
+
data.tar.gz: 96d073fd13ae14bd374427e28e151c464f2d89a83a220c60796002058ab9af7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 139d1ed7233ab36daa78514cb7636aac30bc7388da9be46ddaf32f3814c5b18c836a4cf52e81b5402db712e9c8476f0e69ed042bd0b79377218cd60a2870f3b8
|
7
|
+
data.tar.gz: ccb2d3e5f5fcadc7dd15a175a37e99edaa2bf38177024aa5b7aebad84adaf7d7adf84e36926d3416e51f6db5314a3c0bc8bea9457b1d2bc0d64563ee07d72e9d
|
data/bin/slyce
CHANGED
@@ -36,7 +36,7 @@ end
|
|
36
36
|
# ==[ Options ]==
|
37
37
|
|
38
38
|
OptionParser.new.instance_eval do
|
39
|
-
@version = "1.
|
39
|
+
@version = "1.6.0"
|
40
40
|
@banner = "usage: #{program_name} [options] <database> <table>"
|
41
41
|
|
42
42
|
on "--csv" , "Output comma separated values"
|
@@ -57,14 +57,6 @@ OptionParser.new.instance_eval do
|
|
57
57
|
self
|
58
58
|
end.parse!(into: opts={}) rescue abort($!.message)
|
59
59
|
|
60
|
-
dbas = nil
|
61
|
-
tabl = nil
|
62
|
-
|
63
|
-
xcsv = opts[:csv]
|
64
|
-
xpsv = opts[:psv]
|
65
|
-
xtsv = opts[:tsv]
|
66
|
-
xprt = xcsv || xpsv || xtsv and require "censive"
|
67
|
-
|
68
60
|
asky = opts[:ascii ] and require "any_ascii"
|
69
61
|
dump = opts[:dump ]
|
70
62
|
want = opts[:extract ].to_s.downcase.split(",")
|
@@ -73,11 +65,23 @@ show = opts[:show ]
|
|
73
65
|
hide = opts[:headerless]
|
74
66
|
filt = opts[:where ] and filt = "\nwhere\n #{filt}"
|
75
67
|
|
76
|
-
|
77
|
-
|
68
|
+
# ==[ Export ]==
|
69
|
+
|
70
|
+
xcsv = opts[:csv]
|
71
|
+
xpsv = opts[:psv]
|
72
|
+
xtsv = opts[:tsv]
|
73
|
+
xprt = xcsv || xpsv || xtsv and require "censive"
|
78
74
|
|
79
75
|
[xcsv, xpsv, xtsv].compact.size > 1 and abort "only one of csv, psv, or tsv allowed"
|
80
76
|
|
77
|
+
# ==[ Source ]==
|
78
|
+
|
79
|
+
dbas = nil
|
80
|
+
tabl = nil
|
81
|
+
|
82
|
+
dbas ||= ARGV.shift or abort "no database given"
|
83
|
+
tabl ||= ARGV.shift or opts[:tables] or !want.empty? or abort "no table given"
|
84
|
+
|
81
85
|
# ==[ Let 'er rip! ]==
|
82
86
|
|
83
87
|
# get database connection
|
data/bin/slyce3
CHANGED
data/bin/slyced
CHANGED
@@ -9,8 +9,6 @@ trap("INT" ) { abort "\n" }
|
|
9
9
|
|
10
10
|
# ==[ Helpers ]==
|
11
11
|
|
12
|
-
DuckDB::Result.use_chunk_each = true
|
13
|
-
|
14
12
|
class DuckDB::Connection
|
15
13
|
alias_method :sql, :query
|
16
14
|
|
@@ -38,33 +36,26 @@ end
|
|
38
36
|
# ==[ Options ]==
|
39
37
|
|
40
38
|
OptionParser.new.instance_eval do
|
41
|
-
@version = "1.
|
39
|
+
@version = "1.6.0"
|
42
40
|
@banner = "usage: #{program_name} [options] <database> <table>"
|
43
41
|
|
44
|
-
on "--csv"
|
45
|
-
on "--psv"
|
46
|
-
on "--tsv"
|
47
|
-
on "-a", "--ascii"
|
48
|
-
on "-c", "--columns"
|
49
|
-
on "-h", "--help"
|
50
|
-
on "-H", "--headerless"
|
51
|
-
on "-n", "--natural"
|
52
|
-
on "-s", "--show <count>"
|
53
|
-
on "-
|
54
|
-
on "-
|
55
|
-
on "-
|
42
|
+
on "--csv" , "Output comma separated values"
|
43
|
+
on "--psv" , "Output pipe separated values"
|
44
|
+
on "--tsv" , "Output tab separated values"
|
45
|
+
on "-a", "--ascii" , "Convert data to ASCII using AnyAscii"
|
46
|
+
on "-c", "--columns" , "Display column names and quit"
|
47
|
+
on "-h", "--help" , "Show help and command usage" do Kernel.abort to_s; end
|
48
|
+
on "-H", "--headerless" , "Do not show headers when exporting delimited files"
|
49
|
+
on "-n", "--natural" , "Sort naturally, not numerically"
|
50
|
+
on "-s", "--show <count>" , "Show this many values", Integer
|
51
|
+
on "-t", "--tables" , "Display table names and quit"
|
52
|
+
on "-v", "--version" , "Show version number" do Kernel.abort "#{program_name} #{@version}"; end
|
53
|
+
on "-w", "--where <cond>" , "Where clause (eg - 'age>50 and state='AZ')"
|
54
|
+
on "-x", "--extract <a,b,c...>", "Comma separated list of columns or tables to extract"
|
56
55
|
|
57
56
|
self
|
58
57
|
end.parse!(into: opts={}) rescue abort($!.message)
|
59
58
|
|
60
|
-
dbas = nil
|
61
|
-
tabl = nil
|
62
|
-
|
63
|
-
xcsv = opts[:csv]
|
64
|
-
xpsv = opts[:psv]
|
65
|
-
xtsv = opts[:tsv]
|
66
|
-
xprt = xcsv || xpsv || xtsv and require "censive"
|
67
|
-
|
68
59
|
asky = opts[:ascii ] and require "any_ascii"
|
69
60
|
want = opts[:extract ].to_s.downcase.split(",")
|
70
61
|
natu = opts[:natural ]
|
@@ -72,14 +63,51 @@ show = opts[:show ]
|
|
72
63
|
hide = opts[:headerless]
|
73
64
|
filt = opts[:where ] and filt = "\nwhere\n #{filt}"
|
74
65
|
|
75
|
-
|
76
|
-
|
66
|
+
# ==[ Export ]==
|
67
|
+
|
68
|
+
xcsv = opts[:csv]
|
69
|
+
xpsv = opts[:psv]
|
70
|
+
xtsv = opts[:tsv]
|
71
|
+
xprt = xcsv || xpsv || xtsv and require "censive"
|
77
72
|
|
78
73
|
[xcsv, xpsv, xtsv].compact.size > 1 and abort "only one of csv, psv, or tsv allowed"
|
79
74
|
|
75
|
+
# ==[ Source ]==
|
76
|
+
|
77
|
+
file = '/dev/stdin'
|
78
|
+
dbas = ':memory:'
|
79
|
+
tabl = '_memory_'
|
80
|
+
|
81
|
+
if ARGV.size == 1
|
82
|
+
if opts[:tables]
|
83
|
+
dbas = ARGV.shift
|
84
|
+
else
|
85
|
+
file = ARGV.shift
|
86
|
+
File.readable?(file) or abort "#{file.inspect} is unreadable"
|
87
|
+
end
|
88
|
+
elsif ARGV.size > 1
|
89
|
+
dbas = ARGV.shift
|
90
|
+
tabl = ARGV.shift
|
91
|
+
end
|
92
|
+
|
80
93
|
# ==[ Let 'er rip! ]==
|
81
94
|
|
82
95
|
conn = DuckDB::Database.open(dbas).connect
|
96
|
+
|
97
|
+
if dbas && opts[:tables]
|
98
|
+
resu = conn.sql("show tables")
|
99
|
+
tbls = resu.to_a.flatten
|
100
|
+
want = want.empty? ? tbls : want & tbls
|
101
|
+
puts want
|
102
|
+
exit
|
103
|
+
end
|
104
|
+
|
105
|
+
conn.sql(<<~end) if file rescue exit
|
106
|
+
create temporary table "#{tabl}" as
|
107
|
+
select *
|
108
|
+
from read_csv("#{file}", all_varchar=true)
|
109
|
+
end
|
110
|
+
|
83
111
|
resu = conn.sql(<<~end)
|
84
112
|
select column_name
|
85
113
|
from information_schema.columns
|
@@ -116,6 +144,7 @@ if xprt
|
|
116
144
|
csv << want unless hide
|
117
145
|
data.each do |row|
|
118
146
|
csv << row.map {|e| asky ? AnyAscii.transliterate(e.to_s) : e.to_s }
|
147
|
+
# csv << row.map {|e| asky ? AnyAscii.transliterate(e.to_s) : e.nil? ? nil : e.to_s }
|
119
148
|
end
|
120
149
|
end
|
121
150
|
|
@@ -127,8 +156,8 @@ want.each do |name|
|
|
127
156
|
limt = show ? "limit #{show}" : ""
|
128
157
|
like = <<~"".gsub(/(.)^/m, '\1 ').rstrip
|
129
158
|
if(regexp_matches("#{name}", '^[-+]?((0|([1-9]\\d*)(\\.\\d*)?)|((0|([1-9]\\d*))\\.\\d+))$'),cast("#{name}" as double),null) nulls last,
|
130
|
-
if(regexp_matches("#{name}", '^0\\d*$'),length("#{name}"),null)
|
131
|
-
if(regexp_matches("#{name}", '^\\d+\\D'),length(regexp_extract("#{name}",'^(\\d+)',1)),null)
|
159
|
+
if(regexp_matches("#{name}", '^0\\d*$'),length("#{name}"),null) nulls last,
|
160
|
+
if(regexp_matches("#{name}", '^\\d+\\D'),length(regexp_extract("#{name}",'^(\\d+)',1)),null) nulls last,
|
132
161
|
|
133
162
|
data = conn.sql(<<~"".rstrip).to_a
|
134
163
|
select
|
@@ -145,8 +174,8 @@ want.each do |name|
|
|
145
174
|
|
146
175
|
uniq, tots = conn.sql(<<~"".rstrip).to_a[0]
|
147
176
|
select
|
148
|
-
count(distinct(ifnull("#{name}",
|
149
|
-
count(ifnull("#{name}",
|
177
|
+
count(distinct(ifnull("#{name}",''))),
|
178
|
+
count(ifnull("#{name}",''))
|
150
179
|
from
|
151
180
|
"#{tabl}"
|
152
181
|
#{filt}
|
data/slyce.gemspec
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
Gem::Specification.new do |
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.name = "slyce"
|
5
|
+
gem.version = `grep -m 1 '^\s*@version' bin/slyce | cut -f 2 -d '"'`
|
6
|
+
gem.author = "Steve Shreeve"
|
7
|
+
gem.email = "steve.shreeve@gmail.com"
|
8
|
+
gem.summary = "A " +
|
9
|
+
gem.description = "Ruby utility to show statistics for databases or csv files"
|
10
|
+
gem.homepage = "https://github.com/shreeve/slyce"
|
11
|
+
gem.license = "MIT"
|
12
|
+
gem.files = `git ls-files`.split("\n") - %w[.gitignore]
|
13
|
+
gem.executables = `cd bin && git ls-files .`.split("\n")
|
14
|
+
gem.required_ruby_version = Gem::Requirement.new(">= 3.0") if gem.respond_to? :required_ruby_version=
|
15
|
+
gem.add_runtime_dependency "any_ascii", "~> 0.3.2"
|
16
|
+
gem.add_runtime_dependency "censive", "~> 1.1.0"
|
17
|
+
gem.add_runtime_dependency "duckdb", "~> 1.1.2"
|
18
|
+
gem.add_runtime_dependency "extralite-bundle", "~> 2.1"
|
19
|
+
gem.add_runtime_dependency "mysql2", "~> 0.5"
|
19
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slyce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Shreeve
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: any_ascii
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.1.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.1.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: extralite-bundle
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.5'
|
83
|
-
description: Ruby utility to show
|
83
|
+
description: Ruby utility to show statistics for databases or csv files
|
84
84
|
email: steve.shreeve@gmail.com
|
85
85
|
executables:
|
86
86
|
- slyce
|
@@ -108,15 +108,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
108
|
requirements:
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: '0'
|
111
|
+
version: '3.0'
|
112
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - ">="
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: '0'
|
117
117
|
requirements: []
|
118
|
-
rubygems_version: 3.
|
118
|
+
rubygems_version: 3.5.22
|
119
119
|
signing_key:
|
120
120
|
specification_version: 4
|
121
|
-
summary: Ruby utility to show
|
121
|
+
summary: A Ruby utility to show statistics for databases or csv files
|
122
122
|
test_files: []
|