Module: Danger::Helpers::CommentsHelper

Instance Method Summary collapse

Methods included from CommentsParsingHelper

#parse_comment, #parse_message_from_row, #parse_tables_from_comment, #table_kind_from_title, #violations_from_table

Instance Method Details

#apply_template(tables: [], markdowns: [], danger_id: "danger", template: "github") ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/danger/helpers/comments_helper.rb', line 79

def apply_template(tables: [], markdowns: [], danger_id: "danger", template: "github")
  require "erb"

  md_template = File.join(Danger.gem_path, "lib/danger/comment_generators/#{template}.md.erb")

  # erb: http://www.rrn.dk/rubys-erb-templating-system
  # for the extra args: http://stackoverflow.com/questions/4632879/erb-template-removing-the-trailing-line
  @tables = tables
  @markdowns = markdowns.map(&:message)
  @danger_id = danger_id
  @emoji_mapper = EmojiMapper.new(template)

  return ERB.new(File.read(md_template), 0, "-").result(binding)
end

#generate_comment(warnings: [], errors: [], messages: [], markdowns: [], previous_violations: {}, danger_id: "danger", template: "github") ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/danger/helpers/comments_helper.rb', line 94

def generate_comment(warnings: [], errors: [], messages: [], markdowns: [], previous_violations: {}, danger_id: "danger", template: "github")
  apply_template(
    tables: [
      table("Error", "no_entry_sign", errors, previous_violations, template: template),
      table("Warning", "warning", warnings, previous_violations, template: template),
      table("Message", "book", messages, previous_violations, template: template)
    ],
    markdowns: markdowns,
    danger_id: danger_id,
    template: template
  )
end

#generate_description(warnings: nil, errors: nil) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
# File 'lib/danger/helpers/comments_helper.rb', line 123

def generate_description(warnings: nil, errors: nil)
  if errors.empty? && warnings.empty?
    return "All green. #{random_compliment}"
  else
    message = "⚠️ "
    message += "#{'Error'.danger_pluralize(errors.count)}. " unless errors.empty?
    message += "#{'Warning'.danger_pluralize(warnings.count)}. " unless warnings.empty?
    message += "Don't worry, everything is fixable."
    return message
  end
end

#generate_inline_comment_body(emoji, message, danger_id: "danger", resolved: false, template: "github") ⇒ Object



107
108
109
110
111
112
113
# File 'lib/danger/helpers/comments_helper.rb', line 107

def generate_inline_comment_body(emoji, message, danger_id: "danger", resolved: false, template: "github")
  apply_template(
    tables: [{ content: [message], resolved: resolved, emoji: emoji }],
    danger_id: danger_id,
    template: "#{template}_inline"
  )
end

#generate_inline_markdown_body(markdown, danger_id: "danger", template: "github") ⇒ Object



115
116
117
118
119
120
121
# File 'lib/danger/helpers/comments_helper.rb', line 115

def generate_inline_markdown_body(markdown, danger_id: "danger", template: "github")
  apply_template(
    markdowns: [markdown],
    danger_id: danger_id,
    template: "#{template}_inline"
  )
end

!@group Extension points Produces a markdown link to the file the message points to

request_source implementations are invited to override this method with their vendor specific link.

Parameters:

Returns:

  • (String)

    The Markdown compatible link



27
28
29
# File 'lib/danger/helpers/comments_helper.rb', line 27

def markdown_link_to_message(message, _)
  "#{message.file}#L#{message.line}"
end

#markdown_parser(text) ⇒ Object



13
14
15
# File 'lib/danger/helpers/comments_helper.rb', line 13

def markdown_parser(text)
  Kramdown::Document.new(text, input: "GFM")
end

#messages_are_equivalent(m1, m2) ⇒ Boolean

!@group Extension points Determine whether two messages are equivalent

request_source implementations are invited to override this method. This is mostly here to enable sources to detect when inlines change only in their commit hash and not in content per-se. since the link is implementation dependant so should be the comparison.

Parameters:

Returns:

  • (Boolean)

    whether they represent the same message



43
44
45
# File 'lib/danger/helpers/comments_helper.rb', line 43

def messages_are_equivalent(m1, m2)
  m1 == m2
end

#process_markdown(violation, hide_link = false) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'lib/danger/helpers/comments_helper.rb', line 47

def process_markdown(violation, hide_link = false)
  message = violation.message
  message = "#{markdown_link_to_message(violation, hide_link)}#{message}" if violation.file && violation.line

  html = markdown_parser(message).to_html
  # Remove the outer `<p>`, the -5 represents a newline + `</p>`
  html = html[3...-5] if html.start_with? "<p>"
  Violation.new(html, violation.sticky, violation.file, violation.line)
end

#random_complimentObject



135
136
137
138
# File 'lib/danger/helpers/comments_helper.rb', line 135

def random_compliment
  ["Well done.", "Congrats.", "Woo!",
   "Yay.", "Jolly good show.", "Good on 'ya.", "Nice work."].sample
end

#table(name, emoji, violations, all_previous_violations, template: "github") ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/danger/helpers/comments_helper.rb', line 57

def table(name, emoji, violations, all_previous_violations, template: "github")
  content = violations
  content = content.map { |v| process_markdown(v) } unless ["bitbucket_server", "vsts"].include?(template)

  kind = table_kind_from_title(name)
  previous_violations = all_previous_violations[kind] || []
  resolved_violations = previous_violations.reject do |pv|
    content.count { |v| messages_are_equivalent(v, pv) } > 0
  end

  resolved_messages = resolved_violations.map(&:message).uniq
  count = content.count

  {
    name: name,
    emoji: emoji,
    content: content,
    resolved: resolved_messages,
    count: count
  }
end