fit-commit 3.2.2 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +40 -0
- data/lib/fit_commit/configuration_loader.rb +4 -3
- data/lib/fit_commit/validator_loader.rb +14 -1
- data/lib/fit_commit/version.rb +1 -1
- data/templates/config/fit_commit.default.yml +2 -0
- data/test/integration/new_repo_test.rb +1 -1
- data/test/test_helper.rb +8 -0
- data/test/unit/configuration_loader_test.rb +18 -13
- data/test/unit/message_parser_test.rb +3 -11
- data/test/unit/runner_test.rb +8 -14
- data/test/unit/validator_loader_test.rb +44 -1
- data/test/unit/validators/validator_helper.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c1962d7ad212ab2d64654448e4ec61fa069636f
|
4
|
+
data.tar.gz: c8942246016315fa610507e5e07ecb978caa4563
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fa212d38361178174a815e1c26f899d4691c71d7bbb01b42a01397bda93db1a574b66ef591bc01d61bf7e6954834d39349e52cd111c8c6a7905c42c1e55d4bb
|
7
|
+
data.tar.gz: 503e76de5b61998831d17a5d47c9da2166597c390f120fe8963b12fe94a9e840f5db25b891380a363bbc3f324ad2309bbcc7a59065c0b11579984938968dea1f
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -82,6 +82,46 @@ Validators/Bar:
|
|
82
82
|
- !ruby/regexp /\Afoo.+bar/
|
83
83
|
```
|
84
84
|
|
85
|
+
## Adding custom validators
|
86
|
+
|
87
|
+
Create your custom validator as a `FitCommit::Validators::Base` subclass:
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
module FitCommit
|
91
|
+
module Validators
|
92
|
+
class MyCustomValidator < Base
|
93
|
+
def validate_line(lineno, text)
|
94
|
+
if text =~ /sneak peak/i
|
95
|
+
add_error(lineno, "I think you mean 'sneak peek'.")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
```
|
102
|
+
|
103
|
+
`Require` the file and enable the validator in your config:
|
104
|
+
|
105
|
+
```yaml
|
106
|
+
FitCommit:
|
107
|
+
Require:
|
108
|
+
- somedir/my_custom_validator.rb
|
109
|
+
Validators/MyCustomValidator:
|
110
|
+
Enabled: true
|
111
|
+
```
|
112
|
+
|
113
|
+
You can also publish your validator as a gem, and require it that way:
|
114
|
+
|
115
|
+
```yaml
|
116
|
+
FitCommit:
|
117
|
+
Require:
|
118
|
+
- my-custom-validator-gem
|
119
|
+
Validators/MyCustomValidator:
|
120
|
+
Enabled: true
|
121
|
+
```
|
122
|
+
|
123
|
+
If others might find your validator useful, submit it as a Pull Request. If it's not useful for everyone, it can be disabled by default.
|
124
|
+
|
85
125
|
## FAQ
|
86
126
|
|
87
127
|
### Can Fit Commit run in all my repos without having to install it each time?
|
@@ -45,7 +45,7 @@ module FitCommit
|
|
45
45
|
|
46
46
|
def read_config(path)
|
47
47
|
load_yaml(path).each_with_object({}) do |(key, value), config|
|
48
|
-
translated_key =
|
48
|
+
translated_key = translate_config_key(key)
|
49
49
|
config[translated_key] = value
|
50
50
|
end
|
51
51
|
end
|
@@ -57,8 +57,9 @@ module FitCommit
|
|
57
57
|
raise e, "Error parsing config file: #{e.message}"
|
58
58
|
end
|
59
59
|
|
60
|
-
def
|
61
|
-
|
60
|
+
def translate_config_key(config_key)
|
61
|
+
return config_key unless config_key.include?("/")
|
62
|
+
"FitCommit::" + config_key.gsub("/", "::")
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
@@ -19,12 +19,25 @@ module FitCommit
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def all_validators
|
22
|
-
|
22
|
+
require_all_validators
|
23
23
|
FitCommit::Validators::Base.all.map do |validator_class|
|
24
24
|
validator_class.new(branch_name, config_for(validator_class))
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
def require_all_validators
|
29
|
+
paths = Dir[File.dirname(__FILE__) + "/validators/*.rb"] + custom_requires
|
30
|
+
paths.each { |file| require file }
|
31
|
+
end
|
32
|
+
|
33
|
+
def custom_requires
|
34
|
+
Array(global_settings["Require"])
|
35
|
+
end
|
36
|
+
|
37
|
+
def global_settings
|
38
|
+
configuration["FitCommit"] || {}
|
39
|
+
end
|
40
|
+
|
28
41
|
def config_for(validator_class)
|
29
42
|
configuration[validator_class.name] || {}
|
30
43
|
end
|
data/lib/fit_commit/version.rb
CHANGED
data/test/test_helper.rb
ADDED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
require "fit_commit/configuration_loader"
|
3
3
|
|
4
4
|
describe FitCommit::ConfigurationLoader do
|
@@ -24,13 +24,6 @@ describe FitCommit::ConfigurationLoader do
|
|
24
24
|
end
|
25
25
|
end
|
26
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
27
|
describe "no configuration files present" do
|
35
28
|
let(:system_file) { nil }
|
36
29
|
let(:user_file) { nil }
|
@@ -41,7 +34,7 @@ describe FitCommit::ConfigurationLoader do
|
|
41
34
|
|
42
35
|
describe "just one configuration file present" do
|
43
36
|
let(:system_file) { nil }
|
44
|
-
let(:user_file) {
|
37
|
+
let(:user_file) { create_tempfile("user_file", user_file_content) }
|
45
38
|
let(:user_file_content) do
|
46
39
|
"Foo/Bar:\n Baz: false\nQux/Norf/Blah:\n - !ruby/regexp /\\Afoo/"
|
47
40
|
end
|
@@ -53,23 +46,35 @@ describe FitCommit::ConfigurationLoader do
|
|
53
46
|
}
|
54
47
|
assert_equal expected, global_configuration
|
55
48
|
end
|
49
|
+
|
50
|
+
describe "has a non-validation key" do
|
51
|
+
let(:user_file_content) do
|
52
|
+
"FitCommit:\n Require:\n - foo/bar"
|
53
|
+
end
|
54
|
+
it "doesn't try to namespace the key" do
|
55
|
+
expected = {
|
56
|
+
"FitCommit" => { "Require" => ["foo/bar"] }
|
57
|
+
}
|
58
|
+
assert_equal expected, global_configuration
|
59
|
+
end
|
60
|
+
end
|
56
61
|
end
|
57
62
|
|
58
63
|
describe "multiple configuration files present" do
|
59
|
-
let(:system_file) {
|
60
|
-
let(:user_file) {
|
64
|
+
let(:system_file) { create_tempfile("system_file", system_file_content) }
|
65
|
+
let(:user_file) { create_tempfile("user_file", user_file_content) }
|
61
66
|
let(:system_file_content) do
|
62
67
|
"Foo/Bar:\n Baz: false\nQux/Norf/Blah:\n Foobar:\n - !ruby/regexp /\\Afoo/\n Booyah: false"
|
63
68
|
end
|
64
69
|
let(:user_file_content) do
|
65
|
-
"Qux/Norf/Blah:\n Foobar: true\
|
70
|
+
"Qux/Norf/Blah:\n Foobar: true\nAbc/Buz:\n - hi"
|
66
71
|
end
|
67
72
|
|
68
73
|
it "is a merged configuration that takes precedence into account" do
|
69
74
|
expected = {
|
70
75
|
"FitCommit::Foo::Bar" => { "Baz" => false },
|
71
76
|
"FitCommit::Qux::Norf::Blah" => { "Foobar" => true, "Booyah" => false },
|
72
|
-
"FitCommit::Buz" => ["hi"]
|
77
|
+
"FitCommit::Abc::Buz" => ["hi"]
|
73
78
|
}
|
74
79
|
assert_equal expected, global_configuration
|
75
80
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
require "fit_commit/message_parser"
|
3
3
|
|
4
4
|
describe FitCommit::MessageParser do
|
@@ -6,16 +6,8 @@ describe FitCommit::MessageParser do
|
|
6
6
|
commit_msg_file.unlink
|
7
7
|
end
|
8
8
|
|
9
|
-
let(:commit_msg_file)
|
10
|
-
|
11
|
-
f.write(commit_msg)
|
12
|
-
f.close
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
let(:lines) do
|
17
|
-
FitCommit::MessageParser.new(commit_msg_file.path).lines
|
18
|
-
end
|
9
|
+
let(:commit_msg_file) { create_tempfile("test-commit-msg", commit_msg) }
|
10
|
+
let(:lines) { FitCommit::MessageParser.new(commit_msg_file.path).lines }
|
19
11
|
|
20
12
|
describe "empty commit msg" do
|
21
13
|
let(:commit_msg) { "" }
|
data/test/unit/runner_test.rb
CHANGED
@@ -1,23 +1,11 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
require "fit_commit/runner"
|
3
3
|
|
4
4
|
describe FitCommit::Runner do
|
5
5
|
after do
|
6
6
|
commit_msg_file.unlink
|
7
7
|
end
|
8
|
-
|
9
|
-
def call_runner
|
10
|
-
exit_code = runner.run
|
11
|
-
stderr.rewind
|
12
|
-
exit_code
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:commit_msg_file) do
|
16
|
-
Tempfile.new("test-commit-msg").tap do |f|
|
17
|
-
f.write(commit_msg)
|
18
|
-
f.close
|
19
|
-
end
|
20
|
-
end
|
8
|
+
let(:commit_msg_file) { create_tempfile("test-commit-msg", commit_msg) }
|
21
9
|
let(:stderr) { StringIO.new }
|
22
10
|
let(:stdin) { StringIO.new }
|
23
11
|
let(:branch_name) { "any" }
|
@@ -25,6 +13,12 @@ describe FitCommit::Runner do
|
|
25
13
|
FitCommit::Runner.new(commit_msg_file.path, branch_name, stderr, stdin)
|
26
14
|
end
|
27
15
|
|
16
|
+
def call_runner
|
17
|
+
exit_code = runner.run
|
18
|
+
stderr.rewind
|
19
|
+
exit_code
|
20
|
+
end
|
21
|
+
|
28
22
|
describe "empty commit msg" do
|
29
23
|
let(:commit_msg) { "" }
|
30
24
|
it "allows commit without printing to stderr" do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "test_helper"
|
2
2
|
require "fit_commit/validator_loader"
|
3
3
|
Dir[File.dirname(__FILE__) + "/validators/*.rb"].each { |file| require file }
|
4
4
|
|
@@ -64,4 +64,47 @@ describe FitCommit::ValidatorLoader do
|
|
64
64
|
assert validators.none? { |v| v.is_a? FitCommit::Validators::Frathouse }
|
65
65
|
end
|
66
66
|
end
|
67
|
+
|
68
|
+
describe "custom validators required" do
|
69
|
+
after do
|
70
|
+
custom_validator_file.unlink
|
71
|
+
end
|
72
|
+
|
73
|
+
let(:custom_validator_file) do
|
74
|
+
create_tempfile(["my_custom_validator", ".rb"], custom_validator_code)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Not actually subclassing FitCommit::Validators::Base because
|
78
|
+
# that affects the loaded validators for other tests.
|
79
|
+
let(:custom_validator_code) do
|
80
|
+
<<-EOF
|
81
|
+
class MyCustomValidator
|
82
|
+
attr_accessor :config
|
83
|
+
def initialize(_branch_name, config)
|
84
|
+
self.config = config
|
85
|
+
end
|
86
|
+
def enabled?
|
87
|
+
config.fetch("Enabled")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
EOF
|
91
|
+
end
|
92
|
+
|
93
|
+
let(:configuration) do
|
94
|
+
all_disabled_configuration.merge(
|
95
|
+
"FitCommit" => { "Require" => [custom_validator_file.path] },
|
96
|
+
"MyCustomValidator" => { "Enabled" => true }
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "loads enabled custom validator" do
|
101
|
+
# stub which will be overridden when the custom validator file is loaded
|
102
|
+
MyCustomValidator = Class.new
|
103
|
+
|
104
|
+
FitCommit::Validators::Base.stub(:all, [MyCustomValidator]) do
|
105
|
+
assert_equal 1, validators.size
|
106
|
+
assert validators.first.is_a?(MyCustomValidator)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
67
110
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fit-commit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Foley
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- templates/config/fit_commit.default.yml
|
92
92
|
- templates/hooks/commit-msg
|
93
93
|
- test/integration/new_repo_test.rb
|
94
|
+
- test/test_helper.rb
|
94
95
|
- test/unit/configuration_loader_test.rb
|
95
96
|
- test/unit/message_parser_test.rb
|
96
97
|
- test/unit/runner_test.rb
|
@@ -136,6 +137,7 @@ specification_version: 4
|
|
136
137
|
summary: A Git hook to validate your commit messages
|
137
138
|
test_files:
|
138
139
|
- test/integration/new_repo_test.rb
|
140
|
+
- test/test_helper.rb
|
139
141
|
- test/unit/configuration_loader_test.rb
|
140
142
|
- test/unit/message_parser_test.rb
|
141
143
|
- test/unit/runner_test.rb
|