Skip to content

Commit

Permalink
Merge pull request #1 from ehsundar/use-linter
Browse files Browse the repository at this point in the history
Use golangci-lint
  • Loading branch information
ehsundar committed Dec 21, 2023
2 parents a583444 + fb0f47e commit 496011d
Show file tree
Hide file tree
Showing 19 changed files with 433 additions and 147 deletions.
56 changes: 56 additions & 0 deletions .github/workflows/golangci-lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: golangci-lint
on:
push:
branches:
- master
pull_request:
branches:
- master

permissions:
contents: read
# Optional: allow read access to pull request. Use with `only-new-issues` option.
pull-requests: read

jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
with:
go-version: '1.21'
cache: true
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
# Require: The version of golangci-lint to use.
# When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version.
# When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit.
version: v1.54.2

# Optional: working directory, useful for monorepos
# working-directory: somedir

# Optional: golangci-lint command line arguments.
#
# Note: By default, the `.golangci.yml` file should be at the root of the repository.
# The location of the configuration file can be changed by using `--config=`
# args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0

# Optional: show only new issues if it's a pull request. The default value is `false`.
# only-new-issues: true

# Optional: if set to true, then all caching functionality will be completely disabled,
# takes precedence over all other caching options.
# skip-cache: true

# Optional: if set to true, then the action won't cache or restore ~/go/pkg.
# skip-pkg-cache: true

# Optional: if set to true, then the action won't cache or restore ~/.cache/go-build.
# skip-build-cache: true

# Optional: The mode to install golangci-lint. It can be 'binary' or 'goinstall'.
# install-mode: "goinstall"
194 changes: 194 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
# Options for analysis running.
run:
# Number of CPUs to use when running golangci-lint.
# Default: the number of logical CPUs in the machine
concurrency: 4
# Timeout for analysis, e.g. 30s, 5m.
# Default: 1m
timeout: 5m
# Exit code when at least one issue was found.
# Default: 1
issues-exit-code: 2
# Include test files or not.
# Default: true
tests: false
# List of build tags, all linters use it.
# Default: []
build-tags: []
# Which dirs to skip: issues from them won't be reported.
# Can use regexp here: `generated.*`, regexp is applied on full path,
# including the path prefix if one is set.
# Default dirs are skipped independently of this option's value (see skip-dirs-use-default).
# "/" will be replaced by current OS file path separator to properly work on Windows.
# Default: []
skip-dirs:
- protobuf
- examples
# Enables skipping of directories:
# - vendor$, third_party$, testdata$, examples$, Godeps$, builtin$
# Default: true
skip-dirs-use-default: false
# Which files to skip: they will be analyzed, but issues from them won't be reported.
# There is no need to include all autogenerated files,
# we confidently recognize autogenerated files.
# If it's not, please let us know.
# "/" will be replaced by current OS file path separator to properly work on Windows.
# Default: []
skip-files: []
# If set, we pass it to "go list -mod={option}". From "go help modules":
# If invoked with -mod=readonly, the go command is disallowed from the implicit
# automatic updating of go.mod described above. Instead, it fails when any changes
# to go.mod are needed. This setting is most useful to check that go.mod does
# not need updates, such as in a continuous integration and testing system.
# If invoked with -mod=vendor, the go command assumes that the vendor
# directory holds the correct copies of dependencies and ignores
# the dependency descriptions in go.mod.
#
# Allowed values: readonly|vendor|mod
# Default: ""
modules-download-mode: readonly
# Allow multiple parallel golangci-lint instances running.
# If false, golangci-lint acquires file lock on start.
# Default: false
allow-parallel-runners: false
# Define the Go version limit.
# Mainly related to generics support since go1.18.
# Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.17
go: '1.21'
# output configuration options
output:
# Format: colored-line-number|line-number|json|colored-tab|tab|checkstyle|code-climate|junit-xml|github-actions|teamcity
#
# Multiple can be specified by separating them by comma, output can be provided
# for each of them by separating format name and path by colon symbol.
# Output path can be either `stdout`, `stderr` or path to the file to write to.
# Example: "checkstyle:report.xml,json:stdout,colored-line-number"
#
# Default: colored-line-number
#format: json
# Print lines of code with issue.
# Default: true
#print-issued-lines: false
# Print linter name in the end of issue text.
# Default: true
#print-linter-name: false
# Make issues output unique by line.
# Default: true
#uniq-by-line: false
# Add a prefix to the output file references.
# Default: ""
#path-prefix: ""
# Sort results by: filepath, line and column.
# Default: false
sort-results: true
linters:
enable-all: true
disable:
- scopelint
- nosnakecase
- ifshort
- depguard
- gci
# Run only fast linters from enabled linters set (first run won't be fast)
# Default: false
fast: true
issues:
# List of regexps of issue texts to exclude.
#
# But independently of 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`
#
# Default: https://golangci-lint.run/usage/false-positives/#default-exclusions
exclude: []
# Excluding configuration per-path, per-linter, per-text and per-source
exclude-rules:
# Exclude some linters from running on tests files.
- path: _test\.go
linters:
- gocyclo
- errcheck
- dupl
- gosec
# Run some linter only for test files by excluding its issues for everything else.
- path-except: _test\.go
linters:
- forbidigo
# Exclude known linters from partially hard-vendored code,
# which is impossible to exclude via `nolint` comments.
# `/` will be replaced by current OS file path separator to properly work on Windows.
- path: internal/hmac/
text: "weak cryptographic primitive"
linters:
- gosec
# Exclude some `staticcheck` messages.
- linters:
- staticcheck
text: "SA9003:"
# Exclude `lll` issues for long lines with `go:generate`.
- linters:
- lll
source: "^//go:generate "
# Independently of 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: true
#exclude-use-default: false
# If set to true exclude and exclude-rules regular expressions become case-sensitive.
# Default: false
exclude-case-sensitive: false
# The list of ids of default excludes to include or disable.
# https://golangci-lint.run/usage/false-positives/#default-exclusions
# Default: []
include: []
# Maximum issues count per one linter.
# Set to 0 to disable.
# Default: 50
max-issues-per-linter: 0
# Maximum count of issues with the same text.
# Set to 0 to disable.
# Default: 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: false
#new: true
# Show only new issues created after git revision `REV`.
# Default: ""
#new-from-rev: HEAD
# Show only new issues created in git patch with set file path.
# Default: ""
#new-from-patch: path/to/patch/file
# Fix found issues (if it's supported by the linter).
# Default: false
fix: true
severity:
# Set the default severity for issues.
#
# If severity rules are defined and the issues do not match or no severity is provided to the rule
# this will be the default severity applied.
# Severities should match the supported severity names of the selected out format.
# - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity
# - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel
# - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message
# - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance
#
# Default: ""
default-severity: error
# If set to true `severity-rules` regular expressions become case-sensitive.
# Default: false
case-sensitive: true
# When a list of severity rules are provided, severity information will be added to lint issues.
# Severity rules have the same filtering capability as exclude rules
# except you are allowed to specify one matcher per severity rule.
# Only affects out formats that support setting severity information.
#
# Default: []
rules:
- linters:
- dupl
severity: info
59 changes: 35 additions & 24 deletions cmd/protoc-gen-go-kvstore/internal/generators/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,41 @@ import (
)

func GenerateFile(gen *protogen.Plugin, file *protogen.File) {

templateCtx := kvstoreTemplateContext{
PackageName: string(file.GoPackageName),
GenVersion: version.Version,
Pairs: map[string]storagePair{},
Pairs: extractKeyValuePairs(file),
}

value, err := Render(templateCtx)
if err != nil {
fmt.Printf("%s\n", err)

return
}

fmtValue, err := formatGoCode([]byte(value))
if err != nil {
panic(err)
}

filename := file.GeneratedFilenamePrefix + "_kvstore.pb.go"
g := gen.NewGeneratedFile(filename, file.GoImportPath)
_, err = g.Write(fmtValue)

if err != nil {
fmt.Printf("%s\n", err)

return
}

return
}

func extractKeyValuePairs(file *protogen.File) map[string]storagePair {
templatePairs := make(map[string]storagePair)
pairs, err := optparse.ExtractPairs(file.Messages)

if err != nil {
panic(err)
}
Expand All @@ -44,7 +71,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) {
valueKind = pair.ValueDesc.Fields().Get(0).Kind()
}

templateCtx.Pairs[name] = storagePair{
templatePairs[name] = storagePair{
CodeSafeName: strcase.ToCamel(name),
KeySpecs: keySpecs{
Opts: pair.KeyOptions,
Expand All @@ -61,26 +88,7 @@ func GenerateFile(gen *protogen.Plugin, file *protogen.File) {
}
}

value, err := Render(templateCtx)
if err != nil {
fmt.Printf("%s\n", err)
return
}

fmtValue, err := formatGoCode([]byte(value))
if err != nil {
panic(err)
}

filename := file.GeneratedFilenamePrefix + "_kvstore.pb.go"
g := gen.NewGeneratedFile(filename, file.GoImportPath)
_, err = g.Write(fmtValue)
if err != nil {
fmt.Printf("%s\n", err)
return
}

return
return templatePairs
}

func protoKindToGoType(k protoreflect.Kind) string {
Expand All @@ -98,19 +106,22 @@ func protoKindToGoType(k protoreflect.Kind) string {
case protoreflect.Uint64Kind:
return "uint64"
default:
//nolint:godox
// TODO: Handle all proto types
return ""
}
}

func formatGoCode(code []byte) ([]byte, error) {
formatted, err := format.Source([]byte(code))
formatted, err := format.Source(code)
if err != nil {
return []byte{}, err
}

//nolint:gomnd
options := &imports.Options{Comments: true, TabIndent: true, TabWidth: 8}
formatted, err = imports.Process("", formatted, options)

if err != nil {
return []byte{}, err
}
Expand Down
9 changes: 8 additions & 1 deletion cmd/protoc-gen-go-kvstore/internal/generators/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,16 @@ var rawTemplate string

var funcs = template.FuncMap{
"funcCallArgs": func(varName string, v interface{}) string {
vv := v.([]string)
vv, ok := v.([]string)

if !ok {
return ""
}

vv = lo.Map(vv, func(item string, _ int) string {
return fmt.Sprintf("%s.%s", varName, item)
})

return strings.Join(vv, ", ")
},
}
Expand Down Expand Up @@ -65,6 +71,7 @@ func Render(templateContext kvstoreTemplateContext) (string, error) {

builder := &bytes.Buffer{}
err := tmpl.Execute(builder, templateContext)

if err != nil {
return "", err
}
Expand Down
Loading

0 comments on commit 496011d

Please sign in to comment.