Class: Danger::Changelog::ChangelogEntryLine

Inherits:
ChangelogLine show all
Defined in:
lib/changelog/changelog_line/changelog_entry_line.rb

Overview

A CHANGELOG.md line represents the change entry.

Constant Summary

Constants inherited from ChangelogLine

Danger::Changelog::ChangelogLine::DELIMITER, Danger::Changelog::ChangelogLine::NON_DELIMITERS, Danger::Changelog::ChangelogLine::PAIRED

Instance Attribute Summary

Attributes inherited from ChangelogLine

#line, #validation_result

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ChangelogLine

#balanced?, #initialize, #invalid?

Constructor Details

This class inherits a constructor from Danger::Changelog::ChangelogLine

Class Method Details

.ends_with_period?(line) ⇒ Boolean

checks whether line ends with a period

Returns:

  • (Boolean)


67
68
69
70
71
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 67

def self.ends_with_period?(line)
  return true if line =~ /\.\n$/

  false
end

.ends_with_space?(line) ⇒ Boolean

checks whether line ends with a space

Returns:

  • (Boolean)


60
61
62
63
64
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 60

def self.ends_with_space?(line)
  return true if line =~ /[[:blank:]]\n$/

  false
end

.example(github) ⇒ Object

provide an example of a CHANGELOG line based on a commit message



41
42
43
44
45
46
47
48
49
50
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 41

def self.example(github)
  pr_number = github.pr_json['number']
  pr_url = github.pr_json['html_url']
  pr_title = github.pr_title
                   .sub(/[?.!,;]?$/, '')
                   .capitalize
  pr_author = github.pr_author
  pr_author_url = "https://github.com/#{github.pr_author}"
  "* [##{pr_number}](#{pr_url}): #{pr_title} - [@#{pr_author}](#{pr_author_url})."
end

.starts_with_star?(line) ⇒ Boolean

checks whether line starts with *

Returns:

  • (Boolean)


53
54
55
56
57
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 53

def self.starts_with_star?(line)
  return true if line =~ /^\*\s/

  false
end

.validates_as_changelog_line?(line) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
34
35
36
37
38
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 31

def self.validates_as_changelog_line?(line)
  matched_rules_count = 0
  matched_rules_count += 1 if starts_with_star?(line)
  matched_rules_count += 1 if with_pr_link?(line)
  matched_rules_count += 1 if with_changelog_description?(line)
  matched_rules_count += 1 if with_author_link?(line)
  matched_rules_count >= 2
end

.with_author_link?(line) ⇒ Boolean

checks whether line contains a MARKDOWN link to an author

Returns:

  • (Boolean)


88
89
90
91
92
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 88

def self.with_author_link?(line)
  return true if line =~ %r{\[\@[\w\d\-\_]+\]\(http[s]?:\/\/github\.com\/.*[\w\d\-\_]+[\/]?\)}

  false
end

.with_changelog_description?(line) ⇒ Boolean

checks whether line contains a capitalized Text, treated as a description

Returns:

  • (Boolean)


81
82
83
84
85
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 81

def self.with_changelog_description?(line)
  return true if line =~ /[\`[:upper:]].*/

  false
end

.with_pr_link?(line) ⇒ Boolean

checks whether line contains a MARKDOWN link to a PR

Returns:

  • (Boolean)


74
75
76
77
78
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 74

def self.with_pr_link?(line)
  return true if line =~ %r{\[\#\d+\]\(http[s]?:\/\/github\.com\/.*\d+[\/]?\)}

  false
end

Instance Method Details

#valid?Boolean

Returns:

  • (Boolean)


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/changelog/changelog_line/changelog_entry_line.rb', line 7

def valid?
  return validation_result.valid? if validation_result

  @validation_result = Parsers::ValidationResult.new

  validation_result.error! 'too many parenthesis' unless balanced?(line)
  return false if validation_result.invalid?

  return true if line =~ %r{^\*\s[\`[:upper:]].*[^.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}
  return true if line =~ %r{^\*\s\[\#\d+\]\(https:\/\/github\.com\/.*\d+\)\: [\`[:upper:]].*[^.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}

  validation_result.error! 'does not start with a star' unless ChangelogEntryLine.starts_with_star?(line)
  validation_result.error! 'does not include a pull request link' unless ChangelogEntryLine.with_pr_link?(line)
  validation_result.error! 'does not have a description' unless ChangelogEntryLine.with_changelog_description?(line)
  validation_result.error! 'does not include an author link' unless ChangelogEntryLine.with_author_link?(line)
  validation_result.error! 'has an extra trailing space' if ChangelogEntryLine.ends_with_space?(line)
  validation_result.error! 'is missing a period at the end of the line' unless ChangelogEntryLine.ends_with_period?(line)
  validation_result.error! 'has an extra period or comma at the end of the description' if
    line =~ %r{^\*\s[\`[:upper:]].*[.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$} ||
    line =~ %r{^\*\s\[\#\d+\]\(https:\/\/github\.com\/.*\d+\)\: [\`[:upper:]].*[.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}

  false
end