diff --git a/.github/release-please.yml b/.github/release-please.yml deleted file mode 100644 index 19c4910..0000000 --- a/.github/release-please.yml +++ /dev/null @@ -1,2 +0,0 @@ -handleGHRelease: true -manifest: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09940af..75a70a0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,7 @@ name: CI on: pull_request: - types: [opened, synchronize, reopen] # these are the defaults - synchronize means 'commits pushed to PR' + types: [opened, synchronize] # these are the defaults - synchronize means 'commits pushed to PR' concurrency: group: ${{ github.ref }} @@ -12,15 +12,15 @@ jobs: name: Run tests and race detection runs-on: ubuntu-latest steps: - - name: Set up Go 1.19 - uses: actions/setup-go@v3 + - name: Check out code + uses: actions/checkout@v5 + + - name: Set up Go + uses: actions/setup-go@v5 with: - go-version: 1.19 + go-version-file: go.mod id: go - - name: Check out code - uses: actions/checkout@v3 - - name: Get dependencies shell: bash run: go get -v -t -d ./... @@ -36,13 +36,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v5 - name: golangci-lint - uses: golangci/golangci-lint-action@v3 + uses: golangci/golangci-lint-action@v8 with: - # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. - version: v1.51 + version: v2.5.0 # Optional: show only new issues if it's a pull request. The default value is `false`. only-new-issues: true diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml new file mode 100644 index 0000000..a0127cb --- /dev/null +++ b/.github/workflows/release-please.yaml @@ -0,0 +1,19 @@ +name: Release Please + +on: + push: + branches: + - master + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: googleapis/release-please-action@v4 + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} diff --git a/.golangci.yml b/.golangci.yml index d4012fa..7dc5cc9 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,184 +1,151 @@ -linters-settings: - dupl: - threshold: 100 - funlen: - lines: 100 - statements: 50 - gocognit: - # minimal code complexity to report, 30 by default (but we recommend 10-20) - min-complexity: 50 - goconst: - min-len: 2 - min-occurrences: 3 - gocritic: - enabled-tags: - - diagnostic - - experimental - - opinionated - - performance - - style - gocyclo: - min-complexity: 25 - godox: - # report any comments starting with keywords, this is useful for TODO or FIXME comments that - # might be left in the code accidentally and should be resolved before merging - keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting - - TODO - - BUG - cyclop: - # the maximal code complexity to report - max-complexity: 25 - lll: - line-length: 200 - maligned: - suggest-new: true - misspell: - locale: US - nestif: - # minimal complexity of if statements to report, 5 by default - min-complexity: 10 - exhaustive: - default-signifies-exhaustive: true - tagliatelle: - # check the struck tag name case - case: - # use the struct field name to check the name of the struct tag - use-field-name: true - rules: - # any struct tag type can be used. - # support string case: `camel`, `pascal`, `kebab`, `snake`, `goCamel`, `goPascal`, `goKebab`, `goSnake`, `upper`, `lower` - json: camel - wrapcheck: - # An array of strings that specify substrings of signatures to ignore. - # If this set, it will override the default set of ignored signatures. - # See https://github.com/tomarrell/wrapcheck#configuration for more information. - ignoreSigs: - - .Errorf( - - errors.New( - - errors.Unwrap( - - .Wrap( - - .Wrapf( - - .WithMessage( - - .WithMessagef( - - .Cause( - +version: "2" linters: - # inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint - disable-all: true + default: none enable: - - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers [fast: true, auto-fix: false] - - bodyclose # checks whether HTTP response body is closed successfully [fast: false, auto-fix: false] - - cyclop # checks function and package cyclomatic complexity [fast: false, auto-fix: false] - # - deadcode # Finds unused code [fast: false, auto-fix: false] - - depguard # Go linter that checks if package imports are in a list of acceptable packages [fast: false, auto-fix: false] - - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) [fast: true, auto-fix: false] - - durationcheck # check for two durations multiplied together [fast: false, auto-fix: false] - - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases [fast: false, auto-fix: false] - - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. [fast: false, auto-fix: false] - - exhaustive # check exhaustiveness of enum switch statements [fast: false, auto-fix: false] - - exportloopref # checks for pointers to enclosing loop variables [fast: false, auto-fix: false] - - forcetypeassert # finds forced type assertions [fast: true, auto-fix: false] - - funlen # Tool for detection of long functions [fast: true, auto-fix: false] - - gochecknoglobals # check that no global variables exist [fast: true, auto-fix: false] - - gochecknoinits # Checks that no init functions are present in Go code [fast: true, auto-fix: false] - - gocognit # Computes and checks the cognitive complexity of functions [fast: true, auto-fix: false] - - goconst # Finds repeated strings that could be replaced by a constant [fast: true, auto-fix: false] - - gocritic # Provides many diagnostics that check for bugs, performance and style issues. [fast: false, auto-fix: false] - - gocyclo # Computes and checks the cyclomatic complexity of functions [fast: true, auto-fix: false] - - godox # Tool for detection of FIXME, TODO and other comment keywords [fast: true, auto-fix: false] - - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification [fast: true, auto-fix: true] - - gofumpt # Gofumpt checks whether code was gofumpt-ed. [fast: true, auto-fix: true] - - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports [fast: true, auto-fix: true] - - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. [fast: true, auto-fix: false] - - goprintffuncname # Checks that printf-like functions are named with `f` at the end [fast: true, auto-fix: false] - - gosec # (gas): Inspects source code for security problems [fast: false, auto-fix: false] - - gosimple # (megacheck): Linter for Go source code that specializes in simplifying a code [fast: false, auto-fix: false] - - govet # (vet, vetshadow): Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string [fast: false, auto-fix: false] - # - ifshort # Checks that your code uses short syntax for if-statements whenever possible [fast: true, auto-fix: false] - - importas # Enforces consistent import aliases [fast: false, auto-fix: false] - - ineffassign # Detects when assignments to existing variables are not used [fast: true, auto-fix: false] - - lll # Reports long lines [fast: true, auto-fix: false] - - makezero # Finds slice declarations with non-zero initial length [fast: false, auto-fix: false] - - misspell # Finds commonly misspelled English words in comments [fast: true, auto-fix: true] - - nakedret # Finds naked returns in functions greater than a specified function length [fast: true, auto-fix: false] - - nestif # Reports deeply nested if statements [fast: true, auto-fix: false] - - nilerr # Finds the code that returns nil even if it checks that the error is not nil. [fast: false, auto-fix: false] - - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity [fast: true, auto-fix: false] - - noctx # noctx finds sending http request without context.Context [fast: false, auto-fix: false] - - nolintlint # Reports ill-formed or insufficient nolint directives [fast: true, auto-fix: false] - - paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test [fast: true, auto-fix: false] - - prealloc # Finds slice declarations that could potentially be preallocated [fast: true, auto-fix: false] - - predeclared # find code that shadows one of Go's predeclared identifiers [fast: true, auto-fix: false] - - revive # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint. [fast: false, auto-fix: false] - # - rowserrcheck # checks whether Err of rows is checked successfully [fast: false, auto-fix: false] - - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. [fast: false, auto-fix: false] - - staticcheck # (megacheck): Staticcheck is a go vet on steroids, applying a ton of static analysis checks [fast: false, auto-fix: false] - # - structcheck # Finds unused struct fields [fast: false, auto-fix: false] - - stylecheck # Stylecheck is a replacement for golint [fast: false, auto-fix: false] - - tagliatelle # Checks the struct tags. [fast: true, auto-fix: false] - - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes [fast: false, auto-fix: false] - - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code [fast: false, auto-fix: false] - - unconvert # Remove unnecessary type conversions [fast: false, auto-fix: false] - - unparam # Reports unused function parameters [fast: false, auto-fix: false] - - unused # (megacheck): Checks Go code for unused constants, variables, functions and types [fast: false, auto-fix: false] - # - varcheck # Finds unused global variables and constants [fast: false, auto-fix: false] - # - wastedassign # wastedassign finds wasted assignment statements. [fast: false, auto-fix: false] - - whitespace # Tool for detection of leading and trailing whitespace [fast: true, auto-fix: true] - - wrapcheck # Checks that errors returned from external packages are wrapped [fast: false, auto-fix: false] - # - dupl # Tool for code clone detection [fast: true, auto-fix: false] - # - exhaustivestruct # Checks if all struct's fields are initialized [fast: false, auto-fix: false] - # - forbidigo # Forbids identifiers [fast: true, auto-fix: false] - # - gci # Gci control golang package import order and make it always deterministic. [fast: true, auto-fix: true] - # - godot # Check if comments end in a period [fast: true, auto-fix: true] - # - goerr113 # Golang linter to check the errors handling expressions [fast: false, auto-fix: false] - # - goheader # Checks is file header matches to pattern [fast: true, auto-fix: false] - # - golint # Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes [fast: false, auto-fix: false] - # - gomnd # An analyzer to detect magic numbers. [fast: true, auto-fix: false] - # - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. [fast: true, auto-fix: false] - # - interfacer # Linter that suggests narrower interface types [fast: false, auto-fix: false] - # - maligned # Tool to detect Go structs that would take less memory if their fields were sorted [fast: false, auto-fix: false] - # - promlinter # Check Prometheus metrics naming via promlint [fast: true, auto-fix: false] - # - scopelint # Scopelint checks for unpinned variables in go programs [fast: true, auto-fix: false] - # - testpackage # linter that makes you use a separate _test package [fast: true, auto-fix: false] - # - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers [fast: false, auto-fix: false] - # - wsl # Whitespace Linter - Forces you to use empty lines! [fast: true, auto-fix: false] - + - asciicheck + - bodyclose + - cyclop + - depguard + - dogsled + - durationcheck + - errcheck + - errorlint + - exhaustive + - forcetypeassert + - funlen + - gochecknoglobals + - gochecknoinits + - gocognit + - goconst + - gocritic + - gocyclo + - godox + - gomoddirectives + - goprintffuncname + - gosec + - govet + - importas + - ineffassign + - lll + - makezero + - misspell + - nakedret + - nestif + - nilerr + - nlreturn + - noctx + - nolintlint + - paralleltest + - prealloc + - predeclared + - revive + - sqlclosecheck + - staticcheck + - tagliatelle + - tparallel + - unconvert + - unparam + - unused + - whitespace + - wrapcheck + settings: + depguard: + rules: + main: + files: + - $all + allow: + - github.com/go-playground/errors/v5 + - github.com/jtwatson/shutdown + - $gostd + cyclop: + max-complexity: 25 + dupl: + threshold: 100 + exhaustive: + default-signifies-exhaustive: true + funlen: + lines: 100 + statements: 50 + gocognit: + min-complexity: 50 + goconst: + min-len: 2 + min-occurrences: 3 + gocritic: + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + gocyclo: + min-complexity: 25 + godox: + keywords: + - TODO + - BUG + lll: + line-length: 200 + misspell: + locale: US + nestif: + min-complexity: 10 + tagliatelle: + case: + rules: + json: camel + use-field-name: true + wrapcheck: + ignore-sigs: + - .Errorf( + - errors.New( + - errors.Unwrap( + - .Wrap( + - .Wrapf( + - .WithMessage( + - .WithMessagef( + - .Cause( + exclusions: + generated: lax + presets: + - common-false-positives + - std-error-handling + rules: + - linters: + - funlen + - gochecknoglobals + - gochecknoinits + - goconst + - gocyclo + - lll + - mnd + - nlreturn + - scopelint + path: _test\.go + - linters: + - paralleltest + - tparallel + path: server_test\.go + text: TestServer_Start + - linters: + - bodyclose + path: server_test\.go + paths: + - third_party$ + - builtin$ + - examples$ issues: - # Excluding configuration per-path, per-linter, per-text and per-source - exclude-rules: - - path: _test\.go - linters: - - gomnd - - scopelint - - funlen - - gocyclo - - goconst - - nlreturn - - gochecknoglobals - - gochecknoinits - - lll - - - path: server_test\.go - linters: - - paralleltest - - tparallel - text: TestServer_Start - - - path: server_test\.go - linters: - - bodyclose - - include: - - EXC0002 - - EXC0005 - - EXC0015 - - # Maximum issues count per one linter. Set to 0 to disable. Default is 50. max-issues-per-linter: 0 - - # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. max-same-issues: 0 - -run: - skip-dirs: - - gui/node_modules +formatters: + enable: + - gofmt + - gofumpt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/go.mod b/go.mod index 09d4b1b..e3c44e1 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module github.com/jtwatson/server -go 1.19 +go 1.25.1 require ( - github.com/go-playground/errors/v5 v5.2.3 + github.com/go-playground/errors/v5 v5.4.0 github.com/jtwatson/shutdown v0.1.1 ) -require github.com/go-playground/pkg/v5 v5.0.0 // indirect +require github.com/go-playground/pkg/v5 v5.30.0 // indirect diff --git a/go.sum b/go.sum index c83bfca..74fd655 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,6 @@ -github.com/go-playground/assert v1.2.1/go.mod h1:Lgy+k19nOB/wQG/fVSQ7rra5qYugmytMQqvQ2dgjWn8= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/errors/v5 v5.2.3 h1:RPxaFHgJZjgk/OFkUcfytJgRQKRINLtueVxgOdnfPpg= -github.com/go-playground/errors/v5 v5.2.3/go.mod h1:DincxRGwraWmq39TZDqtnOtHGOJ+AbNbO0OmBzX6MLw= -github.com/go-playground/form/v4 v4.1.1/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U= -github.com/go-playground/pkg/v5 v5.0.0 h1:cml7lI472g05ANLG0Or2B6dyeFrnkQazTDEWdJx9/x4= -github.com/go-playground/pkg/v5 v5.0.0/go.mod h1:0380E0lsFB1POWFypOLL8tX2f0O1OBCBpSdVmEy4mg0= +github.com/go-playground/errors/v5 v5.4.0 h1:BxBxwlRjuclYbRebE4ddrRrMK705lS2mHzHw7BDoDPA= +github.com/go-playground/errors/v5 v5.4.0/go.mod h1:6aVeVHsT36RNu/m/8AvGdPv8T2J/+KfVv6Su4VvBfpQ= +github.com/go-playground/pkg/v5 v5.30.0 h1:ElTFBK1Pf3Jm0pRBi/AvgzbwBPAFzFsI2h4uH2xaEsY= +github.com/go-playground/pkg/v5 v5.30.0/go.mod h1:UgHNntEQnMJSygw2O2RQ3LAB0tprx81K90c/pOKh7cU= github.com/jtwatson/shutdown v0.1.1 h1:1kgFchOopPJJk5vDitJuQ4jxHdsKz5119N1nn5ZMsNs= github.com/jtwatson/shutdown v0.1.1/go.mod h1:X6GrzMnrtG80WnP9s3eEYDpwHefIq85nO1WNRevOJq8= diff --git a/release-please-config.json b/release-please-config.json index b677899..58fea4c 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -15,6 +15,7 @@ { "type": "style", "section": "Styles", "hidden": true }, { "type": "chore", "section": "Miscellaneous Chores", "hidden": true }, { "type": "refactor", "section": "Code Refactoring" }, + { "type": "cleanup", "section": "Code Cleanup" }, { "type": "test", "section": "Tests", "hidden": true }, { "type": "build", "section": "Build System", "hidden": true }, { "type": "ci", "section": "Continuous Integration", "hidden": true }, diff --git a/server.go b/server.go index a1b962f..1f173e5 100644 --- a/server.go +++ b/server.go @@ -1,4 +1,4 @@ -// server starts an HTTP Server to run the application +// Package server starts an HTTP Server to run the application package server import ( @@ -33,7 +33,7 @@ func (s *Server) Start(ctx context.Context, handler http.Handler) error { // Capture interrupts so we can handle them gracefully. ctx, cancel := shutdown.CaptureInterrupts(ctx) - log.Printf("Starting Server at %s", s.srv.Addr) + log.Printf("Starting Server at http://%s", s.srv.Addr) defer log.Print("Server Exited") errChan := make(chan error, 1) diff --git a/server_test.go b/server_test.go index 70d491a..e2c67e9 100644 --- a/server_test.go +++ b/server_test.go @@ -70,7 +70,7 @@ func TestServer_Start(t *testing.T) { t.Run(tt.name, func(t *testing.T) { var wg sync.WaitGroup var handlerCalled atomic.Bool - handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + handler := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { wg.Done() if handlerCalled.Load() { time.Sleep(tt.args.responseDelay)