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 1f84ed8
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 5 deletions.
23 changes: 19 additions & 4 deletions lib/annotate/annotate_models.rb
Original file line number Diff line number Diff line change
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
33 changes: 32 additions & 1 deletion spec/lib/annotate/annotate_models_spec.rb
Original file line number Diff line number Diff line change
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 @@ -537,6 +538,36 @@ def mock_column(name, type, options = {})
it 'returns schema info with index information' do
is_expected.to eq expected_result
end

context 'with a comment on the index' do
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
end

context 'when one of indexes includes ordered index key' do
Expand Down

0 comments on commit 1f84ed8

Please sign in to comment.