Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tweak reported location of Documentation/DocumentationAdmonition issues #569

Merged
merged 1 commit into from
Feb 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions spec/ameba/rule/documentation/documentation_admonition_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,21 @@ module Ameba::Rule::Documentation

it "fails for comments with admonition" do
subject.admonitions.each do |admonition|
expect_issue subject, <<-CRYSTAL
# #{admonition}: Single-line comment
# ^{} error: Found a #{admonition} admonition in a comment
expect_issue subject, <<-CRYSTAL, admonition: admonition
# %{admonition}: Single-line comment
# ^{admonition} error: Found a #{admonition} admonition in a comment
CRYSTAL

expect_issue subject, <<-CRYSTAL
expect_issue subject, <<-CRYSTAL, admonition: admonition
# Text before ...
# #{admonition}(some context): Part of multi-line comment
# ^{} error: Found a #{admonition} admonition in a comment
# %{admonition}(some context): Part of multi-line comment
# ^{admonition} error: Found a #{admonition} admonition in a comment
# Text after ...
CRYSTAL

expect_issue subject, <<-CRYSTAL
# #{admonition}
# ^{} error: Found a #{admonition} admonition in a comment
expect_issue subject, <<-CRYSTAL, admonition: admonition
# %{admonition}
# ^{admonition} error: Found a #{admonition} admonition in a comment
if rand > 0.5
end
CRYSTAL
Expand All @@ -51,38 +51,38 @@ module Ameba::Rule::Documentation
it "fails for admonitions with past date" do
subject.admonitions.each do |admonition|
past_date = (Time.utc - 21.days).to_s(format: "%F")
expect_issue subject, <<-CRYSTAL
# #{admonition}(#{past_date}): sth in the past
# ^{} error: Found a #{admonition} admonition in a comment (21 days past)
expect_issue subject, <<-CRYSTAL, admonition: admonition
# %{admonition}(#{past_date}): sth in the past
# ^{admonition} error: Found a #{admonition} admonition in a comment (21 days past)
CRYSTAL
end
end

it "fails for admonitions with yesterday's date" do
subject.admonitions.each do |admonition|
yesterday_date = (Time.utc - 1.day).to_s(format: "%F")
expect_issue subject, <<-CRYSTAL
# #{admonition}(#{yesterday_date}): sth in the past
# ^{} error: Found a #{admonition} admonition in a comment (1 day past)
expect_issue subject, <<-CRYSTAL, admonition: admonition
# %{admonition}(#{yesterday_date}): sth in the past
# ^{admonition} error: Found a #{admonition} admonition in a comment (1 day past)
CRYSTAL
end
end

it "fails for admonitions with today's date" do
subject.admonitions.each do |admonition|
today_date = Time.utc.to_s(format: "%F")
expect_issue subject, <<-CRYSTAL
# #{admonition}(#{today_date}): sth in the past
# ^{} error: Found a #{admonition} admonition in a comment (today is the day!)
expect_issue subject, <<-CRYSTAL, admonition: admonition
# %{admonition}(#{today_date}): sth in the past
# ^{admonition} error: Found a #{admonition} admonition in a comment (today is the day!)
CRYSTAL
end
end

it "fails for admonitions with invalid date" do
subject.admonitions.each do |admonition|
expect_issue subject, <<-CRYSTAL
# #{admonition}(0000-00-00): sth wrong
# ^{} error: #{admonition} admonition error: Invalid time: "0000-00-00"
expect_issue subject, <<-CRYSTAL, admonition: admonition
# %{admonition}(0000-00-00): sth wrong
# ^{admonition} error: #{admonition} admonition error: Invalid time: "0000-00-00"
CRYSTAL
end
end
Expand All @@ -95,9 +95,9 @@ module Ameba::Rule::Documentation
rule.admonitions = %w[FOO BAR]

rule.admonitions.each do |admonition|
expect_issue rule, <<-CRYSTAL
# #{admonition}
# ^{} error: Found a #{admonition} admonition in a comment
expect_issue rule, <<-CRYSTAL, admonition: admonition
# %{admonition}
# ^{admonition} error: Found a #{admonition} admonition in a comment
CRYSTAL
end

Expand Down
17 changes: 11 additions & 6 deletions src/ameba/rule/documentation/documentation_admonition.cr
Original file line number Diff line number Diff line change
Expand Up @@ -61,25 +61,30 @@ module Ameba::Rule::Documentation
matches = doc.scan(pattern)
matches.each do |match|
admonition = match["admonition"]

end_location =
token.location.adjust(column_number: admonition.size + 1)
token_location = {token.location, end_location}

begin
case expr = match["context"]?.presence
when /\A\d{4}-\d{2}-\d{2}\Z/ # date
date = Time.parse($0, "%F", location)
issue_for_date source, token, admonition, date
issue_for_date source, token_location, admonition, date
when /\A\d{4}-\d{2}-\d{2} \d{2}:\d{2}(:\d{2})?\Z/ # date + time (no tz)
date = Time.parse($0, "%F #{$1?.presence ? "%T" : "%R"}", location)
issue_for_date source, token, admonition, date
issue_for_date source, token_location, admonition, date
else
issue_for token, MSG % admonition
issue_for *token_location, MSG % admonition
end
rescue ex
issue_for token, MSG_ERR % {admonition, "#{ex}: #{expr.inspect}"}
issue_for *token_location, MSG_ERR % {admonition, "#{ex}: #{expr.inspect}"}
end
end
end
end

private def issue_for_date(source, node, admonition, date)
private def issue_for_date(source, token_location, admonition, date)
diff = Time.utc - date.to_utc

return if diff.negative?
Expand All @@ -90,7 +95,7 @@ module Ameba::Rule::Documentation
else "#{diff.total_days.to_i} days past"
end

issue_for node, MSG_LATE % {admonition, past}
issue_for *token_location, MSG_LATE % {admonition, past}
end
end
end