Skip to content

Commit 8b8ccfc

Browse files
feat(config)!: new config format
new config format makes it easy to control enabled rules and severity levels for each rule * rename RuleConfig to RuleSettings
1 parent b681031 commit 8b8ccfc

File tree

5 files changed

+160
-146
lines changed

5 files changed

+160
-146
lines changed

config/config.go

+23-5
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,28 @@ func Validate(conf *lint.Config) []error {
6262
}
6363
}
6464

65-
for ruleName, r := range conf.Rules {
65+
// Check Severity Level
66+
if !isSeverityValid(conf.Severity.Default) {
67+
errs = append(errs, fmt.Errorf("unknown default severity level '%s'", conf.Severity.Default))
68+
}
69+
70+
for ruleName, sev := range conf.Severity.Rules {
6671
// Check Severity Level of rule config
67-
switch r.Severity {
68-
case lint.SeverityError, lint.SeverityWarn:
69-
default:
70-
errs = append(errs, fmt.Errorf("unknown severity level '%s' for rule '%s'", r.Severity, ruleName))
72+
if !isSeverityValid(sev) {
73+
errs = append(errs, fmt.Errorf("unknown default severity level '%s' for rule '%s'", ruleName, sev))
74+
}
75+
}
76+
77+
for _, ruleName := range conf.Rules {
78+
// Check if rule is registered
79+
_, ok := registry.GetRule(ruleName)
80+
if !ok {
81+
errs = append(errs, fmt.Errorf("unknown rule '%s'", ruleName))
82+
continue
7183
}
84+
}
7285

86+
for ruleName, r := range conf.Settings {
7387
// Check if rule is registered
7488
ruleData, ok := registry.GetRule(ruleName)
7589
if !ok {
@@ -133,3 +147,7 @@ func checkIfMinVersion(versionNo string) error {
133147
}
134148
return fmt.Errorf("min version required is %s. you have %s.\nupgrade commitlint", versionNo, internal.Version())
135149
}
150+
151+
func isSeverityValid(s lint.Severity) bool {
152+
return s == lint.SeverityError || s == lint.SeverityWarn
153+
}

config/default.go

+101-122
Original file line numberDiff line numberDiff line change
@@ -9,151 +9,130 @@ import (
99

1010
// Default returns default config
1111
func Default() *lint.Config {
12-
def := &lint.Config{
13-
MinVersion: internal.Version(),
12+
// Enabled Rules
13+
rules := []string{
14+
(&rule.HeadMinLenRule{}).Name(),
15+
(&rule.HeadMaxLenRule{}).Name(),
16+
(&rule.BodyMaxLineLenRule{}).Name(),
17+
(&rule.FooterMaxLineLenRule{}).Name(),
18+
(&rule.TypeEnumRule{}).Name(),
19+
}
1420

15-
Formatter: (&formatter.DefaultFormatter{}).Name(),
21+
// Severity Levels
22+
severity := lint.SeverityConfig{
23+
Default: lint.SeverityError,
24+
}
1625

17-
Rules: map[string]lint.RuleConfig{
18-
// Header Min Len Rule
19-
(&rule.HeadMinLenRule{}).Name(): {
20-
Enabled: true,
21-
Severity: lint.SeverityError,
22-
Argument: 10,
23-
},
26+
// Default Rule Settings
27+
settings := map[string]lint.RuleSetting{
28+
// Header Min Len Rule
29+
(&rule.HeadMinLenRule{}).Name(): {
30+
Argument: 10,
31+
},
2432

25-
// Header Max Len Rule
26-
(&rule.HeadMaxLenRule{}).Name(): {
27-
Enabled: true,
28-
Severity: lint.SeverityError,
29-
Argument: 50,
30-
},
33+
// Header Max Len Rule
34+
(&rule.HeadMaxLenRule{}).Name(): {
35+
Argument: 50,
36+
},
3137

32-
// Body Max Line Rule
33-
(&rule.BodyMaxLineLenRule{}).Name(): {
34-
Enabled: true,
35-
Severity: lint.SeverityError,
36-
Argument: 72,
37-
},
38+
// Body Max Line Rule
39+
(&rule.BodyMaxLineLenRule{}).Name(): {
40+
Argument: 72,
41+
},
3842

39-
// Footer Max Line Rule
40-
(&rule.FooterMaxLineLenRule{}).Name(): {
41-
Enabled: true,
42-
Severity: lint.SeverityError,
43-
Argument: 72,
44-
},
43+
// Footer Max Line Rule
44+
(&rule.FooterMaxLineLenRule{}).Name(): {
45+
Argument: 72,
46+
},
4547

46-
// Types Enum Rule
47-
(&rule.TypeEnumRule{}).Name(): {
48-
Enabled: true,
49-
Severity: lint.SeverityError,
50-
Argument: []interface{}{
51-
"feat", "fix", "docs", "style", "refactor", "perf",
52-
"test", "build", "ci", "chore", "revert",
53-
},
48+
// Types Enum Rule
49+
(&rule.TypeEnumRule{}).Name(): {
50+
Argument: []interface{}{
51+
"feat", "fix", "docs", "style", "refactor", "perf",
52+
"test", "build", "ci", "chore", "revert",
5453
},
54+
},
5555

56-
// Scope Enum Rule
57-
(&rule.ScopeEnumRule{}).Name(): {
58-
Enabled: false,
59-
Severity: lint.SeverityError,
60-
Argument: []interface{}{},
61-
Flags: map[string]interface{}{
62-
"allow-empty": true,
63-
},
56+
// Scope Enum Rule
57+
(&rule.ScopeEnumRule{}).Name(): {
58+
Argument: []interface{}{},
59+
Flags: map[string]interface{}{
60+
"allow-empty": true,
6461
},
62+
},
6563

66-
// Body Min Len Rule
67-
(&rule.BodyMinLenRule{}).Name(): {
68-
Enabled: false,
69-
Severity: lint.SeverityError,
70-
Argument: 0,
71-
},
64+
// Body Min Len Rule
65+
(&rule.BodyMinLenRule{}).Name(): {
66+
Argument: 0,
67+
},
7268

73-
// Body Max Len Rule
74-
(&rule.BodyMaxLenRule{}).Name(): {
75-
Enabled: false,
76-
Severity: lint.SeverityError,
77-
Argument: -1,
78-
},
69+
// Body Max Len Rule
70+
(&rule.BodyMaxLenRule{}).Name(): {
71+
Argument: -1,
72+
},
7973

80-
// Footer Min Len Rule
81-
(&rule.FooterMinLenRule{}).Name(): {
82-
Enabled: false,
83-
Severity: lint.SeverityError,
84-
Argument: 0,
85-
},
74+
// Footer Min Len Rule
75+
(&rule.FooterMinLenRule{}).Name(): {
76+
Argument: 0,
77+
},
8678

87-
// Footer Max Len Rule
88-
(&rule.FooterMaxLenRule{}).Name(): {
89-
Enabled: false,
90-
Severity: lint.SeverityError,
91-
Argument: -1,
92-
},
79+
// Footer Max Len Rule
80+
(&rule.FooterMaxLenRule{}).Name(): {
81+
Argument: -1,
82+
},
9383

94-
// Type Min Len Rule
95-
(&rule.TypeMinLenRule{}).Name(): {
96-
Enabled: false,
97-
Severity: lint.SeverityError,
98-
Argument: 0,
99-
},
84+
// Type Min Len Rule
85+
(&rule.TypeMinLenRule{}).Name(): {
86+
Argument: 0,
87+
},
10088

101-
// Type Max Len Rule
102-
(&rule.TypeMaxLenRule{}).Name(): {
103-
Enabled: false,
104-
Severity: lint.SeverityError,
105-
Argument: -1,
106-
},
89+
// Type Max Len Rule
90+
(&rule.TypeMaxLenRule{}).Name(): {
91+
Argument: -1,
92+
},
10793

108-
// Scope Min Len Rule
109-
(&rule.ScopeMinLenRule{}).Name(): {
110-
Enabled: false,
111-
Severity: lint.SeverityError,
112-
Argument: 0,
113-
},
94+
// Scope Min Len Rule
95+
(&rule.ScopeMinLenRule{}).Name(): {
96+
Argument: 0,
97+
},
11498

115-
// Scope Max Len Rule
116-
(&rule.ScopeMaxLenRule{}).Name(): {
117-
Enabled: false,
118-
Severity: lint.SeverityError,
119-
Argument: -1,
120-
},
99+
// Scope Max Len Rule
100+
(&rule.ScopeMaxLenRule{}).Name(): {
101+
Argument: -1,
102+
},
121103

122-
// Description Min Len Rule
123-
(&rule.DescriptionMinLenRule{}).Name(): {
124-
Enabled: false,
125-
Severity: lint.SeverityError,
126-
Argument: 0,
127-
},
104+
// Description Min Len Rule
105+
(&rule.DescriptionMinLenRule{}).Name(): {
106+
Argument: 0,
107+
},
128108

129-
// Description Max Len Rule
130-
(&rule.DescriptionMaxLenRule{}).Name(): {
131-
Enabled: false,
132-
Severity: lint.SeverityError,
133-
Argument: -1,
134-
},
109+
// Description Max Len Rule
110+
(&rule.DescriptionMaxLenRule{}).Name(): {
111+
Argument: -1,
112+
},
135113

136-
// Type Charset Rule
137-
(&rule.TypeCharsetRule{}).Name(): {
138-
Enabled: false,
139-
Severity: lint.SeverityError,
140-
Argument: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
141-
},
114+
// Type Charset Rule
115+
(&rule.TypeCharsetRule{}).Name(): {
116+
Argument: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
117+
},
142118

143-
// Scope Charset Rule
144-
(&rule.ScopeCharsetRule{}).Name(): {
145-
Enabled: false,
146-
Severity: lint.SeverityError,
147-
Argument: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/,",
148-
},
119+
// Scope Charset Rule
120+
(&rule.ScopeCharsetRule{}).Name(): {
121+
Argument: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/,",
122+
},
149123

150-
// Footer Enum Rule
151-
(&rule.FooterEnumRule{}).Name(): {
152-
Enabled: false,
153-
Severity: lint.SeverityError,
154-
Argument: []interface{}{},
155-
},
124+
// Footer Enum Rule
125+
(&rule.FooterEnumRule{}).Name(): {
126+
Argument: []interface{}{},
156127
},
157128
}
129+
130+
def := &lint.Config{
131+
MinVersion: internal.Version(),
132+
Formatter: (&formatter.DefaultFormatter{}).Name(),
133+
Rules: rules,
134+
Severity: severity,
135+
Settings: settings,
136+
}
158137
return def
159138
}

config/lint.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func NewLinter(conf *lint.Config) (*lint.Linter, error) {
1818
if err != nil {
1919
return nil, err
2020
}
21+
2122
return lint.New(conf, rules)
2223
}
2324

@@ -39,19 +40,20 @@ func GetFormatter(conf *lint.Config) (lint.Formatter, error) {
3940
func GetEnabledRules(conf *lint.Config) ([]lint.Rule, error) {
4041
enabledRules := make([]lint.Rule, 0, len(conf.Rules))
4142

42-
for ruleName, ruleConfig := range conf.Rules {
43+
for _, ruleName := range conf.Rules {
4344
// Checking if rule is registered
4445
// before checking if rule is enabled
4546
r, ok := registry.GetRule(ruleName)
4647
if !ok {
4748
return nil, fmt.Errorf("config error: '%s' rule not found", ruleName)
4849
}
4950

50-
if !ruleConfig.Enabled {
51-
continue
51+
rConf, ok := conf.Settings[ruleName]
52+
if !ok {
53+
return nil, fmt.Errorf("config error: '%s' rule settings not found", ruleName)
5254
}
5355

54-
err := r.Apply(ruleConfig.Argument, ruleConfig.Flags)
56+
err := r.Apply(rConf.Argument, rConf.Flags)
5557
if err != nil {
5658
return nil, fmt.Errorf("config error: %v", err)
5759
}

lint/config.go

+28-13
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package lint
22

3-
// RuleConfig represent config for a rule
4-
type RuleConfig struct {
5-
Enabled bool `yaml:"enabled"`
6-
7-
Severity Severity `yaml:"severity"`
8-
9-
Argument interface{} `yaml:"argument"`
3+
// RuleSetting represent config for a rule
4+
type RuleSetting struct {
5+
Argument interface{} `yaml:"argument"`
6+
Flags map[string]interface{} `yaml:"flags,omitempty"`
7+
}
108

11-
// Flags are optional key value pairs
12-
Flags map[string]interface{} `yaml:"flags"`
9+
// SeverityConfig represent severity levels for rules
10+
type SeverityConfig struct {
11+
Default Severity `yaml:"default"`
12+
Rules map[string]Severity `yaml:"rules,omitempty"`
1313
}
1414

1515
// Config represent linter config
@@ -21,11 +21,26 @@ type Config struct {
2121
// Formatter of the lint result
2222
Formatter string `yaml:"formatter"`
2323

24-
// Rules is rule name to rule config map
25-
Rules map[string]RuleConfig `yaml:"rules"`
24+
// Enabled Rules
25+
Rules []string `yaml:"rules"`
26+
27+
// Severity
28+
Severity SeverityConfig `yaml:"severity"`
29+
30+
// Settings is rule name to rule settings
31+
Settings map[string]RuleSetting `yaml:"settings"`
2632
}
2733

2834
// GetRule returns RuleConfig for given rule name
29-
func (c *Config) GetRule(ruleName string) RuleConfig {
30-
return c.Rules[ruleName]
35+
func (c *Config) GetRule(ruleName string) RuleSetting {
36+
return c.Settings[ruleName]
37+
}
38+
39+
// GetSeverity returns Severity for given ruleName
40+
func (c *Config) GetSeverity(ruleName string) Severity {
41+
s, ok := c.Severity.Rules[ruleName]
42+
if ok {
43+
return s
44+
}
45+
return c.Severity.Default
3146
}

lint/linter.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ func (l *Linter) LintCommit(msg *Commit) (*Failure, error) {
3838

3939
for _, rule := range l.rules {
4040
currentRule := rule
41-
ruleConf := l.conf.GetRule(currentRule.Name())
42-
ruleRes, isValid := l.runRule(currentRule, ruleConf.Severity, msg)
41+
severity := l.conf.GetSeverity(currentRule.Name())
42+
ruleRes, isValid := l.runRule(currentRule, severity, msg)
4343
if !isValid {
4444
res.add(ruleRes)
4545
}

0 commit comments

Comments
 (0)