git-lint 6.2.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +234 -104
  4. data/git-lint.gemspec +12 -12
  5. data/lib/git/lint/analyzer.rb +8 -4
  6. data/lib/git/lint/analyzers/abstract.rb +3 -3
  7. data/lib/git/lint/analyzers/commit_author_capitalization.rb +1 -1
  8. data/lib/git/lint/analyzers/commit_body_bullet_capitalization.rb +1 -1
  9. data/lib/git/lint/analyzers/commit_body_bullet_delimiter.rb +1 -1
  10. data/lib/git/lint/analyzers/{commit_body_single_bullet.rb → commit_body_bullet_only.rb} +4 -4
  11. data/lib/git/lint/analyzers/commit_body_phrase.rb +2 -5
  12. data/lib/git/lint/analyzers/commit_body_presence.rb +3 -3
  13. data/lib/git/lint/analyzers/commit_body_tracker_shorthand.rb +2 -2
  14. data/lib/git/lint/analyzers/commit_body_word_repeat.rb +31 -0
  15. data/lib/git/lint/analyzers/commit_signature.rb +2 -2
  16. data/lib/git/lint/analyzers/commit_subject_prefix.rb +3 -3
  17. data/lib/git/lint/analyzers/commit_subject_suffix.rb +2 -2
  18. data/lib/git/lint/analyzers/commit_subject_word_repeat.rb +20 -0
  19. data/lib/git/lint/analyzers/commit_trailer_collaborator_capitalization.rb +2 -2
  20. data/lib/git/lint/analyzers/commit_trailer_collaborator_email.rb +3 -4
  21. data/lib/git/lint/analyzers/commit_trailer_collaborator_key.rb +4 -6
  22. data/lib/git/lint/analyzers/commit_trailer_collaborator_name.rb +2 -2
  23. data/lib/git/lint/analyzers/commit_trailer_format_key.rb +4 -6
  24. data/lib/git/lint/analyzers/commit_trailer_format_value.rb +4 -4
  25. data/lib/git/lint/analyzers/commit_trailer_issue_key.rb +4 -6
  26. data/lib/git/lint/analyzers/commit_trailer_issue_value.rb +4 -4
  27. data/lib/git/lint/analyzers/commit_trailer_milestone_key.rb +33 -0
  28. data/lib/git/lint/analyzers/commit_trailer_milestone_value.rb +35 -0
  29. data/lib/git/lint/analyzers/commit_trailer_order.rb +38 -0
  30. data/lib/git/lint/analyzers/commit_trailer_reviewer_key.rb +33 -0
  31. data/lib/git/lint/analyzers/commit_trailer_reviewer_value.rb +35 -0
  32. data/lib/git/lint/analyzers/commit_trailer_signer_capitalization.rb +2 -2
  33. data/lib/git/lint/analyzers/commit_trailer_signer_email.rb +3 -4
  34. data/lib/git/lint/analyzers/commit_trailer_signer_key.rb +4 -4
  35. data/lib/git/lint/analyzers/commit_trailer_signer_name.rb +2 -2
  36. data/lib/git/lint/analyzers/commit_trailer_tracker_key.rb +4 -6
  37. data/lib/git/lint/analyzers/commit_trailer_tracker_value.rb +4 -4
  38. data/lib/git/lint/commits/{systems → hosts}/circle_ci.rb +2 -2
  39. data/lib/git/lint/commits/{systems → hosts}/container.rb +2 -2
  40. data/lib/git/lint/commits/{systems → hosts}/git_hub_action.rb +2 -2
  41. data/lib/git/lint/commits/{systems → hosts}/import.rb +1 -1
  42. data/lib/git/lint/commits/{systems → hosts}/local.rb +2 -2
  43. data/lib/git/lint/commits/{systems → hosts}/netlify_ci.rb +2 -2
  44. data/lib/git/lint/commits/loader.rb +6 -6
  45. data/lib/git/lint/configuration/contract.rb +19 -11
  46. data/lib/git/lint/configuration/defaults.yml +43 -22
  47. data/lib/git/lint/configuration/model.rb +19 -11
  48. data/lib/git/lint/configuration/trailer.rb +10 -0
  49. data/lib/git/lint/container.rb +28 -6
  50. data/lib/git/lint/errors/severity.rb +6 -1
  51. data/lib/git/lint/kit/filter_list.rb +9 -4
  52. data/lib/git/lint/reporters/branch.rb +5 -5
  53. data/lib/git/lint/validators/name.rb +2 -2
  54. data/lib/git/lint/validators/repeated_word.rb +36 -0
  55. data/lib/git/lint.rb +3 -1
  56. data.tar.gz.sig +0 -0
  57. metadata +40 -32
  58. metadata.gz.sig +0 -0
  59. data/lib/git/lint/analyzers/commit_body_bullet.rb +0 -34
@@ -6,25 +6,25 @@ module Git
6
6
  class Analyzer
7
7
  include Import[:configuration]
8
8
 
9
- # rubocop:todo Metrics/CollectionLiteralLength
10
9
  ANALYZERS = [
11
10
  Analyzers::CommitAuthorCapitalization,
12
11
  Analyzers::CommitAuthorEmail,
13
12
  Analyzers::CommitAuthorName,
14
- Analyzers::CommitBodyBullet,
15
13
  Analyzers::CommitBodyBulletCapitalization,
16
14
  Analyzers::CommitBodyBulletDelimiter,
15
+ Analyzers::CommitBodyBulletOnly,
17
16
  Analyzers::CommitBodyLeadingLine,
18
17
  Analyzers::CommitBodyLineLength,
19
18
  Analyzers::CommitBodyParagraphCapitalization,
20
19
  Analyzers::CommitBodyPhrase,
21
20
  Analyzers::CommitBodyPresence,
22
- Analyzers::CommitBodySingleBullet,
23
21
  Analyzers::CommitBodyTrackerShorthand,
22
+ Analyzers::CommitBodyWordRepeat,
24
23
  Analyzers::CommitSignature,
25
24
  Analyzers::CommitSubjectLength,
26
25
  Analyzers::CommitSubjectPrefix,
27
26
  Analyzers::CommitSubjectSuffix,
27
+ Analyzers::CommitSubjectWordRepeat,
28
28
  Analyzers::CommitTrailerCollaboratorCapitalization,
29
29
  Analyzers::CommitTrailerCollaboratorEmail,
30
30
  Analyzers::CommitTrailerCollaboratorKey,
@@ -34,6 +34,11 @@ module Git
34
34
  Analyzers::CommitTrailerFormatValue,
35
35
  Analyzers::CommitTrailerIssueKey,
36
36
  Analyzers::CommitTrailerIssueValue,
37
+ Analyzers::CommitTrailerMilestoneKey,
38
+ Analyzers::CommitTrailerMilestoneValue,
39
+ Analyzers::CommitTrailerOrder,
40
+ Analyzers::CommitTrailerReviewerKey,
41
+ Analyzers::CommitTrailerReviewerValue,
37
42
  Analyzers::CommitTrailerSignerCapitalization,
38
43
  Analyzers::CommitTrailerSignerEmail,
39
44
  Analyzers::CommitTrailerSignerKey,
@@ -41,7 +46,6 @@ module Git
41
46
  Analyzers::CommitTrailerTrackerKey,
42
47
  Analyzers::CommitTrailerTrackerValue
43
48
  ].freeze
44
- # rubocop:enable Metrics/CollectionLiteralLength
45
49
 
46
50
  # rubocop:disable Metrics/ParameterLists
47
51
  def initialize(
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "core"
4
- require "refinements/strings"
4
+ require "refinements/string"
5
5
 
6
6
  module Git
7
7
  module Lint
8
8
  module Analyzers
9
- # An abstract class which provides basic functionality from which all analyzers inherit from.
9
+ # An abstract class which provides basic functionality for all analyzers to inherit from.
10
10
  class Abstract
11
11
  include Import[:configuration, :environment]
12
12
 
13
- using ::Refinements::Strings
13
+ using Refinements::String
14
14
 
15
15
  LEVELS = %w[warn error].freeze
16
16
  BODY_OFFSET = 3
@@ -3,7 +3,7 @@
3
3
  module Git
4
4
  module Lint
5
5
  module Analyzers
6
- # Analyzes author for proper capitalization of author name.
6
+ # Analyzes author name for proper capitalization.
7
7
  class CommitAuthorCapitalization < Abstract
8
8
  include Import[validator: "validators.capitalization"]
9
9
 
@@ -23,7 +23,7 @@ module Git
23
23
  end
24
24
 
25
25
  def invalid_line? line
26
- line.match?(/\A\s*#{Regexp.union filter_list.to_regexp}\s[[:lower:]]+/)
26
+ line.match?(/\A\s*#{Regexp.union filter_list}\s[[:lower:]]+/)
27
27
  end
28
28
 
29
29
  private
@@ -24,7 +24,7 @@ module Git
24
24
 
25
25
  def invalid_line?(line) = line.match?(/\A\s*#{pattern}(?!(#{pattern}|\s)).+\Z/)
26
26
 
27
- def pattern = Regexp.union(filter_list.to_regexp)
27
+ def pattern = Regexp.union filter_list
28
28
  end
29
29
  end
30
30
  end
@@ -4,8 +4,8 @@ module Git
4
4
  module Lint
5
5
  module Analyzers
6
6
  # Analyzes commit bodies with only a single bullet point.
7
- class CommitBodySingleBullet < Abstract
8
- def valid? = affected_commit_body_lines.size != 1
7
+ class CommitBodyBulletOnly < Abstract
8
+ def valid? = !affected_commit_body_lines.one?
9
9
 
10
10
  def issue
11
11
  return {} if valid?
@@ -19,10 +19,10 @@ module Git
19
19
  protected
20
20
 
21
21
  def load_filter_list
22
- Kit::FilterList.new configuration.commits_body_single_bullet_includes
22
+ Kit::FilterList.new configuration.commits_body_bullet_only_includes
23
23
  end
24
24
 
25
- def invalid_line?(line) = line.match?(/\A#{Regexp.union filter_list.to_regexp}\s+/)
25
+ def invalid_line?(line) = line.match?(/\A#{Regexp.union filter_list}\s+/)
26
26
  end
27
27
  end
28
28
  end
@@ -11,7 +11,7 @@ module Git
11
11
  return {} if valid?
12
12
 
13
13
  {
14
- hint: %(Avoid: #{filter_list.to_hint}.),
14
+ hint: %(Avoid: #{filter_list.to_usage}.),
15
15
  lines: affected_commit_body_lines
16
16
  }
17
17
  end
@@ -23,10 +23,7 @@ module Git
23
23
  end
24
24
 
25
25
  def invalid_line? line
26
- line.downcase.match? Regexp.new(
27
- Regexp.union(filter_list.to_regexp).source,
28
- Regexp::IGNORECASE
29
- )
26
+ line.downcase.match? Regexp.new(Regexp.union(filter_list).source, Regexp::IGNORECASE)
30
27
  end
31
28
  end
32
29
  end
@@ -3,9 +3,9 @@
3
3
  module Git
4
4
  module Lint
5
5
  module Analyzers
6
- # Analyzes pretense of commit body.
6
+ # Analyzes presence of commit body.
7
7
  class CommitBodyPresence < Abstract
8
- using ::Refinements::Strings
8
+ using Refinements::String
9
9
 
10
10
  def valid?
11
11
  return true if commit.fixup?
@@ -19,7 +19,7 @@ module Git
19
19
  def issue
20
20
  return {} if valid?
21
21
 
22
- {hint: %(Use minimum of #{"#{minimum} line".pluralize "s", count: minimum} (non-empty).)}
22
+ {hint: %(Use minimum of #{"#{minimum} line".pluralize "s", minimum} (non-empty).)}
23
23
  end
24
24
  end
25
25
  end
@@ -11,7 +11,7 @@ module Git
11
11
  return {} if valid?
12
12
 
13
13
  {
14
- hint: "Explain issue instead of using shorthand. Avoid: #{filter_list.to_hint}.",
14
+ hint: "Explain issue instead of using shorthand. Avoid: #{filter_list.to_usage}.",
15
15
  lines: affected_commit_body_lines
16
16
  }
17
17
  end
@@ -22,7 +22,7 @@ module Git
22
22
  Kit::FilterList.new configuration.commits_body_tracker_shorthand_excludes
23
23
  end
24
24
 
25
- def invalid_line?(line) = line.match?(/.*#{Regexp.union filter_list.to_regexp}.*/)
25
+ def invalid_line?(line) = line.match?(/.*#{Regexp.union filter_list}.*/)
26
26
  end
27
27
  end
28
28
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit body for repeated words.
7
+ class CommitBodyWordRepeat < Abstract
8
+ include Import[validator: "validators.repeated_word"]
9
+
10
+ def valid? = commit.body_lines.all? { |line| !invalid_line? line }
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Avoid repeating these words: #{validator.call commit.body}.",
17
+ lines: affected_commit_body_lines
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def invalid_line? line
24
+ return false if line.start_with? "#"
25
+
26
+ !validator.call(line).empty?
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -8,10 +8,10 @@ module Git
8
8
  include Import[sanitizer: "sanitizers.signature"]
9
9
 
10
10
  def valid?
11
- sanitizer.call(commit.signature).match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
11
+ sanitizer.call(commit.signature).match?(/\A#{Regexp.union filter_list}\Z/)
12
12
  end
13
13
 
14
- def issue = valid? ? {} : {hint: %(Use: #{filter_list.to_hint}.)}
14
+ def issue = valid? ? {} : {hint: %(Use: #{filter_list.to_usage "or"}.)}
15
15
 
16
16
  protected
17
17
 
@@ -9,13 +9,13 @@ module Git
9
9
  return true if locally_prefixed?
10
10
  return true if filter_list.empty?
11
11
 
12
- commit.subject.match?(/\A#{Regexp.union filter_list.to_regexp}/)
12
+ commit.subject.match?(/\A#{Regexp.union filter_list}/)
13
13
  end
14
14
 
15
15
  def issue
16
16
  return {} if valid?
17
17
 
18
- {hint: %(Use: #{filter_list.to_hint}.)}
18
+ {hint: %(Use: #{filter_list.to_usage "or"}.)}
19
19
  end
20
20
 
21
21
  protected
@@ -26,7 +26,7 @@ module Git
26
26
  .then { |list| Kit::FilterList.new list }
27
27
  end
28
28
 
29
- def locally_prefixed? = !ci? && commit.prefix?
29
+ def locally_prefixed? = !ci? && commit.directive?
30
30
 
31
31
  def ci? = environment["CI"] == "true"
32
32
 
@@ -8,13 +8,13 @@ module Git
8
8
  def valid?
9
9
  return true if filter_list.empty?
10
10
 
11
- !commit.subject.match?(/#{Regexp.union filter_list.to_regexp}\Z/)
11
+ !commit.subject.match?(/#{Regexp.union filter_list}\Z/)
12
12
  end
13
13
 
14
14
  def issue
15
15
  return {} if valid?
16
16
 
17
- {hint: %(Avoid: #{filter_list.to_hint}.)}
17
+ {hint: %(Avoid: #{filter_list.to_usage}.)}
18
18
  end
19
19
 
20
20
  protected
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit subject for repeated words.
7
+ class CommitSubjectWordRepeat < Abstract
8
+ include Import[validator: "validators.repeated_word"]
9
+
10
+ def valid? = validator.call(commit.subject).empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {hint: "Avoid repeating these words: #{validator.call commit.subject}."}
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -6,7 +6,7 @@ module Git
6
6
  # Analyzes commit trailer collaborator name capitalization.
7
7
  class CommitTrailerCollaboratorCapitalization < Abstract
8
8
  include Import[
9
- pattern: "trailers.collaborator",
9
+ setting: "trailers.collaborator",
10
10
  parser: "parsers.person",
11
11
  validator: "validators.capitalization"
12
12
  ]
@@ -26,7 +26,7 @@ module Git
26
26
 
27
27
  def invalid_line? trailer
28
28
  parser.call(trailer.value).then do |person|
29
- trailer.key.match?(pattern) && !validator.call(person.name)
29
+ trailer.key.match?(setting.pattern) && !validator.call(person.name)
30
30
  end
31
31
  end
32
32
  end
@@ -6,9 +6,8 @@ module Git
6
6
  # Analyzes commit trailer collaborator email address format.
7
7
  class CommitTrailerCollaboratorEmail < Abstract
8
8
  include Import[
9
- pattern: "trailers.collaborator",
9
+ setting: "trailers.collaborator",
10
10
  parser: "parsers.person",
11
- sanitizer: "sanitizers.email",
12
11
  validator: "validators.email"
13
12
  ]
14
13
 
@@ -26,8 +25,8 @@ module Git
26
25
  protected
27
26
 
28
27
  def invalid_line? trailer
29
- email = sanitizer.call parser.call(trailer.value).email
30
- trailer.key.match?(pattern) && !validator.call(email)
28
+ email = parser.call(trailer.value).email
29
+ trailer.key.match?(setting.pattern) && !validator.call(email)
31
30
  end
32
31
 
33
32
  private
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer collaborator key usage.
7
7
  class CommitTrailerCollaboratorKey < Abstract
8
- include Import[pattern: "trailers.collaborator"]
8
+ include Import[setting: "trailers.collaborator"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,20 +13,18 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
20
20
 
21
21
  protected
22
22
 
23
- def load_filter_list
24
- Kit::FilterList.new configuration.commits_trailer_collaborator_key_includes
25
- end
23
+ def load_filter_list = Kit::FilterList.new setting.name
26
24
 
27
25
  def invalid_line? trailer
28
26
  trailer.key.then do |key|
29
- key.match?(pattern) && !key.match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
30
28
  end
31
29
  end
32
30
  end
@@ -6,7 +6,7 @@ module Git
6
6
  # Analyzes commit trailer collaborator name construction.
7
7
  class CommitTrailerCollaboratorName < Abstract
8
8
  include Import[
9
- pattern: "trailers.collaborator",
9
+ setting: "trailers.collaborator",
10
10
  parser: "parsers.person",
11
11
  validator: "validators.name"
12
12
  ]
@@ -26,7 +26,7 @@ module Git
26
26
 
27
27
  def invalid_line? trailer
28
28
  parser.call(trailer.value).then do |person|
29
- trailer.key.match?(pattern) && !validator.call(person.name, minimum:)
29
+ trailer.key.match?(setting.pattern) && !validator.call(person.name, minimum:)
30
30
  end
31
31
  end
32
32
 
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer format key usage.
7
7
  class CommitTrailerFormatKey < Abstract
8
- include Import[pattern: "trailers.format"]
8
+ include Import[setting: "trailers.format"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,20 +13,18 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
20
20
 
21
21
  protected
22
22
 
23
- def load_filter_list
24
- Kit::FilterList.new configuration.commits_trailer_format_key_includes
25
- end
23
+ def load_filter_list = Kit::FilterList.new setting.name
26
24
 
27
25
  def invalid_line? trailer
28
26
  trailer.key.then do |key|
29
- key.match?(pattern) && !key.match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
30
28
  end
31
29
  end
32
30
  end
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer format value.
7
7
  class CommitTrailerFormatValue < Abstract
8
- include Import[pattern: "trailers.format"]
8
+ include Import[setting: "trailers.format"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,7 +13,7 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage "or"}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
@@ -25,10 +25,10 @@ module Git
25
25
  end
26
26
 
27
27
  def invalid_line? trailer
28
- trailer.key.match?(pattern) && !trailer.value.match?(value_pattern)
28
+ trailer.key.match?(setting.pattern) && !trailer.value.match?(value_pattern)
29
29
  end
30
30
 
31
- def value_pattern = /\A#{Regexp.union filter_list.to_regexp}\Z/
31
+ def value_pattern = /\A#{Regexp.union filter_list}\Z/
32
32
  end
33
33
  end
34
34
  end
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer issue key usage.
7
7
  class CommitTrailerIssueKey < Abstract
8
- include Import[pattern: "trailers.issue"]
8
+ include Import[setting: "trailers.issue"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,20 +13,18 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
20
20
 
21
21
  protected
22
22
 
23
- def load_filter_list
24
- Kit::FilterList.new configuration.commits_trailer_issue_key_includes
25
- end
23
+ def load_filter_list = Kit::FilterList.new setting.name
26
24
 
27
25
  def invalid_line? trailer
28
26
  trailer.key.then do |key|
29
- key.match?(pattern) && !key.match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
30
28
  end
31
29
  end
32
30
  end
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer issue value.
7
7
  class CommitTrailerIssueValue < Abstract
8
- include Import[pattern: "trailers.issue"]
8
+ include Import[setting: "trailers.issue"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,7 +13,7 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
@@ -25,10 +25,10 @@ module Git
25
25
  end
26
26
 
27
27
  def invalid_line? trailer
28
- trailer.key.match?(pattern) && !trailer.value.match?(value_pattern)
28
+ trailer.key.match?(setting.pattern) && !trailer.value.match?(value_pattern)
29
29
  end
30
30
 
31
- def value_pattern = /\A#{Regexp.union filter_list.to_regexp}\Z/
31
+ def value_pattern = /\A#{Regexp.union filter_list}\Z/
32
32
  end
33
33
  end
34
34
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer milestone key usage.
7
+ class CommitTrailerMilestoneKey < Abstract
8
+ include Import[setting: "trailers.milestone"]
9
+
10
+ def valid? = affected_commit_trailers.empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Use: #{filter_list.to_usage}.",
17
+ lines: affected_commit_trailers
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def load_filter_list = Kit::FilterList.new setting.name
24
+
25
+ def invalid_line? trailer
26
+ trailer.key.then do |key|
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer milestone value.
7
+ class CommitTrailerMilestoneValue < Abstract
8
+ include Import[setting: "trailers.milestone"]
9
+
10
+ def valid? = affected_commit_trailers.empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Use: #{filter_list.to_usage "or"}.",
17
+ lines: affected_commit_trailers
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def load_filter_list
24
+ Kit::FilterList.new configuration.commits_trailer_milestone_value_includes
25
+ end
26
+
27
+ def invalid_line? trailer
28
+ trailer.key.match?(setting.pattern) && !trailer.value.match?(value_pattern)
29
+ end
30
+
31
+ def value_pattern = /\A#{Regexp.union filter_list}\Z/
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer order value.
7
+ class CommitTrailerOrder < Abstract
8
+ def initialize(...)
9
+ super
10
+ @original_order = commit.trailers.map(&:key)
11
+ @sorted_order = original_order.sort
12
+ end
13
+
14
+ def valid? = original_order == sorted_order
15
+
16
+ def issue
17
+ return {} if valid?
18
+
19
+ {
20
+ hint: "Ensure keys are alphabetically sorted.",
21
+ lines: affected_commit_trailers
22
+ }
23
+ end
24
+
25
+ protected
26
+
27
+ def invalid_line? trailer
28
+ key = trailer.key
29
+ original_order.index(key) != sorted_order.index(key)
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :original_order, :sorted_order
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer reviwer key usage.
7
+ class CommitTrailerReviewerKey < Abstract
8
+ include Import[setting: "trailers.reviewer"]
9
+
10
+ def valid? = affected_commit_trailers.empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Use: #{filter_list.to_usage}.",
17
+ lines: affected_commit_trailers
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def load_filter_list = Kit::FilterList.new setting.name
24
+
25
+ def invalid_line? trailer
26
+ trailer.key.then do |key|
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end