# This file contains all available configuration options
# with their default values.

# options for analysis running
run:
  tests: true
  skip-files:
    - requests.go

# output configuration options
output:
  # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number"
  format: colored-line-number

  # print lines of code with issue, default is true
  print-issued-lines: true

  # print linter name in the end of issue text, default is true
  print-linter-name: true


# all available settings of specific linters
linters-settings:
  govet:
    # report about shadowed variables
    check-shadowing: false
  dupl:
    # tokens count to trigger issue, 150 by default
    threshold: 100
  exhaustive:
    default-signifies-exhaustive: true
  goconst:
    # minimal length of string constant, 3 by default
    min-len: 3
    # minimal occurrences count to trigger, 3 by default
    min-occurrences: 3
  depguard:
    # Rules to apply.
    #
    # Variables:
    # - File Variables
    #   you can still use and exclamation mark ! in front of a variable to say not to use it.
    #   Example !$test will match any file that is not a go test file.
    #
    #   `$all` - matches all go files
    #   `$test` - matches all go test files
    #
    # - Package Variables
    #
    #  `$gostd` - matches all of go's standard library (Pulled from `GOROOT`)
    #
    # Default: Only allow $gostd in all files.
    rules:
      # Name of a rule.
      all:
        # List of file globs that will match this list of settings to compare against.
        # Default: $all
        files:
          - $all
        # List of allowed packages.
        # allow:
        #  - $gostd
        # Packages that are not allowed where the value is a suggestion.
        deny:
          - pkg: github.com/magiconair/properties/assert
            desc: Use testify/assert package instead
          - pkg: gopkg.in/go-playground/assert.v1
            desc: Use testify/assert package instead
          - pkg: github.com/pborman/uuid
            desc: Use google/uuid package instead
      main:
        files:
          - "!$test"
          # todo need to check the usage
          - "!**authorization/conditions.go"
          - "!**yugotest/assertions.go"
          - "!**yugometrics/backendtesting/compliance.go"
          - "!**scopes/auth_scope.go"
        deny:
          - pkg: github.com/davecgh/go-spew/spew
            desc: spew is usually only used in tests
          - pkg: github.com/stretchr/testify
            desc: testify is usually only used in tests
  gomodguard:
    blocked:
      modules:
        - gopkg.in/go-playground/assert.v1:
            recommendations:
              - github.com/stretchr/testify
            reason: "testify is the test assertion framework we use"
  misspell:
    # Correct spellings using locale preferences for US or UK.
    # Default is to use a neutral variety of English.
    # Setting locale to US will correct the British spelling of 'colour' to 'color'.
    locale: US
  unused:
    # treat code as a program (not a library) and report unused exported identifiers; default is false.
    # XXX: if you enable this setting, unused will report a lot of false-positives in text editors:
    # if it's called for subdir of a project it can't find funcs usages. All text editor integrations
    # with golangci-lint call it on a directory with the changed file.
    check-exported: false
  gocritic:
    # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty
    disabled-checks:
  revive:
    ignore-generated-header: true
  wsl:
    allow-cuddle-declarations: true
    allow-separated-leading-comment: true
    allow-assign-and-anything: true

linters:
  # to try out individual linters: golangci-lint run -E gocyclo,gosimple
  enable:
    # default linters
    - staticcheck
    - errcheck
    - gosimple
    - govet
    - ineffassign
    - unused
    # additional linters
    - asciicheck
    - bidichk
##    - bodyclose          # its all false positives with requester and sling, which both close the body already
    - containedctx
    - contextcheck
#    - cyclop              # need to analyze findings
    - decorder
    - depguard
##    - dogsled            # checks for too many blank identifiers.  don't care
    - dupl
    - durationcheck
    - errchkjson
    - errname
    - errorlint
    - exhaustive
    - exportloopref
    - forbidigo
    - forcetypeassert
##    - funlen              # checks function length.  don't care
#    - gci                  # not sure why this is complaining
##    - gochecknoglobals    # too common
    - gochecknoinits
#    - gocognit          # too many findings, will take time to evaluate
    - goconst
    - gocritic
##    - gocyclo             # checks cyclomatic complexity.  don't care
#    - godot               # too many false positives
#    - godox               # doesn't allow TODO comments.  We allow those to be committed.
#    - goerr113             # good practice, but it doesn't recognize that we're already wrapping errors with merry
##    - gofmt               # checks code is formatted, handled by make prep
    - gofumpt
    - goheader
##    - goimports           # checks import order.  We're not using goimports
#    - gomnd                # too aggressive
    - gomoddirectives
    - gomodguard
    - goprintffuncname
    - gosec
    - grouper
    - importas
#    - ireturn              # there are valid use cases for this pattern.  too strict.
##    - lll                 # checks line length.  not enforced
#    - maintidx             # look at this later
    - makezero
##    - maligned            # optimizies struct field order, but structs are usually ordered for legibility
    - misspell
    - nakedret
#    - nestif               # need to evaluate the findings
    - nilerr
    - nilnil
#    - nlreturn             # a little too aggressive.  wsl covers the same ground.
    - noctx
    - nolintlint
#    - paralleltest        # look at this later
#    - prealloc            # slice optimizations, but promotes too much premature optimization
    - predeclared
    - promlinter
    - revive
    - rowserrcheck
    - sqlclosecheck
    - stylecheck
    - tagliatelle
    - thelper
    - tparallel
    - unconvert
    - unparam
#    - varnamelen        # take a look later
    - wastedassign
    - whitespace
#    - wrapcheck           # way too aggressive
    - wsl
##    - unparam            # too many false positives
##    - whitespace         # not enforced
  disable-all: true
#  presets:
#    - bugs
#    - unused
#  fast: false


issues:
  # List of regexps of issue texts to exclude, empty list by default.
  # But independently from this option we use default exclude patterns,
  # it can be disabled by `exclude-use-default: false`. To list all
  # excluded by default patterns execute `golangci-lint run --help`
#  exclude:
#    - abcdef

  # Excluding configuration per-path, per-linter, per-text and per-source
  exclude-rules:
    # Explicitly exclude the typecheck plugin.  There is some bug in golangci which is
    # enabling this checker, even though it isn't listed above.
    # Exclude some linters from running on tests files.
    - path: _test\.go
      linters:
        - gocyclo
        - errcheck
        - dupl
        - gosec
        - exportloopref
        - gochecknoinits
        - gochecknoglobals
        - wsl
        - nlreturn
        - errchkjson
        - forcetypeassert
    - path: cmd
      linters:
        # init(), globals, and prints are pretty common in main packages
        - gochecknoinits
        - gochecknoglobals
        - forbidigo

    # Exclude known linters from partially hard-vendored code,
    # which is impossible to exclude via "nolint" comments.
#    - path: internal/hmac/
#      text: "weak cryptographic primitive"
#      linters:
#        - gosec

    # Exclude some staticcheck messages
#    - linters:
#        - staticcheck
#      text: "SA9003:"


  # Independently from option `exclude` we use default exclude patterns,
  # it can be disabled by this option. To list all
  # excluded by default patterns execute `golangci-lint run --help`.
  # Default value for this option is true.
#  exclude-use-default: false

  # 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

  # Show only new issues: if there are unstaged changes or untracked files,
  # only those changes are analyzed, else only changes in HEAD~ are analyzed.
  # It's a super-useful option for integration of golangci-lint into existing
  # large codebase. It's not practical to fix all existing issues at the moment
  # of integration: much better don't allow issues in new code.
  # Default is false.
  new: false

  # Show only new issues created after git revision `REV`
#  new-from-rev: REV

  # Show only new issues created in git patch with set file path.
#  new-from-patch: path/to/patch/file