fit-commit 2.1.2 → 2.2.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +3 -0
- data/README.md +39 -2
- data/Rakefile +4 -0
- data/lib/fit_commit/configuration_loader.rb +62 -0
- data/lib/fit_commit/runner.rb +5 -6
- data/lib/fit_commit/validator_loader.rb +32 -0
- data/lib/fit_commit/validators/base.rb +22 -7
- data/lib/fit_commit/validators/frathouse.rb +3 -3
- data/lib/fit_commit/validators/line_length.rb +17 -8
- data/lib/fit_commit/validators/summary_period.rb +1 -1
- data/lib/fit_commit/validators/tense.rb +1 -1
- data/lib/fit_commit/validators/wip.rb +3 -4
- data/lib/fit_commit/version.rb +1 -1
- data/templates/config/fit_commit.default.yml +16 -0
- data/test/configuration_loader_test.rb +77 -0
- data/test/validator_loader_test.rb +48 -0
- data/test/validators/frathouse_test.rb +26 -36
- data/test/validators/line_length_test.rb +58 -28
- data/test/validators/summary_period_test.rb +7 -4
- data/test/validators/tense_test.rb +10 -8
- data/test/validators/validator_helper.rb +8 -0
- data/test/validators/wip_test.rb +18 -28
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d0e5940862e5d3bb79d5e2fd77eab59035ecb41
|
4
|
+
data.tar.gz: 2fa241ffb6eae0aa6cfbfda5d12f8cba52bf4823
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3024e9600be177394c86f8037f08d2ee8b0253008b22352da8b36378b9557511db17e9dd88c5f6efa03f37d68acc6a7b39b26bf1584fe63bfde58902bf8a590f
|
7
|
+
data.tar.gz: e6ce9e0c4df171f734ad6dd613662e8d35fe31d7de4dc361a2f9546666b90cabce6709497d0b844aa670546cffdbca0347efc5feffcf3ac9484f3c6303a2701a
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -38,9 +38,46 @@ This creates a `.git/hooks/commit-msg` script which will automatically check you
|
|
38
38
|
* **Line Length**: All lines must be <= 72 chars (URLs excluded). First line should be <= 50 chars. Second line must be blank.
|
39
39
|
* **Tense**: Message must use imperative present tense: "Fix bug" and not "Fixed bug" or "Fixes bug."
|
40
40
|
* **Summary Period**: Do not end your summary with a period.
|
41
|
-
* **WIP**: Do not commit WIPs to
|
42
|
-
* **Frat House**: No frat house commit messages in
|
41
|
+
* **WIP**: Do not commit WIPs to shared branches.
|
42
|
+
* **Frat House**: No frat house commit messages in shared branches.
|
43
|
+
|
44
|
+
## Configuration
|
45
|
+
|
46
|
+
Settings are read from these files, in increasing precedence: `/etc/fit_commit.yml`, `$HOME/.fit_commit.yml`, `config/fit_commit.yml`, `./.fit_commit.yml`.
|
47
|
+
|
48
|
+
The default settings are:
|
49
|
+
|
50
|
+
```yaml
|
51
|
+
---
|
52
|
+
Validators/LineLength:
|
53
|
+
Enabled: true
|
54
|
+
MaxLineLength: 72
|
55
|
+
SummaryWarnLength: 50
|
56
|
+
AllowLongUrls: true
|
57
|
+
Validators/Tense:
|
58
|
+
Enabled: true
|
59
|
+
Validators/SummaryPeriod:
|
60
|
+
Enabled: true
|
61
|
+
Validators/Wip:
|
62
|
+
Enabled:
|
63
|
+
- master
|
64
|
+
Validators/Frathouse:
|
65
|
+
Enabled:
|
66
|
+
- master
|
67
|
+
```
|
43
68
|
|
69
|
+
The `Enabled` property accepts multiple formats:
|
70
|
+
|
71
|
+
```yaml
|
72
|
+
# true/false are branch agnostic
|
73
|
+
Validators/Foo:
|
74
|
+
Enabled: false
|
75
|
+
# Array of String/Regex matching each branch for which it's enabled
|
76
|
+
Validators/Bar:
|
77
|
+
Enabled:
|
78
|
+
- master
|
79
|
+
- !ruby/regexp /\Afoo.+bar/
|
80
|
+
```
|
44
81
|
|
45
82
|
## FAQ
|
46
83
|
|
data/Rakefile
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module FitCommit
|
4
|
+
class ConfigurationLoader
|
5
|
+
def global_configuration
|
6
|
+
all_filepaths.each_with_object({}) do |filepath, config|
|
7
|
+
config.merge!(read_config(filepath))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def all_filepaths
|
14
|
+
# sorted by increasing precedence
|
15
|
+
[default_filepath, system_filepath, user_filepath, config_filepath, local_filepath]
|
16
|
+
end
|
17
|
+
|
18
|
+
def default_filepath
|
19
|
+
File.expand_path("../../../templates/config/fit_commit.default.yml", __FILE__)
|
20
|
+
end
|
21
|
+
|
22
|
+
def system_filepath
|
23
|
+
"/etc/fit_commit.yml"
|
24
|
+
end
|
25
|
+
|
26
|
+
def user_filepath
|
27
|
+
File.join(ENV["HOME"], ".fit_commit.yml")
|
28
|
+
end
|
29
|
+
|
30
|
+
def config_filepath
|
31
|
+
File.join(git_top_level, "config", "fit_commit.yml")
|
32
|
+
end
|
33
|
+
|
34
|
+
def local_filepath
|
35
|
+
".fit_commit.yml"
|
36
|
+
end
|
37
|
+
|
38
|
+
def git_top_level
|
39
|
+
top_level = `git rev-parse --show-toplevel`.chomp.strip
|
40
|
+
fail "Git repo not found! Please submit a bug report." if top_level == ""
|
41
|
+
top_level
|
42
|
+
end
|
43
|
+
|
44
|
+
def read_config(path)
|
45
|
+
load_yaml(path).each_with_object({}) do |(key, value), config|
|
46
|
+
translated_key = translate_class_name(key)
|
47
|
+
config[translated_key] = value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def load_yaml(path)
|
52
|
+
content = YAML.load_file(path) if File.exist?(path)
|
53
|
+
content || {}
|
54
|
+
rescue => e
|
55
|
+
raise e, "Error parsing config file: #{e.message}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def translate_class_name(config_class_name)
|
59
|
+
"FitCommit::" + config_class_name.gsub("/", "::")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/fit_commit/runner.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "fit_commit/has_errors"
|
2
2
|
require "fit_commit/message_parser"
|
3
|
+
require "fit_commit/validator_loader"
|
3
4
|
|
4
5
|
module FitCommit
|
5
6
|
class Runner
|
@@ -38,17 +39,15 @@ module FitCommit
|
|
38
39
|
private
|
39
40
|
|
40
41
|
def run_validators
|
41
|
-
|
42
|
-
validator
|
43
|
-
validator.validate
|
42
|
+
validators.each do |validator|
|
43
|
+
validator.validate(lines)
|
44
44
|
merge_errors(validator.errors)
|
45
45
|
merge_warnings(validator.warnings)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
50
|
-
|
51
|
-
FitCommit::Validators::Base.all
|
49
|
+
def validators
|
50
|
+
FitCommit::ValidatorLoader.new(branch_name).validators
|
52
51
|
end
|
53
52
|
|
54
53
|
def print_results
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "fit_commit/configuration_loader"
|
2
|
+
|
3
|
+
module FitCommit
|
4
|
+
class ValidatorLoader
|
5
|
+
attr_accessor :branch_name, :configuration
|
6
|
+
def initialize(branch_name, configuration = load_configuration)
|
7
|
+
self.branch_name = branch_name
|
8
|
+
self.configuration = configuration
|
9
|
+
end
|
10
|
+
|
11
|
+
def validators
|
12
|
+
all_validators.select(&:enabled?)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def load_configuration
|
18
|
+
FitCommit::ConfigurationLoader.new.global_configuration
|
19
|
+
end
|
20
|
+
|
21
|
+
def all_validators
|
22
|
+
Dir[File.dirname(__FILE__) + "/validators/*.rb"].each { |file| require file }
|
23
|
+
FitCommit::Validators::Base.all.map do |validator_class|
|
24
|
+
validator_class.new(branch_name, config_for(validator_class))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def config_for(validator_class)
|
29
|
+
configuration[validator_class.name] || {}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -5,10 +5,10 @@ module FitCommit
|
|
5
5
|
class Base
|
6
6
|
include FitCommit::HasErrors
|
7
7
|
|
8
|
-
attr_accessor :
|
9
|
-
def initialize(
|
10
|
-
self.lines = lines
|
8
|
+
attr_accessor :branch_name, :config
|
9
|
+
def initialize(branch_name, config)
|
11
10
|
self.branch_name = branch_name
|
11
|
+
self.config = config
|
12
12
|
end
|
13
13
|
|
14
14
|
@all = []
|
@@ -19,15 +19,30 @@ module FitCommit
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def validate
|
23
|
-
lines.each
|
24
|
-
validate_line(line.lineno, line.text, branch_name)
|
25
|
-
end
|
22
|
+
def validate(lines)
|
23
|
+
lines.each { |line| validate_line(line.lineno, line.text) }
|
26
24
|
end
|
27
25
|
|
28
26
|
def validate_line(*)
|
29
27
|
fail NotImplementedError, "Implement in subclass"
|
30
28
|
end
|
29
|
+
|
30
|
+
def enabled?
|
31
|
+
enabled_val = config.fetch("Enabled")
|
32
|
+
if enabled_val.is_a?(Array)
|
33
|
+
enabled_val.any? { |pattern| matches_branch?(pattern) }
|
34
|
+
else
|
35
|
+
enabled_val
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def matches_branch?(pattern)
|
40
|
+
if pattern.is_a?(Regexp)
|
41
|
+
pattern =~ branch_name
|
42
|
+
else
|
43
|
+
pattern == branch_name
|
44
|
+
end
|
45
|
+
end
|
31
46
|
end
|
32
47
|
end
|
33
48
|
end
|
@@ -4,9 +4,9 @@ require "swearjar"
|
|
4
4
|
module FitCommit
|
5
5
|
module Validators
|
6
6
|
class Frathouse < Base
|
7
|
-
def validate_line(lineno, text
|
8
|
-
if
|
9
|
-
add_error(lineno, "No frat house commit messages in
|
7
|
+
def validate_line(lineno, text)
|
8
|
+
if Swearjar.default.profane?(text)
|
9
|
+
add_error(lineno, "No frat house commit messages in shared branches.")
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -3,30 +3,39 @@ require "fit_commit/validators/base"
|
|
3
3
|
module FitCommit
|
4
4
|
module Validators
|
5
5
|
class LineLength < Base
|
6
|
-
|
7
|
-
LINE_MAX_LENGTH = 72
|
8
|
-
|
9
|
-
def validate_line(lineno, text, _branch_name)
|
6
|
+
def validate_line(lineno, text)
|
10
7
|
if lineno == 1 && text.empty?
|
11
8
|
add_error(lineno, "First line cannot be blank.")
|
12
9
|
elsif lineno == 2 && !text.empty?
|
13
10
|
add_error(lineno, "Second line must be blank.")
|
14
11
|
elsif line_too_long?(text)
|
15
12
|
add_error(lineno, format("Lines should be <= %i chars. (%i)",
|
16
|
-
|
17
|
-
elsif lineno == 1 && text.length >
|
13
|
+
max_line_length, text.length))
|
14
|
+
elsif lineno == 1 && text.length > summary_warn_length
|
18
15
|
add_warning(lineno, format("First line should be <= %i chars. (%i)",
|
19
|
-
|
16
|
+
summary_warn_length, text.length))
|
20
17
|
end
|
21
18
|
end
|
22
19
|
|
23
20
|
def line_too_long?(text)
|
24
|
-
text.length >
|
21
|
+
text.length > max_line_length && !(allow_long_urls? && contains_url?(text))
|
25
22
|
end
|
26
23
|
|
27
24
|
def contains_url?(text)
|
28
25
|
text =~ %r{[a-z]+://}
|
29
26
|
end
|
27
|
+
|
28
|
+
def max_line_length
|
29
|
+
config.fetch("MaxLineLength")
|
30
|
+
end
|
31
|
+
|
32
|
+
def summary_warn_length
|
33
|
+
config.fetch("SummaryWarnLength")
|
34
|
+
end
|
35
|
+
|
36
|
+
def allow_long_urls?
|
37
|
+
config.fetch("AllowLongUrls")
|
38
|
+
end
|
30
39
|
end
|
31
40
|
end
|
32
41
|
end
|
@@ -3,7 +3,7 @@ require "fit_commit/validators/base"
|
|
3
3
|
module FitCommit
|
4
4
|
module Validators
|
5
5
|
class SummaryPeriod < Base
|
6
|
-
def validate_line(lineno, text
|
6
|
+
def validate_line(lineno, text)
|
7
7
|
if lineno == 1 && text.end_with?(".")
|
8
8
|
add_error(lineno, "Do not end your summary with a period.")
|
9
9
|
end
|
@@ -3,10 +3,9 @@ require "fit_commit/validators/base"
|
|
3
3
|
module FitCommit
|
4
4
|
module Validators
|
5
5
|
class Wip < Base
|
6
|
-
def validate_line(lineno, text
|
7
|
-
if lineno == 1 &&
|
8
|
-
|
9
|
-
add_error(lineno, "Do not commit WIPs to master.")
|
6
|
+
def validate_line(lineno, text)
|
7
|
+
if lineno == 1 && text.split.any? { |word| word == "WIP" }
|
8
|
+
add_error(lineno, "Do not commit WIPs to shared branches.")
|
10
9
|
end
|
11
10
|
end
|
12
11
|
end
|
data/lib/fit_commit/version.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
Validators/LineLength:
|
3
|
+
Enabled: true
|
4
|
+
MaxLineLength: 72
|
5
|
+
SummaryWarnLength: 50
|
6
|
+
AllowLongUrls: true
|
7
|
+
Validators/Tense:
|
8
|
+
Enabled: true
|
9
|
+
Validators/SummaryPeriod:
|
10
|
+
Enabled: true
|
11
|
+
Validators/Wip:
|
12
|
+
Enabled:
|
13
|
+
- master
|
14
|
+
Validators/Frathouse:
|
15
|
+
Enabled:
|
16
|
+
- master
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "fit_commit/configuration_loader"
|
3
|
+
|
4
|
+
describe FitCommit::ConfigurationLoader do
|
5
|
+
subject { FitCommit::ConfigurationLoader.new }
|
6
|
+
|
7
|
+
after do
|
8
|
+
[system_file, user_file].compact.each(&:unlink)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:global_configuration) do
|
12
|
+
subject.stub :default_filepath, "nofile" do
|
13
|
+
subject.stub :system_filepath, (system_file ? system_file.path : "nofile") do
|
14
|
+
subject.stub :user_filepath, (user_file ? user_file.path : "nofile") do
|
15
|
+
subject.stub :config_filepath, "nofile" do
|
16
|
+
subject.stub :local_filepath, "nofile" do
|
17
|
+
subject.stub :git_top_level, "." do
|
18
|
+
subject.global_configuration
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def tempfile(filename, content)
|
28
|
+
Tempfile.new(filename).tap do |f|
|
29
|
+
f.write(content)
|
30
|
+
f.close
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "no configuration files present" do
|
35
|
+
let(:system_file) { nil }
|
36
|
+
let(:user_file) { nil }
|
37
|
+
it "is empty" do
|
38
|
+
assert_equal({}, global_configuration)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "just one configuration file present" do
|
43
|
+
let(:system_file) { nil }
|
44
|
+
let(:user_file) { tempfile("user_file", user_file_content) }
|
45
|
+
let(:user_file_content) do
|
46
|
+
"Foo/Bar:\n Baz: false\nQux/Norf/Blah:\n - !ruby/regexp /\\Afoo/"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "is a configuration equal to that file" do
|
50
|
+
expected = {
|
51
|
+
"FitCommit::Foo::Bar" => { "Baz" => false },
|
52
|
+
"FitCommit::Qux::Norf::Blah" => [/\Afoo/]
|
53
|
+
}
|
54
|
+
assert_equal expected, global_configuration
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "multiple configuration files present" do
|
59
|
+
let(:system_file) { tempfile("system_file", system_file_content) }
|
60
|
+
let(:user_file) { tempfile("user_file", user_file_content) }
|
61
|
+
let(:system_file_content) do
|
62
|
+
"Foo/Bar:\n Baz: false\nQux/Norf/Blah:\n - !ruby/regexp /\\Afoo/"
|
63
|
+
end
|
64
|
+
let(:user_file_content) do
|
65
|
+
"Qux/Norf/Blah:\n Foobar: true\nBuz:\n - hi"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "is a merged configuration that takes precedence into account" do
|
69
|
+
expected = {
|
70
|
+
"FitCommit::Foo::Bar" => { "Baz" => false },
|
71
|
+
"FitCommit::Qux::Norf::Blah" => { "Foobar" => true },
|
72
|
+
"FitCommit::Buz" => ["hi"]
|
73
|
+
}
|
74
|
+
assert_equal expected, global_configuration
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "fit_commit/validator_loader"
|
3
|
+
Dir[File.dirname(__FILE__) + "/validators/*.rb"].each { |file| require file }
|
4
|
+
|
5
|
+
describe FitCommit::ValidatorLoader do
|
6
|
+
let(:validators) { loader.validators }
|
7
|
+
let(:loader) { FitCommit::ValidatorLoader.new(branch_name, configuration) }
|
8
|
+
let(:branch_name) { "foo" }
|
9
|
+
let(:configuration) do
|
10
|
+
{
|
11
|
+
"FitCommit::Validators::LineLength" => { "Enabled" => false },
|
12
|
+
"FitCommit::Validators::Tense" => { "Enabled" => false },
|
13
|
+
"FitCommit::Validators::SummaryPeriod" => { "Enabled" => true },
|
14
|
+
"FitCommit::Validators::Wip" => { "Enabled" => true },
|
15
|
+
"FitCommit::Validators::Frathouse" => { "Enabled" => ["bar", /\Abaz+/] }
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "loads enabled validators" do
|
20
|
+
assert validators.any? { |v| v.is_a? FitCommit::Validators::SummaryPeriod }
|
21
|
+
assert validators.any? { |v| v.is_a? FitCommit::Validators::Wip }
|
22
|
+
end
|
23
|
+
|
24
|
+
it "doesn't load disabled validators" do
|
25
|
+
assert validators.none? { |v| v.is_a? FitCommit::Validators::LineLength }
|
26
|
+
assert validators.none? { |v| v.is_a? FitCommit::Validators::Tense }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "non-boolean options for Enabled" do
|
30
|
+
it "doesn't load validators with a non-matching string/regex Enabled values" do
|
31
|
+
assert validators.none? { |v| v.is_a? FitCommit::Validators::Frathouse }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "validator has a matching string Enabled value" do
|
35
|
+
let(:branch_name) { "bar" }
|
36
|
+
it "loads validator" do
|
37
|
+
assert validators.any? { |v| v.is_a? FitCommit::Validators::Frathouse }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "validator has a matching regex Enabled value" do
|
42
|
+
let(:branch_name) { "bazzz" }
|
43
|
+
it "loads validator" do
|
44
|
+
assert validators.any? { |v| v.is_a? FitCommit::Validators::Frathouse }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,47 +1,37 @@
|
|
1
|
-
require "
|
1
|
+
require File.expand_path "../validator_helper.rb", __FILE__
|
2
2
|
require "fit_commit/validators/frathouse"
|
3
|
+
require "fit_commit/line"
|
3
4
|
|
4
5
|
describe FitCommit::Validators::Frathouse do
|
5
|
-
let(:validator) { FitCommit::Validators::Frathouse.new(
|
6
|
+
let(:validator) { FitCommit::Validators::Frathouse.new(branch_name, config) }
|
6
7
|
let(:commit_lines) { FitCommit::Line.from_text_array(commit_msg.split("\n")) }
|
8
|
+
let(:default_config) { default_config_for("Validators/Frathouse") }
|
9
|
+
let(:config) { default_config }
|
10
|
+
let(:branch_name) { "any" }
|
7
11
|
|
8
|
-
describe "
|
9
|
-
let(:
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
assert_equal 1, validator.errors[1].size
|
15
|
-
assert_empty validator.warnings
|
16
|
-
end
|
12
|
+
describe "contains swear word" do
|
13
|
+
let(:commit_msg) { "fucking foobar" }
|
14
|
+
it "has error" do
|
15
|
+
validator.validate(commit_lines)
|
16
|
+
assert_equal 1, validator.errors[1].size
|
17
|
+
assert_empty validator.warnings
|
17
18
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
27
|
-
describe "does not contain swear words" do
|
28
|
-
let(:commit_msg) { "foo" }
|
29
|
-
it "does not have errors/warnings" do
|
30
|
-
validator.validate
|
31
|
-
assert_empty validator.errors
|
32
|
-
assert_empty validator.warnings
|
33
|
-
end
|
19
|
+
end
|
20
|
+
describe "contains swear words on multiple lines" do
|
21
|
+
let(:commit_msg) { "damn\n\nIE7 is fucking bullshit!" }
|
22
|
+
it "has 1 error per line" do
|
23
|
+
validator.validate(commit_lines)
|
24
|
+
assert_equal 1, validator.errors[1].size
|
25
|
+
assert_equal 1, validator.errors[3].size
|
26
|
+
assert_empty validator.warnings
|
34
27
|
end
|
35
28
|
end
|
36
|
-
describe "not
|
37
|
-
let(:
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
assert_empty validator.errors
|
43
|
-
assert_empty validator.warnings
|
44
|
-
end
|
29
|
+
describe "does not contain swear words" do
|
30
|
+
let(:commit_msg) { "foo" }
|
31
|
+
it "does not have errors/warnings" do
|
32
|
+
validator.validate(commit_lines)
|
33
|
+
assert_empty validator.errors
|
34
|
+
assert_empty validator.warnings
|
45
35
|
end
|
46
36
|
end
|
47
37
|
end
|
@@ -1,17 +1,19 @@
|
|
1
|
-
require "
|
1
|
+
require File.expand_path "../validator_helper.rb", __FILE__
|
2
2
|
require "fit_commit/validators/line_length"
|
3
|
+
require "fit_commit/line"
|
3
4
|
|
4
5
|
describe FitCommit::Validators::LineLength do
|
5
|
-
let(:validator) { FitCommit::Validators::LineLength.new(
|
6
|
+
let(:validator) { FitCommit::Validators::LineLength.new(branch_name, config) }
|
6
7
|
let(:commit_lines) { FitCommit::Line.from_text_array(commit_msg.split("\n")) }
|
7
|
-
|
8
|
+
let(:default_config) { default_config_for("Validators/LineLength") }
|
9
|
+
let(:config) { default_config }
|
8
10
|
let(:branch_name) { "any" }
|
9
11
|
|
10
12
|
describe "first line" do
|
11
13
|
describe "first line is empty" do
|
12
14
|
let(:commit_msg) { "\n\nbar" }
|
13
15
|
it "has error" do
|
14
|
-
validator.validate
|
16
|
+
validator.validate(commit_lines)
|
15
17
|
assert_equal 1, validator.errors[1].size
|
16
18
|
assert_empty validator.warnings
|
17
19
|
end
|
@@ -19,47 +21,52 @@ describe FitCommit::Validators::LineLength do
|
|
19
21
|
describe "first line is not empty" do
|
20
22
|
let(:commit_msg) { "foo\n\nbar" }
|
21
23
|
it "does not have error" do
|
22
|
-
validator.validate
|
24
|
+
validator.validate(commit_lines)
|
23
25
|
assert_empty validator.errors
|
24
26
|
assert_empty validator.warnings
|
25
27
|
end
|
26
28
|
end
|
27
29
|
describe "first line is over warning limit" do
|
28
|
-
let(:commit_msg)
|
29
|
-
"x" * (FitCommit::Validators::LineLength::FIRST_LINE_MAX_LENGTH + 1)
|
30
|
-
end
|
30
|
+
let(:commit_msg) { "x" * 51 }
|
31
31
|
it "has a warning" do
|
32
|
-
validator.validate
|
32
|
+
validator.validate(commit_lines)
|
33
33
|
assert_empty validator.errors
|
34
34
|
assert_equal 1, validator.warnings[1].size
|
35
35
|
end
|
36
36
|
end
|
37
37
|
describe "first line is over error limit" do
|
38
|
-
let(:commit_msg)
|
39
|
-
"x" * (FitCommit::Validators::LineLength::LINE_MAX_LENGTH + 1)
|
40
|
-
end
|
38
|
+
let(:commit_msg) { "x" * 73 }
|
41
39
|
it "has an error and no warning" do
|
42
|
-
validator.validate
|
40
|
+
validator.validate(commit_lines)
|
43
41
|
assert_equal 1, validator.errors[1].size
|
44
42
|
assert_empty validator.warnings
|
45
43
|
end
|
46
44
|
end
|
45
|
+
describe "SummaryWarnLength modified in config" do
|
46
|
+
let(:config) { default_config.merge("SummaryWarnLength" => 5) }
|
47
|
+
describe "first line is over modified warning limit" do
|
48
|
+
let(:commit_msg) { "x" * 6 }
|
49
|
+
it "has a warning" do
|
50
|
+
validator.validate(commit_lines)
|
51
|
+
assert_empty validator.errors
|
52
|
+
assert_equal 1, validator.warnings[1].size
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
47
56
|
end
|
48
57
|
describe "second line" do
|
49
58
|
describe "second line is not empty" do
|
50
59
|
let(:commit_msg) { "foo\nbar" }
|
51
60
|
it "has error" do
|
52
|
-
validator.validate
|
61
|
+
validator.validate(commit_lines)
|
53
62
|
assert_equal 1, validator.errors[2].size
|
54
63
|
assert_empty validator.warnings
|
55
64
|
end
|
56
65
|
end
|
57
66
|
describe "second line is not empty and too long" do
|
58
|
-
let(:commit_msg)
|
59
|
-
"foo\n" + ("x" * (FitCommit::Validators::LineLength::LINE_MAX_LENGTH + 1))
|
60
|
-
end
|
67
|
+
let(:commit_msg) { "foo\n" + ("x" * 73) }
|
61
68
|
it "only mentions blank error" do
|
62
|
-
validator.validate
|
69
|
+
validator.validate(commit_lines)
|
63
70
|
assert_equal 1, validator.errors[2].size
|
64
71
|
assert_match(/must be blank/, validator.errors[2][0])
|
65
72
|
assert_empty validator.warnings
|
@@ -68,7 +75,7 @@ describe FitCommit::Validators::LineLength do
|
|
68
75
|
describe "second line is empty" do
|
69
76
|
let(:commit_msg) { "foo\n\nbar" }
|
70
77
|
it "does not have error" do
|
71
|
-
validator.validate
|
78
|
+
validator.validate(commit_lines)
|
72
79
|
assert_empty validator.errors
|
73
80
|
assert_empty validator.warnings
|
74
81
|
end
|
@@ -76,7 +83,7 @@ describe FitCommit::Validators::LineLength do
|
|
76
83
|
describe "does not have a second line" do
|
77
84
|
let(:commit_msg) { "foo" }
|
78
85
|
it "does not have error" do
|
79
|
-
validator.validate
|
86
|
+
validator.validate(commit_lines)
|
80
87
|
assert_empty validator.errors
|
81
88
|
assert_empty validator.warnings
|
82
89
|
end
|
@@ -84,24 +91,47 @@ describe FitCommit::Validators::LineLength do
|
|
84
91
|
end
|
85
92
|
describe "body text" do
|
86
93
|
describe "line is over length limit" do
|
87
|
-
let(:commit_msg)
|
88
|
-
"foo\n\n" + ("x" * (FitCommit::Validators::LineLength::LINE_MAX_LENGTH + 1))
|
89
|
-
end
|
94
|
+
let(:commit_msg) { "foo\n\n" + ("x" * 73) }
|
90
95
|
it "has error" do
|
91
|
-
validator.validate
|
96
|
+
validator.validate(commit_lines)
|
92
97
|
assert_equal 1, validator.errors[3].size
|
93
98
|
assert_empty validator.warnings
|
94
99
|
end
|
95
100
|
end
|
96
|
-
describe "line is
|
97
|
-
let(:commit_msg)
|
98
|
-
|
101
|
+
describe "line is over length limit and has an URL" do
|
102
|
+
let(:commit_msg) { "foo\n\nhttps://" + ("x" * 100) }
|
103
|
+
it "does not have error" do
|
104
|
+
validator.validate(commit_lines)
|
105
|
+
assert_empty validator.errors
|
106
|
+
assert_empty validator.warnings
|
107
|
+
end
|
108
|
+
describe "AllowLongUrls modified in config" do
|
109
|
+
let(:config) { default_config.merge("AllowLongUrls" => false) }
|
110
|
+
it "has error" do
|
111
|
+
validator.validate(commit_lines)
|
112
|
+
assert_equal 1, validator.errors[3].size
|
113
|
+
assert_empty validator.warnings
|
114
|
+
end
|
99
115
|
end
|
116
|
+
end
|
117
|
+
describe "line is equal to length limit" do
|
118
|
+
let(:commit_msg) { "foo\n\n" + ("x" * 72) }
|
100
119
|
it "does not have error" do
|
101
|
-
validator.validate
|
120
|
+
validator.validate(commit_lines)
|
102
121
|
assert_empty validator.errors
|
103
122
|
assert_empty validator.warnings
|
104
123
|
end
|
105
124
|
end
|
125
|
+
describe "MaxLineLength modified in config" do
|
126
|
+
let(:config) { default_config.merge("MaxLineLength" => 5) }
|
127
|
+
describe "line is over modified limit" do
|
128
|
+
let(:commit_msg) { "foo\n\n" + ("x" * 6) }
|
129
|
+
it "has error" do
|
130
|
+
validator.validate(commit_lines)
|
131
|
+
assert_equal 1, validator.errors[3].size
|
132
|
+
assert_empty validator.warnings
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
106
136
|
end
|
107
137
|
end
|
@@ -1,15 +1,18 @@
|
|
1
|
-
require "
|
1
|
+
require File.expand_path "../validator_helper.rb", __FILE__
|
2
2
|
require "fit_commit/validators/summary_period"
|
3
|
+
require "fit_commit/line"
|
3
4
|
|
4
5
|
describe FitCommit::Validators::SummaryPeriod do
|
5
|
-
let(:validator) { FitCommit::Validators::SummaryPeriod.new(
|
6
|
+
let(:validator) { FitCommit::Validators::SummaryPeriod.new(branch_name, config) }
|
6
7
|
let(:commit_lines) { FitCommit::Line.from_text_array(commit_msg.split("\n")) }
|
8
|
+
let(:default_config) { default_config_for("Validators/SummaryPeriod") }
|
9
|
+
let(:config) { default_config }
|
7
10
|
let(:branch_name) { "any" }
|
8
11
|
|
9
12
|
describe "summary ends with period" do
|
10
13
|
let(:commit_msg) { "foo bar." }
|
11
14
|
it "has error" do
|
12
|
-
validator.validate
|
15
|
+
validator.validate(commit_lines)
|
13
16
|
assert_equal 1, validator.errors[1].size
|
14
17
|
assert_empty validator.warnings
|
15
18
|
end
|
@@ -17,7 +20,7 @@ describe FitCommit::Validators::SummaryPeriod do
|
|
17
20
|
describe "summary does not end with period" do
|
18
21
|
let(:commit_msg) { "foo bar\n\nhi." }
|
19
22
|
it "does not have errors/warnings" do
|
20
|
-
validator.validate
|
23
|
+
validator.validate(commit_lines)
|
21
24
|
assert_empty validator.errors
|
22
25
|
assert_empty validator.warnings
|
23
26
|
end
|
@@ -1,16 +1,18 @@
|
|
1
|
-
require "
|
1
|
+
require File.expand_path "../validator_helper.rb", __FILE__
|
2
2
|
require "fit_commit/validators/tense"
|
3
|
+
require "fit_commit/line"
|
3
4
|
|
4
5
|
describe FitCommit::Validators::Tense do
|
5
|
-
let(:validator) { FitCommit::Validators::Tense.new(
|
6
|
+
let(:validator) { FitCommit::Validators::Tense.new(branch_name, config) }
|
6
7
|
let(:commit_lines) { FitCommit::Line.from_text_array(commit_msg.split("\n")) }
|
7
|
-
|
8
|
-
let(:
|
8
|
+
let(:default_config) { default_config_for("Validators/Tense") }
|
9
|
+
let(:config) { default_config }
|
10
|
+
let(:branch_name) { "any" }
|
9
11
|
|
10
12
|
describe "uses incorrect tense on first line" do
|
11
13
|
let(:commit_msg) { "Changed something" }
|
12
14
|
it "has error" do
|
13
|
-
validator.validate
|
15
|
+
validator.validate(commit_lines)
|
14
16
|
assert_equal 1, validator.errors[1].size
|
15
17
|
assert_empty validator.warnings
|
16
18
|
end
|
@@ -19,7 +21,7 @@ describe FitCommit::Validators::Tense do
|
|
19
21
|
describe "uses incorrect tense on first line" do
|
20
22
|
let(:commit_msg) { "[#ticketno] Changed something" }
|
21
23
|
it "has error" do
|
22
|
-
validator.validate
|
24
|
+
validator.validate(commit_lines)
|
23
25
|
assert_equal 1, validator.errors[1].size
|
24
26
|
assert_empty validator.warnings
|
25
27
|
end
|
@@ -28,7 +30,7 @@ describe FitCommit::Validators::Tense do
|
|
28
30
|
describe "has incorrect tense after the first word" do
|
29
31
|
let(:commit_msg) { "Document fixes to bug" }
|
30
32
|
it "does not have errors/warnings" do
|
31
|
-
validator.validate
|
33
|
+
validator.validate(commit_lines)
|
32
34
|
assert_empty validator.errors
|
33
35
|
assert_empty validator.warnings
|
34
36
|
end
|
@@ -37,7 +39,7 @@ describe FitCommit::Validators::Tense do
|
|
37
39
|
describe "uses incorrect tense on a line other than first line" do
|
38
40
|
let(:commit_msg) { "Fix bug\n\nChanged something" }
|
39
41
|
it "does not have errors/warnings" do
|
40
|
-
validator.validate
|
42
|
+
validator.validate(commit_lines)
|
41
43
|
assert_empty validator.errors
|
42
44
|
assert_empty validator.warnings
|
43
45
|
end
|
data/test/validators/wip_test.rb
CHANGED
@@ -1,38 +1,28 @@
|
|
1
|
-
require "
|
1
|
+
require File.expand_path "../validator_helper.rb", __FILE__
|
2
2
|
require "fit_commit/validators/wip"
|
3
|
+
require "fit_commit/line"
|
3
4
|
|
4
5
|
describe FitCommit::Validators::Wip do
|
5
|
-
let(:validator) { FitCommit::Validators::Wip.new(
|
6
|
+
let(:validator) { FitCommit::Validators::Wip.new(branch_name, config) }
|
6
7
|
let(:commit_lines) { FitCommit::Line.from_text_array(commit_msg.split("\n")) }
|
8
|
+
let(:default_config) { default_config_for("Validators/Wip") }
|
9
|
+
let(:config) { default_config }
|
10
|
+
let(:branch_name) { "any" }
|
7
11
|
|
8
|
-
describe "
|
9
|
-
let(:
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
assert_equal 1, validator.errors[1].size
|
15
|
-
assert_empty validator.warnings
|
16
|
-
end
|
17
|
-
end
|
18
|
-
describe "does not contain WIP" do
|
19
|
-
let(:commit_msg) { "foo" }
|
20
|
-
it "does not have errors/warnings" do
|
21
|
-
validator.validate
|
22
|
-
assert_empty validator.errors
|
23
|
-
assert_empty validator.warnings
|
24
|
-
end
|
12
|
+
describe "contains WIP" do
|
13
|
+
let(:commit_msg) { "WIP foo" }
|
14
|
+
it "has error" do
|
15
|
+
validator.validate(commit_lines)
|
16
|
+
assert_equal 1, validator.errors[1].size
|
17
|
+
assert_empty validator.warnings
|
25
18
|
end
|
26
19
|
end
|
27
|
-
describe "not
|
28
|
-
let(:
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
assert_empty validator.errors
|
34
|
-
assert_empty validator.warnings
|
35
|
-
end
|
20
|
+
describe "does not contain WIP" do
|
21
|
+
let(:commit_msg) { "foo" }
|
22
|
+
it "does not have errors/warnings" do
|
23
|
+
validator.validate(commit_lines)
|
24
|
+
assert_empty validator.errors
|
25
|
+
assert_empty validator.warnings
|
36
26
|
end
|
37
27
|
end
|
38
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fit-commit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Foley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: swearjar
|
@@ -73,11 +73,13 @@ files:
|
|
73
73
|
- fit-commit.gemspec
|
74
74
|
- lib/fit_commit.rb
|
75
75
|
- lib/fit_commit/cli.rb
|
76
|
+
- lib/fit_commit/configuration_loader.rb
|
76
77
|
- lib/fit_commit/has_errors.rb
|
77
78
|
- lib/fit_commit/installer.rb
|
78
79
|
- lib/fit_commit/line.rb
|
79
80
|
- lib/fit_commit/message_parser.rb
|
80
81
|
- lib/fit_commit/runner.rb
|
82
|
+
- lib/fit_commit/validator_loader.rb
|
81
83
|
- lib/fit_commit/validators/base.rb
|
82
84
|
- lib/fit_commit/validators/frathouse.rb
|
83
85
|
- lib/fit_commit/validators/line_length.rb
|
@@ -85,13 +87,17 @@ files:
|
|
85
87
|
- lib/fit_commit/validators/tense.rb
|
86
88
|
- lib/fit_commit/validators/wip.rb
|
87
89
|
- lib/fit_commit/version.rb
|
90
|
+
- templates/config/fit_commit.default.yml
|
88
91
|
- templates/hooks/commit-msg
|
92
|
+
- test/configuration_loader_test.rb
|
89
93
|
- test/message_parser_test.rb
|
90
94
|
- test/runner_test.rb
|
95
|
+
- test/validator_loader_test.rb
|
91
96
|
- test/validators/frathouse_test.rb
|
92
97
|
- test/validators/line_length_test.rb
|
93
98
|
- test/validators/summary_period_test.rb
|
94
99
|
- test/validators/tense_test.rb
|
100
|
+
- test/validators/validator_helper.rb
|
95
101
|
- test/validators/wip_test.rb
|
96
102
|
homepage: https://github.com/m1foley/fit-commit
|
97
103
|
licenses:
|
@@ -126,11 +132,14 @@ signing_key:
|
|
126
132
|
specification_version: 4
|
127
133
|
summary: A Git hook to validate your commit messages
|
128
134
|
test_files:
|
135
|
+
- test/configuration_loader_test.rb
|
129
136
|
- test/message_parser_test.rb
|
130
137
|
- test/runner_test.rb
|
138
|
+
- test/validator_loader_test.rb
|
131
139
|
- test/validators/frathouse_test.rb
|
132
140
|
- test/validators/line_length_test.rb
|
133
141
|
- test/validators/summary_period_test.rb
|
134
142
|
- test/validators/tense_test.rb
|
143
|
+
- test/validators/validator_helper.rb
|
135
144
|
- test/validators/wip_test.rb
|
136
145
|
has_rdoc:
|