diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..5b19dc4 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,265 @@ +# Options for analysis running. +run: + # The default concurrency value is the number of available CPU. + # concurrency: 4 + + # Timeout for analysis, e.g. 30s, 5m. + # Default: 1m + timeout: 10m + + # 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: + # - mytag + + # Which dirs to skip: issues from them won't be reported. + # Can use regexp here: `generated.*`, regexp is applied on full path. + # Default value is empty list, + # but 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. + # skip-dirs: + # - src/external_libs + # - autogenerated_by_my_lib + + # Enables skipping of directories: + # - vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + # Default: true + skip-dirs-use-default: true + + # Which files to skip: they will be analyzed, but issues from them won't be reported. + # Default value is empty list, + # but 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. + # skip-files: + # - ".*\\.my\\.go$" + # - lib/bad.go + + # 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 + # By default, it isn't set. + # modules-download-mode: readonly + + # Allow multiple parallel golangci-lint instances running. + # If false (default) - golangci-lint acquires file lock on start. + 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.18 + # go: '1.19' + +# output configuration options +output: + # Format: colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions + # + # 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.json,colored-line-number" + # + # Default: colored-line-number + format: colored-line-number + + # Print lines of code with issue. + # Default: true + print-issued-lines: true + + # Print linter name in the end of issue text. + # Default: true + print-linter-name: true + + # Make issues output unique by line. + # Default: true + uniq-by-line: true + + # Add a prefix to the output file references. + # Default is no prefix. + path-prefix: "" + + # Sort results by: filepath, line and column. + sort-results: false +linters: + # Disable all linters. + # Default: false + disable-all: true + + # Enable specific linter + # https://golangci-lint.run/usage/linters/#enabled-by-default + enable: + - revive + - goimports + - unconvert + - unparam + - gosec + - bodyclose + - errcheck + - govet + - unused + - staticcheck + - typecheck + - ineffassign + - gosimple + - exhaustive + - nilerr + + # Enable all available linters. + # Default: false + # enable-all: false + + # Disable specific linter + # https://golangci-lint.run/usage/linters/#disabled-by-default + # disable: + # - asasalint + + # Enable presets. + # https://golangci-lint.run/usage/linters + # presets: + # - bugs + # - comment + # - complexity + # - error + # - format + # - import + # - metalinter + # - module + # - performance + # - sql + # - style + # - test + # - unused + + # Run only fast linters from enabled linters set (first run won't be fast) + # Default: false + fast: false +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: + - "should have a package comment" + # Excluding configuration per-path, per-linter, per-text and per-source + exclude-rules: + - text: "G404:" # Use of weak random number generator (math/rand instead of crypto/rand)" + linters: + - gosec + - text: "G109:" # Use of weak random number generator (math/rand instead of crypto/rand)" + linters: + - gosec + # Exclude some linters from running on tests files. + - path: _test\.go + linters: + - gocyclo + - errcheck + - dupl + - gosec + # 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: + # - EXC0001 + # - EXC0002 + # - EXC0003 + # - EXC0004 + # - EXC0005 + # - EXC0006 + # - EXC0007 + # - EXC0008 + # - EXC0009 + # - EXC0010 + # - EXC0011 + # - EXC0012 + # - EXC0013 + # - EXC0014 + + # 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: false + # Show only new issues created after git revision `REV`. + # new-from-rev: HEAD + # Show only new issues created in git patch with set file path. + # new-from-patch: path/to/patch/file + # Fix found issues (if it's supported by the linter). + 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 + # + # Default value is an empty string. + 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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f03957..dcec5be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # go-utils + +## [v1.34.0] - 2023-09-19 +### New Features +- add generate uuid functionality and update linter + + ## [v1.33.0] - 2023-07-20 ### New Features @@ -106,6 +112,9 @@ - fix marshal issue on gorm.DeletedAt empty value ([#32](https://github.com/kumparan/kumnats/issues/32)) + +## [v.1.20.0] - 2022-03-11 + ## [v1.20.0] - 2022-03-11 ### New Features @@ -274,7 +283,8 @@ - init go-utils -[Unreleased]: https://github.com/kumparan/kumnats/compare/v1.33.0...HEAD +[Unreleased]: https://github.com/kumparan/kumnats/compare/v1.34.0...HEAD +[v1.34.0]: https://github.com/kumparan/kumnats/compare/v1.33.0...v1.34.0 [v1.33.0]: https://github.com/kumparan/kumnats/compare/v1.32.1...v1.33.0 [v1.32.1]: https://github.com/kumparan/kumnats/compare/v1.32.0...v1.32.1 [v1.32.0]: https://github.com/kumparan/kumnats/compare/v1.31.0...v1.32.0 @@ -291,7 +301,8 @@ [v1.23.0]: https://github.com/kumparan/kumnats/compare/v1.22.0...v1.23.0 [v1.22.0]: https://github.com/kumparan/kumnats/compare/v1.21.0...v1.22.0 [v1.21.0]: https://github.com/kumparan/kumnats/compare/v1.20.1...v1.21.0 -[v1.20.1]: https://github.com/kumparan/kumnats/compare/v1.20.0...v1.20.1 +[v1.20.1]: https://github.com/kumparan/kumnats/compare/v.1.20.0...v1.20.1 +[v.1.20.0]: https://github.com/kumparan/kumnats/compare/v1.20.0...v.1.20.0 [v1.20.0]: https://github.com/kumparan/kumnats/compare/v1.19.3...v1.20.0 [v1.19.3]: https://github.com/kumparan/kumnats/compare/v1.19.2...v1.19.3 [v1.19.2]: https://github.com/kumparan/kumnats/compare/v1.19.1...v1.19.2 diff --git a/Makefile b/Makefile index 77af81f..3beff4d 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ changelog_args=-o CHANGELOG.md -tag-filter-pattern '^v' test_command=richgo test ./... $(TEST_ARGS) -v --cover lint: - golangci-lint run --concurrency 4 --print-issued-lines=false --exclude-use-default=false --enable=revive --enable=goimports --enable=unconvert --fix + golangci-lint run changelog: ifdef version diff --git a/bson_test.go b/bson_test.go index 55a19cf..f20d19b 100644 --- a/bson_test.go +++ b/bson_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" ) -func BenchmarkTimeFromObjectIDHex(b *testing.B) { +func BenchmarkTimeFromObjectIDHex(_ *testing.B) { cases := []string{ "63acfc824ffda9000ee65045", "5c4b288bac1b2972d0291377", diff --git a/cron.go b/cron.go index 3a325bb..c93cd01 100644 --- a/cron.go +++ b/cron.go @@ -11,6 +11,7 @@ var cronNextAtTimeFormat = "2006-01-02T15:04:05" // GetCronNextAt supports // - Standard crontab specs, e.g. "* * * * ?" // - Descriptors, e.g. "@midnight", "@every 1h30m" +// // if cron parsing error then return current time func GetCronNextAt(cronTab string) string { now := time.Now() diff --git a/cron_test.go b/cron_test.go index 41899e7..46487d2 100644 --- a/cron_test.go +++ b/cron_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "github.com/agiledragon/gomonkey" + "github.com/agiledragon/gomonkey/v2" "github.com/stretchr/testify/assert" ) diff --git a/encryption/aes.go b/encryption/aes.go index 8f37714..1699d03 100644 --- a/encryption/aes.go +++ b/encryption/aes.go @@ -91,7 +91,7 @@ func (c *AESCryptor) generateIVKey(iv string) (bIv []byte, err error) { return hex.DecodeString(ivKey) } -func (c *AESCryptor) pkcs5Padding(ciphertext []byte, blockSize int, after int) []byte { +func (c *AESCryptor) pkcs5Padding(ciphertext []byte, blockSize int, _ int) []byte { padding := (blockSize - len(ciphertext)%blockSize) padtext := bytes.Repeat([]byte{byte(padding)}, padding) diff --git a/go.mod b/go.mod index c6a5688..4ede514 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,10 @@ go 1.18 require ( github.com/99designs/gqlgen v0.14.0 - github.com/agiledragon/gomonkey v2.0.2+incompatible + github.com/agiledragon/gomonkey/v2 v2.10.1 github.com/getsentry/sentry-go v0.11.0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 + github.com/gofrs/uuid/v5 v5.0.0 github.com/goodsign/monday v1.0.0 github.com/graph-gophers/graphql-go v1.4.0 github.com/leekchan/accounting v0.3.1 @@ -22,7 +23,7 @@ require ( gorm.io/gorm v1.22.4 ) -require gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +require gopkg.in/yaml.v3 v3.0.1 // indirect require ( github.com/aymerick/douceur v0.2.0 // indirect diff --git a/go.sum b/go.sum index d0db8a6..59b5a03 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3 github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw= -github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= +github.com/agiledragon/gomonkey/v2 v2.10.1 h1:FPJJNykD1957cZlGhr9X0zjr291/lbazoZ/dmc4mS4c= +github.com/agiledragon/gomonkey/v2 v2.10.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/agnivade/levenshtein v1.1.0/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= @@ -56,6 +56,8 @@ github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AE github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -286,8 +288,9 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/gorm v1.22.4 h1:8aPcyEJhY0MAt8aY6Dc524Pn+pO29K+ydu+e/cXSpQM= gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/string.go b/string.go index fcc75be..1ae939c 100644 --- a/string.go +++ b/string.go @@ -4,6 +4,9 @@ import ( "encoding/json" "strconv" "strings" + + "github.com/gofrs/uuid/v5" + "github.com/sirupsen/logrus" ) // StandardizeSpaces -> JoinURL long query to one line query @@ -125,3 +128,14 @@ func TrimSpacePointerString(s *string) { } *s = strings.TrimSpace(*s) } + +// GenerateUUID generate random UUID v4 +func GenerateUUID() string { + u, err := uuid.NewV4() + if err != nil { + logrus.Error(err) + return "" + } + + return u.String() +} diff --git a/string_test.go b/string_test.go index d5fe56b..57815ab 100644 --- a/string_test.go +++ b/string_test.go @@ -122,3 +122,9 @@ func Test_TrimSpacePointerString(t *testing.T) { assert.Equal(t, out, in) } } + +func TestGenerateUUID(t *testing.T) { + uuid := GenerateUUID() + assert.NotEqual(t, "", uuid) + assert.Equal(t, 36, len(uuid)) +}