Skip to content

Commit

Permalink
feat: add linters, minor refactors
Browse files Browse the repository at this point in the history
  • Loading branch information
Antosik committed Nov 7, 2024
1 parent 92ca814 commit cdf8152
Show file tree
Hide file tree
Showing 25 changed files with 248 additions and 190 deletions.
27 changes: 22 additions & 5 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,30 @@ outputs:
format: colored-line-number

linters:
enable:
- revive
- gosec
- lll
- wsl
presets:
- bugs
- comment
- complexity
- error
- format
- import
- metalinter
- module
- performance
- style
- test
- unused
disable:
- depguard # tbd
- exhaustruct # tbd
- wrapcheck # tbd
- tagliatelle # json case differs from output to output
- gochecknoinits # we need init for lambda
- gochecknoglobals # we need globals for lambda

linters-settings:
gosec:
excludes:
- G107
funlen:
lines: 80
2 changes: 0 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,3 @@ require (
github.com/google/uuid v1.6.0 // indirect
golang.org/x/net v0.30.0 // indirect
)

replace gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.2.8
17 changes: 13 additions & 4 deletions internal/atom.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@ package internal

import (
"encoding/xml"
"fmt"
"strings"
"time"
)

const NSAtom = "http://www.w3.org/2005/Atom"
const (
NSAtom = "http://www.w3.org/2005/Atom"
AtomLinksCount = 2
)

// Atom Docs - https://validator.w3.org/feed/docs/atom.html

Expand All @@ -25,7 +29,12 @@ type Atom struct {
}

func (atom Atom) XML() ([]byte, error) {
return xml.Marshal(atom)
data, err := xml.Marshal(atom)
if err != nil {
return nil, fmt.Errorf("can't marshal atom feed: %w", err)
}

return data, nil
}

type AtomGenerator struct {
Expand Down Expand Up @@ -68,7 +77,7 @@ type AtomLink struct {

func ConvertFeedEntryToAtomEntry(entry *FeedEntry) AtomEntry {
var (
links = make([]AtomLink, 0, 2)
links = make([]AtomLink, 0, AtomLinksCount)
authors = make([]AtomAuthor, len(entry.Authors))
categories = make([]AtomCategory, len(entry.Categories))
)
Expand Down Expand Up @@ -104,7 +113,7 @@ func ConvertFeedToAtom(feed *Feed) Atom {
entries[i] = item.Atom()
}

links := make([]AtomLink, 0, 2)
links := make([]AtomLink, 0, AtomLinksCount)

links = append(links, AtomLink{
Href: feed.Links.Alternate,
Expand Down
7 changes: 4 additions & 3 deletions internal/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ func (c *ErrorCollector) CollectMany(e []error) { *c = append(*c, e...) }

func (c *ErrorCollector) CollectFrom(e ErrorCollector) { *c = append(*c, e...) }

func (c *ErrorCollector) String() (err string) {
err = "Collected errors:\n"
func (c *ErrorCollector) String() string {
err := "Collected errors:\n"

for i, e := range *c {
err += fmt.Sprintf("\tError %d: %s\n", i, e.Error())
}
Expand All @@ -25,7 +26,7 @@ func (c *ErrorCollector) String() (err string) {
}

func (c *ErrorCollector) Error() error {
return fmt.Errorf(c.String())
return fmt.Errorf("%s", c.String()) //nolint:err113
}

func (c *ErrorCollector) Size() int {
Expand Down
12 changes: 9 additions & 3 deletions internal/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ type FeedFile struct {
Buffer []byte
}

const filesCount = 3 // atom, rss, jsonfeed, json (will be added lately)

var feedMimeType = map[string]string{
"atom": "application/atom+xml",
"rss": "application/rss+xml",
Expand All @@ -25,14 +27,14 @@ var feedBufferGenerators = map[string]func(feed Feed) ([]byte, error){

func GenerateFeedFiles(feed Feed, domain string, name string) ([]FeedFile, []error) {
var (
generatedFiles = make([]FeedFile, 0, 4)
generationErrors = make([]error, 0, 4)
generatedFiles = make([]FeedFile, 0, filesCount)
generationErrors = make([]error, 0, filesCount)
formats = []string{"atom", "rss", "jsonfeed"}
)

for _, format := range formats {
mime := feedMimeType[format]
filename := fmt.Sprintf("%s.%s", name, format)
filename := name + "." + format // "%s.%s"

if domain != "" {
feed.Links.Self = fmt.Sprintf("https://%s/%s", domain, filename)
Expand Down Expand Up @@ -69,3 +71,7 @@ func GenerateRawFile(entries interface{}, name string) (FeedFile, error) {
func FormatFilePath(path string) string {
return strings.ReplaceAll(strings.ToLower(path), "_", "-")
}

func FormatAbstractFilePath(path string) string {
return "/" + path + ".*" // "/%s.*"
}
4 changes: 1 addition & 3 deletions internal/jsonfeed.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ type JSONFeedEntry struct {
}

func ConvertFeedEntryToJSONFeedEntry(entry *FeedEntry) JSONFeedEntry {
var (
authors = make([]JSONFeedAuthor, len(entry.Authors))
)
authors := make([]JSONFeedAuthor, len(entry.Authors))

for i, author := range entry.Authors {
authors[i] = JSONFeedAuthor{Name: author}
Expand Down
8 changes: 6 additions & 2 deletions internal/processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ func (p *MainProcessor[ParamType]) Process(params []ParamType) error {
generatedPathsCollector = []string{}
)

//nolint:forbidigo // need for lambda logs
fmt.Printf(
"Starting processing %s with %d parameters and %d concurrency\n",
p.Name,
Expand All @@ -81,18 +82,21 @@ func (p *MainProcessor[ParamType]) Process(params []ParamType) error {
go p.ProcessChunk(generatedPathsChannel, errorsChannel, chunk, p.S3Client)
}

for i := 0; i < p.Concurrency; i++ {
for range p.Concurrency {
errorsCollector.CollectFrom(<-errorsChannel)

generatedPathsCollector = append(generatedPathsCollector, <-generatedPathsChannel...)
}

if len(generatedPathsCollector) > 0 {
//nolint:forbidigo // need for lambda logs
fmt.Printf("Updated paths (%d): %v\n", len(generatedPathsCollector), generatedPathsCollector)
}

if errorsCollector.Size() > 0 {
fmt.Printf("During execution %d errors occured\n", errorsCollector.Size())
//nolint:forbidigo // need for lambda logs
fmt.Printf("During execution %d errors occurred\n", errorsCollector.Size())

return errorsCollector.Error()
}

Expand Down
12 changes: 8 additions & 4 deletions internal/rss.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package internal

import (
"encoding/xml"
"fmt"
"strings"
"time"
)
Expand All @@ -19,7 +20,12 @@ type RSS struct {
}

func (rss RSS) XML() ([]byte, error) {
return xml.Marshal(rss)
data, err := xml.Marshal(rss)
if err != nil {
return nil, fmt.Errorf("can't marshal rss feed: %w", err)
}

return data, nil
}

type RSSChannel struct {
Expand Down Expand Up @@ -53,9 +59,7 @@ type RSSEntry struct {
}

func ConvertFeedEntryToRSSEntry(entry *FeedEntry) RSSEntry {
var (
image *RSSEnclosure
)
var image *RSSEnclosure

if entry.Image != "" {
image = &RSSEnclosure{URL: entry.Image, Length: 0, Type: "image/*"}
Expand Down
4 changes: 1 addition & 3 deletions internal/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ import (
"github.com/aws/aws-sdk-go-v2/service/s3"
)

var (
bucketName string
)
var bucketName string

func init() {
bucketName = os.Getenv("BUCKET_NAME")
Expand Down
49 changes: 23 additions & 26 deletions internal/slice.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package internal

import (
"fmt"
)

func SplitSliceToChunks[T interface{}](arr []T, count int) [][]T {
var (
size = int(float64(len(arr)) / float64(count))
Expand All @@ -12,32 +8,32 @@ func SplitSliceToChunks[T interface{}](arr []T, count int) [][]T {
)

pointer := 0
for i := 0; i < count; i++ {
for index := range count {
start := pointer
pointer = pointer + size
pointer += size

if i < exceed {
pointer = pointer + 1
if index < exceed {
pointer++
}

if pointer > len(arr) {
pointer = len(arr)
}

result[i] = make([]T, pointer-start)
copy(result[i], arr[start:pointer])
result[index] = make([]T, pointer-start)
copy(result[index], arr[start:pointer])
}

return result
}

func IsEqual[T interface{}](a, b []T, comparator func(a, b T) bool) bool {
if len(a) != len(b) {
func IsEqual[T interface{}](first, second []T, comparator func(a, b T) bool) bool {
if len(first) != len(second) {
return false
}

for i := range a {
if !comparator(a[i], b[i]) {
for i := range first {
if !comparator(first[i], second[i]) {
return false
}
}
Expand All @@ -46,32 +42,33 @@ func IsEqual[T interface{}](a, b []T, comparator func(a, b T) bool) bool {
}

func CompareAndGetDiff[T interface{}](
old, new []T,
olditems, newitems []T,
keyfunc func(item T) string,
) (diff []string, isEqual bool) {
om := make(map[string]int8, len(old))
) ([]string, bool) {
changesmap := make(map[string]int8, len(olditems))
diff := []string{}

for _, olditem := range old {
om[keyfunc(olditem)] = om[keyfunc(olditem)] + 1
for _, olditem := range olditems {
changesmap[keyfunc(olditem)] = changesmap[keyfunc(olditem)] + 1
}

for _, newitem := range new {
for _, newitem := range newitems {
key := keyfunc(newitem)

val, found := om[key]
val, found := changesmap[key]
if found {
om[key] = val - 1
changesmap[key] = val - 1
} else {
diff = append(diff, fmt.Sprintf("+ %s", key))
diff = append(diff, "+ "+key)
}
}

for key, value := range om {
for key, value := range changesmap {
switch {
case value < 0:
diff = append(diff, fmt.Sprintf("+ %s", key))
diff = append(diff, "+ "+key)
case value > 0:
diff = append(diff, fmt.Sprintf("- %s", key))
diff = append(diff, "- "+key)
}
}

Expand Down
Loading

0 comments on commit cdf8152

Please sign in to comment.