table_inspector 0.3.1 → 0.4.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/README.md +12 -3
- data/lib/table_inspector/column.rb +4 -9
- data/lib/table_inspector/grid.rb +7 -1
- data/lib/table_inspector/indexes.rb +5 -6
- data/lib/table_inspector/presenter.rb +44 -3
- data/lib/table_inspector/table.rb +4 -4
- data/lib/table_inspector/text.rb +21 -1
- data/lib/table_inspector/validator.rb +37 -0
- data/lib/table_inspector/version.rb +1 -1
- data/lib/table_inspector.rb +30 -10
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64cb2752d497fae638297315267d3b4f5621b7a197fc321c440b60c73a353a14
|
4
|
+
data.tar.gz: 92ca3311efa5e77768aad96784d6d11c14dd7196ee0877529b4aaa2213d90a0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2cbf4d4ea540bb0883528f4ee3ab95ba428fc5e649e387461b7c0037165a64a461d9f9db3c1d9c75ee6fa66ae1d64bc3bd77d964e03f75e431d4ad14f5d117cc
|
7
|
+
data.tar.gz: 5b4b05a46dea671f457740f72f6e64f08123e006cdbb7bb8f0952990ca9369472aa0454c549a02807b61d54cd54e88b826301235efad9fd43bfb7ed04732381a
|
data/README.md
CHANGED
@@ -12,22 +12,31 @@ require "table_inspector"
|
|
12
12
|
TableInspector.scan User
|
13
13
|
```
|
14
14
|
|
15
|
-

|
16
16
|
|
17
17
|
It will print the all table definition and all indexes.
|
18
18
|
|
19
|
+
Or you can use `TableInspector.ascan` to print more colorful table(`ascan` means `awesome scan`) :
|
20
|
+
```ruby
|
21
|
+
TableInspector.ascan User
|
22
|
+
```
|
23
|
+

|
24
|
+
|
19
25
|
And to print specific column by:
|
20
26
|
|
21
27
|
```ruby
|
22
28
|
TableInspector.scan User, :name
|
23
29
|
```
|
24
|
-

|
25
31
|
|
26
32
|
It will print the column definition and which indexes that contains this column.
|
27
33
|
|
28
34
|
Also, you can print `sql_type` which type of column in database by provide `sql_type: true` option:
|
29
35
|
|
30
|
-
|
36
|
+
```ruby
|
37
|
+
TableInspector.scan User, sql_type: true
|
38
|
+
```
|
39
|
+

|
31
40
|
|
32
41
|
## Installation
|
33
42
|
Add this line to your application's Gemfile:
|
@@ -3,12 +3,11 @@ module TableInspector
|
|
3
3
|
class Column
|
4
4
|
attr_reader :column, :klass, :sql_type, :presenter
|
5
5
|
|
6
|
-
def initialize(klass, column_name, sql_type: false)
|
6
|
+
def initialize(klass, column_name, sql_type: false, colorize: false )
|
7
7
|
@column = klass.columns.find {|column| column.name == column_name.to_s}
|
8
|
-
raise_column_not_found_error! unless @column
|
9
8
|
@klass = klass
|
10
9
|
@sql_type = sql_type
|
11
|
-
@presenter = Presenter.new(klass, sql_type: sql_type)
|
10
|
+
@presenter = Presenter.new(klass, sql_type: sql_type, colorize: false)
|
12
11
|
end
|
13
12
|
|
14
13
|
def render
|
@@ -27,19 +26,15 @@ module TableInspector
|
|
27
26
|
private
|
28
27
|
|
29
28
|
def render_title
|
30
|
-
Grid.new.render
|
29
|
+
Grid.new.render(padding: [0, 4, 0, 0]) do |grid|
|
31
30
|
grid << ["#{Text.bold('Table')}: #{klass.table_name}", "#{Text.bold('Column')}: #{column.name}"]
|
32
31
|
end
|
33
32
|
end
|
34
33
|
|
35
34
|
def render_body
|
36
|
-
Grid.new(header: presenter.header).render_ascii do |grid|
|
35
|
+
Grid.new(header: presenter.header).render_ascii(indent: 2) do |grid|
|
37
36
|
grid << @presenter.extract_meta(column).values
|
38
37
|
end
|
39
38
|
end
|
40
|
-
|
41
|
-
def raise_column_not_found_error!
|
42
|
-
raise TableInspector::Error, "Column not found!"
|
43
|
-
end
|
44
39
|
end
|
45
40
|
end
|
data/lib/table_inspector/grid.rb
CHANGED
@@ -17,10 +17,16 @@ module TableInspector
|
|
17
17
|
puts grid.render(:ascii, **common_render_options.merge(with))
|
18
18
|
end
|
19
19
|
|
20
|
+
def self.render_empty
|
21
|
+
new.render(padding: [0, 2]) do |grid|
|
22
|
+
grid << ["Empty."]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
20
26
|
def common_render_options
|
21
27
|
{
|
22
28
|
multiline: true
|
23
29
|
}
|
24
30
|
end
|
25
31
|
end
|
26
|
-
end
|
32
|
+
end
|
@@ -21,18 +21,17 @@ module TableInspector
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def render_title
|
24
|
-
Grid.new.render
|
24
|
+
Grid.new.render do |grid|
|
25
25
|
grid << [Text.bold("Indexes")]
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
def render_indexes_with_specific_column
|
30
30
|
if indexes_with_specific_column.blank?
|
31
|
-
|
32
|
-
return
|
31
|
+
Grid.render_empty
|
33
32
|
end
|
34
33
|
|
35
|
-
Grid.new.render do |grid|
|
34
|
+
Grid.new.render(padding: [0, 2]) do |grid|
|
36
35
|
indexes_with_specific_column.each do |index|
|
37
36
|
grid << compose_index_data(index)
|
38
37
|
end
|
@@ -41,11 +40,11 @@ module TableInspector
|
|
41
40
|
|
42
41
|
def render_indexes
|
43
42
|
if indexes.blank?
|
44
|
-
|
43
|
+
Grid.render_empty
|
45
44
|
return
|
46
45
|
end
|
47
46
|
|
48
|
-
Grid.new.render do |grid|
|
47
|
+
Grid.new.render(padding: [0, 2]) do |grid|
|
49
48
|
indexes.each do |index|
|
50
49
|
grid << compose_index_data(index)
|
51
50
|
end
|
@@ -3,15 +3,39 @@ module TableInspector
|
|
3
3
|
class Presenter
|
4
4
|
attr_reader :klass, :sql_type
|
5
5
|
|
6
|
-
def initialize(klass, sql_type:)
|
6
|
+
def initialize(klass, sql_type:, colorize: false)
|
7
7
|
@klass = klass
|
8
8
|
@sql_type = sql_type
|
9
|
+
@colorize = colorize
|
9
10
|
end
|
10
11
|
|
11
|
-
def
|
12
|
+
def extract_meta_with_highlight(column)
|
13
|
+
column_data = column.as_json.merge(column.sql_type_metadata.as_json)
|
14
|
+
|
15
|
+
# Colorize text but except "comment" field
|
16
|
+
column_data.each do |k, v|
|
17
|
+
if k != "comment"
|
18
|
+
column_data[k] = colorize(v)
|
19
|
+
else
|
20
|
+
column_data[k]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
column_data.slice(*ordered_keys)
|
25
|
+
end
|
26
|
+
|
27
|
+
def extract_meta_without_highlight(column)
|
12
28
|
column.as_json.merge(column.sql_type_metadata.as_json).slice(*ordered_keys)
|
13
29
|
end
|
14
30
|
|
31
|
+
def extract_meta(column)
|
32
|
+
if @colorize
|
33
|
+
extract_meta_with_highlight(column)
|
34
|
+
else
|
35
|
+
extract_meta_without_highlight(column)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
15
39
|
def header
|
16
40
|
first_column = klass.columns.first
|
17
41
|
extract_meta(first_column).keys.map(&:humanize)
|
@@ -24,5 +48,22 @@ module TableInspector
|
|
24
48
|
keys << "sql_type" if sql_type
|
25
49
|
end
|
26
50
|
end
|
51
|
+
|
52
|
+
def colorize(value)
|
53
|
+
case value
|
54
|
+
when TrueClass, DateTime, 'datetime'
|
55
|
+
Text.green(value)
|
56
|
+
when FalseClass
|
57
|
+
Text.red(value)
|
58
|
+
when Numeric, 'integer', 'decimal'
|
59
|
+
Text.blue(value)
|
60
|
+
when 'boolean'
|
61
|
+
Text.cyan(value)
|
62
|
+
when String
|
63
|
+
Text.yellow(value)
|
64
|
+
else
|
65
|
+
value
|
66
|
+
end
|
67
|
+
end
|
27
68
|
end
|
28
|
-
end
|
69
|
+
end
|
@@ -3,10 +3,10 @@ module TableInspector
|
|
3
3
|
class Table
|
4
4
|
attr_reader :klass, :sql_type, :presenter
|
5
5
|
|
6
|
-
def initialize(klass, sql_type: false)
|
6
|
+
def initialize(klass, sql_type: false, colorize: false)
|
7
7
|
@klass = klass
|
8
8
|
@sql_type = sql_type
|
9
|
-
@presenter = Presenter.new(klass, sql_type: sql_type)
|
9
|
+
@presenter = Presenter.new(klass, sql_type: sql_type, colorize: colorize)
|
10
10
|
end
|
11
11
|
|
12
12
|
def render
|
@@ -25,13 +25,13 @@ module TableInspector
|
|
25
25
|
private
|
26
26
|
|
27
27
|
def render_title
|
28
|
-
Grid.new.render
|
28
|
+
Grid.new.render do |grid|
|
29
29
|
grid << ["#{Text.bold('Table')}: #{klass.table_name}"]
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
def render_body
|
34
|
-
Grid.new(header: presenter.header).render_ascii do |grid|
|
34
|
+
Grid.new(header: presenter.header).render_ascii(indent: 2) do |grid|
|
35
35
|
klass.columns.each do |column|
|
36
36
|
grid << presenter.extract_meta(column).values
|
37
37
|
end
|
data/lib/table_inspector/text.rb
CHANGED
@@ -10,5 +10,25 @@ module TableInspector
|
|
10
10
|
def break_line
|
11
11
|
puts "\n"
|
12
12
|
end
|
13
|
+
|
14
|
+
def red(text)
|
15
|
+
"\e[31m#{text}\e[0m"
|
16
|
+
end
|
17
|
+
|
18
|
+
def green(text)
|
19
|
+
"\e[32m#{text}\e[0m"
|
20
|
+
end
|
21
|
+
|
22
|
+
def yellow(text)
|
23
|
+
"\e[33m#{text}\e[0m"
|
24
|
+
end
|
25
|
+
|
26
|
+
def blue(text)
|
27
|
+
"\e[34m#{text}\e[0m"
|
28
|
+
end
|
29
|
+
|
30
|
+
def cyan(text)
|
31
|
+
"\e[36m#{text}\e[0m"
|
32
|
+
end
|
13
33
|
end
|
14
|
-
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
module TableInspector
|
3
|
+
class Validator
|
4
|
+
def initialize(klass, column_name)
|
5
|
+
@klass = klass
|
6
|
+
@column = column_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def validate!
|
10
|
+
|
11
|
+
if column_name && !validate_column(klass, column_name)
|
12
|
+
puts column_is_not_exists_hint(klass, column_name)
|
13
|
+
return
|
14
|
+
end
|
15
|
+
|
16
|
+
true
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def is_active_record_class?(klass)
|
22
|
+
klass < ActiveRecord::Base
|
23
|
+
end
|
24
|
+
|
25
|
+
def validate_column(klass, column_name)
|
26
|
+
klass.columns.find{|column| column.name == column_name.to_s }
|
27
|
+
end
|
28
|
+
|
29
|
+
def not_a_model_class_hint(klass)
|
30
|
+
"#{klass} is not a model klass"
|
31
|
+
end
|
32
|
+
|
33
|
+
def column_is_not_exists_hint(klass, column_name)
|
34
|
+
puts "Column '#{column_name}' doesn't exists in table '#{klass.table_name}'"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/table_inspector.rb
CHANGED
@@ -7,33 +7,53 @@ require "table_inspector/indexes"
|
|
7
7
|
require "table_inspector/text"
|
8
8
|
require "table_inspector/column"
|
9
9
|
require "table_inspector/presenter"
|
10
|
+
require "table_inspector/validator"
|
10
11
|
|
11
12
|
module TableInspector
|
12
13
|
extend self
|
13
14
|
|
14
|
-
|
15
|
+
def ascan(klass, column_name = nil, sql_type: false)
|
16
|
+
klass = init_klass!(klass)
|
17
|
+
return unless klass
|
18
|
+
|
19
|
+
return unless Validator.new(klass, column_name)
|
20
|
+
|
21
|
+
render(klass, column_name, sql_type, colorize: true)
|
22
|
+
end
|
15
23
|
|
16
24
|
def scan(klass, column_name = nil, sql_type: false)
|
25
|
+
klass = init_klass!(klass)
|
26
|
+
return unless klass
|
27
|
+
|
28
|
+
return unless Validator.new(klass, column_name)
|
29
|
+
|
30
|
+
render(klass, column_name, sql_type)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def init_klass!(klass)
|
17
36
|
begin
|
18
37
|
unless klass.is_a?(Class)
|
19
|
-
klass = klass.constantize
|
38
|
+
klass = klass.to_s.classify.constantize
|
20
39
|
end
|
21
40
|
rescue NameError
|
22
|
-
|
41
|
+
puts invalid_model_name_hint(klass.inspect)
|
42
|
+
return
|
23
43
|
end
|
24
44
|
|
25
|
-
|
45
|
+
klass
|
46
|
+
end
|
26
47
|
|
48
|
+
def render(klass, column_name, sql_type, colorize: false)
|
27
49
|
if column_name
|
28
|
-
Column.new(klass, column_name, sql_type: sql_type).render
|
50
|
+
Column.new(klass, column_name, sql_type: sql_type, colorize: colorize).render
|
29
51
|
else
|
30
|
-
Table.new(klass, sql_type: sql_type).render
|
52
|
+
Table.new(klass, sql_type: sql_type, colorize: colorize).render
|
31
53
|
end
|
32
54
|
end
|
33
|
-
|
34
|
-
private
|
35
55
|
|
36
|
-
def
|
37
|
-
|
56
|
+
def invalid_model_name_hint(klass)
|
57
|
+
"'#{klass}' can be transform to a model class."
|
38
58
|
end
|
39
59
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_inspector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02
|
11
|
+
date: 2023-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- lib/table_inspector/railtie.rb
|
57
57
|
- lib/table_inspector/table.rb
|
58
58
|
- lib/table_inspector/text.rb
|
59
|
+
- lib/table_inspector/validator.rb
|
59
60
|
- lib/table_inspector/version.rb
|
60
61
|
- lib/tasks/table_inspector_tasks.rake
|
61
62
|
homepage: https://github.com/table_inspector
|