diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index aecffe4..7088fa7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,10 +18,12 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Checkout - uses: actions/checkout@master + uses: actions/checkout@v4 + with: + fetch-depth: 0 # for golangci-lint's -new-from-rev - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} cache: true # caching and restoring go modules and build outputs @@ -34,5 +36,8 @@ jobs: - name: nilaway run: make nilaway + - name: lint + run: make lint-new + - name: Test run: go test -v -race -p=1 -count=1 diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..495c683 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,74 @@ +linters: + # Please, do not use `enable-all`: it's deprecated and will be removed soon. + # Inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint. + # Full list of linters - https://golangci-lint.run/usage/linters + disable-all: true + enable: + - errcheck # Mandatory. Do not disable. + - ineffassign # Mandatory. Do not disable. + - staticcheck # Mandatory. Do not disable. + - gomodguard + - nolintlint + +# TODO: +# - bodyclose # https://github.com/timakin/bodyclose +# - gocritic +# - goimports +# - gosec +# - gosimple +# - govet +# - noctx +# - stylecheck +# - typecheck +# - unused + +linters-settings: + gocritic: + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + + errcheck: + # List of functions to exclude from checking, where each entry is a single function to exclude. + # See https://github.com/kisielk/errcheck#excluding-functions for details. + exclude-functions: + - (io.Closer).Close + - (io.ReadCloser).Close + + govet: + enable-all: true + disable: + - shadow + - fieldalignment + + gomodguard: + blocked: + # List of blocked modules. + modules: + - github.com/pkg/errors: + recommendations: + - github.com/mailgun/errors + - errors + reason: "Deprecated" + + stylecheck: + # https://staticcheck.io/docs/options#checks + checks: ["all"] + +issues: + # 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: 50 + +run: + # include test files or not, default is true + tests: true + + # Timeout for analysis, e.g. 30s, 5m. + # Default: 1m + timeout: 5m diff --git a/Makefile b/Makefile index 1060781..11ec1d9 100644 --- a/Makefile +++ b/Makefile @@ -27,3 +27,16 @@ godoc: .PHONY: nilaway nilaway: $(NILAWAY) $(NILAWAY) -include-pkgs="$(PACKAGE)" -test=false -exclude-errors-in-files=mock_ ./... + +# linter: +GOLINT = $(GOPATH)/bin/golangci-lint +$(GOLINT): + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOPATH)/bin v1.61.0 + +.PHONY: lint-new +lint-new: $(GOLINT) + $(GOLINT) run -new-from-rev=master + +.PHONY: lint +lint: $(GOLINT) + $(GOLINT) run diff --git a/analytics.go b/analytics.go index 3b93f4a..001703f 100644 --- a/analytics.go +++ b/analytics.go @@ -10,7 +10,9 @@ import ( type MetricsPagination struct { // Colon-separated value indicating column name and sort direction e.g. 'domain:asc'. Sort string `json:"sort"` - // The number of items to skip over when satisfying the request. To get the first page of data set skip to zero. Then increment the skip by the limit for subsequent calls. + // The number of items to skip over when satisfying the request. + // To get the first page of data set skip to zero. + // Then increment the skip by the limit for subsequent calls. Skip int `json:"skip"` // The maximum number of items returned in the response. Limit int `json:"limit"` @@ -79,11 +81,7 @@ func (iter *MetricsIterator) Next(ctx context.Context, resp *MetricsResponse) (m iter.opts.Pagination.Skip = iter.opts.Pagination.Skip + iter.opts.Pagination.Limit - if len(resp.Items) < iter.opts.Pagination.Limit { - return false - } - - return true + return len(resp.Items) == iter.opts.Pagination.Limit } func (iter *MetricsIterator) fetch(ctx context.Context, resp *MetricsResponse) error {