Skip to content

Commit f4a5a0c

Browse files
creating default pylint if no configuration found
1 parent 5ab42dc commit f4a5a0c

File tree

4 files changed

+236
-75
lines changed

4 files changed

+236
-75
lines changed

cmd/init.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,12 @@ func buildRepositoryConfigurationFiles(token string) error {
202202
log.Fatal(err)
203203
}
204204
fmt.Println("Pylint configuration created based on Codacy settings")
205+
} else {
206+
err = createDefaultPylintConfigFile()
207+
if err != nil {
208+
log.Fatal(err)
209+
}
210+
fmt.Println("Default Pylint configuration created")
205211
}
206212

207213
return nil
@@ -281,6 +287,11 @@ func createPylintConfigFile(config types.ToolConfiguration) error {
281287
return nil
282288
}
283289

290+
func createDefaultPylintConfigFile() error {
291+
pylintConfigurationString := pylint.GeneratePylintRCDefault()
292+
return os.WriteFile(".pylintrc", []byte(pylintConfigurationString), 0644)
293+
}
294+
284295
// createTrivyConfigFile creates a trivy.yaml configuration file based on the API configuration
285296
func createTrivyConfigFile(config types.ToolConfiguration) error {
286297
// Convert ToolConfiguration to tools.ToolConfiguration

tools/pylint/pylintConfigParser.go

Lines changed: 88 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -7,115 +7,128 @@ import (
77
"strings"
88
)
99

10-
// GeneratePylintRC generates a pylintrc file content with the specified patterns enabled
11-
func GeneratePylintRC(config types.ToolConfiguration) string {
12-
var rcContent strings.Builder
10+
// getDefaultParametersForPatterns returns a map of pattern IDs to their default parameters
11+
func getDefaultParametersForPatterns(patternIDs []string) map[string][]types.ParameterConfiguration {
12+
defaultParams := make(map[string][]types.ParameterConfiguration)
13+
14+
for _, patternID := range patternIDs {
15+
if params, exists := PatternDefaultParameters[patternID]; exists {
16+
defaultParams[patternID] = params
17+
}
18+
}
19+
20+
return defaultParams
21+
}
1322

14-
// Write header
23+
// writePylintRCHeader writes the common header sections to the RC content
24+
func writePylintRCHeader(rcContent *strings.Builder) {
1525
rcContent.WriteString("[MASTER]\n")
1626
rcContent.WriteString("ignore=CVS\n")
1727
rcContent.WriteString("persistent=yes\n")
1828
rcContent.WriteString("load-plugins=\n\n")
19-
20-
// Disable all patterns by default
2129
rcContent.WriteString("[MESSAGES CONTROL]\n")
2230
rcContent.WriteString("disable=all\n")
31+
}
2332

24-
// Collect all enabled pattern IDs and their parameters
25-
var enabledPatternsIds []string
26-
patternParams := make(map[string]map[string]string)
27-
28-
// Only process patterns if the tool is enabled
29-
if config.IsEnabled {
30-
for _, pattern := range config.Patterns {
31-
patternID := extractPatternId(pattern.InternalId)
32-
enabledPatternsIds = append(enabledPatternsIds, patternID)
33-
34-
// Store parameters for this pattern
35-
params := make(map[string]string)
36-
for _, param := range pattern.Parameters {
37-
params[param.Name] = param.Value
38-
}
39-
patternParams[patternID] = params
40-
}
41-
}
42-
43-
// Write all enabled patterns in a single line
44-
if len(enabledPatternsIds) > 0 {
45-
rcContent.WriteString(fmt.Sprintf("enable=%s\n", strings.Join(enabledPatternsIds, ",")))
33+
// writeEnabledPatterns writes the enabled patterns section to the RC content
34+
func writeEnabledPatterns(rcContent *strings.Builder, patternIDs []string) {
35+
if len(patternIDs) > 0 {
36+
rcContent.WriteString(fmt.Sprintf("enable=%s\n", strings.Join(patternIDs, ",")))
4637
}
4738
rcContent.WriteString("\n")
39+
}
4840

49-
// Group parameters by section
50-
groupedParams := groupParametersBySection(config)
51-
52-
// Write parameters for each section
41+
// writeParametersBySection writes the parameters grouped by section to the RC content
42+
func writeParametersBySection(rcContent *strings.Builder, groupedParams map[string][]types.PylintPatternParameterConfiguration) {
5343
for sectionName, params := range groupedParams {
5444
rcContent.WriteString(fmt.Sprintf("[%s]\n", sectionName))
5545
for _, param := range params {
56-
value := param.Value
57-
if value == "" {
58-
// If no value is set, use default from PatternDefaultParameters
59-
if defaultParams, ok := PatternDefaultParameters[extractPatternId(param.Name)]; ok {
60-
for _, defaultParam := range defaultParams {
61-
if defaultParam.Name == param.Name {
62-
value = defaultParam.Value
63-
break
64-
}
65-
}
66-
}
67-
}
68-
rcContent.WriteString(fmt.Sprintf("%s=%s\n", param.Name, value))
46+
rcContent.WriteString(fmt.Sprintf("%s=%s\n", param.Name, param.Value))
6947
}
7048
rcContent.WriteString("\n")
7149
}
72-
73-
return rcContent.String()
7450
}
7551

76-
// groupParametersBySection groups parameters by their section name
77-
func groupParametersBySection(config types.ToolConfiguration) map[string][]types.PylintPatternParameterConfiguration {
78-
// Initialize the result map
52+
// groupParametersByPatterns groups parameters from patterns into sections
53+
func groupParametersByPatterns(patterns []types.PatternConfiguration) map[string][]types.PylintPatternParameterConfiguration {
7954
groupedParams := make(map[string][]types.PylintPatternParameterConfiguration)
8055

81-
// Iterate through each pattern
82-
for _, pattern := range config.Patterns {
83-
// Get parameters to process - either from the pattern or from defaults
84-
if len(pattern.Parameters) == 0 {
85-
// If no parameters, check defaults
86-
patternID := extractPatternId(pattern.InternalId)
87-
pattern.Parameters = PatternDefaultParameters[patternID]
88-
}
56+
for _, pattern := range patterns {
57+
patternID := extractPatternId(pattern.InternalId)
58+
params := pattern.Parameters
8959

90-
// Convert pattern parameters to PylintPatternParameterConfiguration
91-
parameters := make([]types.PylintPatternParameterConfiguration, len(pattern.Parameters))
92-
for i, param := range pattern.Parameters {
93-
parameters[i] = types.PylintPatternParameterConfiguration{
94-
Name: param.Name,
95-
Value: param.Value,
96-
SectionName: GetParameterSection(param.Name),
97-
}
60+
// If no parameters, check defaults
61+
if len(params) == 0 {
62+
params = PatternDefaultParameters[patternID]
9863
}
9964

100-
// Process all parameters (either from pattern or defaults)
101-
for _, param := range parameters {
102-
// Skip parameters without a section name
103-
if param.SectionName == nil {
65+
for _, param := range params {
66+
sectionName := GetParameterSection(param.Name)
67+
if sectionName == nil {
10468
log.Printf("Parameter %s has no section name", param.Name)
10569
continue
10670
}
10771

108-
// Get the section name
109-
sectionName := *param.SectionName
110-
111-
// Add the parameter to the appropriate section
112-
groupedParams[sectionName] = append(groupedParams[sectionName], param)
72+
groupedParams[*sectionName] = append(groupedParams[*sectionName], types.PylintPatternParameterConfiguration{
73+
Name: param.Name,
74+
Value: param.Value,
75+
SectionName: sectionName,
76+
})
11377
}
11478
}
11579

11680
return groupedParams
11781
}
11882

83+
func GeneratePylintRCDefault() string {
84+
var rcContent strings.Builder
85+
86+
writePylintRCHeader(&rcContent)
87+
writeEnabledPatterns(&rcContent, DefaultPatterns)
88+
89+
// Get default parameters for enabled patterns
90+
defaultParams := getDefaultParametersForPatterns(DefaultPatterns)
91+
92+
// Convert default parameters to pattern configurations
93+
var patterns []types.PatternConfiguration
94+
for patternID, params := range defaultParams {
95+
patterns = append(patterns, types.PatternConfiguration{
96+
InternalId: "PyLintPython3_" + patternID,
97+
Parameters: params,
98+
})
99+
}
100+
101+
// Group and write parameters
102+
groupedParams := groupParametersByPatterns(patterns)
103+
writeParametersBySection(&rcContent, groupedParams)
104+
105+
return rcContent.String()
106+
}
107+
108+
// GeneratePylintRC generates a pylintrc file content with the specified patterns enabled
109+
func GeneratePylintRC(config types.ToolConfiguration) string {
110+
var rcContent strings.Builder
111+
112+
writePylintRCHeader(&rcContent)
113+
114+
// Collect enabled pattern IDs
115+
var enabledPatternsIds []string
116+
if config.IsEnabled {
117+
for _, pattern := range config.Patterns {
118+
patternID := extractPatternId(pattern.InternalId)
119+
enabledPatternsIds = append(enabledPatternsIds, patternID)
120+
}
121+
}
122+
123+
writeEnabledPatterns(&rcContent, enabledPatternsIds)
124+
125+
// Group and write parameters
126+
groupedParams := groupParametersByPatterns(config.Patterns)
127+
writeParametersBySection(&rcContent, groupedParams)
128+
129+
return rcContent.String()
130+
}
131+
119132
// extractPatternId returns the part of the pattern ID after the underscore
120133
// For example: "PyLintPython3_C0301" -> "C0301"
121134
func extractPatternId(fullID string) string {
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package pylint
2+
3+
// DefaultPatterns contains the list of default Pylint patterns
4+
var DefaultPatterns = []string{
5+
"C0123",
6+
"C0200",
7+
"C0303",
8+
"E0100",
9+
"E0101",
10+
"E0102",
11+
"E0103",
12+
"E0104",
13+
"E0105",
14+
"E0106",
15+
"E0107",
16+
"E0108",
17+
"E0110",
18+
"E0112",
19+
"E0113",
20+
"E0114",
21+
"E0115",
22+
"E0116",
23+
"E0117",
24+
"E0202",
25+
"E0203",
26+
"E0211",
27+
"E0236",
28+
"E0238",
29+
"E0239",
30+
"E0240",
31+
"E0241",
32+
"E0301",
33+
"E0302",
34+
"E0601",
35+
"E0603",
36+
"E0604",
37+
"E0701",
38+
"E0702",
39+
"E0703",
40+
"E0704",
41+
"E0710",
42+
"E0711",
43+
"E0712",
44+
"E1003",
45+
"E1102",
46+
"E1111",
47+
"E1120",
48+
"E1121",
49+
"E1123",
50+
"E1124",
51+
"E1125",
52+
"E1126",
53+
"E1127",
54+
"E1132",
55+
"E1200",
56+
"E1201",
57+
"E1205",
58+
"E1206",
59+
"E1300",
60+
"E1301",
61+
"E1302",
62+
"E1303",
63+
"E1304",
64+
"E1305",
65+
"E1306",
66+
"R0201",
67+
"R0202",
68+
"R0203",
69+
"W0101",
70+
"W0102",
71+
"W0104",
72+
"W0105",
73+
"W0106",
74+
"W0107",
75+
"W0108",
76+
"W0109",
77+
"W0120",
78+
"W0122",
79+
"W0124",
80+
"W0150",
81+
"W0199",
82+
"W0221",
83+
"W0222",
84+
"W0233",
85+
"W0404",
86+
"W0410",
87+
"W0601",
88+
"W0602",
89+
"W0604",
90+
"W0611",
91+
"W0612",
92+
"W0622",
93+
"W0623",
94+
"W0702",
95+
"W0705",
96+
"W0711",
97+
"W1300",
98+
"W1301",
99+
"W1302",
100+
"W1303",
101+
"W1305",
102+
"W1306",
103+
"W1307",
104+
}

tools/pylint/test/pylintConfigParser_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"codacy/cli-v2/tools/pylint"
55
"codacy/cli-v2/tools/types"
66
"encoding/json"
7+
"fmt"
8+
"strings"
79
"testing"
810

911
"github.com/stretchr/testify/assert"
@@ -295,3 +297,34 @@ func TestGeneratePylintRCFromTestData(t *testing.T) {
295297
// Verify specific pattern with parameters
296298
assert.Contains(t, rcContent, "max-line-length=125")
297299
}
300+
301+
func TestGeneratePylintRCDefault(t *testing.T) {
302+
rcContent := pylint.GeneratePylintRCDefault()
303+
304+
// Print the generated content for inspection
305+
fmt.Println("Generated Pylint RC Content:")
306+
fmt.Println(rcContent)
307+
308+
// Basic validation
309+
if rcContent == "" {
310+
t.Error("Generated RC content is empty")
311+
}
312+
313+
// Check for required sections
314+
requiredSections := []string{"[MASTER]", "[MESSAGES CONTROL]"}
315+
for _, section := range requiredSections {
316+
if !strings.Contains(rcContent, section) {
317+
t.Errorf("Missing required section: %s", section)
318+
}
319+
}
320+
321+
// Check if default patterns are enabled
322+
if !strings.Contains(rcContent, "enable=") {
323+
t.Error("Missing enable line")
324+
}
325+
326+
// Check if any parameters are present
327+
if !strings.Contains(rcContent, "=") {
328+
t.Error("No parameters found in the configuration")
329+
}
330+
}

0 commit comments

Comments
 (0)