diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 92632d0..056d718 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,17 +15,17 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - go: [1.15, 1.16, 1.17, 1.18] + go: [1.23, 1.24, 1.25] name: ${{ matrix.os }} @ Go ${{ matrix.go }} runs-on: ${{ matrix.os }} steps: - name: Set up Go ${{ matrix.go }} - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: ${{ matrix.go }} - name: Cache - uses: actions/cache@v2.1.0 + uses: actions/cache@v4 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} @@ -33,7 +33,7 @@ jobs: ${{ runner.os }}-go- - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v5 with: path: ${{ env.WORKSPACE }} @@ -44,7 +44,7 @@ jobs: run: sh testdata/test.sh - name: Upload coverage to Codecov - if: success() && matrix.go == 1.18 && matrix.os == 'windows-latest' + if: success() && matrix.go == 1.25 && matrix.os == 'windows-latest' uses: codecov/codecov-action@v1 with: token: @@ -56,11 +56,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v5 with: path: ${{ env.WORKSPACE }} - name: golangci-lint - uses: golangci/golangci-lint-action@v2 + uses: golangci/golangci-lint-action@v8 with: version: latest working-directory: ${{ env.WORKSPACE }} diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..e7260f6 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,7 @@ +version: "2" + +linters: + exclusions: + rules: + - linters: [staticcheck] + text: ST1001 diff --git a/generator_test.go b/generator_test.go index e5ba20c..9eb2cce 100644 --- a/generator_test.go +++ b/generator_test.go @@ -3,7 +3,7 @@ package main import ( "flag" "fmt" - "io/ioutil" + "io" "math/rand" "os" "path/filepath" @@ -79,7 +79,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { { d := "./noname" - err := generate(d, iFile, oDir, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(d, iFile, oDir, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -91,7 +91,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { d := "./noname" f := "foo.go" - err := generate(d, f, oDir, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(d, f, oDir, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -102,7 +102,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { { d := "main.go" - err := generate(d, iFile, oDir, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(d, iFile, oDir, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -113,7 +113,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { { f := "foo.go" - err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -124,7 +124,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { { f := "internal" - err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -135,7 +135,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { { f := "./testdata/test.sh" - err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -146,7 +146,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { { d := "./noname" - err := generate(iDir, iFile, d, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(iDir, iFile, d, oFile, ptr, false, true, false, false, io.Discard) if err != nil { t.Fatal(err) } @@ -154,7 +154,7 @@ func TestGenerateCodeErrorInput(t *testing.T) { { d := "./main.go" - err := generate(iDir, iFile, d, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(iDir, iFile, d, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -173,7 +173,7 @@ func TestGenerateCodeGoPathOutside(t *testing.T) { t.Fatal(err) } - err = generate(iDir, iFile, oDir, oFile, ptr, true, true, false, false, ioutil.Discard) + err = generate(iDir, iFile, oDir, oFile, ptr, true, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -191,7 +191,7 @@ func TestGenerateCodeDuplicateTag(t *testing.T) { f := "./testdata/def.go" - err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, ioutil.Discard) + err := generate(iDir, f, oDir, oFile, ptr, false, true, false, false, io.Discard) if err == nil { t.Fatal("error has to return") } @@ -202,7 +202,7 @@ func TestGenerateCodeDuplicateTag(t *testing.T) { func TestGenerateCodeDryRun(t *testing.T) { - err := generate(iDir, iFile, "", oFile, -1, false, true, false, false, ioutil.Discard) + err := generate(iDir, iFile, "", oFile, -1, false, true, false, false, io.Discard) if err != nil { t.Fatal(err) } @@ -236,8 +236,11 @@ func TestGenerateCodeOK(t *testing.T) { t.Fatal(err) } goPath := strings.SplitN(filepath.ToSlash(wd), "/src", 2)[0] - os.Setenv("GOPATH", filepath.FromSlash(goPath)) - err = generate(iDir, iFile, oDir, oFile, ptr, true, true, false, false, ioutil.Discard) + err = os.Setenv("GOPATH", filepath.FromSlash(goPath)) + if err != nil { + t.Fatal(err) + } + err = generate(iDir, iFile, oDir, oFile, ptr, true, true, false, false, io.Discard) if err != nil { t.Fatal(err) } diff --git a/go.mod b/go.mod index eae6993..3aedf20 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/shamaton/msgpackgen -go 1.13 +go 1.23 require ( - github.com/dave/jennifer v1.4.1 - github.com/shamaton/msgpack/v2 v2.1.0 + github.com/dave/jennifer v1.7.1 + github.com/shamaton/msgpack/v2 v2.3.1 ) diff --git a/go.sum b/go.sum index ac9c8ae..6c65d22 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,4 @@ -github.com/dave/jennifer v1.4.1 h1:XyqG6cn5RQsTj3qlWQTKlRGAyrTcsk1kUmWdZBzRjDw= -github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= -github.com/shamaton/msgpack/v2 v2.1.0 h1:9jJ2eGZw2Wa9KExPX3KaDDckVjgr4zhXGFCfWagUWqg= -github.com/shamaton/msgpack/v2 v2.1.0/go.mod h1:aTUEmh31ziGX1Ml7wMPLVY0f4vT3CRsCvZRoSCs+VGg= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/shamaton/msgpack/v2 v2.3.1 h1:R3QNLIGA/tbdczNMZ5PCRxrXvy+fnzsIaHG4kKMgWYo= +github.com/shamaton/msgpack/v2 v2.3.1/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= diff --git a/internal/generator/analyze.go b/internal/generator/analyze.go index 92fbf00..bd96142 100644 --- a/internal/generator/analyze.go +++ b/internal/generator/analyze.go @@ -7,8 +7,8 @@ import ( "go/parser" "go/token" "go/types" - "io/ioutil" "math/big" + "os" "path/filepath" "reflect" "strings" @@ -55,7 +55,7 @@ func (g *generator) getImportPathAndParseFile(file string) (string, string, *ast return "", "", nil, err } - source, err := ioutil.ReadFile(file) + source, err := os.ReadFile(file) if err != nil { return "", "", nil, err } diff --git a/internal/generator/gen.go b/internal/generator/gen.go index 22d41e7..dc71be3 100644 --- a/internal/generator/gen.go +++ b/internal/generator/gen.go @@ -6,7 +6,6 @@ import ( "go/ast" "go/token" "io" - "io/ioutil" "os" "path/filepath" "runtime" @@ -164,8 +163,8 @@ func (g *generator) run(input, out, fileName string, isInputDir, dryRun bool, w f := g.generateCode() if dryRun { - fmt.Fprintf(w, "%#v", f) - return nil + _, err = fmt.Fprintf(w, "%#v", f) + return err } err = g.output(f, fileName) if err != nil { @@ -187,7 +186,7 @@ func (g *generator) searchGoModFile(input string, isInputDir bool) (string, erro return goModFilePath, err } - files, err := ioutil.ReadDir(path) + files, err := os.ReadDir(path) if err != nil { return goModFilePath, err } @@ -318,7 +317,7 @@ func (g *generator) getImportPath(path string) (string, error) { } func (g *generator) getTargetFiles(dir string, recursive bool) ([]string, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } diff --git a/internal/generator/gen_test.go b/internal/generator/gen_test.go index f27e793..48c0aa2 100644 --- a/internal/generator/gen_test.go +++ b/internal/generator/gen_test.go @@ -85,8 +85,13 @@ func TestOutput(t *testing.T) { t.Fatal("something wrong", err) } + err = os.MkdirAll("tmp/resolver.go", 0777) + if err != nil { + t.Fatal("unexpected error", err) + } + g.outputDir = "tmp" - err = g.output(nil, "") + err = g.output(nil, "resolver.go") if err == nil { t.Error("error should occur") } @@ -94,7 +99,7 @@ func TestOutput(t *testing.T) { t.Error("something wrong", err) } - err = os.Remove("tmp") + err = os.RemoveAll("tmp/resolver.go") if err != nil { t.Fatal(err) } diff --git a/internal/generator/structure/code_ident.go b/internal/generator/structure/code_ident.go index f1a4089..1a8a2ef 100644 --- a/internal/generator/structure/code_ident.go +++ b/internal/generator/structure/code_ident.go @@ -2,6 +2,7 @@ package structure import ( "strings" + "unicode" . "github.com/dave/jennifer/jen" "github.com/shamaton/msgpackgen/internal/generator/ptn" @@ -12,10 +13,10 @@ type identCodeGen struct { func (st *Structure) createIdentCode(node *Node, encodeFieldName, decodeFieldName string) (cArray []Code, cMap []Code, eArray []Code, eMap []Code, dArray []Code, dMap []Code) { - funcSuffix := strings.Title(node.IdenticalName) - g := identCodeGen{} + funcSuffix := g.toPascalCase(node.IdenticalName) + cArray = g.createCalcCode("Calc"+funcSuffix, Id(encodeFieldName)) cMap = g.createCalcCode("Calc"+funcSuffix, Id(encodeFieldName)) @@ -67,3 +68,25 @@ func (g identCodeGen) createDecCode(node *Node, structures []*Structure, fieldNa return []Code{Block(codes...)} } + +func (g identCodeGen) toPascalCase(s string) string { + parts := strings.FieldsFunc(s, func(r rune) bool { + // character that is not a letter or digit + return !unicode.IsLetter(r) && !unicode.IsDigit(r) + }) + + if len(parts) == 0 { + return "" + } + + result := "" + for _, p := range parts { + if p == "" { + continue + } + // Convert first character to uppercase and the rest to lowercase + result += strings.ToUpper(string(p[0])) + strings.ToLower(p[1:]) + } + + return result +} diff --git a/msgpack/enc/byte.go b/msgpack/enc/byte.go index a8ec9b1..8e0c1a3 100644 --- a/msgpack/enc/byte.go +++ b/msgpack/enc/byte.go @@ -39,6 +39,7 @@ func (e *Encoder) CalcByte(b byte) int { } // WriteByte sets the contents of v to the buffer. +//nolint:govet // custom WriteByte signature is intentional (used only by generated code) func (e *Encoder) WriteByte(b byte, offset int) int { return e.setByte(b, offset) } diff --git a/msgpack_test.go b/msgpack_test.go index ba97cc9..a933e7a 100644 --- a/msgpack_test.go +++ b/msgpack_test.go @@ -1144,7 +1144,7 @@ func TestStruct(t *testing.T) { if !reflect.DeepEqual(v.A, v1.A) || !reflect.DeepEqual(v.A, v2.A) { t.Error("value different", v.A, v1.A, v2.A) } - if v.A.B.Int != v1.B.Int || v.B.Int != v2.A.B.Int { + if v.A.B.Int != v1.B.Int || v.B.Int != v2.A.B.Int { //nolint:staticcheck // keeping "A" explicit for clarity t.Error("value something wrong", v.A.Int, v1.Int, v2.Int) } if v.A.Int == v1.Int || v.A.Int == v2.Int {