From 8228fbbb058dfcf958e0df71346d44d2c34093ba Mon Sep 17 00:00:00 2001 From: Claudio Beatrice Date: Sat, 20 Apr 2024 11:56:41 +0200 Subject: [PATCH] chore: fix linting issues --- .rules/.golangci.yml | 9 ++++++--- internal/x/text/cases.go | 1 + pkg/codegen/emitter.go | 2 +- pkg/codegen/model.go | 1 + pkg/codegen/utils.go | 5 +++-- pkg/generator/output.go | 1 + pkg/generator/schema_generator.go | 14 +++++++++----- pkg/generator/validator.go | 8 ++++---- tests/generation_test.go | 5 +++++ tests/serializable_date_test.go | 2 -- tests/serializable_time_test.go | 2 -- tests/validation_test.go | 6 ------ 12 files changed, 31 insertions(+), 25 deletions(-) diff --git a/.rules/.golangci.yml b/.rules/.golangci.yml index 8cfc4fb4..8585d530 100644 --- a/.rules/.golangci.yml +++ b/.rules/.golangci.yml @@ -4,8 +4,9 @@ # Options for analysis running. run: + go: "1.22" timeout: 5m - skip-files: + exclude-files: - .*\.gen\.go$ - tests/data/.* modules-download-mode: readonly @@ -27,6 +28,7 @@ linters: - godox - ireturn - nestif + - perfsprint - revive - varnamelen # unsupported @@ -76,12 +78,11 @@ linters-settings: capital: true period: true gofumpt: - lang-version: "1.22" extra-rules: true goimports: local-prefixes: github.com/atombender govet: - check-shadowing: true + shadow: true grouper: const-require-single-const: true const-require-grouping: false @@ -460,6 +461,8 @@ issues: # Default: [] exclude: - "local replacement are not allowed: github.com/atombender/go-jsonschema/tests/data" + - "exporting a pointer for the loop variable i" + - "G601: Implicit memory aliasing in for loop." # Excluding configuration per-path, per-linter, per-text and per-source exclude-rules: # Exclude some linters from running on tests files. diff --git a/internal/x/text/cases.go b/internal/x/text/cases.go index 4a95d5ec..6b6fe6ca 100644 --- a/internal/x/text/cases.go +++ b/internal/x/text/cases.go @@ -124,6 +124,7 @@ func splitIdentifierByCaseAndSeparators(s string) []string { if i > j { result = append(result, runes[j:i]) } + j = i } diff --git a/pkg/codegen/emitter.go b/pkg/codegen/emitter.go index 92074906..a1d02430 100644 --- a/pkg/codegen/emitter.go +++ b/pkg/codegen/emitter.go @@ -78,7 +78,7 @@ func (e *Emitter) Newline() { func (e *Emitter) checkIndent() { if e.start { - for i := uint(0); i < e.indent; i++ { + for range e.indent { e.sb.WriteRune('\t') } diff --git a/pkg/codegen/model.go b/pkg/codegen/model.go index 3e73b5a5..9145cf64 100644 --- a/pkg/codegen/model.go +++ b/pkg/codegen/model.go @@ -335,6 +335,7 @@ func (s *StructType) Generate(out *Emitter) { f.Generate(out) out.Newline() + i++ } diff --git a/pkg/codegen/utils.go b/pkg/codegen/utils.go index ed4b79b6..8f3def25 100644 --- a/pkg/codegen/utils.go +++ b/pkg/codegen/utils.go @@ -1,14 +1,15 @@ package codegen import ( + "errors" "fmt" "github.com/atombender/go-jsonschema/pkg/schemas" ) var ( - errUnexpectedType = fmt.Errorf("unexpected type") - errUnknownJSONSchemaType = fmt.Errorf("unknown JSON Schema type") + errUnexpectedType = errors.New("unexpected type") + errUnknownJSONSchemaType = errors.New("unknown JSON Schema type") ) func WrapTypeInPointer(t Type) Type { diff --git a/pkg/generator/output.go b/pkg/generator/output.go index 035105d5..fe0b8de1 100644 --- a/pkg/generator/output.go +++ b/pkg/generator/output.go @@ -31,6 +31,7 @@ func (o *output) uniqueTypeName(name string) string { return suffixed } + count++ } } diff --git a/pkg/generator/schema_generator.go b/pkg/generator/schema_generator.go index b2ba7b1d..136cda8d 100644 --- a/pkg/generator/schema_generator.go +++ b/pkg/generator/schema_generator.go @@ -144,6 +144,7 @@ func (g *schemaGenerator) generateReferencedType(ref string) (codegen.Type, erro } else { def = (*schemas.Type)(schema.ObjectAsType) defName = g.getRootTypeName(schema, fileName) + if len(def.Type) == 0 { // Minor hack to make definitions default to being objects. def.Type = schemas.TypeList{schemas.TypeNameObject} @@ -181,7 +182,6 @@ func (g *schemaGenerator) generateReferencedType(ref string) (codegen.Type, erro var imp *codegen.Import for _, i := range g.output.file.Package.Imports { - i := i if i.Name == sg.output.file.Package.Name() && i.QualifiedName == sg.output.file.Package.QualifiedName { imp = &i @@ -267,8 +267,6 @@ func (g *schemaGenerator) generateDeclaredType( } for _, formatter := range g.formatters { - formatter := formatter - formatter.addImport(g.output.file) g.output.file.Package.AddDecl(&codegen.Method{ @@ -691,22 +689,28 @@ func (g *schemaGenerator) generateEnumType( } var primitiveType string + for _, v := range t.Enum { var valueType string + if v == nil { valueType = interfaceTypeName } else { switch v.(type) { case string: valueType = "string" + case float64: valueType = "float64" + case bool: valueType = "bool" + default: return nil, fmt.Errorf("%w %v", errEnumNonPrimitiveVal, v) } } + if primitiveType == "" { primitiveType = valueType } else if primitiveType != valueType { @@ -715,9 +719,11 @@ func (g *schemaGenerator) generateEnumType( break } } + if primitiveType == interfaceTypeName { wrapInStruct = true } + enumType = codegen.PrimitiveType{Type: primitiveType} } @@ -754,8 +760,6 @@ func (g *schemaGenerator) generateEnumType( g.output.file.Package.AddImport("reflect", "") for _, formatter := range g.formatters { - formatter := formatter - formatter.addImport(g.output.file) if wrapInStruct { diff --git a/pkg/generator/validator.go b/pkg/generator/validator.go index e260c01e..31f09309 100644 --- a/pkg/generator/validator.go +++ b/pkg/generator/validator.go @@ -62,11 +62,11 @@ func (v *nullTypeValidator) generate(out *codegen.Emitter) { value := fmt.Sprintf("%s.%s", varNamePlainStruct, v.fieldName) fieldName := v.jsonName - var indexes []string + indexes := make([]string, v.arrayDepth) - for i := 0; i < v.arrayDepth; i++ { + for i := range v.arrayDepth { index := fmt.Sprintf("i%d", i) - indexes = append(indexes, index) + indexes[i] = index out.Printlnf(`for %s := range %s {`, index, value) value += fmt.Sprintf("[%s]", index) fieldName += "[%d]" @@ -85,7 +85,7 @@ func (v *nullTypeValidator) generate(out *codegen.Emitter) { out.Indent(-1) out.Printlnf("}") - for i := 0; i < v.arrayDepth; i++ { + for range v.arrayDepth { out.Indent(-1) out.Printlnf("}") } diff --git a/tests/generation_test.go b/tests/generation_test.go index ca987fc9..975ea59d 100644 --- a/tests/generation_test.go +++ b/tests/generation_test.go @@ -217,12 +217,16 @@ func testExampleFile(t *testing.T, cfg generator.Config, fileName string) { if !os.IsNotExist(err) { t.Fatal(err) } + goldenData = source + t.Log("File does not exist; creating it") + if err = os.WriteFile(goldenFileName, goldenData, 0o655); err != nil { t.Fatal(err) } } + if diff, ok := diffStrings(t, string(goldenData), string(source)); !ok { t.Fatalf("Contents different (left is expected, right is actual):\n%s", *diff) } @@ -238,6 +242,7 @@ func testFailingExampleFile(t *testing.T, cfg generator.Config, fileName string) if err != nil { t.Fatal(err) } + if err := g.DoFile(fileName); err == nil { t.Fatal("Expected test to fail") } diff --git a/tests/serializable_date_test.go b/tests/serializable_date_test.go index e1027b61..54df702f 100644 --- a/tests/serializable_date_test.go +++ b/tests/serializable_date_test.go @@ -60,8 +60,6 @@ func TestSerializableDateUnmarshalJSONReturnsErrorForInvalidString(t *testing.T) } for _, testCase := range testCases { - testCase := testCase - t.Run(fmt.Sprintf("Given '%s' expected UnmarshalJSON to return an error", testCase), func(t *testing.T) { t.Parallel() diff --git a/tests/serializable_time_test.go b/tests/serializable_time_test.go index a87b38f6..69809e80 100644 --- a/tests/serializable_time_test.go +++ b/tests/serializable_time_test.go @@ -63,8 +63,6 @@ func TestSerializableTimeUnmarshalJSONReturnsErrorForInvalidString(t *testing.T) } for _, testCase := range testCases { - testCase := testCase - t.Run(fmt.Sprintf("Given '%s' expected UnmarshalJSON to return an error", testCase), func(t *testing.T) { t.Parallel() diff --git a/tests/validation_test.go b/tests/validation_test.go index d9b34e70..d4ff795b 100644 --- a/tests/validation_test.go +++ b/tests/validation_test.go @@ -51,8 +51,6 @@ func TestMaxStringLength(t *testing.T) { }, } for _, tC := range testCases { - tC := tC - t.Run(tC.desc, func(t *testing.T) { t.Parallel() @@ -100,8 +98,6 @@ func TestMinStringLength(t *testing.T) { }, } for _, tC := range testCases { - tC := tC - t.Run(tC.desc, func(t *testing.T) { t.Parallel() @@ -139,8 +135,6 @@ func TestRequiredFields(t *testing.T) { }, } for _, tC := range testCases { - tC := tC - t.Run(tC.desc, func(t *testing.T) { t.Parallel()