From 592e1167fd9589524581ad2f0b9f9c229afd0ecb Mon Sep 17 00:00:00 2001 From: Sourya Vatsyayan Date: Mon, 4 Aug 2025 12:08:48 +0530 Subject: [PATCH 1/3] fix: make enabled optional in .deepsource.toml Signed-off-by: Sourya Vatsyayan --- .deepsource.toml | 5 +---- configvalidator/analyzer_config_validator.go | 14 ++++++------ configvalidator/config_validator.go | 16 +++++++++++++- configvalidator/config_validator_test.go | 22 +++++++++++++++++++ .../transformer_config_validator.go | 9 ++------ configvalidator/types.go | 4 ++-- 6 files changed, 49 insertions(+), 21 deletions(-) diff --git a/.deepsource.toml b/.deepsource.toml index bf4cd148..6bbcd066 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -2,15 +2,12 @@ version = 1 [[analyzers]] name = "go" -enabled = true [analyzers.meta] import_path = "github.com/deepsourcelabs/cli" [[analyzers]] name = "secrets" -enabled = true [[analyzers]] -name = "test-coverage" -enabled = true \ No newline at end of file +name = "test-coverage" \ No newline at end of file diff --git a/configvalidator/analyzer_config_validator.go b/configvalidator/analyzer_config_validator.go index 31ce254f..3d2c78e7 100644 --- a/configvalidator/analyzer_config_validator.go +++ b/configvalidator/analyzer_config_validator.go @@ -24,15 +24,14 @@ func (c *ConfigValidator) validateAnalyzersConfig() { c.pushError(fmt.Sprintf("Value of `analyzers` should be an array. Found: %v", analyzersType)) } - // Enabled must be boolean. And atleast one analyzer must be enabled among all mentioned in config + // Count enabled analyzers (missing enabled field defaults to true) countEnabled := 0 for _, analyzer := range c.Config.Analyzers { - enabledType := reflect.TypeOf(analyzer.Enabled).Kind().String() - if enabledType != "bool" { - c.pushError(fmt.Sprintf("The `enabled` property should be of boolean type. Found: %v", enabledType)) - } + // If enabled is not set (nil), consider it as enabled (true) + // If enabled is set, use its value + isEnabled := analyzer.Enabled == nil || *analyzer.Enabled - if analyzer.Enabled { + if isEnabled { countEnabled++ } } @@ -47,7 +46,8 @@ func (c *ConfigValidator) validateAnalyzersConfig() { if analyzer.Name == supportedAnalyzer { // Copy the meta of activated analyzer for usage in // analyzer meta validation - if analyzer.Enabled { + isEnabled := analyzer.Enabled == nil || *analyzer.Enabled + if isEnabled { activatedAnalyzers[analyzer.Name] = analyzer.Meta } supported = true diff --git a/configvalidator/config_validator.go b/configvalidator/config_validator.go index 3688c052..b4fb102e 100644 --- a/configvalidator/config_validator.go +++ b/configvalidator/config_validator.go @@ -2,6 +2,8 @@ package configvalidator import ( "bytes" + "fmt" + "strings" "github.com/spf13/viper" ) @@ -41,7 +43,19 @@ func (c *ConfigValidator) ValidateConfig(inputConfig []byte) Result { return c.Result } // Unmarshaling the configdata into DSConfig struct - viper.UnmarshalExact(&config) + err = viper.UnmarshalExact(&config) + if err != nil { + // Check if the error is due to invalid enabled field types + if strings.Contains(err.Error(), "enabled") { + c.Result.Valid = false + c.Result.Errors = append(c.Result.Errors, "The `enabled` property should be of boolean type (true/false)") + return c.Result + } + // Other unmarshaling errors + c.Result.Valid = false + c.Result.Errors = append(c.Result.Errors, fmt.Sprintf("Error while parsing config: %v", err)) + return c.Result + } c.Config = config // Validate generic config which applies to all analyzers and transformers diff --git a/configvalidator/config_validator_test.go b/configvalidator/config_validator_test.go index a9d5cf0e..6b492a3b 100644 --- a/configvalidator/config_validator_test.go +++ b/configvalidator/config_validator_test.go @@ -107,7 +107,29 @@ func TestValidateConfig(t *testing.T) { enabled = true`, valid: false, }, + "valid config with enabled not set (defaults to true)": { + inputConfig: ` + version = 1 + + [[analyzers]] + name = "python" + + [[transformers]] + name = "black"`, + valid: true, + }, + + "invalid config with enabled = \"falsee\" (non-boolean)": { + inputConfig: ` + version = 1 + + [[analyzers]] + name = "python" + enabled = "falsee"`, + valid: false, + }, } + for testName, tc := range tests { t.Run(testName, func(t *testing.T) { c := &ConfigValidator{} diff --git a/configvalidator/transformer_config_validator.go b/configvalidator/transformer_config_validator.go index fc98aa27..0bd103d6 100644 --- a/configvalidator/transformer_config_validator.go +++ b/configvalidator/transformer_config_validator.go @@ -21,13 +21,8 @@ func (c *ConfigValidator) validateTransformersConfig() { c.pushError(fmt.Sprintf("Value of `transformers` should be an array. Found: %v", transformersType)) } - // Enabled property should be of boolean type - for _, transformer := range c.Config.Transformers { - enabledType := reflect.TypeOf(transformer.Enabled).Kind().String() - if enabledType != "bool" { - c.pushError(fmt.Sprintf("The `enabled` property should be of boolean type. Found: %v", enabledType)) - } - } + // Enabled property validation is handled in the main config validator + // (transformers with invalid enabled types will cause unmarshaling errors) // ==== Transformer shortcode validation ==== supported := false diff --git a/configvalidator/types.go b/configvalidator/types.go index c33c7743..9c5cad4a 100644 --- a/configvalidator/types.go +++ b/configvalidator/types.go @@ -4,7 +4,7 @@ package configvalidator type Analyzer struct { Name string `mapstructure:"name,omitempty" json:"name,omitempty"` RuntimeVersion string `mapstructure:"runtime_version,omitempty" json:"runtime_version,omitempty"` - Enabled bool `mapstructure:"enabled,omitempty" json:"enabled"` + Enabled *bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty"` DependencyFilePaths []string `mapstructure:"dependency_file_paths,omitempty" json:"dependency_file_paths,omitempty"` Meta interface{} `mapstructure:"meta,omitempty" json:"meta,omitempty"` Thresholds interface{} `mapstructure:"thresholds,omitempty" json:"thresholds,omitempty"` @@ -12,7 +12,7 @@ type Analyzer struct { type Transformer struct { Name string `mapstructure:"name,omitempty" json:"name,omitempty"` - Enabled bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty"` + Enabled *bool `mapstructure:"enabled,omitempty" json:"enabled,omitempty"` } type DSConfig struct { From 5d16c7d68ab58a3cdd43cae31a94fff09f2b76c9 Mon Sep 17 00:00:00 2001 From: Sourya Vatsyayan Date: Mon, 4 Aug 2025 12:30:50 +0530 Subject: [PATCH 2/3] add more tests Signed-off-by: Sourya Vatsyayan --- configvalidator/config_validator_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/configvalidator/config_validator_test.go b/configvalidator/config_validator_test.go index 6b492a3b..f24d4285 100644 --- a/configvalidator/config_validator_test.go +++ b/configvalidator/config_validator_test.go @@ -128,6 +128,15 @@ func TestValidateConfig(t *testing.T) { enabled = "falsee"`, valid: false, }, + "config with syntax error": { + inputConfig: ` + version = 1 + + [[analyzers]] + name = "python" + enabled = falsee`, + valid: false, + }, } for testName, tc := range tests { From 53a4aa720ec1ac3c52b439b056de5308bfa911b8 Mon Sep 17 00:00:00 2001 From: Sourya Vatsyayan Date: Mon, 4 Aug 2025 12:52:54 +0530 Subject: [PATCH 3/3] more tests Signed-off-by: Sourya Vatsyayan --- configvalidator/config_validator.go | 3 ++- configvalidator/config_validator_test.go | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configvalidator/config_validator.go b/configvalidator/config_validator.go index b4fb102e..75cac33e 100644 --- a/configvalidator/config_validator.go +++ b/configvalidator/config_validator.go @@ -46,7 +46,8 @@ func (c *ConfigValidator) ValidateConfig(inputConfig []byte) Result { err = viper.UnmarshalExact(&config) if err != nil { // Check if the error is due to invalid enabled field types - if strings.Contains(err.Error(), "enabled") { + // match `` * cannot parse 'analyzers[0].enabled' as bool: strconv.ParseBool: parsing "falsee": invalid syntax` + if strings.Contains(err.Error(), "strconv.ParseBool") { c.Result.Valid = false c.Result.Errors = append(c.Result.Errors, "The `enabled` property should be of boolean type (true/false)") return c.Result diff --git a/configvalidator/config_validator_test.go b/configvalidator/config_validator_test.go index f24d4285..8c3c8564 100644 --- a/configvalidator/config_validator_test.go +++ b/configvalidator/config_validator_test.go @@ -1,7 +1,6 @@ package configvalidator import ( - "reflect" "testing" "github.com/deepsourcelabs/cli/utils" @@ -132,9 +131,9 @@ func TestValidateConfig(t *testing.T) { inputConfig: ` version = 1 - [[analyzers]] + [[analyzers] name = "python" - enabled = falsee`, + enabled = false`, valid: false, }, } @@ -143,7 +142,7 @@ func TestValidateConfig(t *testing.T) { t.Run(testName, func(t *testing.T) { c := &ConfigValidator{} c.ValidateConfig([]byte(tc.inputConfig)) - if !reflect.DeepEqual(tc.valid, c.Result.Valid) { + if tc.valid != c.Result.Valid { t.Errorf("%s: expected: %v, got: %v. Error: %v", testName, tc.valid, c.Result.Valid, c.Result.Errors) } })