simple-sql 0.5.13 → 0.5.14

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
  SHA256:
3
- metadata.gz: 77b3c1274f0022bc282c46ce72e510abb34817a97808e4eb2b2341d8977c3228
4
- data.tar.gz: 730f0a6008beafdd8aa7e6137510357aa994965725739e959dab848d552b62f7
3
+ metadata.gz: c2cf9ed788b6ea018998b2a6e97d0a6144fe223f86234812387a86eaf65d2485
4
+ data.tar.gz: d722f3cfb44f0029ec51ccd2d54dbbe609fd6036b57431dc2c2481d8496ecf50
5
5
  SHA512:
6
- metadata.gz: dcd150904f6ace82f964d803231fb1c249c1eea80f8775b80907a3369da43b097a999bc8c19f4d949d549838484515902b78d346715f93029003387de337470d
7
- data.tar.gz: c5e65cc327d238fc815ff992660b538e3b5c218033240f254ad0350aa325e9328d2afabf9e6477786a08b9e25fbd17a40236a2333434b1ac0dc01b160476458c
6
+ metadata.gz: 2c94eaa1fe5651b0355ff6c614bd26a51a6f33d3b5c6f6ca5d832883d570e8e2434f63dc73a5f7e138f3d6eb9eef1ab3b43b5e137af282a55a21c38b8f7a8f09
7
+ data.tar.gz: 6e25c1fbc93fd05964d6bf3aae02df55047bf67f90ff19e0fed2ccbf327cbafa0871913591c58d4bc9169069c2299f89005ebc1f3192767d694f7a3fc81d54cd
@@ -61,11 +61,14 @@ class Simple::SQL::Connection
61
61
  end
62
62
 
63
63
  # Runs a query and prints the results via "table_print"
64
- def print(sql, *args, into: nil)
65
- raise ArgumentError, "You cannot call Simple::SQL.print with into: #{into.inspect}" unless into.nil?
64
+ def print(sql, *args, io: STDOUT, width: :auto)
65
+ if sql.is_a?(Array) && args.empty?
66
+ records = sql
67
+ else
68
+ records = all sql, *args, into: Hash
69
+ end
66
70
 
67
- records = all sql, *args, into: Hash
68
- Simple::SQL::Helpers::Printer.print records
71
+ Simple::SQL::Helpers::Printer.print(records, width: width, io: io)
69
72
  records
70
73
  end
71
74
 
@@ -1,56 +1,78 @@
1
- # rubocop:disable Metrics/AbcSize
1
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
2
2
 
3
3
  # private
4
4
  module Simple::SQL::Helpers::Printer
5
5
  extend self
6
6
 
7
- def print(records)
8
- if table_print?
9
- tp records
10
- else
11
- lp records
7
+ ROW_SEPARATOR = " | "
8
+
9
+ def self.print(records, io: STDOUT, width: :auto)
10
+ # check args
11
+
12
+ return if records.empty?
13
+ return if records.first.keys.empty?
14
+
15
+ if width == :auto && io.isatty
16
+ width = `tput cols`.to_i
12
17
  end
18
+ width = nil if width && width <= 0
19
+
20
+ # prepare printing
21
+
22
+ rows = materialize_rows(records)
23
+ column_widths = calculate_column_widths(rows)
24
+ column_widths = optimize_column_widths(column_widths, width, rows.first.length) if width
25
+
26
+ # print
27
+
28
+ print_records(rows, io, column_widths)
13
29
  end
14
30
 
15
- def lp(records)
16
- return if records.empty?
31
+ private
17
32
 
33
+ def materialize_rows(records)
18
34
  keys = records.first.keys
19
- return if keys.empty?
20
35
 
21
36
  rows = []
22
- rows << keys
23
-
37
+ rows << keys.map(&:to_s)
24
38
  records.each do |rec|
25
39
  rows << rec.values_at(*keys).map(&:to_s)
26
40
  end
41
+ rows
42
+ end
27
43
 
28
- max_lengths = rows.inject([0] * keys.count) do |ary, row|
44
+ def calculate_column_widths(rows)
45
+ rows.inject([0] * rows.first.length) do |ary, row|
29
46
  ary.zip(row.map(&:length)).map(&:max)
30
47
  end
48
+ end
49
+
50
+ def optimize_column_widths(column_widths, width, column_count)
51
+ required_width = column_widths.sum + column_count * ROW_SEPARATOR.length
52
+ overflow = required_width - width
53
+ return column_widths if overflow <= 0
54
+
55
+ # TODO: Use d'hondt with a minimum percentage for a fairer distribution
56
+ # The following is just a quick hack...
57
+ overflow += 40
58
+
59
+ column_widths.map do |col_width|
60
+ (col_width - overflow * col_width * 1.0 / required_width).to_i
61
+ end
62
+ end
31
63
 
64
+ def print_records(rows, io, column_widths)
32
65
  rows.each_with_index do |row, idx|
33
- parts = row.zip(max_lengths).map do |value, max_length|
34
- " %-#{max_length}s " % value
66
+ parts = row.zip(column_widths).map do |value, col_width|
67
+ s = "%-#{col_width}s " % value
68
+ s[0..col_width]
35
69
  end
36
70
 
37
- STDERR.puts parts.join("|")
71
+ io.puts parts.join(ROW_SEPARATOR)
38
72
 
39
73
  if idx == 0
40
- STDERR.puts parts.join("|").gsub(/[^|]/, "-")
74
+ io.puts parts.join(ROW_SEPARATOR).gsub(/[^|]/, "-")
41
75
  end
42
76
  end
43
77
  end
44
-
45
- def table_print?
46
- load_table_print unless instance_variable_defined? :@table_print
47
- @table_print
48
- end
49
-
50
- def load_table_print
51
- require "table_print"
52
- @table_print = true
53
- rescue LoadError
54
- @table_print = false
55
- end
56
78
  end
@@ -1,5 +1,5 @@
1
1
  module Simple
2
2
  module SQL
3
- VERSION = "0.5.13"
3
+ VERSION = "0.5.14"
4
4
  end
5
5
  end
data/simple-sql.gemspec CHANGED
@@ -43,7 +43,6 @@ Gem::Specification.new do |gem|
43
43
  gem.add_development_dependency 'rubocop', '~> 0.61.1'
44
44
  gem.add_development_dependency 'database_cleaner', '~> 1'
45
45
  gem.add_development_dependency 'simplecov', '~> 0'
46
- gem.add_development_dependency 'awesome_print', '~> 0'
47
46
 
48
47
  gem.add_development_dependency 'memory_profiler', '~> 0.9.12'
49
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple-sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.13
4
+ version: 0.5.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - radiospiel
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-06-08 00:00:00.000000000 Z
12
+ date: 2019-06-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pg_array_parser
@@ -165,20 +165,6 @@ dependencies:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
- - !ruby/object:Gem::Dependency
169
- name: awesome_print
170
- requirement: !ruby/object:Gem::Requirement
171
- requirements:
172
- - - "~>"
173
- - !ruby/object:Gem::Version
174
- version: '0'
175
- type: :development
176
- prerelease: false
177
- version_requirements: !ruby/object:Gem::Requirement
178
- requirements:
179
- - - "~>"
180
- - !ruby/object:Gem::Version
181
- version: '0'
182
168
  - !ruby/object:Gem::Dependency
183
169
  name: memory_profiler
184
170
  requirement: !ruby/object:Gem::Requirement