Skip to content

Commit 63f2581

Browse files
refactor: reorganize code base
* rename allRules to defaultRules * rename allFormatters to defaultFormatters * rename GetRules to GetEnabledRules * move config utils to config.go * move linter utils to lint.go * update test files
1 parent e007af6 commit 63f2581

File tree

7 files changed

+164
-176
lines changed

7 files changed

+164
-176
lines changed

config/config.go

Lines changed: 72 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,22 @@
22
package config
33

44
import (
5+
"bufio"
6+
"errors"
57
"fmt"
68
"os"
79
"path/filepath"
810

9-
"github.com/conventionalcommit/commitlint/formatter"
11+
"gopkg.in/yaml.v3"
12+
1013
"github.com/conventionalcommit/commitlint/lint"
11-
"github.com/conventionalcommit/commitlint/rule"
1214
)
1315

1416
const (
1517
// ConfFileName represent config file name
1618
ConfFileName = "commitlint.yaml"
1719
)
1820

19-
var allFormatters = []lint.Formatter{
20-
&formatter.DefaultFormatter{},
21-
&formatter.JSONFormatter{},
22-
}
23-
24-
var allRules = []lint.Rule{
25-
&rule.BodyMinLenRule{},
26-
&rule.BodyMaxLenRule{},
27-
28-
&rule.FooterMinLenRule{},
29-
&rule.FooterMaxLenRule{},
30-
31-
&rule.HeadMaxLenRule{},
32-
&rule.HeadMinLenRule{},
33-
34-
&rule.TypeEnumRule{},
35-
&rule.ScopeEnumRule{},
36-
37-
&rule.BodyMaxLineLenRule{},
38-
&rule.FooterMaxLineLenRule{},
39-
40-
&rule.TypeCharsetRule{},
41-
&rule.ScopeCharsetRule{},
42-
43-
&rule.TypeMaxLenRule{},
44-
&rule.ScopeMaxLenRule{},
45-
&rule.DescriptionMaxLenRule{},
46-
47-
&rule.TypeMinLenRule{},
48-
&rule.ScopeMinLenRule{},
49-
&rule.DescriptionMinLenRule{},
50-
}
51-
5221
// GetConfig returns conf
5322
func GetConfig(flagConfPath string) (*lint.Config, error) {
5423
confFilePath, useDefault, err := GetConfigPath(flagConfPath)
@@ -93,48 +62,86 @@ func GetConfigPath(confFilePath string) (string, bool, error) {
9362
return filepath.Clean(confFilePath), false, nil
9463
}
9564

96-
// GetFormatter returns the formatter as defined in conf
97-
func GetFormatter(c *lint.Config) (lint.Formatter, error) {
98-
for _, f := range allFormatters {
99-
if f.Name() == c.Formatter {
100-
return f, nil
101-
}
65+
// Parse parse Config from given file
66+
func Parse(confPath string) (*lint.Config, error) {
67+
confBytes, err := os.ReadFile(confPath)
68+
if err != nil {
69+
return nil, err
10270
}
103-
return nil, fmt.Errorf("%s formatter not found", c.Formatter)
71+
72+
conf := &lint.Config{}
73+
err = yaml.Unmarshal(confBytes, conf)
74+
if err != nil {
75+
return nil, err
76+
}
77+
78+
err = Validate(conf)
79+
if err != nil {
80+
return nil, fmt.Errorf("config error: %w", err)
81+
}
82+
return conf, nil
10483
}
10584

106-
// GetRules forms Rule object for rules which are enabled in config
107-
func GetRules(conf *lint.Config) ([]lint.Rule, error) {
108-
// rules lookup map
109-
rulesMap := map[string]lint.Rule{}
110-
for _, r := range allRules {
111-
rulesMap[r.Name()] = r
85+
// Validate parses Config from given data
86+
func Validate(conf *lint.Config) error {
87+
if conf.Formatter == "" {
88+
return errors.New("formatter is empty")
11289
}
11390

114-
enabledRules := make([]lint.Rule, 0, len(conf.Rules))
91+
// Check Severity Level of rule config
92+
for ruleName, r := range conf.Rules {
93+
switch r.Severity {
94+
case lint.SeverityError:
95+
case lint.SeverityWarn:
96+
default:
97+
return fmt.Errorf("unknown severity level '%s' for rule '%s'", r.Severity, ruleName)
98+
}
99+
}
100+
101+
return nil
102+
}
115103

116-
for ruleName, ruleConfig := range conf.Rules {
117-
r, ok := rulesMap[ruleName]
118-
if !ok {
119-
return nil, fmt.Errorf("unknown rule: %s", ruleName)
104+
// DefaultConfToFile writes default config to given file
105+
func DefaultConfToFile(isOnlyEnabled bool) error {
106+
outPath := filepath.Join(".", filepath.Clean(ConfFileName))
107+
if isOnlyEnabled {
108+
confClone := &lint.Config{
109+
Formatter: defConf.Formatter,
110+
Rules: map[string]lint.RuleConfig{},
120111
}
121-
if ruleConfig.Enabled {
122-
err := r.Apply(ruleConfig.Argument, ruleConfig.Flags)
123-
if err != nil {
124-
return nil, err
112+
113+
for ruleName, r := range defConf.Rules {
114+
if r.Enabled {
115+
confClone.Rules[ruleName] = r
125116
}
126-
enabledRules = append(enabledRules, r)
127117
}
128-
}
129118

130-
return enabledRules, nil
119+
return WriteConfToFile(outPath, confClone)
120+
}
121+
return WriteConfToFile(outPath, defConf)
131122
}
132123

133-
// GetLinter returns Linter for given confFilePath
134-
func GetLinter(conf *lint.Config) (*lint.Linter, error) {
135-
rules, err := GetRules(conf)
124+
// WriteConfToFile util func to write config object to given file
125+
func WriteConfToFile(outFilePath string, conf *lint.Config) (retErr error) {
126+
file, err := os.Create(outFilePath)
136127
if err != nil {
137-
return nil, err
128+
return err
138129
}
139-
return lint.NewLinter(conf, rules)
130+
defer func() {
131+
err1 := file.Close()
132+
if retErr == nil && err1 != nil {
133+
retErr = err1
134+
}
135+
}()
136+
137+
w := bufio.NewWriter(file)
138+
defer func() {
139+
err1 := w.Flush()
140+
if retErr == nil && err1 != nil {
141+
retErr = err1
142+
}
143+
}()
144+
145+
enc := yaml.NewEncoder(w)
146+
return enc.Encode(conf)
140147
}

config/config_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package config
22

33
import "testing"
44

5-
func TestAllRules(t *testing.T) {
5+
func TestDefaultRules(t *testing.T) {
66
var m = make(map[string]struct{})
7-
for _, r := range allRules {
7+
for _, r := range defaultRules {
88
_, ok := m[r.Name()]
99
if ok {
1010
t.Errorf("error: %s rule name already exists", r.Name())
@@ -13,9 +13,9 @@ func TestAllRules(t *testing.T) {
1313
}
1414
}
1515

16-
func TestAllFormatters(t *testing.T) {
16+
func TestDefaultFormatters(t *testing.T) {
1717
var m = make(map[string]struct{})
18-
for _, r := range allFormatters {
18+
for _, r := range defaultFormatters {
1919
_, ok := m[r.Name()]
2020
if ok {
2121
t.Errorf("error: %s formatter name already exists", r.Name())

config/default.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,36 @@ var defConf = &lint.Config{
142142
},
143143
},
144144
}
145+
146+
var defaultFormatters = []lint.Formatter{
147+
&formatter.DefaultFormatter{},
148+
&formatter.JSONFormatter{},
149+
}
150+
151+
var defaultRules = []lint.Rule{
152+
&rule.BodyMinLenRule{},
153+
&rule.BodyMaxLenRule{},
154+
155+
&rule.FooterMinLenRule{},
156+
&rule.FooterMaxLenRule{},
157+
158+
&rule.HeadMaxLenRule{},
159+
&rule.HeadMinLenRule{},
160+
161+
&rule.TypeEnumRule{},
162+
&rule.ScopeEnumRule{},
163+
164+
&rule.BodyMaxLineLenRule{},
165+
&rule.FooterMaxLineLenRule{},
166+
167+
&rule.TypeCharsetRule{},
168+
&rule.ScopeCharsetRule{},
169+
170+
&rule.TypeMaxLenRule{},
171+
&rule.ScopeMaxLenRule{},
172+
&rule.DescriptionMaxLenRule{},
173+
174+
&rule.TypeMinLenRule{},
175+
&rule.ScopeMinLenRule{},
176+
&rule.DescriptionMinLenRule{},
177+
}

config/default_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ func TestDefaultLint(t *testing.T) {
1212
}
1313

1414
func TestDefaultConf(t *testing.T) {
15-
if len(allRules) != len(defConf.Rules) {
16-
t.Error("default conf does not have all rules", len(allRules), len(defConf.Rules))
15+
if len(defaultRules) != len(defConf.Rules) {
16+
t.Error("default conf does not have all rules", len(defaultRules), len(defConf.Rules))
1717
return
1818
}
1919
}

config/lint.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package config
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/conventionalcommit/commitlint/lint"
7+
)
8+
9+
// GetLinter returns Linter for given confFilePath
10+
func GetLinter(conf *lint.Config) (*lint.Linter, error) {
11+
rules, err := GetEnabledRules(conf)
12+
if err != nil {
13+
return nil, err
14+
}
15+
return lint.NewLinter(conf, rules)
16+
}
17+
18+
// GetFormatter returns the formatter as defined in conf
19+
func GetFormatter(c *lint.Config) (lint.Formatter, error) {
20+
for _, f := range defaultFormatters {
21+
if f.Name() == c.Formatter {
22+
return f, nil
23+
}
24+
}
25+
return nil, fmt.Errorf("%s formatter not found", c.Formatter)
26+
}
27+
28+
// GetEnabledRules forms Rule object for rules which are enabled in config
29+
func GetEnabledRules(conf *lint.Config) ([]lint.Rule, error) {
30+
// rules lookup map
31+
rulesMap := map[string]lint.Rule{}
32+
for _, r := range defaultRules {
33+
rulesMap[r.Name()] = r
34+
}
35+
36+
enabledRules := make([]lint.Rule, 0, len(conf.Rules))
37+
38+
for ruleName, ruleConfig := range conf.Rules {
39+
r, ok := rulesMap[ruleName]
40+
if !ok {
41+
return nil, fmt.Errorf("unknown rule: %s", ruleName)
42+
}
43+
if ruleConfig.Enabled {
44+
err := r.Apply(ruleConfig.Argument, ruleConfig.Flags)
45+
if err != nil {
46+
return nil, err
47+
}
48+
enabledRules = append(enabledRules, r)
49+
}
50+
}
51+
52+
return enabledRules, nil
53+
}

config/parse.go

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)