Skip to content

Commit

Permalink
feat: add COMMENT support to indexes
Browse files Browse the repository at this point in the history
This reads out any COMMENT added to an INDEX object and adds its after
the last output on its "details" line.
  • Loading branch information
olleolleolle committed Feb 9, 2024
1 parent 5d01c41 commit 1b625fb
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 5 deletions.
23 changes: 19 additions & 4 deletions lib/annotate/annotate_models.rb
Expand Up @@ -36,6 +36,10 @@ module AnnotateModels
using: {
default: 'USING',
markdown: '_using_'
},
comment: {
default: 'COMMENT',
markdown: '_comment_'
}
}.freeze

Expand Down Expand Up @@ -295,12 +299,22 @@ def index_using_info(index, format = :default)
end
end

def index_comment_info(index, format = :default)
value = index.try(:comment).try(:to_s)
if value.blank?
''
else
" #{INDEX_CLAUSES[:comment][format]} #{value}"
end
end

def final_index_string_in_markdown(index)
details = sprintf(
"%s%s%s",
"%s%s%s%s",
index_unique_info(index, :markdown),
index_where_info(index, :markdown),
index_using_info(index, :markdown)
index_using_info(index, :markdown),
index_comment_info(index, :markdown)
).strip
details = " (#{details})" unless details.blank?

Expand All @@ -314,12 +328,13 @@ def final_index_string_in_markdown(index)

def final_index_string(index, max_size)
sprintf(
"# %-#{max_size}.#{max_size}s %s%s%s%s",
"# %-#{max_size}.#{max_size}s %s%s%s%s%s",
index.name,
"(#{index_columns_info(index).join(',')})",
index_unique_info(index),
index_where_info(index),
index_using_info(index)
index_using_info(index),
index_comment_info(index)
).rstrip + "\n"
end

Expand Down
40 changes: 39 additions & 1 deletion spec/lib/annotate/annotate_models_spec.rb
Expand Up @@ -28,7 +28,8 @@ def mock_index(name, params = {})
unique: params[:unique] || false,
orders: params[:orders] || {},
where: params[:where],
using: params[:using])
using: params[:using],
comment: params[:comment])
end

def mock_foreign_key(name, from_column, to_table, to_column = 'id', constraints = {})
Expand Down Expand Up @@ -539,6 +540,43 @@ def mock_column(name, type, options = {})
end
end

context 'when an index has a comment' do
let :columns do
[
mock_column(:id, :integer),
mock_column(:foreign_thing_id, :integer)
]
end

let :indexes do
[
mock_index('index_rails_02e851e3b9', columns: ['id']),
mock_index('index_rails_02e851e3ba', columns: ['foreign_thing_id'], comment: 'This is a comment')
]
end

let :expected_result do
<<~EOS
# Schema Info
#
# Table name: users
#
# id :integer not null, primary key
# foreign_thing_id :integer not null
#
# Indexes
#
# index_rails_02e851e3b9 (id)
# index_rails_02e851e3ba (foreign_thing_id) COMMENT This is a comment
#
EOS
end

it 'returns schema info with index information' do
is_expected.to eq expected_result
end
end

context 'when one of indexes includes ordered index key' do
let :columns do
[
Expand Down

0 comments on commit 1b625fb

Please sign in to comment.