From c87ac19efa8a4eb8057beff522377c03ac87d257 Mon Sep 17 00:00:00 2001 From: Abhimanyu Sharma Date: Thu, 23 Dec 2021 23:26:36 +0530 Subject: [PATCH] Adding new processor revers lines --- README.md | 11 +++-- cmd/processor_reverse-lines.go | 56 ++++++++++++++++++++++ processors/lines.go | 39 +++++++++++++++ processors/lines_test.go | 87 ++++++++++++++++++++++++++++++++++ processors/processor.go | 1 + 5 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 cmd/processor_reverse-lines.go diff --git a/README.md b/README.md index 908282b..84570d3 100644 --- a/README.md +++ b/README.md @@ -159,9 +159,6 @@ echo "Hello World" | sttr base64-encode | sttr md5 - [x] **reverse** - Reverse Text ( txeT esreveR ) - [x] **slug** - Transform your text to slug-case - [x] **snake** - Transform your text to snake_case -- [x] **sort-lines** - Sort lines alphabetically -- [x] **shuffle-lines** - Shuffle lines randomly -- [x] **unique-lines** - Get unique lines from list - [x] **title** - Transform your text to Title Case - [x] **upper** - Transform your text to UPPER CASE @@ -171,6 +168,14 @@ echo "Hello World" | sttr base64-encode | sttr md5 - [x] **count-lines** - Count the number of lines in your text - [x] **count-words** - Count the number of words in your text +### Lines + +- [x] **count-lines** - Count the number of lines in your text +- [x] **reverse-lines** - Reverse lines +- [x] **shuffle-lines** - Shuffle lines randomly +- [x] **sort-lines** - Sort lines alphabetically +- [x] **unique-lines** - Get unique lines from list + #### RGB/Hex - [x] **hex-rgb** - Convert a #hex-color code to RGB diff --git a/cmd/processor_reverse-lines.go b/cmd/processor_reverse-lines.go new file mode 100644 index 0000000..eb9315d --- /dev/null +++ b/cmd/processor_reverse-lines.go @@ -0,0 +1,56 @@ +// Code generated by github.com/abhimanyu003/sttr/cmd/generate.go. DO NOT EDIT + +package cmd + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/abhimanyu003/sttr/processors" + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(reverseLinesCmd) +} + +var reverseLinesCmd = &cobra.Command{ + Use: "reverse-lines", + Short: "Reverse Lines", + Aliases: []string{}, + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + var err error + var in []byte + var out string + + if len(args) == 0 { + in, err = ioutil.ReadAll(cmd.InOrStdin()) + if err != nil { + return err + } + } else { + if fi, err := os.Stat(args[0]); err == nil && !fi.IsDir() { + d, err := ioutil.ReadFile(args[0]) + if err != nil { + return err + } + in = d + } else { + in = []byte(args[0]) + } + } + + flags := make([]processors.Flag, 0) + p := processors.ReverseLines{} + + out, err = p.Transform(in, flags...) + if err != nil { + return err + } + + _, err = fmt.Fprint(os.Stdout, out) + return err + }, +} diff --git a/processors/lines.go b/processors/lines.go index 6b2f531..ad61f09 100644 --- a/processors/lines.go +++ b/processors/lines.go @@ -181,3 +181,42 @@ func (p UniqueLines) Description() string { func (p UniqueLines) FilterValue() string { return p.Title() } + +// ReverseLines sort given lines, in random order. +type ReverseLines struct{} + +func (p ReverseLines) Name() string { + return "reverse-lines" +} + +func (p ReverseLines) Alias() []string { + return nil +} + +func (p ReverseLines) Transform(data []byte, _ ...Flag) (string, error) { + var output []string + split := strings.Split(string(data), "\n") + length := len(split) - 1 + + for i := length; i >= 0; i-- { + output = append(output, split[i]) + } + + return strings.Join(output, "\n"), nil +} + +func (p ReverseLines) Flags() []Flag { + return nil +} + +func (p ReverseLines) Title() string { + return "Reverse Lines" +} + +func (p ReverseLines) Description() string { + return "Reverse Lines" +} + +func (p ReverseLines) FilterValue() string { + return p.Title() +} diff --git a/processors/lines_test.go b/processors/lines_test.go index ccd6477..21b8c45 100644 --- a/processors/lines_test.go +++ b/processors/lines_test.go @@ -246,3 +246,90 @@ func TestUniqueLines_Transform(t *testing.T) { }) } } + +func TestReverseLines_Command(t *testing.T) { + test := struct { + alias []string + description string + filterValue string + flags []Flag + name string + title string + }{ + alias: nil, + description: "Reverse Lines", + filterValue: "Reverse Lines", + flags: nil, + name: "reverse-lines", + title: "Reverse Lines", + } + p := ReverseLines{} + if got := p.Alias(); !reflect.DeepEqual(got, test.alias) { + t.Errorf("Alias() = %v, want %v", got, test.alias) + } + if got := p.Description(); got != test.description { + t.Errorf("Description() = %v, want %v", got, test.description) + } + if got := p.FilterValue(); got != test.filterValue { + t.Errorf("Flags() = %v, want %v", got, test.filterValue) + } + if got := p.Flags(); !reflect.DeepEqual(got, test.flags) { + t.Errorf("Flags() = %v, want %v", got, test.flags) + } + if got := p.Name(); got != test.name { + t.Errorf("Name() = %v, want %v", got, test.name) + } + if got := p.Title(); got != test.title { + t.Errorf("Title() = %v, want %v", got, test.title) + } +} + +func TestReverseLines_Transform(t *testing.T) { + type args struct { + data []byte + opts []Flag + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "Reverse lines with numbers", + args: args{data: []byte("1\n2\n3\n4")}, + want: "4\n3\n2\n1", + }, + { + name: "Reverse lines with numbers and alpha", + args: args{data: []byte("1\n2\ntest")}, + want: "test\n2\n1", + }, + { + name: "Empty input", + args: args{data: []byte("")}, + want: "", + }, + { + name: "Single input", + args: args{data: []byte("1")}, + want: "1", + }, + { + name: "Single input with new line", + args: args{data: []byte("1\n")}, + want: "\n1", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // We are going run test 100 to make sure that list order is preserved. + for i := 0; i < 100; i++ { + p := ReverseLines{} + if got, _ := p.Transform(tt.args.data, tt.args.opts...); got != tt.want { + t.Errorf("ReverseLines() = %v, want %v", got, tt.want) + } + } + }) + } +} diff --git a/processors/processor.go b/processors/processor.go index 6474f4b..41d2ab2 100644 --- a/processors/processor.go +++ b/processors/processor.go @@ -41,6 +41,7 @@ var List = []list.Item{ Markdown{}, ROT13Encode{}, Reverse{}, + ReverseLines{}, SHA1{}, SHA256{}, SHA512{},