git-lint 1.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 (60) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE.adoc +162 -0
  5. data/README.adoc +1068 -0
  6. data/bin/git-lint +9 -0
  7. data/lib/git/kit/repo.rb +30 -0
  8. data/lib/git/lint.rb +51 -0
  9. data/lib/git/lint/analyzers/abstract.rb +108 -0
  10. data/lib/git/lint/analyzers/commit_author_capitalization.rb +35 -0
  11. data/lib/git/lint/analyzers/commit_author_email.rb +35 -0
  12. data/lib/git/lint/analyzers/commit_author_name.rb +40 -0
  13. data/lib/git/lint/analyzers/commit_body_bullet.rb +43 -0
  14. data/lib/git/lint/analyzers/commit_body_bullet_capitalization.rb +46 -0
  15. data/lib/git/lint/analyzers/commit_body_bullet_delimiter.rb +40 -0
  16. data/lib/git/lint/analyzers/commit_body_issue_tracker_link.rb +45 -0
  17. data/lib/git/lint/analyzers/commit_body_leading_line.rb +30 -0
  18. data/lib/git/lint/analyzers/commit_body_line_length.rb +42 -0
  19. data/lib/git/lint/analyzers/commit_body_paragraph_capitalization.rb +47 -0
  20. data/lib/git/lint/analyzers/commit_body_phrase.rb +72 -0
  21. data/lib/git/lint/analyzers/commit_body_presence.rb +36 -0
  22. data/lib/git/lint/analyzers/commit_body_single_bullet.rb +40 -0
  23. data/lib/git/lint/analyzers/commit_subject_length.rb +33 -0
  24. data/lib/git/lint/analyzers/commit_subject_prefix.rb +42 -0
  25. data/lib/git/lint/analyzers/commit_subject_suffix.rb +39 -0
  26. data/lib/git/lint/analyzers/commit_trailer_collaborator_capitalization.rb +51 -0
  27. data/lib/git/lint/analyzers/commit_trailer_collaborator_duplication.rb +56 -0
  28. data/lib/git/lint/analyzers/commit_trailer_collaborator_email.rb +52 -0
  29. data/lib/git/lint/analyzers/commit_trailer_collaborator_key.rb +56 -0
  30. data/lib/git/lint/analyzers/commit_trailer_collaborator_name.rb +57 -0
  31. data/lib/git/lint/branches/environments/circle_ci.rb +28 -0
  32. data/lib/git/lint/branches/environments/local.rb +28 -0
  33. data/lib/git/lint/branches/environments/netlify_ci.rb +34 -0
  34. data/lib/git/lint/branches/environments/travis_ci.rb +57 -0
  35. data/lib/git/lint/branches/feature.rb +44 -0
  36. data/lib/git/lint/cli.rb +122 -0
  37. data/lib/git/lint/collector.rb +64 -0
  38. data/lib/git/lint/commits/saved.rb +104 -0
  39. data/lib/git/lint/commits/unsaved.rb +120 -0
  40. data/lib/git/lint/errors/base.rb +14 -0
  41. data/lib/git/lint/errors/severity.rb +13 -0
  42. data/lib/git/lint/errors/sha.rb +13 -0
  43. data/lib/git/lint/identity.rb +13 -0
  44. data/lib/git/lint/kit/filter_list.rb +30 -0
  45. data/lib/git/lint/parsers/trailers/collaborator.rb +57 -0
  46. data/lib/git/lint/rake/setup.rb +4 -0
  47. data/lib/git/lint/rake/tasks.rb +33 -0
  48. data/lib/git/lint/refinements/strings.rb +25 -0
  49. data/lib/git/lint/reporters/branch.rb +67 -0
  50. data/lib/git/lint/reporters/commit.rb +30 -0
  51. data/lib/git/lint/reporters/line.rb +32 -0
  52. data/lib/git/lint/reporters/lines/paragraph.rb +49 -0
  53. data/lib/git/lint/reporters/lines/sentence.rb +31 -0
  54. data/lib/git/lint/reporters/style.rb +52 -0
  55. data/lib/git/lint/runner.rb +34 -0
  56. data/lib/git/lint/validators/capitalization.rb +29 -0
  57. data/lib/git/lint/validators/email.rb +24 -0
  58. data/lib/git/lint/validators/name.rb +30 -0
  59. metadata +363 -0
  60. metadata.gz.sig +3 -0
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Refinements
6
+ module Strings
7
+ refine String do
8
+ def pluralize count:, suffix: "s"
9
+ return "#{count} #{self}" if count == 1
10
+
11
+ "#{count} #{self}#{suffix}"
12
+ end
13
+
14
+ def fixup?
15
+ match?(/\Afixup!\s/)
16
+ end
17
+
18
+ def squash?
19
+ match?(/\Asquash!\s/)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pastel"
4
+
5
+ module Git
6
+ module Lint
7
+ module Reporters
8
+ # Reports issues related to a single branch.
9
+ class Branch
10
+ using Refinements::Strings
11
+
12
+ def initialize collector: Collector.new, colorizer: Pastel.new
13
+ @collector = collector
14
+ @colorizer = colorizer
15
+ end
16
+
17
+ def to_s
18
+ "Running #{Identity::LABEL}...#{branch_report}\n" \
19
+ "#{commit_total}. #{issue_totals}.\n"
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :collector, :colorizer
25
+
26
+ def commit_report
27
+ collector.to_h.reduce "" do |details, (commit, analyzers)|
28
+ details + Commit.new(commit: commit, analyzers: analyzers).to_s
29
+ end
30
+ end
31
+
32
+ def branch_report
33
+ return "" unless collector.issues?
34
+
35
+ "\n\n#{commit_report}".chomp "\n"
36
+ end
37
+
38
+ def commit_total
39
+ %(#{"commit".pluralize count: collector.total_commits} inspected)
40
+ end
41
+
42
+ def issue_total
43
+ color = collector.errors? ? :red : :yellow
44
+ colorizer.public_send color, "issue".pluralize(count: collector.total_issues)
45
+ end
46
+
47
+ def warning_total
48
+ color = collector.warnings? ? :yellow : :green
49
+ colorizer.public_send color, "warning".pluralize(count: collector.total_warnings)
50
+ end
51
+
52
+ def error_total
53
+ color = collector.errors? ? :red : :green
54
+ colorizer.public_send color, "error".pluralize(count: collector.total_errors)
55
+ end
56
+
57
+ def issue_totals
58
+ if collector.issues?
59
+ "#{issue_total} detected (#{warning_total}, #{error_total})"
60
+ else
61
+ colorizer.green("0 issues") + " detected"
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Reporters
6
+ # Reports issues related to a single commit.
7
+ class Commit
8
+ def initialize commit:, analyzers: []
9
+ @commit = commit
10
+ @analyzers = analyzers.select(&:invalid?)
11
+ end
12
+
13
+ def to_s
14
+ return "" if analyzers.empty?
15
+
16
+ "#{commit.sha} (#{commit.author_name}, #{commit.author_date_relative}): " \
17
+ "#{commit.subject}\n#{report}\n"
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :commit, :analyzers
23
+
24
+ def report
25
+ analyzers.reduce("") { |report, analyzer| report + Style.new(analyzer).to_s }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Reporters
6
+ # Reports issues related to an invalid line within the commit body.
7
+ class Line
8
+ DEFAULT_INDENT = " "
9
+
10
+ def initialize data = {}
11
+ @data = data
12
+ end
13
+
14
+ def to_s
15
+ if content.include? "\n"
16
+ Lines::Paragraph.new(data).to_s
17
+ else
18
+ Lines::Sentence.new(data).to_s
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :data
25
+
26
+ def content
27
+ data.fetch :content
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Reporters
6
+ module Lines
7
+ class Paragraph
8
+ def initialize data = {}
9
+ @data = data
10
+ end
11
+
12
+ def to_s
13
+ %(#{label}"#{paragraph}"\n)
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :data
19
+
20
+ def label
21
+ "#{Line::DEFAULT_INDENT}Line #{number}: "
22
+ end
23
+
24
+ def paragraph
25
+ formatted_lines.join "\n"
26
+ end
27
+
28
+ def formatted_lines
29
+ content.split("\n").map.with_index do |line, index|
30
+ index.zero? ? line : "#{indent}#{line}"
31
+ end
32
+ end
33
+
34
+ def indent
35
+ " " * (label.length + 1)
36
+ end
37
+
38
+ def number
39
+ data.fetch :number
40
+ end
41
+
42
+ def content
43
+ data.fetch :content
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Reporters
6
+ module Lines
7
+ class Sentence
8
+ def initialize data = {}
9
+ @data = data
10
+ end
11
+
12
+ def to_s
13
+ %(#{Line::DEFAULT_INDENT}Line #{number}: "#{content}"\n)
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :data
19
+
20
+ def number
21
+ data.fetch :number
22
+ end
23
+
24
+ def content
25
+ data.fetch :content
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pastel"
4
+
5
+ module Git
6
+ module Lint
7
+ module Reporters
8
+ # Reports issues related to a single style.
9
+ class Style
10
+ def initialize analyzer, colorizer: Pastel.new
11
+ @analyzer = analyzer
12
+ @issue = analyzer.issue
13
+ @colorizer = colorizer
14
+ end
15
+
16
+ def to_s
17
+ colorizer.public_send color, message
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :analyzer, :issue, :colorizer
23
+
24
+ def message
25
+ " #{analyzer.class.label}#{severity_suffix}. " \
26
+ "#{issue.fetch :hint}\n" \
27
+ "#{affected_lines}"
28
+ end
29
+
30
+ def severity_suffix
31
+ case analyzer.severity
32
+ when :warn then " Warning"
33
+ when :error then " Error"
34
+ else ""
35
+ end
36
+ end
37
+
38
+ def color
39
+ case analyzer.severity
40
+ when :warn then :yellow
41
+ when :error then :red
42
+ else :white
43
+ end
44
+ end
45
+
46
+ def affected_lines
47
+ issue.fetch(:lines, []).reduce("") { |lines, line| lines + Line.new(line).to_s }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ class Runner
6
+ def initialize configuration:, collector: Collector.new
7
+ @configuration = configuration
8
+ @collector = collector
9
+ end
10
+
11
+ def call commits: Branches::Feature.new.commits
12
+ Array(commits).map { |commit| check commit }
13
+ collector
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :configuration, :collector
19
+
20
+ def check commit
21
+ configuration.map { |id, settings| load_analyzer id, commit, settings }
22
+ .select(&:enabled?)
23
+ .map { |analyzer| collector.add analyzer }
24
+ end
25
+
26
+ def load_analyzer id, commit, settings
27
+ klass = Analyzers::Abstract.descendants.find { |descendant| descendant.id == id }
28
+ fail Errors::Base, "Invalid analyzer: #{id}. See docs for supported analyzer." unless klass
29
+
30
+ klass.new commit: commit, settings: settings
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Validators
6
+ class Capitalization
7
+ DEFAULT_PATTERN = /\A[[:upper:]].*\Z/.freeze
8
+
9
+ def initialize text, delimiter: Name::DEFAULT_DELIMITER, pattern: DEFAULT_PATTERN
10
+ @text = String text
11
+ @delimiter = delimiter
12
+ @pattern = pattern
13
+ end
14
+
15
+ def valid?
16
+ parts.all? { |name| String(name).match? pattern }
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :text, :delimiter, :pattern
22
+
23
+ def parts
24
+ text.split delimiter
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+
5
+ module Git
6
+ module Lint
7
+ module Validators
8
+ class Email
9
+ def initialize text, pattern: URI::MailTo::EMAIL_REGEXP
10
+ @text = text
11
+ @pattern = pattern
12
+ end
13
+
14
+ def valid?
15
+ String(text).match? pattern
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :text, :pattern
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Validators
6
+ class Name
7
+ DEFAULT_DELIMITER = /\s{1}/.freeze
8
+ DEFAULT_MINIMUM = 2
9
+
10
+ def initialize text, delimiter: DEFAULT_DELIMITER, minimum: DEFAULT_MINIMUM
11
+ @text = text
12
+ @delimiter = delimiter
13
+ @minimum = minimum
14
+ end
15
+
16
+ def valid?
17
+ parts.size >= minimum && parts.all? { |name| !String(name).empty? }
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :text, :delimiter, :minimum
23
+
24
+ def parts
25
+ String(text).split delimiter
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,363 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-lint
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brooke Kuhlmann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIC/jCCAeagAwIBAgIBAzANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
+ a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMDAzMTUxNDQ1MzJaFw0yMTAzMTUx
15
+ NDQ1MzJaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
16
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
17
+ xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
18
+ brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
19
+ 9z0A8KcGhz67SdcoQiD7qiCjL/2NTeWHOzkpPrdGlt088+VerEEGf5I13QCvaftP
20
+ D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
21
+ 3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
22
+ AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
23
+ 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAIHhAlD3po4sTYqacXaQ
24
+ XI9jIhrfMy//2PgbHWcETtlJPBeNUbbSNBABcllUHKqYsVDlSvSmss034KSWNR8F
25
+ bF1GcloicyvcCC4y6IoW4it0COAcdeaaxkxiBSgKdQFpff9REnDlIKK4uQ9lLxIo
26
+ Y2G5xubiziKZkyfWFuSr67PIjW3Bu673D1JVBArhA1qbgQmYQcy1CkGOjo+iO8Nf
27
+ 7u/QSfBHb+r/bXhKscDgPpnKwbUmvgO2+94zJG9KsrmIydlzYfsD09aXKx0t6Xy4
28
+ 2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
29
+ QWc=
30
+ -----END CERTIFICATE-----
31
+ date: 2020-06-13 00:00:00.000000000 Z
32
+ dependencies:
33
+ - !ruby/object:Gem::Dependency
34
+ name: pastel
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.7'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.7'
47
+ - !ruby/object:Gem::Dependency
48
+ name: refinements
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '7.5'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '7.5'
61
+ - !ruby/object:Gem::Dependency
62
+ name: runcom
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '6.0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '6.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: thor
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.20'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.20'
89
+ - !ruby/object:Gem::Dependency
90
+ name: bundler-audit
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.6'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.6'
103
+ - !ruby/object:Gem::Dependency
104
+ name: gemsmith
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '14.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '14.0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: guard-rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '4.7'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '4.7'
131
+ - !ruby/object:Gem::Dependency
132
+ name: pry
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.13'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.13'
145
+ - !ruby/object:Gem::Dependency
146
+ name: pry-byebug
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.9'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '3.9'
159
+ - !ruby/object:Gem::Dependency
160
+ name: rake
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '13.0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '13.0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: reek
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '6.0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '6.0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: rspec
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '3.9'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '3.9'
201
+ - !ruby/object:Gem::Dependency
202
+ name: rubocop
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '0.83'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0.83'
215
+ - !ruby/object:Gem::Dependency
216
+ name: rubocop-performance
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.5'
222
+ type: :development
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '1.5'
229
+ - !ruby/object:Gem::Dependency
230
+ name: rubocop-rake
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '0.5'
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '0.5'
243
+ - !ruby/object:Gem::Dependency
244
+ name: rubocop-rspec
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '1.39'
250
+ type: :development
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '1.39'
257
+ - !ruby/object:Gem::Dependency
258
+ name: simplecov
259
+ requirement: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: '0.18'
264
+ type: :development
265
+ prerelease: false
266
+ version_requirements: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - "~>"
269
+ - !ruby/object:Gem::Version
270
+ version: '0.18'
271
+ description:
272
+ email:
273
+ - brooke@alchemists.io
274
+ executables:
275
+ - git-lint
276
+ extensions: []
277
+ extra_rdoc_files:
278
+ - README.adoc
279
+ - LICENSE.adoc
280
+ files:
281
+ - LICENSE.adoc
282
+ - README.adoc
283
+ - bin/git-lint
284
+ - lib/git/kit/repo.rb
285
+ - lib/git/lint.rb
286
+ - lib/git/lint/analyzers/abstract.rb
287
+ - lib/git/lint/analyzers/commit_author_capitalization.rb
288
+ - lib/git/lint/analyzers/commit_author_email.rb
289
+ - lib/git/lint/analyzers/commit_author_name.rb
290
+ - lib/git/lint/analyzers/commit_body_bullet.rb
291
+ - lib/git/lint/analyzers/commit_body_bullet_capitalization.rb
292
+ - lib/git/lint/analyzers/commit_body_bullet_delimiter.rb
293
+ - lib/git/lint/analyzers/commit_body_issue_tracker_link.rb
294
+ - lib/git/lint/analyzers/commit_body_leading_line.rb
295
+ - lib/git/lint/analyzers/commit_body_line_length.rb
296
+ - lib/git/lint/analyzers/commit_body_paragraph_capitalization.rb
297
+ - lib/git/lint/analyzers/commit_body_phrase.rb
298
+ - lib/git/lint/analyzers/commit_body_presence.rb
299
+ - lib/git/lint/analyzers/commit_body_single_bullet.rb
300
+ - lib/git/lint/analyzers/commit_subject_length.rb
301
+ - lib/git/lint/analyzers/commit_subject_prefix.rb
302
+ - lib/git/lint/analyzers/commit_subject_suffix.rb
303
+ - lib/git/lint/analyzers/commit_trailer_collaborator_capitalization.rb
304
+ - lib/git/lint/analyzers/commit_trailer_collaborator_duplication.rb
305
+ - lib/git/lint/analyzers/commit_trailer_collaborator_email.rb
306
+ - lib/git/lint/analyzers/commit_trailer_collaborator_key.rb
307
+ - lib/git/lint/analyzers/commit_trailer_collaborator_name.rb
308
+ - lib/git/lint/branches/environments/circle_ci.rb
309
+ - lib/git/lint/branches/environments/local.rb
310
+ - lib/git/lint/branches/environments/netlify_ci.rb
311
+ - lib/git/lint/branches/environments/travis_ci.rb
312
+ - lib/git/lint/branches/feature.rb
313
+ - lib/git/lint/cli.rb
314
+ - lib/git/lint/collector.rb
315
+ - lib/git/lint/commits/saved.rb
316
+ - lib/git/lint/commits/unsaved.rb
317
+ - lib/git/lint/errors/base.rb
318
+ - lib/git/lint/errors/severity.rb
319
+ - lib/git/lint/errors/sha.rb
320
+ - lib/git/lint/identity.rb
321
+ - lib/git/lint/kit/filter_list.rb
322
+ - lib/git/lint/parsers/trailers/collaborator.rb
323
+ - lib/git/lint/rake/setup.rb
324
+ - lib/git/lint/rake/tasks.rb
325
+ - lib/git/lint/refinements/strings.rb
326
+ - lib/git/lint/reporters/branch.rb
327
+ - lib/git/lint/reporters/commit.rb
328
+ - lib/git/lint/reporters/line.rb
329
+ - lib/git/lint/reporters/lines/paragraph.rb
330
+ - lib/git/lint/reporters/lines/sentence.rb
331
+ - lib/git/lint/reporters/style.rb
332
+ - lib/git/lint/runner.rb
333
+ - lib/git/lint/validators/capitalization.rb
334
+ - lib/git/lint/validators/email.rb
335
+ - lib/git/lint/validators/name.rb
336
+ homepage: https://www.alchemists.io/projects/git-lint
337
+ licenses:
338
+ - Apache-2.0
339
+ metadata:
340
+ bug_tracker_uri: https://github.com/bkuhlmann/git-lint/issues
341
+ changelog_uri: https://www.alchemists.io/projects/git-lint/changes.html
342
+ documentation_uri: https://www.alchemists.io/projects/git-lint
343
+ source_code_uri: https://github.com/bkuhlmann/git-lint
344
+ post_install_message:
345
+ rdoc_options: []
346
+ require_paths:
347
+ - lib
348
+ required_ruby_version: !ruby/object:Gem::Requirement
349
+ requirements:
350
+ - - "~>"
351
+ - !ruby/object:Gem::Version
352
+ version: '2.7'
353
+ required_rubygems_version: !ruby/object:Gem::Requirement
354
+ requirements:
355
+ - - ">="
356
+ - !ruby/object:Gem::Version
357
+ version: '0'
358
+ requirements: []
359
+ rubygems_version: 3.1.4
360
+ signing_key:
361
+ specification_version: 4
362
+ summary: A command line interface for linting Git commits.
363
+ test_files: []