mirror of
https://github.com/kjanat/articulate-parser.git
synced 2026-08-05 16:44:06 +02:00
144125d355
* fix(lint): resolve golangci-lint failures and modernize string handling
CI's golangci-lint (v2.12.2) job was failing with 14 issues, which blocked
the dependent test job. This addresses all of them:
- goconst: extract repeated string literals into constants
- format aliases ("md", "word", "htm") in the exporter factory
- "section" lesson type shared by markdown and HTML exporters
- default Articulate Rise base URL and host in the parser
- reuse existing itemType* constants in the markdown switch
- staticcheck (QF1012): replace buf.WriteString(fmt.Sprintf(...)) with
fmt.Fprintf(...) in the markdown exporter
Also drop the hardcoded `go: "1.24"` from .golangci.yml so the target Go
version is autodetected from go.mod.
* ci: drop test matrix, run a single Go version from go.mod
The test job ran a 1.24.x/1.25.x matrix, but go.mod requires go 1.25.0, so the
1.24 entry just auto-downloaded the 1.25 toolchain and tested the same thing
twice. Replace the matrix with a single job that sources its Go version from
go.mod via go-version-file, and reference the resolved version through the
setup-go step output in summaries, artifact names, and Codecov flags.
* docs: remove emojis from README
* ci: pin modernize tool to gopls v0.21.x for Go 1.25 compatibility
The autofix workflow's `task modernize` step installed the modernize
analyzer from gopls@latest, which as of v0.22.0 requires Go 1.26. The
project targets Go 1.25 (go.mod) and CI runs with GOTOOLCHAIN=local, so
the install failed. Pin to the v0.21.x line, which supports Go >= 1.25.
* ci: keep modernize@latest, fetch its toolchain via GOTOOLCHAIN=auto
Replaces the earlier v0.21.0 pin. The modernize analyzer (gopls v0.22+)
requires Go 1.26, which the project doesn't target yet — and bumping the
module to 1.26 isn't viable because the current golangci-lint release is
built with Go 1.25 and refuses to lint a newer target. Instead, let the
modernize task fetch the toolchain it needs on demand via GOTOOLCHAIN=auto
(setup-go pins GOTOOLCHAIN=local in CI), so we stay on the latest analyzer
without touching the module's Go version.
Also bump golang.org/x/image v0.34.0 -> v0.42.0 via `go get -u ./...`.
* ci: set GOTOOLCHAIN=auto inline for the modernize task
A task-level env: entry does not override GOTOOLCHAIN when setup-go has
already exported GOTOOLCHAIN=local job-wide, so the autofix job still
failed. Set GOTOOLCHAIN=auto inline on the modernize command itself, which
reliably overrides the inherited value and lets Go fetch the toolchain the
modernize analyzer requires.
* ci: bump to Go 1.26 and address PR review feedback
The autofix failure is fixed properly by moving to Go 1.26 instead of the
GOTOOLCHAIN workaround. The official golangci-lint v2.12.2 binary is built
with go1.26.2 and lints a Go 1.26 target fine (the earlier "not ready"
claim was from a locally go-installed binary compiled with Go 1.25), and
the Dockerfiles already use golang:1.26-alpine, so this also aligns the
module with the images.
- go.mod: go 1.25.0 -> 1.26.0, drop the toolchain pin (keeps the lint
target at the go directive).
- Taskfile: revert modernize to plain modernize@latest; on Go 1.26 the
GOTOOLCHAIN dance and its comments are unnecessary.
- ci.yml: pass the resolved Go version through an env var (GO_VERSION)
instead of interpolating steps.setup-go.outputs.go-version directly into
shell scripts (script-injection hygiene); grant the dependency-review job
pull-requests: write so it can post its summary.
- parser.go: derive defaultBaseURL from riseHost instead of duplicating the
host string; drop the redundant per-const comments.
- .golangci.yml: remove the redundant go-version comment.
- regenerate internal/exporters/output.docx.
392 lines
8.6 KiB
YAML
392 lines
8.6 KiB
YAML
# 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
|
|
|
|
# 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
|