Skip to content

Commit 66c17c5

Browse files
feature: Replace hardcoded tool language mappings with API-driven configuration [PLUTO-1430] (#155)
feature: Replace hardcoded tool language mappings with API-driven configuration Remove static DefaultToolLanguageMap with 60+ hardcoded entries Integrate /api/v3/tools and /api/v3/languages/tools APIs Separate remote/local mode logic for cleaner architecture Eliminate code duplication between API functions Enhance repository language detection for remote mode Remove special treatment for trivy and codacy-enigma-cli Update all integration tests to match API-driven behavior BREAKING: Language configurations now require API access BENEFIT: Always up-to-date mappings, no manual maintenance needed Closes: PLUTO-1430
1 parent 1e42bda commit 66c17c5

File tree

11 files changed

+452
-224
lines changed

11 files changed

+452
-224
lines changed

cmd/analyze.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"codacy/cli-v2/tools"
88
"codacy/cli-v2/tools/lizard"
99
reviveTool "codacy/cli-v2/tools/revive"
10+
"codacy/cli-v2/utils/logger"
1011
"encoding/json"
1112
"fmt"
1213
"log"
@@ -18,6 +19,7 @@ import (
1819

1920
codacyclient "codacy/cli-v2/codacy-client"
2021

22+
"github.com/sirupsen/logrus"
2123
"github.com/spf13/cobra"
2224
"gopkg.in/yaml.v3"
2325
)
@@ -373,6 +375,9 @@ func runTool(workDirectory string, toolName string, pathsToCheck []string, outpu
373375
func validatePaths(paths []string) error {
374376
for _, path := range paths {
375377
if _, err := os.Stat(path); os.IsNotExist(err) {
378+
logger.Error("Analysis failed because path does not exist", logrus.Fields{
379+
"path": path,
380+
})
376381
return fmt.Errorf("❌ Error: cannot find file or directory '%s'", path)
377382
}
378383
}

cmd/configsetup/setup.go

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
"codacy/cli-v2/tools/pylint"
1919
reviveTool "codacy/cli-v2/tools/revive"
2020
"codacy/cli-v2/utils"
21+
22+
"gopkg.in/yaml.v3"
2123
)
2224

2325
// Configuration file names - extracted as constants to avoid duplication
@@ -194,33 +196,24 @@ func (r *reviveConfigCreator) GetConfigFileName() string { return "revive.toml"
194196
func (r *reviveConfigCreator) GetToolName() string { return "Revive" }
195197

196198
func CreateLanguagesConfigFileLocal(toolsConfigDir string) error {
197-
content := `tools:
198-
- name: pylint
199-
languages: [Python]
200-
extensions: [.py]
201-
- name: eslint
202-
languages: [JavaScript, TypeScript, JSX, TSX]
203-
extensions: [.js, .jsx, .ts, .tsx]
204-
- name: pmd
205-
languages: [Java, JavaScript, JSP, Velocity, XML, Apex, Scala, Ruby, VisualForce]
206-
extensions: [.java, .js, .jsp, .vm, .xml, .cls, .trigger, .scala, .rb, .page, .component]
207-
- name: trivy
208-
languages: [Multiple]
209-
extensions: []
210-
- name: dartanalyzer
211-
languages: [Dart]
212-
extensions: [.dart]
213-
- name: lizard
214-
languages: [C, CPP, Java, "C#", JavaScript, TypeScript, VueJS, "Objective-C", Swift, Python, Ruby, "TTCN-3", PHP, Scala, GDScript, Golang, Lua, Rust, Fortran, Kotlin, Solidity, Erlang, Zig, Perl]
215-
extensions: [.c, .cpp, .cc, .h, .hpp, .java, .cs, .js, .jsx, .ts, .tsx, .vue, .m, .swift, .py, .rb, .ttcn, .php, .scala, .gd, .go, .lua, .rs, .f, .f90, .kt, .sol, .erl, .zig, .pl]
216-
- name: semgrep
217-
languages: [C, CPP, "C#", Generic, Go, Java, JavaScript, JSON, Kotlin, Python, TypeScript, Ruby, Rust, JSX, PHP, Scala, Swift, Terraform]
218-
extensions: [.c, .cpp, .h, .hpp, .cs, .go, .java, .js, .json, .kt, .py, .ts, .rb, .rs, .jsx, .php, .scala, .swift, .tf, .tfvars]
219-
- name: codacy-enigma-cli
220-
languages: [Multiple]
221-
extensions: []`
222-
223-
return writeConfigFile(filepath.Join(toolsConfigDir, LanguagesConfigFileName), []byte(content))
199+
// Build tool language configurations from API
200+
configTools, err := tools.BuildLanguagesConfigFromAPI()
201+
if err != nil {
202+
return fmt.Errorf("failed to build languages config from API: %w", err)
203+
}
204+
205+
// Create the config structure
206+
config := domain.LanguagesConfig{
207+
Tools: configTools,
208+
}
209+
210+
// Marshal to YAML
211+
data, err := yaml.Marshal(config)
212+
if err != nil {
213+
return fmt.Errorf("failed to marshal languages config to YAML: %w", err)
214+
}
215+
216+
return writeConfigFile(filepath.Join(toolsConfigDir, LanguagesConfigFileName), data)
224217
}
225218

226219
func CreateGitIgnoreFile() error {
@@ -441,19 +434,19 @@ func BuildRepositoryConfigurationFiles(flags domain.InitFlags) error {
441434

442435
logVersionConflicts(familyToVersions, toolsWithLatestVersion)
443436

444-
// Generate languages configuration based on API tools response
437+
// Create main config files with all enabled API tools (including cli-config.yaml)
438+
if err := CreateConfigurationFiles(toolsWithLatestVersion, false); err != nil {
439+
return err
440+
}
441+
442+
// Generate languages configuration based on API tools response (after cli-config.yaml is created)
445443
if err := tools.CreateLanguagesConfigFile(toolsWithLatestVersion, toolsConfigDir, uuidToName, flags); err != nil {
446444
return fmt.Errorf("failed to create languages configuration file: %w", err)
447445
}
448446

449447
// Filter out any tools that use configuration file
450448
configuredToolsWithUI := tools.FilterToolsByConfigUsage(toolsWithLatestVersion)
451449

452-
// Create main config files with all enabled API tools
453-
if err := CreateConfigurationFiles(toolsWithLatestVersion, false); err != nil {
454-
return err
455-
}
456-
457450
// Generate config files for tools not using their own config file
458451
return createToolConfigurationFiles(configuredToolsWithUI, flags)
459452
}

codacy-client/client.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,26 @@ func GetRepositoryTools(initFlags domain.InitFlags) ([]domain.Tool, error) {
211211
return nil, err
212212
}
213213

214+
// Get global tools with languages to populate the Languages field
215+
globalTools, err := GetToolsVersions()
216+
if err != nil {
217+
fmt.Printf("Warning: Failed to get global tools for languages: %v\n", err)
218+
return toolsResponse.Data, nil // Return repository tools without languages
219+
}
220+
221+
// Create a map of UUID to languages from global tools
222+
uuidToLanguages := make(map[string][]string)
223+
for _, globalTool := range globalTools {
224+
uuidToLanguages[globalTool.Uuid] = globalTool.Languages
225+
}
226+
227+
// Populate Languages field in repository tools
228+
for i := range toolsResponse.Data {
229+
if languages, exists := uuidToLanguages[toolsResponse.Data[i].Uuid]; exists {
230+
toolsResponse.Data[i].Languages = languages
231+
}
232+
}
233+
214234
return toolsResponse.Data, nil
215235
}
216236

@@ -253,3 +273,21 @@ func GetRepositoryLanguages(initFlags domain.InitFlags) ([]domain.Language, erro
253273

254274
return languagesResponse.Languages, nil
255275
}
276+
277+
// GetLanguageTools fetches the default language file extensions from the API
278+
func GetLanguageTools() ([]domain.LanguageTool, error) {
279+
baseURL := fmt.Sprintf("%s/api/v3/languages/tools", CodacyApiBase)
280+
281+
bodyResponse, err := getRequest(baseURL, "")
282+
if err != nil {
283+
return nil, fmt.Errorf("failed to get language tools: %w", err)
284+
}
285+
286+
var languageToolsResponse domain.LanguageToolsResponse
287+
err = json.Unmarshal(bodyResponse, &languageToolsResponse)
288+
if err != nil {
289+
return nil, fmt.Errorf("failed to unmarshal language tools response: %w", err)
290+
}
291+
292+
return languageToolsResponse.Data, nil
293+
}

domain/language.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@ type LanguagesResponse struct {
1414
Languages []Language `json:"languages"`
1515
}
1616

17+
// LanguageTool represents a language tool with its file extensions from the API
18+
type LanguageTool struct {
19+
Name string `json:"name"`
20+
FileExtensions []string `json:"fileExtensions"`
21+
}
22+
23+
// LanguageToolsResponse represents the structure of the language tools API response
24+
type LanguageToolsResponse struct {
25+
Data []LanguageTool `json:"data"`
26+
}
27+
1728
// ToolLanguageInfo contains language and extension information for a tool
1829
type ToolLanguageInfo struct {
1930
Name string `yaml:"name"`

domain/tool.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ type ToolsResponse struct {
77

88
// Tool represents a tool in the Codacy API
99
type Tool struct {
10-
Uuid string `json:"uuid"`
11-
Name string `json:"name"`
12-
Version string `json:"version"`
13-
ShortName string `json:"shortName"`
14-
Prefix string `json:"prefix"`
10+
Uuid string `json:"uuid"`
11+
Name string `json:"name"`
12+
Version string `json:"version"`
13+
ShortName string `json:"shortName"`
14+
Prefix string `json:"prefix"`
15+
Languages []string `json:"languages"`
1516
Settings struct {
1617
Enabled bool `json:"isEnabled"`
1718
HasConfigurationFile bool `json:"hasConfigurationFile"`

integration-tests/config-discover/expected/codacy.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ tools:
1010
1111
1212
13+
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
tools:
2-
- name: codacy-enigma-cli
3-
languages: [Multiple]
4-
extensions: []
52
- name: dartanalyzer
63
languages: [Dart]
74
extensions: [.dart]
85
- name: eslint
9-
languages: [JavaScript, TypeScript, JSX, TSX]
10-
extensions: [.js, .jsx, .ts, .tsx]
6+
languages: [Javascript, TypeScript]
7+
extensions: [.js, .jsm, .jsx, .mjs, .ts, .tsx, .vue]
118
- name: lizard
12-
languages: [C, CPP, Java, C#, JavaScript, TypeScript, VueJS, Objective-C, Swift, Python, Ruby, TTCN-3, PHP, Scala, GDScript, Golang, Lua, Rust, Fortran, Kotlin, Solidity, Erlang, Zig, Perl]
13-
extensions: [.c, .cpp, .cc, .h, .hpp, .java, .cs, .js, .jsx, .ts, .tsx, .vue, .m, .swift, .py, .rb, .ttcn, .php, .scala, .gd, .go, .lua, .rs, .f, .f90, .kt, .sol, .erl, .zig, .pl]
9+
languages: [C, CPP, CSharp, Erlang, Fortran, Go, Java, Javascript, Kotlin, Lua, Objective C, PHP, Python, Ruby, Rust, Scala, Solidity, Swift, TypeScript]
10+
extensions: [.c, .cc, .cpp, .cs, .cxx, .gemspec, .go, .h, .hpp, .ino, .java, .jbuilder, .js, .jsm, .jsx, .kt, .kts, .m, .mjs, .opal, .php, .podspec, .py, .rake, .rb, .rlib, .rs, .scala, .swift, .ts, .tsx, .vue]
1411
- name: pmd
15-
languages: [Java, JavaScript, JSP, Velocity, XML, Apex, Scala, Ruby, VisualForce]
16-
extensions: [.java, .js, .jsp, .vm, .xml, .cls, .trigger, .scala, .rb, .page, .component]
12+
languages: [Apex, JSP, Java, Javascript, PLSQL, SQL, Velocity, VisualForce, XML]
13+
extensions: [.cls, .component, .fnc, .java, .js, .jsm, .jsp, .jsx, .mjs, .page, .pck, .pkb, .pkh, .pks, .plb, .pld, .plh, .pls, .pom, .prc, .sql, .tpb, .tps, .trg, .trigger, .tyb, .typ, .vm, .vue, .wsdl, .xml, .xsl]
1714
- name: pylint
1815
languages: [Python]
1916
extensions: [.py]
17+
- name: revive
18+
languages: [Go]
19+
extensions: [.go]
2020
- name: semgrep
21-
languages: [C, CPP, C#, Generic, Go, Java, JavaScript, JSON, Kotlin, Python, TypeScript, Ruby, Rust, JSX, PHP, Scala, Swift, Terraform]
22-
extensions: [.c, .cpp, .h, .hpp, .cs, .go, .java, .js, .json, .kt, .py, .ts, .rb, .rs, .jsx, .php, .scala, .swift, .tf, .tfvars]
21+
languages: [Apex, C, CPP, CSharp, Dockerfile, Go, Java, Javascript, Kotlin, PHP, PLSQL, Python, Ruby, Rust, SQL, Scala, Shell, Swift, Terraform, TypeScript, YAML]
22+
extensions: [.bash, .c, .cc, .cls, .cpp, .cs, .cxx, .dockerfile, .fnc, .gemspec, .go, .h, .hpp, .ino, .java, .jbuilder, .js, .jsm, .jsx, .kt, .kts, .mjs, .opal, .pck, .php, .pkb, .pkh, .pks, .plb, .pld, .plh, .pls, .podspec, .prc, .py, .rake, .rb, .rlib, .rs, .scala, .sh, .sql, .swift, .tf, .tpb, .tps, .trg, .trigger, .ts, .tsx, .tyb, .typ, .vue, .yaml, .yml]
2323
- name: trivy
24-
languages: [Multiple]
25-
extensions: []
24+
languages: [C, CPP, CSharp, Dart, Dockerfile, Elixir, Go, JSON, Java, Javascript, PHP, Python, Ruby, Rust, Scala, Swift, Terraform, TypeScript, XML, YAML]
25+
extensions: [.c, .cc, .cpp, .cs, .cxx, .dart, .dockerfile, .ex, .exs, .gemspec, .go, .h, .hpp, .ino, .java, .jbuilder, .js, .jsm, .json, .jsx, .mjs, .opal, .php, .podspec, .pom, .py, .rake, .rb, .rlib, .rs, .scala, .swift, .tf, .ts, .tsx, .vue, .wsdl, .xml, .xsl, .yaml, .yml]
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
tools:
2-
- name: pylint
3-
languages: [Python]
4-
extensions: [.py]
2+
- name: eslint
3+
languages: [Javascript]
4+
extensions: [.js, .jsm, .jsx, .mjs, .vue]
55
- name: lizard
6-
languages: [Java, JavaScript, Python]
6+
languages: [Java, Javascript, Python]
77
extensions: [.java, .js, .jsm, .jsx, .mjs, .py, .vue]
88
- name: pmd
9-
languages: [Java, JavaScript]
9+
languages: [Java, Javascript]
1010
extensions: [.java, .js, .jsm, .jsx, .mjs, .vue]
11-
- name: eslint
12-
languages: [JavaScript]
13-
extensions: [.js, .jsm, .jsx, .mjs, .vue]
14-
- name: trivy
15-
languages: [Multiple]
16-
extensions: []
11+
- name: pylint
12+
languages: [Python]
13+
extensions: [.py]
1714
- name: semgrep
18-
languages: [Java, JavaScript, JSON, Python]
19-
extensions: [.java, .js, .jsm, .json, .jsx, .mjs, .py, .vue]
15+
languages: [Java, Javascript, Python]
16+
extensions: [.java, .js, .jsm, .jsx, .mjs, .py, .vue]
17+
- name: trivy
18+
languages: [JSON, Java, Javascript, Python]
19+
extensions: [.java, .js, .jsm, .json, .jsx, .mjs, .py, .vue]
Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
tools:
2-
- name: pylint
3-
languages: [Python]
4-
extensions: [.py]
5-
- name: eslint
6-
languages: [JavaScript, TypeScript, JSX, TSX]
7-
extensions: [.js, .jsx, .ts, .tsx]
8-
- name: pmd
9-
languages: [Java, JavaScript, JSP, Velocity, XML, Apex, Scala, Ruby, VisualForce]
10-
extensions: [.java, .js, .jsp, .vm, .xml, .cls, .trigger, .scala, .rb, .page, .component]
11-
- name: trivy
12-
languages: [Multiple]
13-
extensions: []
142
- name: dartanalyzer
153
languages: [Dart]
164
extensions: [.dart]
5+
- name: eslint
6+
languages: [Javascript, TypeScript]
7+
extensions: [.js, .jsm, .jsx, .mjs, .ts, .tsx, .vue]
178
- name: lizard
18-
languages: [C, CPP, Java, "C#", JavaScript, TypeScript, VueJS, "Objective-C", Swift, Python, Ruby, "TTCN-3", PHP, Scala, GDScript, Golang, Lua, Rust, Fortran, Kotlin, Solidity, Erlang, Zig, Perl]
19-
extensions: [.c, .cpp, .cc, .h, .hpp, .java, .cs, .js, .jsx, .ts, .tsx, .vue, .m, .swift, .py, .rb, .ttcn, .php, .scala, .gd, .go, .lua, .rs, .f, .f90, .kt, .sol, .erl, .zig, .pl]
9+
languages: [C, CPP, CSharp, Erlang, Fortran, Go, Java, Javascript, Kotlin, Lua, Objective C, PHP, Python, Ruby, Rust, Scala, Solidity, Swift, TypeScript]
10+
extensions: [.c, .cc, .cpp, .cs, .cxx, .gemspec, .go, .h, .hpp, .ino, .java, .jbuilder, .js, .jsm, .jsx, .kt, .kts, .m, .mjs, .opal, .php, .podspec, .py, .rake, .rb, .rlib, .rs, .scala, .swift, .ts, .tsx, .vue]
11+
- name: pmd
12+
languages: [Apex, JSP, Java, Javascript, PLSQL, SQL, Velocity, VisualForce, XML]
13+
extensions: [.cls, .component, .fnc, .java, .js, .jsm, .jsp, .jsx, .mjs, .page, .pck, .pkb, .pkh, .pks, .plb, .pld, .plh, .pls, .pom, .prc, .sql, .tpb, .tps, .trg, .trigger, .tyb, .typ, .vm, .vue, .wsdl, .xml, .xsl]
14+
- name: pylint
15+
languages: [Python]
16+
extensions: [.py]
17+
- name: revive
18+
languages: [Go]
19+
extensions: [.go]
2020
- name: semgrep
21-
languages: [C, CPP, "C#", Generic, Go, Java, JavaScript, JSON, Kotlin, Python, TypeScript, Ruby, Rust, JSX, PHP, Scala, Swift, Terraform]
22-
extensions: [.c, .cpp, .h, .hpp, .cs, .go, .java, .js, .json, .kt, .py, .ts, .rb, .rs, .jsx, .php, .scala, .swift, .tf, .tfvars]
23-
- name: codacy-enigma-cli
24-
languages: [Multiple]
25-
extensions: []
21+
languages: [Apex, C, CPP, CSharp, Dockerfile, Go, Java, Javascript, Kotlin, PHP, PLSQL, Python, Ruby, Rust, SQL, Scala, Shell, Swift, Terraform, TypeScript, YAML]
22+
extensions: [.bash, .c, .cc, .cls, .cpp, .cs, .cxx, .dockerfile, .fnc, .gemspec, .go, .h, .hpp, .ino, .java, .jbuilder, .js, .jsm, .jsx, .kt, .kts, .mjs, .opal, .pck, .php, .pkb, .pkh, .pks, .plb, .pld, .plh, .pls, .podspec, .prc, .py, .rake, .rb, .rlib, .rs, .scala, .sh, .sql, .swift, .tf, .tpb, .tps, .trg, .trigger, .ts, .tsx, .tyb, .typ, .vue, .yaml, .yml]
23+
- name: trivy
24+
languages: [C, CPP, CSharp, Dart, Dockerfile, Elixir, Go, JSON, Java, Javascript, PHP, Python, Ruby, Rust, Scala, Swift, Terraform, TypeScript, XML, YAML]
25+
extensions: [.c, .cc, .cpp, .cs, .cxx, .dart, .dockerfile, .ex, .exs, .gemspec, .go, .h, .hpp, .ino, .java, .jbuilder, .js, .jsm, .json, .jsx, .mjs, .opal, .php, .podspec, .pom, .py, .rake, .rb, .rlib, .rs, .scala, .swift, .tf, .ts, .tsx, .vue, .wsdl, .xml, .xsl, .yaml, .yml]

0 commit comments

Comments
 (0)