# golangci-lint configuration for articulate-parser # https://golangci-lint.run/usage/configuration/ version: "2" # Options for analysis running run: # Timeout for total work timeout: 5m # Skip directories (not allowed in config v2, will use issues exclude instead) # Go version go: "1.24" # Include test files tests: true # Use Go module mode modules-download-mode: readonly # Output configuration output: # Format of output formats: text: print-issued-lines: true print-linter-name: true # Sort results sort-order: - linter - severity - file # Show statistics show-stats: true # Issues configuration issues: # Maximum issues count per one linter max-issues-per-linter: 0 # Maximum count of issues with the same text max-same-issues: 3 # Show only new issues new: false # Fix found issues (if linter supports) fix: false # Formatters configuration formatters: enable: - gofmt - goimports - gofumpt settings: # gofmt settings gofmt: simplify: true # goimports settings goimports: local-prefixes: - github.com/kjanat/articulate-parser # gofumpt settings gofumpt: module-path: github.com/kjanat/articulate-parser extra-rules: true # Linters configuration linters: # Default set of linters default: none # Enable specific linters enable: # Default/standard linters - errcheck # Check for unchecked errors - govet # Go vet - ineffassign # Detect ineffectual assignments - staticcheck # Staticcheck - unused # Find unused code # Code quality - revive # Fast, configurable linter - gocritic # Opinionated Go source code linter - godot # Check comment periods - godox # Detect TODO/FIXME comments - gocognit # Cognitive complexity - gocyclo # Cyclomatic complexity - funlen # Function length - maintidx # Maintainability index # Security - gosec # Security problems # Performance - prealloc # Find slice preallocation opportunities - bodyclose # Check HTTP response body closed # Style and formatting - goconst # Find repeated strings - misspell # Find misspellings - whitespace # Find unnecessary blank lines - unconvert # Remove unnecessary type conversions - dupword # Check for duplicate words # Error handling - errorlint # Error handling improvements - wrapcheck # Check error wrapping # Testing - testifylint # Testify usage - tparallel # Detect improper t.Parallel() usage - thelper # Detect test helpers without t.Helper() # Best practices - exhaustive # Check exhaustiveness of enum switches - nolintlint # Check nolint directives - nakedret # Find naked returns - nilnil # Check for redundant nil checks - noctx # Check sending HTTP requests without context - contextcheck # Check context propagation - asciicheck # Check for non-ASCII identifiers - bidichk # Check for dangerous unicode sequences - durationcheck # Check for multiplied durations - makezero # Find slice declarations with non-zero length - nilerr # Find code returning nil with non-nil error - predeclared # Find code shadowing predeclared identifiers - promlinter # Check Prometheus metrics naming - reassign # Check reassignment of package variables - usestdlibvars # Use variables from stdlib - wastedassign # Find wasted assignments # Documentation - godoclint # Check godoc comments # New - modernize # Suggest simplifications using new Go features # Exclusion rules for linters exclusions: rules: # Exclude some linters from test files - path: _test\.go linters: - gosec - dupl - errcheck - goconst - funlen - goerr113 - gocognit # Exclude benchmarks from some linters - path: _bench_test\.go linters: - gosec - dupl - errcheck - goconst - funlen - goerr113 - wrapcheck # Exclude example tests - path: _example_test\.go linters: - gosec - errcheck - funlen - goerr113 - wrapcheck - revive # Exclude linters for main.go - path: ^main\.go$ linters: - forbidigo # Exclude certain linters for generated files - path: internal/version/version.go linters: - gochecknoglobals - gochecknoinits # Exclude var-naming for interfaces package (standard Go pattern for interface definitions) - path: internal/interfaces/ text: "var-naming: avoid meaningless package names" linters: - revive # Allow fmt.Print* in main package - path: ^main\.go$ text: "use of fmt.Print" linters: - forbidigo # Exclude common false positives - text: "Error return value of .((os\\.)?std(out|err)\\..*|.*Close|.*Flush|os\\.Remove(All)?|.*print(f|ln)?|os\\.(Un)?Setenv). is not checked" linters: - errcheck # Exclude error wrapping suggestions for well-known errors - text: "non-wrapping format verb for fmt.Errorf" linters: - errorlint # Linters settings settings: # errcheck settings errcheck: check-type-assertions: true check-blank: false # govet settings govet: enable-all: true disable: - fieldalignment # Too many false positives - shadow # Can be noisy # goconst settings goconst: min-len: 3 min-occurrences: 3 # godot settings godot: scope: toplevel exclude: - "^fixme:" - "^todo:" capital: true period: true # godox settings godox: keywords: - TODO - FIXME - HACK - BUG - XXX # misspell settings misspell: locale: US # funlen settings funlen: lines: 100 statements: 50 # gocognit settings gocognit: min-complexity: 20 # gocyclo settings gocyclo: min-complexity: 15 # gocritic settings gocritic: enabled-tags: - diagnostic - style - performance - experimental disabled-checks: - ifElseChain - singleCaseSwitch - commentedOutCode settings: hugeParam: sizeThreshold: 512 rangeValCopy: sizeThreshold: 512 # gosec settings gosec: severity: medium confidence: medium excludes: - G104 # Handled by errcheck - G304 # File path provided as taint input # revive settings revive: severity: warning rules: - name: blank-imports - name: context-as-argument - name: context-keys-type - name: dot-imports - name: empty-block - name: error-naming - name: error-return - name: error-strings - name: errorf - name: exported - name: if-return - name: increment-decrement - name: indent-error-flow - name: package-comments - name: range - name: receiver-naming - name: time-naming - name: unexported-return - name: var-declaration - name: var-naming # errorlint settings errorlint: errorf: true errorf-multi: true asserts: true comparison: true # wrapcheck settings wrapcheck: ignore-sigs: - .Errorf( - errors.New( - errors.Unwrap( - errors.Join( - .WithMessage( - .WithMessagef( - .WithStack( ignore-package-globs: - github.com/kjanat/articulate-parser/* # exhaustive settings exhaustive: check: - switch - map default-signifies-exhaustive: true # nolintlint settings nolintlint: allow-unused: false require-explanation: true require-specific: true # stylecheck settings staticcheck: checks: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022"] # maintidx settings maintidx: under: 20 # testifylint settings testifylint: enable-all: true disable: - float-compare # thelper settings thelper: test: first: true name: true begin: true benchmark: first: true name: true begin: true # Severity rules severity: default: warning rules: - linters: - gosec severity: error - linters: - errcheck - staticcheck severity: error - linters: - godox severity: info