commento 0.1.3 → 0.2.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 +39 -15
- data/lib/commento/adapters/active_record.rb +3 -3
- data/lib/commento/dsl.rb +6 -6
- data/lib/commento/helpers.rb +4 -4
- data/lib/commento/railtie.rb +15 -0
- data/lib/commento/report.rb +2 -2
- data/lib/commento/scrapers/ruby.rb +6 -5
- data/lib/commento/version.rb +1 -1
- data/lib/commento.rb +1 -0
- data/lib/generators/commento/active_record_generator.rb +72 -0
- data/lib/generators/commento/templates/migration.erb +7 -0
- data/lib/tasks/commento.rake +110 -0
- metadata +34 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec9a9477c941a8b246f869b1e157c99c9cf49476ff1708abc1a4c1b0f57c847e
|
4
|
+
data.tar.gz: ddfc8c0308bbfa0933e7d580e57fe7a2f157ad73a02d066681d21993901e6fa4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b39355f42447cbcf9d1b55e5adc35e8793f61a3514b4bcfdfbb3352fa2f66a6b41a38bcc6d9f1d8517cf4fa2f462ef5b7bc33bc1699bdff1715ac6e0e3324c17
|
7
|
+
data.tar.gz: 7a70ad3732e253860cb17f1dcc57152651e6229b9ad815d097093755f844553c38ff48e0c48fe5febeacd2688034bfdd273023598e977891242f8bd5c1cf6aed
|
data/README.md
CHANGED
@@ -27,31 +27,55 @@ require 'commento/adapters/active_record'
|
|
27
27
|
|
28
28
|
Commento.configure do |config|
|
29
29
|
config.adapter = Commento::Adapters::ActiveRecord.new
|
30
|
+
config.include_folders = %w[app lib] # folder for searching commento comments
|
31
|
+
config.exclude_folders = ['app/assets'] # folder for excluding searching commento comments
|
32
|
+
config.skip_table_names = %w[ar_internal_metadata schema_migrations] # ignoring tables
|
33
|
+
config.skip_column_names = %w[id uuid created_at updated_at] # ignoring columns
|
30
34
|
end
|
31
35
|
```
|
32
36
|
|
33
|
-
|
37
|
+
## Rake tasks
|
34
38
|
|
35
|
-
|
39
|
+
### Generating reports
|
36
40
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
+
You can generate different types of reports (right now only html) with rake task
|
42
|
+
|
43
|
+
```bash
|
44
|
+
rails "commento:generate_report[html]"
|
41
45
|
```
|
42
46
|
|
43
|
-
|
47
|
+
### Health check
|
44
48
|
|
45
|
-
You can
|
49
|
+
You can check amount of missing comments for tables and columns with console report
|
46
50
|
|
47
|
-
```
|
48
|
-
|
51
|
+
```bash
|
52
|
+
rails commento:health
|
53
|
+
```
|
54
|
+
|
55
|
+
<img width="727" alt="Снимок экрана 2024-09-13 в 10 11 12" src="https://github.com/user-attachments/assets/f0b8fbf8-6a6a-4c7b-b6b6-2a0de6d19f45">
|
56
|
+
|
57
|
+
### Generating migration for adding comments to tables and columns
|
58
|
+
|
59
|
+
You can generate migration with adding comments for table and columns
|
60
|
+
|
61
|
+
```bash
|
62
|
+
rails g commento:active_record
|
49
63
|
```
|
50
64
|
|
51
65
|
## Usage
|
52
66
|
|
53
67
|
Commento provides helpers for models for setting and getting comments.
|
54
68
|
|
69
|
+
### Models configuration
|
70
|
+
|
71
|
+
Update your application model
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
class ApplicationRecord < ActiveRecord::Base
|
75
|
+
include Commento::Helpers
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
55
79
|
### Set table's comment
|
56
80
|
|
57
81
|
```ruby
|
@@ -63,13 +87,13 @@ or reset comment by skiping value
|
|
63
87
|
User.set_table_comment
|
64
88
|
```
|
65
89
|
|
66
|
-
### Read table's
|
90
|
+
### Read table's comment
|
67
91
|
|
68
92
|
```ruby
|
69
|
-
User.
|
93
|
+
User.fetch_table_comment
|
70
94
|
```
|
71
95
|
|
72
|
-
### Set
|
96
|
+
### Set column's comment
|
73
97
|
|
74
98
|
```ruby
|
75
99
|
User.set_column_comment(:email, 'Required field for user authentication')
|
@@ -80,10 +104,10 @@ or reset comment by skiping value
|
|
80
104
|
User.set_column_comment(:email)
|
81
105
|
```
|
82
106
|
|
83
|
-
### Read
|
107
|
+
### Read column's comment
|
84
108
|
|
85
109
|
```ruby
|
86
|
-
User.
|
110
|
+
User.fetch_column_comment(:email)
|
87
111
|
```
|
88
112
|
|
89
113
|
## License
|
@@ -23,7 +23,7 @@ module Commento
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# Public: Returns comment for table.
|
26
|
-
def
|
26
|
+
def fetch_table_comment(table_name)
|
27
27
|
table_data = execute(tables_comments_sql).to_a.find { |data| data['table_name'] == table_name }
|
28
28
|
table_data.present? ? table_data['obj_description'] : nil
|
29
29
|
end
|
@@ -36,14 +36,14 @@ module Commento
|
|
36
36
|
end
|
37
37
|
|
38
38
|
# Public: Returns comment for table's column.
|
39
|
-
def
|
39
|
+
def fetch_column_comment(table_name, column_name)
|
40
40
|
sql = columns_comments_sql(table_name)
|
41
41
|
column_data = execute(sql).to_a.find { |data| data['column_name'].to_sym == column_name }
|
42
42
|
column_data.present? ? column_data['col_description'] : nil
|
43
43
|
end
|
44
44
|
|
45
45
|
# Public: Returns comments for tables and columns.
|
46
|
-
def
|
46
|
+
def fetch_comments_for_database
|
47
47
|
execute(tables_comments_sql).to_a.filter_map do |table_data|
|
48
48
|
next if configuration.skip_table_names.include?(table_data['table_name'])
|
49
49
|
|
data/lib/commento/dsl.rb
CHANGED
@@ -17,8 +17,8 @@ module Commento
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Public: Returns comment for table.
|
20
|
-
def
|
21
|
-
adapter.
|
20
|
+
def fetch_table_comment(table_name)
|
21
|
+
adapter.fetch_table_comment(table_name)
|
22
22
|
end
|
23
23
|
|
24
24
|
# Public: Sets comment for table's column.
|
@@ -27,13 +27,13 @@ module Commento
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# Public: Returns comment for table's column.
|
30
|
-
def
|
31
|
-
adapter.
|
30
|
+
def fetch_column_comment(table_name, column_name)
|
31
|
+
adapter.fetch_column_comment(table_name, column_name)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Public: Returns comments for tables and columns.
|
35
|
-
def
|
36
|
-
adapter.
|
35
|
+
def fetch_comments_for_database
|
36
|
+
adapter.fetch_comments_for_database
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
data/lib/commento/helpers.rb
CHANGED
@@ -13,16 +13,16 @@ module Commento
|
|
13
13
|
instance.set_table_comment(table_name, value)
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
instance.
|
16
|
+
def fetch_table_comment
|
17
|
+
instance.fetch_table_comment(table_name)
|
18
18
|
end
|
19
19
|
|
20
20
|
def set_column_comment(column_name, value=nil)
|
21
21
|
instance.set_column_comment(table_name, column_name, value)
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
25
|
-
instance.
|
24
|
+
def fetch_column_comment(column_name)
|
25
|
+
instance.fetch_column_comment(table_name, column_name)
|
26
26
|
end
|
27
27
|
|
28
28
|
def instance
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'commento'
|
4
|
+
require 'rails'
|
5
|
+
|
6
|
+
module Commento
|
7
|
+
class Railtie < Rails::Railtie
|
8
|
+
railtie_name :commento
|
9
|
+
|
10
|
+
rake_tasks do
|
11
|
+
path = File.expand_path(__dir__)
|
12
|
+
Dir.glob("#{path}/../tasks/**/*.rake").each { |f| load f }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/commento/report.rb
CHANGED
@@ -32,7 +32,7 @@ module Commento
|
|
32
32
|
columns.map do |column_data|
|
33
33
|
full_column_name = "#{table_name}.#{column_data[:column_name]}"
|
34
34
|
column_template
|
35
|
-
.gsub('%column_name%',
|
35
|
+
.gsub('%column_name%', column_data[:column_name])
|
36
36
|
.gsub('%column_comment%', column_data[:column_comment].presence || '')
|
37
37
|
.gsub('%data_placeholder%', data_placeholder(full_column_name))
|
38
38
|
end.join
|
@@ -47,7 +47,7 @@ module Commento
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def database_comments
|
50
|
-
adapter.
|
50
|
+
adapter.fetch_comments_for_database
|
51
51
|
end
|
52
52
|
|
53
53
|
def main_template
|
@@ -9,6 +9,7 @@ module Commento
|
|
9
9
|
# {
|
10
10
|
# 'fantasy_sports.points' => [
|
11
11
|
# 'app/services/some_service.rb:11'
|
12
|
+
# 'app/services/some_another_service.rb:12'
|
12
13
|
# ]
|
13
14
|
# }
|
14
15
|
# key - table_name.column_name
|
@@ -33,15 +34,15 @@ module Commento
|
|
33
34
|
end
|
34
35
|
|
35
36
|
# commento line looks like
|
36
|
-
# commento:
|
37
|
+
# commento:fantasy_sports:points,statistics
|
37
38
|
def iterate_filelines(lines, filename)
|
38
39
|
lines.each.with_index(1) do |line, index|
|
39
40
|
next unless COMMENTO_MATCH_REGEXP.match?(line)
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
@data[
|
44
|
-
@data[
|
42
|
+
table_name, columns = line.strip.split('# commento:')[-1].split(':').map(&:strip)
|
43
|
+
columns.split(',').each do |column|
|
44
|
+
@data["#{table_name}.#{column}"] ||= []
|
45
|
+
@data["#{table_name}.#{column}"] << "#{filename}:#{index}"
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
data/lib/commento/version.rb
CHANGED
data/lib/commento.rb
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module Commento
|
6
|
+
module Generators
|
7
|
+
class ActiveRecordGenerator < ::Rails::Generators::Base
|
8
|
+
include ::Rails::Generators::Migration
|
9
|
+
|
10
|
+
desc 'Generates migration for adding comments'
|
11
|
+
|
12
|
+
source_paths << File.join(File.dirname(__FILE__), 'templates')
|
13
|
+
|
14
|
+
attr_reader :tables_change_data, :columns_change_data
|
15
|
+
|
16
|
+
def self.next_migration_number(dirname)
|
17
|
+
::ActiveRecord::Generators::Base.next_migration_number(dirname)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.migration_version
|
21
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]" if requires_migration_number?
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.requires_migration_number?
|
25
|
+
Rails::VERSION::MAJOR.to_i >= 5
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_migration_file
|
29
|
+
generate_migration_data
|
30
|
+
|
31
|
+
migration_template 'migration.erb', 'db/migrate/commento_add_comments_to_tables_and_columns.rb'
|
32
|
+
end
|
33
|
+
|
34
|
+
def migration_version
|
35
|
+
self.class.migration_version
|
36
|
+
end
|
37
|
+
|
38
|
+
def generate_migration_data
|
39
|
+
@tables_without_comment = []
|
40
|
+
@table_report = {}
|
41
|
+
|
42
|
+
check_comments_for_database(Commento.adapter.fetch_comments_for_database)
|
43
|
+
|
44
|
+
@tables_change_data =
|
45
|
+
@tables_without_comment
|
46
|
+
.map { |table_name| "change_table_comment(:#{table_name}, from: nil, to: '')" }
|
47
|
+
.join("\n ")
|
48
|
+
|
49
|
+
@columns_change_data =
|
50
|
+
@table_report.map do |table_name, column_names|
|
51
|
+
column_names.map do |column_name|
|
52
|
+
"change_column_comment(:#{table_name}, :#{column_name}, from: nil, to: '')"
|
53
|
+
end
|
54
|
+
end.flatten.join("\n ")
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def check_comments_for_database(comments_for_database)
|
60
|
+
comments_for_database.each do |table_data|
|
61
|
+
@tables_without_comment << table_data[:table_name] if table_data[:table_comment].nil?
|
62
|
+
table_data[:columns].each do |column_data|
|
63
|
+
next if column_data[:column_comment].present?
|
64
|
+
|
65
|
+
@table_report[table_data[:table_name]] ||= []
|
66
|
+
@table_report[table_data[:table_name]] << column_data[:column_name]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'commento'
|
4
|
+
require 'rainbow'
|
5
|
+
require 'terminal-table'
|
6
|
+
|
7
|
+
AVAILABLE_REPORT_FORMATS = %w[html].freeze
|
8
|
+
|
9
|
+
# rubocop: disable Metrics/BlockLength
|
10
|
+
namespace :commento do
|
11
|
+
desc 'Generates HTML report'
|
12
|
+
task :generate_report, [:format] => :environment do |_, args|
|
13
|
+
if args[:format].blank?
|
14
|
+
puts Rainbow('Please specify format').red.bright
|
15
|
+
next
|
16
|
+
end
|
17
|
+
|
18
|
+
unless args[:format].in?(AVAILABLE_REPORT_FORMATS)
|
19
|
+
puts Rainbow("Format is not supported, available options: #{AVAILABLE_REPORT_FORMATS.join(", ")}").red.bright
|
20
|
+
next
|
21
|
+
end
|
22
|
+
|
23
|
+
puts Rainbow('Generating report is started').green
|
24
|
+
|
25
|
+
case args[:format]
|
26
|
+
when 'html' then Commento::Reports::Html.new.create_report
|
27
|
+
end
|
28
|
+
|
29
|
+
puts Rainbow('✓ Good job! Report is generated').green.bright
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Generates console report about missing table and column comments'
|
33
|
+
task health: :environment do
|
34
|
+
puts Rainbow("Starting commento health check\n").green
|
35
|
+
|
36
|
+
comments_for_database = Commento.adapter.fetch_comments_for_database
|
37
|
+
|
38
|
+
tables_with_comment_amount = 0
|
39
|
+
tables_without_comment = []
|
40
|
+
tables_without_comment_amount = 0
|
41
|
+
columns_with_comment_amount = 0
|
42
|
+
columns_without_comment_amount = 0
|
43
|
+
|
44
|
+
table_report_with_missing_comments = {}
|
45
|
+
|
46
|
+
comments_for_database.each do |table_data|
|
47
|
+
if table_data[:table_comment].nil?
|
48
|
+
tables_without_comment << table_data[:table_name]
|
49
|
+
tables_without_comment_amount += 1
|
50
|
+
table_report_with_missing_comments[table_data[:table_name]] = []
|
51
|
+
else
|
52
|
+
tables_with_comment_amount += 1
|
53
|
+
end
|
54
|
+
table_data[:columns].each do |column_data|
|
55
|
+
if column_data[:column_comment].nil?
|
56
|
+
columns_without_comment_amount += 1
|
57
|
+
table_report_with_missing_comments[table_data[:table_name]] ||= []
|
58
|
+
table_report_with_missing_comments[table_data[:table_name]] << column_data[:column_name]
|
59
|
+
else
|
60
|
+
columns_with_comment_amount += 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
total_tables_amount = tables_with_comment_amount + tables_without_comment_amount
|
66
|
+
tables_with_comment_ratio = total_tables_amount.zero? ? 0 : (tables_with_comment_amount * 100 / total_tables_amount)
|
67
|
+
|
68
|
+
if tables_with_comment_ratio == 100
|
69
|
+
puts Rainbow('✓ Amazing! All tables have comment').green.bright
|
70
|
+
elsif tables_with_comment_ratio > 50
|
71
|
+
puts Rainbow("✓ Good job! #{tables_with_comment_ratio}% of tables have comment").green.bright
|
72
|
+
elsif tables_with_comment_ratio.positive?
|
73
|
+
puts Rainbow("✓ Need to work! Only #{tables_with_comment_ratio}% of tables have comment").yellow.bright
|
74
|
+
else
|
75
|
+
puts Rainbow('✓ Something is missing! No single table have comment').red.bright
|
76
|
+
end
|
77
|
+
|
78
|
+
total_columns_amount = columns_with_comment_amount + columns_without_comment_amount
|
79
|
+
columns_ratio = total_columns_amount.zero? ? 0 : (columns_with_comment_amount * 100 / total_columns_amount)
|
80
|
+
|
81
|
+
if columns_ratio == 100
|
82
|
+
puts Rainbow('✓ Amazing! All columns have comment').green.bright
|
83
|
+
elsif columns_ratio > 50
|
84
|
+
puts Rainbow("✓ Good job! #{columns_ratio}% of columns have comment").green.bright
|
85
|
+
elsif columns_ratio.positive?
|
86
|
+
puts Rainbow("✓ Need to work! Only #{columns_ratio}% of columns have comment").yellow.bright
|
87
|
+
else
|
88
|
+
puts Rainbow('✓ Something is missing! No single column have comment').red.bright
|
89
|
+
end
|
90
|
+
|
91
|
+
if tables_without_comment_amount.positive? || columns_without_comment_amount.positive?
|
92
|
+
rows = []
|
93
|
+
table_report_with_missing_comments.each do |table_name, column_names|
|
94
|
+
rows << [
|
95
|
+
table_name.in?(tables_without_comment) ? Rainbow(table_name).cyan.bright : Rainbow(table_name).silver.bright,
|
96
|
+
column_names.map { |column_name| Rainbow(column_name).cyan.bright }.join("\n")
|
97
|
+
]
|
98
|
+
rows << :separator
|
99
|
+
end
|
100
|
+
puts ''
|
101
|
+
puts Terminal::Table.new(
|
102
|
+
title: Rainbow('Missing comments report').silver.bright,
|
103
|
+
headings: [Rainbow('Table name').silver.bright, Rainbow('Column name').silver.bright],
|
104
|
+
rows: rows,
|
105
|
+
style: { width: 80, border_bottom: false }
|
106
|
+
)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
# rubocop: enable Metrics/BlockLength
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commento
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bogdanov Anton
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rainbow
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.2.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.2.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: terminal-table
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: rubocop
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,10 +108,14 @@ files:
|
|
80
108
|
- lib/commento/configuration.rb
|
81
109
|
- lib/commento/dsl.rb
|
82
110
|
- lib/commento/helpers.rb
|
111
|
+
- lib/commento/railtie.rb
|
83
112
|
- lib/commento/report.rb
|
84
113
|
- lib/commento/reports/html.rb
|
85
114
|
- lib/commento/scrapers/ruby.rb
|
86
115
|
- lib/commento/version.rb
|
116
|
+
- lib/generators/commento/active_record_generator.rb
|
117
|
+
- lib/generators/commento/templates/migration.erb
|
118
|
+
- lib/tasks/commento.rake
|
87
119
|
homepage: https://github.com/kortirso/commento
|
88
120
|
licenses:
|
89
121
|
- MIT
|