From 015c294c957ed29de6987d0b31b7d0ebac517bd6 Mon Sep 17 00:00:00 2001 From: kynefuk Date: Sat, 11 Jul 2020 09:25:53 +0900 Subject: [PATCH 1/6] kadai1-kynefuk --- kadai1/kynefuk/.gitignore | 27 +++++++++++ kadai1/kynefuk/README.md | 34 +++++++++++++ kadai1/kynefuk/cli/args.go | 44 +++++++++++++++++ kadai1/kynefuk/cli/args_test.go | 29 +++++++++++ kadai1/kynefuk/cli/cli.go | 44 +++++++++++++++++ kadai1/kynefuk/cli/cli_test.go | 39 +++++++++++++++ kadai1/kynefuk/converter/converter.go | 66 ++++++++++++++++++++++++++ kadai1/kynefuk/go.mod | 5 ++ kadai1/kynefuk/go.sum | 3 ++ kadai1/kynefuk/main.go | 32 +++++++++++++ kadai1/kynefuk/testdata/gopher1.jpg | Bin 0 -> 40013 bytes kadai1/kynefuk/testdata/gopher1.png | Bin 0 -> 52993 bytes kadai1/kynefuk/walker/walker.go | 41 ++++++++++++++++ 13 files changed, 364 insertions(+) create mode 100644 kadai1/kynefuk/.gitignore create mode 100644 kadai1/kynefuk/README.md create mode 100644 kadai1/kynefuk/cli/args.go create mode 100644 kadai1/kynefuk/cli/args_test.go create mode 100644 kadai1/kynefuk/cli/cli.go create mode 100644 kadai1/kynefuk/cli/cli_test.go create mode 100644 kadai1/kynefuk/converter/converter.go create mode 100644 kadai1/kynefuk/go.mod create mode 100644 kadai1/kynefuk/go.sum create mode 100644 kadai1/kynefuk/main.go create mode 100644 kadai1/kynefuk/testdata/gopher1.jpg create mode 100644 kadai1/kynefuk/testdata/gopher1.png create mode 100644 kadai1/kynefuk/walker/walker.go diff --git a/kadai1/kynefuk/.gitignore b/kadai1/kynefuk/.gitignore new file mode 100644 index 0000000..05ecac4 --- /dev/null +++ b/kadai1/kynefuk/.gitignore @@ -0,0 +1,27 @@ +# Created by https://www.toptal.com/developers/gitignore/api/go +# Edit at https://www.toptal.com/developers/gitignore?templates=go + +### Go ### +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +### Go Patch ### +/vendor/ +/Godeps/ + +img + +# End of https://www.toptal.com/developers/gitign \ No newline at end of file diff --git a/kadai1/kynefuk/README.md b/kadai1/kynefuk/README.md new file mode 100644 index 0000000..4e39cc2 --- /dev/null +++ b/kadai1/kynefuk/README.md @@ -0,0 +1,34 @@ +# 画像変換コマンドを作ろう + +## 概要 + +### 次の仕様を満たすコマンドを作って下さい + +- ディレクトリを指定する +- 指定したディレクトリ以下の JPG ファイルを PNG に変換(デフォルト) +- ディレクトリ以下は再帰的に処理する +- 変換前と変換後の画像形式を指定できる(オプション) + +### 以下を満たすように開発してください + +- main パッケージと分離する +- 自作パッケージと標準パッケージと準標準パッケージのみ使う +- 準標準パッケージ:golang.org/x 以下のパッケージ +- ユーザ定義型を作ってみる +- GoDoc を生成してみる +- Go Modules を使ってみる + +# Usage + +## build + +``` +cd kynefuk +go build -o imgconverter +``` + +## command + +``` +imgconverter -d [directory] -f [from format] -t [to format] +``` diff --git a/kadai1/kynefuk/cli/args.go b/kadai1/kynefuk/cli/args.go new file mode 100644 index 0000000..79cca38 --- /dev/null +++ b/kadai1/kynefuk/cli/args.go @@ -0,0 +1,44 @@ +package cli + +import ( + "fmt" +) + +// Args represents CLI's arguments object +type Args struct { + directory, from, to string +} + +// Validate is a validation method +func (args *Args) Validate() error { + fileExtMap := createFileExtMap() + if _, ok := fileExtMap[args.from]; !ok { + return fmt.Errorf("argument of \"-f, --from\" is not valid file format. invalid format: %s", args.from) + } + if _, ok := fileExtMap[args.to]; !ok { + return fmt.Errorf("argument of \"-t, --to\" is not valid file format. invalid format: %s", args.to) + } + + return nil +} + +func createFileExtMap() map[string]string { + fileExtMap := make(map[string]string) + list := []string{ + "jpg", + "jpeg", + "png", + "gif", + "bmp", + "tiff", + } + for _, v := range list { + fileExtMap[v] = "" + } + return fileExtMap +} + +// NewArgs is a constructor of Args +func NewArgs(directory, from, to string) *Args { + return &Args{directory: directory, from: from, to: to} +} diff --git a/kadai1/kynefuk/cli/args_test.go b/kadai1/kynefuk/cli/args_test.go new file mode 100644 index 0000000..239ba86 --- /dev/null +++ b/kadai1/kynefuk/cli/args_test.go @@ -0,0 +1,29 @@ +package cli + +import ( + "testing" +) + +const dummyDir = "dummy" + +func TestArgs(t *testing.T) { + tests := []struct{ name, fromFormat, toFormat, expectedMessage string }{ + {name: "valid arguments", fromFormat: "jpeg", toFormat: "png", expectedMessage: ""}, + {name: "invalid from format", fromFormat: "hoge", toFormat: "jpg", expectedMessage: "argument of \"-f, --from\" is not valid file format. invalid format: hoge"}, + {name: "invalid to format", fromFormat: "gif", toFormat: "hage", expectedMessage: "argument of \"-t, --to\" is not valid file format. invalid format: hage"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + args := NewArgs(dummyDir, tt.fromFormat, tt.toFormat) + actual := args.Validate() + if actual == nil { + if tt.expectedMessage != "" { + t.Errorf("want %s, got %s", actual, tt.expectedMessage) + } + } else if actual.Error() != tt.expectedMessage { + t.Errorf("want %s, got %s", actual, tt.expectedMessage) + } + }) + } +} diff --git a/kadai1/kynefuk/cli/cli.go b/kadai1/kynefuk/cli/cli.go new file mode 100644 index 0000000..ad0dd13 --- /dev/null +++ b/kadai1/kynefuk/cli/cli.go @@ -0,0 +1,44 @@ +package cli + +import ( + "fmt" + "io" + + "github.com/gopherdojo/dojo8/kadai1/kynefuk/converter" + "github.com/gopherdojo/dojo8/kadai1/kynefuk/walker" +) + +// it represents Exit Code +const ( + ExitCodeOK = iota + ExitCodeError +) + +// Command represents CLI object +type Command struct { + OutStream, ErrStream io.Writer +} + +// Run invoke cli main logic +func (cli *Command) Run(args *Args) int { + dirWalker := walker.NewWalker(args.from) + files, err := dirWalker.Dirwalk(args.directory) + if err != nil { + fmt.Fprintf(cli.ErrStream, "failed to read directory: %s, err: %s\n", args.directory, err) + return ExitCodeError + } + imgConverter := converter.NewConverter(args.from, args.to) + for _, file := range files { + if err := imgConverter.ConvertFormat(file); err != nil { + fmt.Println(imgConverter.From, imgConverter.To) + fmt.Fprintf(cli.ErrStream, "failed to convert img, err: %s\n", err) + return ExitCodeError + } + } + return ExitCodeOK +} + +// NewCommand is a constructor of CLI +func NewCommand(outStream, errStream io.Writer) *Command { + return &Command{OutStream: outStream, ErrStream: errStream} +} diff --git a/kadai1/kynefuk/cli/cli_test.go b/kadai1/kynefuk/cli/cli_test.go new file mode 100644 index 0000000..20285cd --- /dev/null +++ b/kadai1/kynefuk/cli/cli_test.go @@ -0,0 +1,39 @@ +package cli + +import ( + "bytes" + "strings" + "testing" +) + +func TestCLI(t *testing.T) { + outStream, errStream := new(bytes.Buffer), new(bytes.Buffer) + command := NewCommand(outStream, errStream) + + tests := []struct { + name, directory, fromFormat, toFormat, outStream, errStream string + exitCode int + }{ + {name: "success", directory: "../testdata", fromFormat: "png", toFormat: "jpg", outStream: "", errStream: "", exitCode: 0}, + {name: "invalid directory", directory: "dummyDir", fromFormat: "jpg", toFormat: "png", outStream: "", errStream: "failed to read directory: dummyDir, err: open dummyDir: no such file or directory", exitCode: 1}, + {name: "invalid to format", directory: "../testdata", fromFormat: "jpg", toFormat: "hoge", outStream: "", errStream: "", exitCode: 1}, + {name: "invalid from format", directory: "../testdata", fromFormat: "hoge", toFormat: "png", outStream: "", errStream: "", exitCode: 1}, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + args := NewArgs(tt.directory, tt.fromFormat, tt.toFormat) + status := command.Run(args) + if status != tt.exitCode { + t.Errorf("want %d, got %d", tt.exitCode, status) + } + if !strings.Contains(outStream.String(), tt.outStream) { + t.Errorf("want %s, got %s", tt.outStream, outStream.String()) + } + if !strings.Contains(errStream.String(), tt.errStream) { + t.Errorf("want %s, got %s", tt.errStream, errStream.String()) + } + }) + } +} diff --git a/kadai1/kynefuk/converter/converter.go b/kadai1/kynefuk/converter/converter.go new file mode 100644 index 0000000..bb3da66 --- /dev/null +++ b/kadai1/kynefuk/converter/converter.go @@ -0,0 +1,66 @@ +package converter + +import ( + "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "strings" + + "golang.org/x/image/bmp" + "golang.org/x/image/tiff" +) + +// Converter converts image file +type Converter struct { + From, To string +} + +// ConvertFormat converts file format +func (converter *Converter) ConvertFormat(filepath string) error { + file, err := os.Open(filepath) + if err != nil { + return fmt.Errorf("failed to open file. file: %s", filepath) + } + defer file.Close() + + img, _, err := image.Decode(file) + if err != nil { + return fmt.Errorf("failed to decode file. file: %s", filepath) + } + + out, err := os.Create(converter.ConvertExt(filepath)) + if err != nil { + return fmt.Errorf("failed to create output file. file: %s", converter.ConvertExt(filepath)) + } + defer out.Close() + + switch converter.To { + case "jpg", "jpeg": + err = jpeg.Encode(out, img, &jpeg.Options{Quality: 100}) + case "png": + err = png.Encode(out, img) + case "gif": + err = gif.Encode(out, img, &gif.Options{NumColors: 256, Quantizer: nil, Drawer: nil}) + case "bmp": + err = bmp.Encode(out, img) + case "tiff": + err = tiff.Encode(out, img, nil) + default: + return fmt.Errorf("unknown format type") + } + + return err +} + +// ConvertExt converts file format extention +func (converter *Converter) ConvertExt(filepath string) string { + return strings.Replace(filepath, converter.From, converter.To, 1) +} + +// NewConverter is a Constructor of Converter +func NewConverter(from, to string) *Converter { + return &Converter{From: from, To: to} +} diff --git a/kadai1/kynefuk/go.mod b/kadai1/kynefuk/go.mod new file mode 100644 index 0000000..f9a7d77 --- /dev/null +++ b/kadai1/kynefuk/go.mod @@ -0,0 +1,5 @@ +module github.com/gopherdojo/dojo8/kadai1/kynefuk + +go 1.14 + +require golang.org/x/image v0.0.0-20200618115811-c13761719519 diff --git a/kadai1/kynefuk/go.sum b/kadai1/kynefuk/go.sum new file mode 100644 index 0000000..394251b --- /dev/null +++ b/kadai1/kynefuk/go.sum @@ -0,0 +1,3 @@ +golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/kadai1/kynefuk/main.go b/kadai1/kynefuk/main.go new file mode 100644 index 0000000..77a2f0f --- /dev/null +++ b/kadai1/kynefuk/main.go @@ -0,0 +1,32 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/gopherdojo/dojo8/kadai1/kynefuk/cli" +) + +func main() { + var directory string + var from string + var to string + flag.StringVar(&directory, "directory", "./", "directory") + flag.StringVar(&directory, "d", "./", "directory(short)") + flag.StringVar(&from, "from", "jpg", "from format") + flag.StringVar(&from, "f", "jpg", "from format(short)") + flag.StringVar(&to, "to", "png", "to format") + flag.StringVar(&to, "t", "png", "to format(short)") + flag.Parse() + + command := cli.NewCommand(os.Stdout, os.Stderr) + + args := cli.NewArgs(directory, from, to) + if err := args.Validate(); err != nil { + fmt.Fprintf(command.ErrStream, "error: %s\n", err) + os.Exit(cli.ExitCodeError) + } + + os.Exit(command.Run(args)) +} diff --git a/kadai1/kynefuk/testdata/gopher1.jpg b/kadai1/kynefuk/testdata/gopher1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0acc83dea50de71ca69b8f64aefb0a27d38e6832 GIT binary patch literal 40013 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 XkAZCa{I4i=|6l6i|9DR0$Jl=W(!#xQ literal 0 HcmV?d00001 diff --git a/kadai1/kynefuk/testdata/gopher1.png b/kadai1/kynefuk/testdata/gopher1.png new file mode 100644 index 0000000000000000000000000000000000000000..cbdfd8c68dc821e688060dcc850bd607ebece65a GIT binary patch literal 52993 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 TD{?Yh8Thcvu|wr(+|_>p-D^E< literal 0 HcmV?d00001 diff --git a/kadai1/kynefuk/walker/walker.go b/kadai1/kynefuk/walker/walker.go new file mode 100644 index 0000000..c2c069c --- /dev/null +++ b/kadai1/kynefuk/walker/walker.go @@ -0,0 +1,41 @@ +package walker + +import ( + "io/ioutil" + "path/filepath" + "strings" +) + +// Walker walk directory to extract files +type Walker struct { + TargetExt string +} + +// Dirwalk walk directory and collect files +func (walker *Walker) Dirwalk(directory string) ([]string, error) { + items, err := ioutil.ReadDir(directory) + if err != nil { + return nil, err + } + + var paths []string + for _, item := range items { + if item.IsDir() { + items, err := walker.Dirwalk(filepath.Join(directory, item.Name())) + if err != nil { + return nil, err + } + paths = append(paths, items...) + continue + } + if strings.HasSuffix(item.Name(), walker.TargetExt) { + paths = append(paths, filepath.Join(directory, item.Name())) + } + } + return paths, nil +} + +// NewWalker is a constructor of Walker +func NewWalker(targetExt string) *Walker { + return &Walker{TargetExt: targetExt} +} From bcbb2064f14e0f6129e6b2533857874cfcaa5bc7 Mon Sep 17 00:00:00 2001 From: kynefuk Date: Sat, 18 Jul 2020 23:02:51 +0900 Subject: [PATCH 2/6] =?UTF-8?q?walker=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/kynefuk/.gitignore | 27 +++++++++ kadai2/kynefuk/README.md | 55 +++++++++++++++++ kadai2/kynefuk/cli/args.go | 44 ++++++++++++++ kadai2/kynefuk/cli/args_test.go | 29 +++++++++ kadai2/kynefuk/cli/cli.go | 44 ++++++++++++++ kadai2/kynefuk/cli/cli_test.go | 87 +++++++++++++++++++++++++++ kadai2/kynefuk/converter/converter.go | 66 ++++++++++++++++++++ kadai2/kynefuk/go.mod | 5 ++ kadai2/kynefuk/go.sum | 4 ++ kadai2/kynefuk/main.go | 32 ++++++++++ kadai2/kynefuk/walker/walker.go | 41 +++++++++++++ kadai2/kynefuk/walker/walker_test.go | 80 ++++++++++++++++++++++++ 12 files changed, 514 insertions(+) create mode 100644 kadai2/kynefuk/.gitignore create mode 100644 kadai2/kynefuk/README.md create mode 100644 kadai2/kynefuk/cli/args.go create mode 100644 kadai2/kynefuk/cli/args_test.go create mode 100644 kadai2/kynefuk/cli/cli.go create mode 100644 kadai2/kynefuk/cli/cli_test.go create mode 100644 kadai2/kynefuk/converter/converter.go create mode 100644 kadai2/kynefuk/go.mod create mode 100644 kadai2/kynefuk/go.sum create mode 100644 kadai2/kynefuk/main.go create mode 100644 kadai2/kynefuk/walker/walker.go create mode 100644 kadai2/kynefuk/walker/walker_test.go diff --git a/kadai2/kynefuk/.gitignore b/kadai2/kynefuk/.gitignore new file mode 100644 index 0000000..05ecac4 --- /dev/null +++ b/kadai2/kynefuk/.gitignore @@ -0,0 +1,27 @@ +# Created by https://www.toptal.com/developers/gitignore/api/go +# Edit at https://www.toptal.com/developers/gitignore?templates=go + +### Go ### +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +### Go Patch ### +/vendor/ +/Godeps/ + +img + +# End of https://www.toptal.com/developers/gitign \ No newline at end of file diff --git a/kadai2/kynefuk/README.md b/kadai2/kynefuk/README.md new file mode 100644 index 0000000..8556b3b --- /dev/null +++ b/kadai2/kynefuk/README.md @@ -0,0 +1,55 @@ +# <課題 1> 画像変換コマンドを作ろう + +## 概要 + +### 次の仕様を満たすコマンドを作って下さい + +- ディレクトリを指定する +- 指定したディレクトリ以下の JPG ファイルを PNG に変換(デフォルト) +- ディレクトリ以下は再帰的に処理する +- 変換前と変換後の画像形式を指定できる(オプション) + +### 以下を満たすように開発してください + +- main パッケージと分離する +- 自作パッケージと標準パッケージと準標準パッケージのみ使う +- 準標準パッケージ:golang.org/x 以下のパッケージ +- ユーザ定義型を作ってみる +- GoDoc を生成してみる +- Go Modules を使ってみる + +# Usage + +## build + +``` +cd kynefuk +go build -o imgconverter +``` + +## command + +``` +imgconverter -d [directory] -f [from format] -t [to format] +``` + +# <課題 2> io.Reader と io.Writer + +### io.Reader とは + +一連のデータの(バイト列)読み込み処理を抽象化したインターフェース。 + +### io.Writer とは + +一連のデータの(バイト列)書き込み処理を抽象化したインターフェース + +## 標準パッケージでどのように使われているか + +データの入出力を表現する様々なパッケージで io.Reader や io.Writer を実装している。 +(標準入力を表す`os.Stdin`、標準出力を表す`os.Stdout`、ファイルの入出力を表現する`os.File`や、通信の入出力を表現する`net.Conn`など) + +## io.Reader と io.Writer があることでどういう利点があるのか具体例を挙げて考えてみる + +入力処理と出力処理の仕様をインターフェースとして定義しておくことで、様々な入出力処理を統一的に扱うことができる。 +例えば、何らかの読み込み処理を行う関数の引数の型を`io.Reader`とすることで、`io.Reader`を実装している型であれば何でも受けることができる。 +同じような入出力処理を持つものを 1 つの型として表現できるため、シンプルになる。 diff --git a/kadai2/kynefuk/cli/args.go b/kadai2/kynefuk/cli/args.go new file mode 100644 index 0000000..79cca38 --- /dev/null +++ b/kadai2/kynefuk/cli/args.go @@ -0,0 +1,44 @@ +package cli + +import ( + "fmt" +) + +// Args represents CLI's arguments object +type Args struct { + directory, from, to string +} + +// Validate is a validation method +func (args *Args) Validate() error { + fileExtMap := createFileExtMap() + if _, ok := fileExtMap[args.from]; !ok { + return fmt.Errorf("argument of \"-f, --from\" is not valid file format. invalid format: %s", args.from) + } + if _, ok := fileExtMap[args.to]; !ok { + return fmt.Errorf("argument of \"-t, --to\" is not valid file format. invalid format: %s", args.to) + } + + return nil +} + +func createFileExtMap() map[string]string { + fileExtMap := make(map[string]string) + list := []string{ + "jpg", + "jpeg", + "png", + "gif", + "bmp", + "tiff", + } + for _, v := range list { + fileExtMap[v] = "" + } + return fileExtMap +} + +// NewArgs is a constructor of Args +func NewArgs(directory, from, to string) *Args { + return &Args{directory: directory, from: from, to: to} +} diff --git a/kadai2/kynefuk/cli/args_test.go b/kadai2/kynefuk/cli/args_test.go new file mode 100644 index 0000000..239ba86 --- /dev/null +++ b/kadai2/kynefuk/cli/args_test.go @@ -0,0 +1,29 @@ +package cli + +import ( + "testing" +) + +const dummyDir = "dummy" + +func TestArgs(t *testing.T) { + tests := []struct{ name, fromFormat, toFormat, expectedMessage string }{ + {name: "valid arguments", fromFormat: "jpeg", toFormat: "png", expectedMessage: ""}, + {name: "invalid from format", fromFormat: "hoge", toFormat: "jpg", expectedMessage: "argument of \"-f, --from\" is not valid file format. invalid format: hoge"}, + {name: "invalid to format", fromFormat: "gif", toFormat: "hage", expectedMessage: "argument of \"-t, --to\" is not valid file format. invalid format: hage"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + args := NewArgs(dummyDir, tt.fromFormat, tt.toFormat) + actual := args.Validate() + if actual == nil { + if tt.expectedMessage != "" { + t.Errorf("want %s, got %s", actual, tt.expectedMessage) + } + } else if actual.Error() != tt.expectedMessage { + t.Errorf("want %s, got %s", actual, tt.expectedMessage) + } + }) + } +} diff --git a/kadai2/kynefuk/cli/cli.go b/kadai2/kynefuk/cli/cli.go new file mode 100644 index 0000000..e518981 --- /dev/null +++ b/kadai2/kynefuk/cli/cli.go @@ -0,0 +1,44 @@ +package cli + +import ( + "fmt" + "io" + + "github.com/gopherdojo/dojo8/kadai2/kynefuk/converter" + "github.com/gopherdojo/dojo8/kadai2/kynefuk/walker" +) + +// it represents Exit Code +const ( + ExitCodeOK = iota + ExitCodeError +) + +// Command represents CLI object +type Command struct { + OutStream, ErrStream io.Writer +} + +// Run invoke cli main logic +func (cli *Command) Run(args *Args) int { + dirWalker := walker.NewWalker(args.from) + files, err := dirWalker.Dirwalk(args.directory) + if err != nil { + fmt.Fprintf(cli.ErrStream, "failed to read directory: %s, err: %s\n", args.directory, err) + return ExitCodeError + } + + imgConverter := converter.NewConverter(args.from, args.to) + for _, file := range files { + if err := imgConverter.ConvertFormat(file); err != nil { + fmt.Fprintf(cli.ErrStream, "failed to convert img, err: %s\n", err) + return ExitCodeError + } + } + return ExitCodeOK +} + +// NewCommand is a constructor of CLI +func NewCommand(outStream, errStream io.Writer) *Command { + return &Command{OutStream: outStream, ErrStream: errStream} +} diff --git a/kadai2/kynefuk/cli/cli_test.go b/kadai2/kynefuk/cli/cli_test.go new file mode 100644 index 0000000..37b3c62 --- /dev/null +++ b/kadai2/kynefuk/cli/cli_test.go @@ -0,0 +1,87 @@ +package cli + +import ( + "bytes" + "fmt" + "image" + "io/ioutil" + "log" + "os" + "strings" + "testing" +) + +var fileExtList = []string{ + "jpg", + "jpeg", + "png", + "gif", + "bmp", + "tiff", +} + +func ConvertExt(filepath, to string) string { + return strings.Replace(filepath, ".png", to, 1) +} + +func createTestData() string { + // setup + testDir, err := ioutil.TempDir("", "testdata") + if err != nil { + log.Fatal(err) + } + + testFilePath := "../testdata/gopher.png" + + file, err := os.Open(testFilePath) + if err != nil { + log.Fatal(err) + } + defer file.Close() + + img, _, err := image.Decode(file) + if err != nil { + log.Fatal(err) + } + + for _, ext := range fileExtList { + out, _ := os.Create(ConvertExt(testFilePath, ext)) + out.Close() + + } + return testDir +} + +func TestCLI(t *testing.T) { + testDir := createTestData() + defer os.Remove(testDir) + outStream, errStream := new(bytes.Buffer), new(bytes.Buffer) + command := NewCommand(outStream, errStream) + + tests := []struct { + name, directory, fromFormat, toFormat, outStream, errStream string + exitCode int + }{ + {name: "success", directory: testDir, fromFormat: "png", toFormat: "jpg", outStream: "", errStream: "", exitCode: 0}, + {name: "invalid directory", directory: "dummyDir", fromFormat: "jpg", toFormat: "png", outStream: "", errStream: "failed to read directory: dummyDir, err: open dummyDir: no such file or directory", exitCode: 1}, + {name: "invalid to format", directory: testDir, fromFormat: "jpg", toFormat: "hoge", outStream: "", errStream: "failed to convert img, err: unknown format type", exitCode: 1}, + {name: "invalid from format", directory: testDir, fromFormat: "hoge", toFormat: "png", outStream: "", errStream: "", exitCode: 0}, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + args := NewArgs(tt.directory, tt.fromFormat, tt.toFormat) + status := command.Run(args) + if status != tt.exitCode { + t.Errorf("want %d, got %d", tt.exitCode, status) + } + if !strings.Contains(outStream.String(), tt.outStream) { + t.Errorf("want %s, got %s", tt.outStream, outStream.String()) + } + if !strings.Contains(errStream.String(), tt.errStream) { + t.Errorf("want %s, got %s", tt.errStream, errStream.String()) + } + }) + } +} diff --git a/kadai2/kynefuk/converter/converter.go b/kadai2/kynefuk/converter/converter.go new file mode 100644 index 0000000..bb3da66 --- /dev/null +++ b/kadai2/kynefuk/converter/converter.go @@ -0,0 +1,66 @@ +package converter + +import ( + "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "strings" + + "golang.org/x/image/bmp" + "golang.org/x/image/tiff" +) + +// Converter converts image file +type Converter struct { + From, To string +} + +// ConvertFormat converts file format +func (converter *Converter) ConvertFormat(filepath string) error { + file, err := os.Open(filepath) + if err != nil { + return fmt.Errorf("failed to open file. file: %s", filepath) + } + defer file.Close() + + img, _, err := image.Decode(file) + if err != nil { + return fmt.Errorf("failed to decode file. file: %s", filepath) + } + + out, err := os.Create(converter.ConvertExt(filepath)) + if err != nil { + return fmt.Errorf("failed to create output file. file: %s", converter.ConvertExt(filepath)) + } + defer out.Close() + + switch converter.To { + case "jpg", "jpeg": + err = jpeg.Encode(out, img, &jpeg.Options{Quality: 100}) + case "png": + err = png.Encode(out, img) + case "gif": + err = gif.Encode(out, img, &gif.Options{NumColors: 256, Quantizer: nil, Drawer: nil}) + case "bmp": + err = bmp.Encode(out, img) + case "tiff": + err = tiff.Encode(out, img, nil) + default: + return fmt.Errorf("unknown format type") + } + + return err +} + +// ConvertExt converts file format extention +func (converter *Converter) ConvertExt(filepath string) string { + return strings.Replace(filepath, converter.From, converter.To, 1) +} + +// NewConverter is a Constructor of Converter +func NewConverter(from, to string) *Converter { + return &Converter{From: from, To: to} +} diff --git a/kadai2/kynefuk/go.mod b/kadai2/kynefuk/go.mod new file mode 100644 index 0000000..8720123 --- /dev/null +++ b/kadai2/kynefuk/go.mod @@ -0,0 +1,5 @@ +module github.com/gopherdojo/dojo8/kadai2/kynefuk + +go 1.14 + +require golang.org/x/image v0.0.0-20200618115811-c13761719519 diff --git a/kadai2/kynefuk/go.sum b/kadai2/kynefuk/go.sum new file mode 100644 index 0000000..83da957 --- /dev/null +++ b/kadai2/kynefuk/go.sum @@ -0,0 +1,4 @@ +github.com/gopherdojo/dojo8 v0.0.0-20200703052727-6a79d18126bf h1:lpYevjFQMxI5VNBc3WXV6Z5pDDrdppdDKwmeBoyt5BE= +golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/kadai2/kynefuk/main.go b/kadai2/kynefuk/main.go new file mode 100644 index 0000000..b58557c --- /dev/null +++ b/kadai2/kynefuk/main.go @@ -0,0 +1,32 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/gopherdojo/dojo8/kadai2/kynefuk/cli" +) + +func main() { + var directory string + var from string + var to string + flag.StringVar(&directory, "directory", "./", "directory") + flag.StringVar(&directory, "d", "./", "directory(short)") + flag.StringVar(&from, "from", "jpg", "from format") + flag.StringVar(&from, "f", "jpg", "from format(short)") + flag.StringVar(&to, "to", "png", "to format") + flag.StringVar(&to, "t", "png", "to format(short)") + flag.Parse() + + command := cli.NewCommand(os.Stdout, os.Stderr) + + args := cli.NewArgs(directory, from, to) + if err := args.Validate(); err != nil { + fmt.Fprintf(command.ErrStream, "error: %s\n", err) + os.Exit(cli.ExitCodeError) + } + + os.Exit(command.Run(args)) +} diff --git a/kadai2/kynefuk/walker/walker.go b/kadai2/kynefuk/walker/walker.go new file mode 100644 index 0000000..c2c069c --- /dev/null +++ b/kadai2/kynefuk/walker/walker.go @@ -0,0 +1,41 @@ +package walker + +import ( + "io/ioutil" + "path/filepath" + "strings" +) + +// Walker walk directory to extract files +type Walker struct { + TargetExt string +} + +// Dirwalk walk directory and collect files +func (walker *Walker) Dirwalk(directory string) ([]string, error) { + items, err := ioutil.ReadDir(directory) + if err != nil { + return nil, err + } + + var paths []string + for _, item := range items { + if item.IsDir() { + items, err := walker.Dirwalk(filepath.Join(directory, item.Name())) + if err != nil { + return nil, err + } + paths = append(paths, items...) + continue + } + if strings.HasSuffix(item.Name(), walker.TargetExt) { + paths = append(paths, filepath.Join(directory, item.Name())) + } + } + return paths, nil +} + +// NewWalker is a constructor of Walker +func NewWalker(targetExt string) *Walker { + return &Walker{TargetExt: targetExt} +} diff --git a/kadai2/kynefuk/walker/walker_test.go b/kadai2/kynefuk/walker/walker_test.go new file mode 100644 index 0000000..283866b --- /dev/null +++ b/kadai2/kynefuk/walker/walker_test.go @@ -0,0 +1,80 @@ +package walker + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "reflect" + "testing" +) + +var fileExtList = []string{ + "jpg", + "jpeg", + "png", + "gif", + "bmp", + "tiff", +} + +func CreateTestDir() string { + dir, err := ioutil.TempDir("./", "example") + if err != nil { + log.Fatalf("failed to create test dir. error: %s", err) + } + return dir +} + +func CreateTmpFile(dir string) []string { + var tmpFilePaths []string + for _, v := range fileExtList { + f, err := ioutil.TempFile(dir, "example.*."+v) + if err != nil { + log.Fatalf("failed to create tmp file. error: %s", err) + } + tmpFilePaths = append(tmpFilePaths, f.Name()) + } + return tmpFilePaths +} + +func TestWalker(t *testing.T) { + testDir := CreateTestDir() + tmpFilePaths := CreateTmpFile(testDir) + defer os.RemoveAll(testDir) + + type TestCase struct { + name, directory, fromFmt string + files []string + err error + } + + type TestCases []struct { + name, directory, fromFmt string + files []string + err error + } + + var testCases TestCases + for _, fileFmt := range fileExtList { + name := fmt.Sprintf("walker collects %s file", fileFmt) + tests := TestCase{ + name: name, directory: testDir, fromFmt: fileFmt, files: tmpFilePaths, err: nil, + } + testCases = append(testCases, tests) + } + + for _, tt := range testCases { + tt := tt + t.Run(tt.name, func(t *testing.T) { + dirWalker := NewWalker(tt.fromFmt) + files, err := dirWalker.Dirwalk(tt.directory) + if err != tt.err { + t.Errorf("test failed. error: %s", err) + } + if reflect.DeepEqual(tt.files, files) { + t.Errorf("want %s, but got %s", tt.files, files) + } + }) + } +} From 0afe692ca581fdcfafc6aca65f0ee2a98ac0824b Mon Sep 17 00:00:00 2001 From: kynefuk Date: Fri, 24 Jul 2020 15:07:23 +0900 Subject: [PATCH 3/6] =?UTF-8?q?converter=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/kynefuk/README.md | 30 +++++- kadai2/kynefuk/cli/cli.go | 3 +- kadai2/kynefuk/cli/cli_test.go | 9 +- kadai2/kynefuk/converter/converter.go | 16 ++- kadai2/kynefuk/converter/converter_test.go | 114 +++++++++++++++++++++ kadai2/kynefuk/walker/walker_test.go | 12 +-- 6 files changed, 165 insertions(+), 19 deletions(-) create mode 100644 kadai2/kynefuk/converter/converter_test.go diff --git a/kadai2/kynefuk/README.md b/kadai2/kynefuk/README.md index 8556b3b..7343332 100644 --- a/kadai2/kynefuk/README.md +++ b/kadai2/kynefuk/README.md @@ -37,19 +37,39 @@ imgconverter -d [directory] -f [from format] -t [to format] ### io.Reader とは -一連のデータの(バイト列)読み込み処理を抽象化したインターフェース。 +一連のデータ(バイト列)の読み込み処理を抽象化したインターフェース。 +読み込まれる対象データとしてバイト型の配列を受け取り、読み込んだバイト数とエラーを戻り値とする。 + +``` +type Reader interface { + Read(p []byte) (n int, err error) +} +``` ### io.Writer とは -一連のデータの(バイト列)書き込み処理を抽象化したインターフェース +一連のデータ(バイト列)の書き込み処理を抽象化したインターフェース +書き込まれる対象データとしてバイト型の配列を受け取り、書き込んだバイト数とエラーを戻り値とする。 + +``` +type Writer interface { + Write(p []byte) (n int, err error) +} +``` ## 標準パッケージでどのように使われているか -データの入出力を表現する様々なパッケージで io.Reader や io.Writer を実装している。 +データの入出力を表現する様々なパッケージで io.Reader や io.Writer が実装している。 (標準入力を表す`os.Stdin`、標準出力を表す`os.Stdout`、ファイルの入出力を表現する`os.File`や、通信の入出力を表現する`net.Conn`など) ## io.Reader と io.Writer があることでどういう利点があるのか具体例を挙げて考えてみる -入力処理と出力処理の仕様をインターフェースとして定義しておくことで、様々な入出力処理を統一的に扱うことができる。 +入力処理と出力処理の仕様をインターフェースとして定義しておくことで、様々な入出力処理を統一的に扱うことができ、プログラムの柔軟性が高くなる。 例えば、何らかの読み込み処理を行う関数の引数の型を`io.Reader`とすることで、`io.Reader`を実装している型であれば何でも受けることができる。 -同じような入出力処理を持つものを 1 つの型として表現できるため、シンプルになる。 +コマンドラインのの処理内容を出力する標準出力や、エラーを表示する標準エラー出力のフィールドの型として io.Writer を指定することで、テスト時に、`bytes.Buffer`などに切り替えることができ、テスト容易性を高めることができる。 + +``` +type Command struct { + OutStream, ErrStream io.Writer +} +``` diff --git a/kadai2/kynefuk/cli/cli.go b/kadai2/kynefuk/cli/cli.go index e518981..6d900a6 100644 --- a/kadai2/kynefuk/cli/cli.go +++ b/kadai2/kynefuk/cli/cli.go @@ -30,7 +30,8 @@ func (cli *Command) Run(args *Args) int { imgConverter := converter.NewConverter(args.from, args.to) for _, file := range files { - if err := imgConverter.ConvertFormat(file); err != nil { + dstPath := converter.ConvertExt(file, args.from, args.to) + if err := imgConverter.ConvertFormat(file, dstPath); err != nil { fmt.Fprintf(cli.ErrStream, "failed to convert img, err: %s\n", err) return ExitCodeError } diff --git a/kadai2/kynefuk/cli/cli_test.go b/kadai2/kynefuk/cli/cli_test.go index 37b3c62..3bdcdf1 100644 --- a/kadai2/kynefuk/cli/cli_test.go +++ b/kadai2/kynefuk/cli/cli_test.go @@ -59,8 +59,13 @@ func TestCLI(t *testing.T) { command := NewCommand(outStream, errStream) tests := []struct { - name, directory, fromFormat, toFormat, outStream, errStream string - exitCode int + name string + directory string + fromFormat string + toFormat string + outStream string + errStream string + exitCode int }{ {name: "success", directory: testDir, fromFormat: "png", toFormat: "jpg", outStream: "", errStream: "", exitCode: 0}, {name: "invalid directory", directory: "dummyDir", fromFormat: "jpg", toFormat: "png", outStream: "", errStream: "failed to read directory: dummyDir, err: open dummyDir: no such file or directory", exitCode: 1}, diff --git a/kadai2/kynefuk/converter/converter.go b/kadai2/kynefuk/converter/converter.go index bb3da66..d33f6bf 100644 --- a/kadai2/kynefuk/converter/converter.go +++ b/kadai2/kynefuk/converter/converter.go @@ -19,7 +19,7 @@ type Converter struct { } // ConvertFormat converts file format -func (converter *Converter) ConvertFormat(filepath string) error { +func (converter *Converter) ConvertFormat(filepath, dst string) error { file, err := os.Open(filepath) if err != nil { return fmt.Errorf("failed to open file. file: %s", filepath) @@ -31,12 +31,18 @@ func (converter *Converter) ConvertFormat(filepath string) error { return fmt.Errorf("failed to decode file. file: %s", filepath) } - out, err := os.Create(converter.ConvertExt(filepath)) + out, err := os.Create(dst) if err != nil { - return fmt.Errorf("failed to create output file. file: %s", converter.ConvertExt(filepath)) + return fmt.Errorf("failed to create output file. file: %s", dst) } defer out.Close() + // out, err := os.Create(converter.ConvertExt(filepath)) + // if err != nil { + // return fmt.Errorf("failed to create output file. file: %s", converter.ConvertExt(filepath)) + // } + // defer out.Close() + switch converter.To { case "jpg", "jpeg": err = jpeg.Encode(out, img, &jpeg.Options{Quality: 100}) @@ -56,8 +62,8 @@ func (converter *Converter) ConvertFormat(filepath string) error { } // ConvertExt converts file format extention -func (converter *Converter) ConvertExt(filepath string) string { - return strings.Replace(filepath, converter.From, converter.To, 1) +func ConvertExt(filepath, from, to string) string { + return strings.Replace(filepath, from, to, 1) } // NewConverter is a Constructor of Converter diff --git a/kadai2/kynefuk/converter/converter_test.go b/kadai2/kynefuk/converter/converter_test.go new file mode 100644 index 0000000..1f302e8 --- /dev/null +++ b/kadai2/kynefuk/converter/converter_test.go @@ -0,0 +1,114 @@ +package converter + +import ( + "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" + "io/ioutil" + "log" + "os" + + "golang.org/x/image/bmp" + "golang.org/x/image/tiff" + "testing" +) + +var fileExtList = []string{ + "jpg", + "jpeg", + "png", + "gif", + "bmp", + "tiff", +} + +const testDirPath = "../testdata" + +func CreateTmpDir() string { + dir, err := ioutil.TempDir("./", "example") + if err != nil { + log.Fatalf("failed to create test dir. error: %s", err) + } + return dir +} + +func CreateJPG(f *os.File, img *image.RGBA) error { + return jpeg.Encode(f, img, &jpeg.Options{Quality: 100}) +} + +func CreatePNG(f *os.File, img *image.RGBA) error { + return png.Encode(f, img) +} + +func CreateGIF(f *os.File, img *image.RGBA) error { + return gif.Encode(f, img, &gif.Options{NumColors: 256, Quantizer: nil, Drawer: nil}) +} + +func CreateBMP(f *os.File, img *image.RGBA) error { + return bmp.Encode(f, img) +} + +func CreateTIFF(f *os.File, img *image.RGBA) error { + return tiff.Encode(f, img, nil) +} + +func CreateTmpFile(dir, fileExt string) *os.File { + + img := image.NewRGBA(image.Rect(0, 0, 100, 50)) + + f, err := ioutil.TempFile(dir, "example.*."+fileExt) + if err != nil { + log.Fatalf("failed to create tmp file. error: %s", err) + } + defer f.Close() + + switch fileExt { + case "jpg", "jpeg": + err = CreateJPG(f, img) + case "png": + err = CreatePNG(f, img) + case "gif": + err = CreateGIF(f, img) + case "bmp": + err = CreateBMP(f, img) + case "tiff": + err = CreateTIFF(f, img) + default: + log.Fatalf("failed to create test file. fileExt: %s", fileExt) + } + + if err != nil { + log.Fatalf("failed to create test file. fileExt: %s", fileExt) + } + + return f +} + +func Exists(filename string) bool { + _, err := os.Stat(filename) + return err == nil +} + +func TestConverter(t *testing.T) { + tmpDir := CreateTmpDir() + defer os.RemoveAll(tmpDir) + + for _, from := range fileExtList { + for _, to := range fileExtList { + tmpFile := CreateTmpFile(tmpDir, from) + fmt.Println("tmpFile:", tmpFile.Name()) + defer os.Remove(tmpFile.Name()) + imgConverter := NewConverter(from, to) + err := imgConverter.ConvertFormat(tmpFile.Name(), ConvertExt(tmpFile.Name(), from, to)) + if err != nil { + t.Errorf("failed to test. error: %s", err) + } + exists := Exists(ConvertExt(tmpFile.Name(), from, to)) + if !exists { + t.Errorf("want true, but got %v", exists) + } + } + } +} diff --git a/kadai2/kynefuk/walker/walker_test.go b/kadai2/kynefuk/walker/walker_test.go index 283866b..861dd6d 100644 --- a/kadai2/kynefuk/walker/walker_test.go +++ b/kadai2/kynefuk/walker/walker_test.go @@ -18,7 +18,7 @@ var fileExtList = []string{ "tiff", } -func CreateTestDir() string { +func CreatetmpDir() string { dir, err := ioutil.TempDir("./", "example") if err != nil { log.Fatalf("failed to create test dir. error: %s", err) @@ -26,7 +26,7 @@ func CreateTestDir() string { return dir } -func CreateTmpFile(dir string) []string { +func CreateTmpFiles(dir string) []string { var tmpFilePaths []string for _, v := range fileExtList { f, err := ioutil.TempFile(dir, "example.*."+v) @@ -39,9 +39,9 @@ func CreateTmpFile(dir string) []string { } func TestWalker(t *testing.T) { - testDir := CreateTestDir() - tmpFilePaths := CreateTmpFile(testDir) - defer os.RemoveAll(testDir) + tmpDir := CreatetmpDir() + tmpFilePaths := CreateTmpFiles(tmpDir) + defer os.RemoveAll(tmpDir) type TestCase struct { name, directory, fromFmt string @@ -59,7 +59,7 @@ func TestWalker(t *testing.T) { for _, fileFmt := range fileExtList { name := fmt.Sprintf("walker collects %s file", fileFmt) tests := TestCase{ - name: name, directory: testDir, fromFmt: fileFmt, files: tmpFilePaths, err: nil, + name: name, directory: tmpDir, fromFmt: fileFmt, files: tmpFilePaths, err: nil, } testCases = append(testCases, tests) } From feec172445d15b9299a67c7d073a4c087d8918f0 Mon Sep 17 00:00:00 2001 From: kynefuk Date: Fri, 24 Jul 2020 21:30:37 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=83=98?= =?UTF-8?q?=E3=83=AB=E3=83=91=E3=83=BC=E3=82=92=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/kynefuk/cli/args.go | 16 +-- kadai2/kynefuk/cli/args_test.go | 22 ++-- kadai2/kynefuk/cli/cli.go | 12 +- kadai2/kynefuk/cli/cli_test.go | 65 +++-------- .../example130541744/example.859397199.jpg | Bin 0 -> 707 bytes .../example979633815/example.209719562.jpg | Bin 0 -> 707 bytes kadai2/kynefuk/converter/converter.go | 6 - kadai2/kynefuk/converter/converter_test.go | 88 ++------------- kadai2/kynefuk/helper/helper.go | 104 ++++++++++++++++++ kadai2/kynefuk/main.go | 2 +- kadai2/kynefuk/walker/walker_test.go | 54 ++------- 11 files changed, 169 insertions(+), 200 deletions(-) create mode 100644 kadai2/kynefuk/cli/example130541744/example.859397199.jpg create mode 100644 kadai2/kynefuk/cli/example979633815/example.209719562.jpg create mode 100644 kadai2/kynefuk/helper/helper.go diff --git a/kadai2/kynefuk/cli/args.go b/kadai2/kynefuk/cli/args.go index 79cca38..5a9dcbb 100644 --- a/kadai2/kynefuk/cli/args.go +++ b/kadai2/kynefuk/cli/args.go @@ -6,17 +6,17 @@ import ( // Args represents CLI's arguments object type Args struct { - directory, from, to string + DirecTory, From, To string } // Validate is a validation method func (args *Args) Validate() error { fileExtMap := createFileExtMap() - if _, ok := fileExtMap[args.from]; !ok { - return fmt.Errorf("argument of \"-f, --from\" is not valid file format. invalid format: %s", args.from) + if _, ok := fileExtMap[args.From]; !ok { + return fmt.Errorf("argument of \"-f, --From\" is not valid file format. invalid format: %s", args.From) } - if _, ok := fileExtMap[args.to]; !ok { - return fmt.Errorf("argument of \"-t, --to\" is not valid file format. invalid format: %s", args.to) + if _, ok := fileExtMap[args.To]; !ok { + return fmt.Errorf("argument of \"-t, --To\" is not valid file format. invalid format: %s", args.To) } return nil @@ -38,7 +38,7 @@ func createFileExtMap() map[string]string { return fileExtMap } -// NewArgs is a constructor of Args -func NewArgs(directory, from, to string) *Args { - return &Args{directory: directory, from: from, to: to} +// NewArgs is a construcTor of Args +func NewArgs(DirecTory, From, To string) *Args { + return &Args{DirecTory: DirecTory, From: From, To: To} } diff --git a/kadai2/kynefuk/cli/args_test.go b/kadai2/kynefuk/cli/args_test.go index 239ba86..c4220f7 100644 --- a/kadai2/kynefuk/cli/args_test.go +++ b/kadai2/kynefuk/cli/args_test.go @@ -2,27 +2,29 @@ package cli import ( "testing" + + "github.com/gopherdojo/dojo8/kadai2/kynefuk/helper" ) const dummyDir = "dummy" func TestArgs(t *testing.T) { - tests := []struct{ name, fromFormat, toFormat, expectedMessage string }{ + cases := []struct{ name, fromFormat, toFormat, expectedMessage string }{ {name: "valid arguments", fromFormat: "jpeg", toFormat: "png", expectedMessage: ""}, - {name: "invalid from format", fromFormat: "hoge", toFormat: "jpg", expectedMessage: "argument of \"-f, --from\" is not valid file format. invalid format: hoge"}, - {name: "invalid to format", fromFormat: "gif", toFormat: "hage", expectedMessage: "argument of \"-t, --to\" is not valid file format. invalid format: hage"}, + {name: "invalid from format", fromFormat: "hoge", toFormat: "jpg", expectedMessage: "argument of \"-f, --From\" is not valid file format. invalid format: hoge"}, + {name: "invalid to format", fromFormat: "gif", toFormat: "hage", expectedMessage: "argument of \"-t, --To\" is not valid file format. invalid format: hage"}, } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - args := NewArgs(dummyDir, tt.fromFormat, tt.toFormat) + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + args := NewArgs(dummyDir, c.fromFormat, c.toFormat) actual := args.Validate() if actual == nil { - if tt.expectedMessage != "" { - t.Errorf("want %s, got %s", actual, tt.expectedMessage) + if c.expectedMessage != "" { + helper.ErrorHelper(t, actual, c.expectedMessage) } - } else if actual.Error() != tt.expectedMessage { - t.Errorf("want %s, got %s", actual, tt.expectedMessage) + } else if actual.Error() != c.expectedMessage { + helper.ErrorHelper(t, actual, c.expectedMessage) } }) } diff --git a/kadai2/kynefuk/cli/cli.go b/kadai2/kynefuk/cli/cli.go index 6d900a6..de244d1 100644 --- a/kadai2/kynefuk/cli/cli.go +++ b/kadai2/kynefuk/cli/cli.go @@ -20,17 +20,17 @@ type Command struct { } // Run invoke cli main logic -func (cli *Command) Run(args *Args) int { - dirWalker := walker.NewWalker(args.from) - files, err := dirWalker.Dirwalk(args.directory) +func (cli *Command) Run(directory, from, to string) int { + dirWalker := walker.NewWalker(from) + files, err := dirWalker.Dirwalk(directory) if err != nil { - fmt.Fprintf(cli.ErrStream, "failed to read directory: %s, err: %s\n", args.directory, err) + fmt.Fprintf(cli.ErrStream, "failed to read directory: %s, err: %s\n", directory, err) return ExitCodeError } - imgConverter := converter.NewConverter(args.from, args.to) + imgConverter := converter.NewConverter(from, to) for _, file := range files { - dstPath := converter.ConvertExt(file, args.from, args.to) + dstPath := converter.ConvertExt(file, from, to) if err := imgConverter.ConvertFormat(file, dstPath); err != nil { fmt.Fprintf(cli.ErrStream, "failed to convert img, err: %s\n", err) return ExitCodeError diff --git a/kadai2/kynefuk/cli/cli_test.go b/kadai2/kynefuk/cli/cli_test.go index 3bdcdf1..5ded4c4 100644 --- a/kadai2/kynefuk/cli/cli_test.go +++ b/kadai2/kynefuk/cli/cli_test.go @@ -2,13 +2,11 @@ package cli import ( "bytes" - "fmt" - "image" - "io/ioutil" - "log" "os" "strings" "testing" + + "github.com/gopherdojo/dojo8/kadai2/kynefuk/helper" ) var fileExtList = []string{ @@ -24,41 +22,13 @@ func ConvertExt(filepath, to string) string { return strings.Replace(filepath, ".png", to, 1) } -func createTestData() string { - // setup - testDir, err := ioutil.TempDir("", "testdata") - if err != nil { - log.Fatal(err) - } - - testFilePath := "../testdata/gopher.png" - - file, err := os.Open(testFilePath) - if err != nil { - log.Fatal(err) - } - defer file.Close() - - img, _, err := image.Decode(file) - if err != nil { - log.Fatal(err) - } - - for _, ext := range fileExtList { - out, _ := os.Create(ConvertExt(testFilePath, ext)) - out.Close() - - } - return testDir -} - func TestCLI(t *testing.T) { - testDir := createTestData() - defer os.Remove(testDir) + testDir := helper.CreateTmpDir() + defer os.RemoveAll(testDir) outStream, errStream := new(bytes.Buffer), new(bytes.Buffer) command := NewCommand(outStream, errStream) - tests := []struct { + cases := []struct { name string directory string fromFormat string @@ -70,22 +40,23 @@ func TestCLI(t *testing.T) { {name: "success", directory: testDir, fromFormat: "png", toFormat: "jpg", outStream: "", errStream: "", exitCode: 0}, {name: "invalid directory", directory: "dummyDir", fromFormat: "jpg", toFormat: "png", outStream: "", errStream: "failed to read directory: dummyDir, err: open dummyDir: no such file or directory", exitCode: 1}, {name: "invalid to format", directory: testDir, fromFormat: "jpg", toFormat: "hoge", outStream: "", errStream: "failed to convert img, err: unknown format type", exitCode: 1}, - {name: "invalid from format", directory: testDir, fromFormat: "hoge", toFormat: "png", outStream: "", errStream: "", exitCode: 0}, + {name: "invalid from format", directory: testDir, fromFormat: "hoge", toFormat: "png", outStream: "", errStream: "", exitCode: 1}, } - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - args := NewArgs(tt.directory, tt.fromFormat, tt.toFormat) - status := command.Run(args) - if status != tt.exitCode { - t.Errorf("want %d, got %d", tt.exitCode, status) + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + tmpFile := helper.CreateTmpFile(testDir, c.fromFormat) + defer os.Remove(tmpFile.Name()) + status := command.Run(c.directory, c.fromFormat, c.toFormat) + + if status != c.exitCode { + helper.ErrorHelper(t, c.exitCode, status) } - if !strings.Contains(outStream.String(), tt.outStream) { - t.Errorf("want %s, got %s", tt.outStream, outStream.String()) + if !strings.Contains(outStream.String(), c.outStream) { + helper.ErrorHelper(t, c.outStream, outStream.String()) } - if !strings.Contains(errStream.String(), tt.errStream) { - t.Errorf("want %s, got %s", tt.errStream, errStream.String()) + if !strings.Contains(errStream.String(), c.errStream) { + helper.ErrorHelper(t, c.errStream, errStream.String()) } }) } diff --git a/kadai2/kynefuk/cli/example130541744/example.859397199.jpg b/kadai2/kynefuk/cli/example130541744/example.859397199.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02a5c44edd4c756a257e2c2fc2ddbe53e3f7fd52 GIT binary patch literal 707 zcmex=L?6mQqXwbzE zD#l4gO`Kd};u4Zls%q*Qnp!5NX66=_R?aT2ZtfnQUcn)uVc`*xQOPN(Y3Ui6S;Zx# zW#tu>Rn0A}ZS5VMU6UqHnL2IyjG40*Enc#8+42=DS8dw7W$U)>J9h3mboj{8W5-XN zJay^vm8;jT-?(|};iJb-o<4j2;^nK4pFV&2`tAFVpT8IxnBgG}@eq=K1cClxVqsxs zVF&q#k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3L?6mQqXwbzE zD#l4gO`Kd};u4Zls%q*Qnp!5NX66=_R?aT2ZtfnQUcn)uVc`*xQOPN(Y3Ui6S;Zx# zW#tu>Rn0A}ZS5VMU6UqHnL2IyjG40*Enc#8+42=DS8dw7W$U)>J9h3mboj{8W5-XN zJay^vm8;jT-?(|};iJb-o<4j2;^nK4pFV&2`tAFVpT8IxnBgG}@eq=K1cClxVqsxs zVF&q#k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3 Date: Fri, 24 Jul 2020 21:32:36 +0900 Subject: [PATCH 5/6] =?UTF-8?q?README=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/kynefuk/README.md | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/kadai2/kynefuk/README.md b/kadai2/kynefuk/README.md index 7343332..2c9bb7b 100644 --- a/kadai2/kynefuk/README.md +++ b/kadai2/kynefuk/README.md @@ -1,38 +1,3 @@ -# <課題 1> 画像変換コマンドを作ろう - -## 概要 - -### 次の仕様を満たすコマンドを作って下さい - -- ディレクトリを指定する -- 指定したディレクトリ以下の JPG ファイルを PNG に変換(デフォルト) -- ディレクトリ以下は再帰的に処理する -- 変換前と変換後の画像形式を指定できる(オプション) - -### 以下を満たすように開発してください - -- main パッケージと分離する -- 自作パッケージと標準パッケージと準標準パッケージのみ使う -- 準標準パッケージ:golang.org/x 以下のパッケージ -- ユーザ定義型を作ってみる -- GoDoc を生成してみる -- Go Modules を使ってみる - -# Usage - -## build - -``` -cd kynefuk -go build -o imgconverter -``` - -## command - -``` -imgconverter -d [directory] -f [from format] -t [to format] -``` - # <課題 2> io.Reader と io.Writer ### io.Reader とは From 95883c65e618d8ba132f325064a44c35f322ae51 Mon Sep 17 00:00:00 2001 From: kynefuk Date: Fri, 24 Jul 2020 21:49:12 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E7=AE=A1=E7=90=86=E4=B8=8B?= =?UTF-8?q?=E3=81=8B=E3=82=89=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/kynefuk/.gitignore | 27 ----------- kadai1/kynefuk/README.md | 34 ------------- kadai1/kynefuk/cli/args.go | 44 ----------------- kadai1/kynefuk/cli/args_test.go | 29 ----------- kadai1/kynefuk/cli/cli.go | 44 ----------------- kadai1/kynefuk/cli/cli_test.go | 39 --------------- kadai1/kynefuk/converter/converter.go | 66 -------------------------- kadai1/kynefuk/go.mod | 5 -- kadai1/kynefuk/go.sum | 3 -- kadai1/kynefuk/main.go | 32 ------------- kadai1/kynefuk/testdata/gopher1.jpg | Bin 40013 -> 0 bytes kadai1/kynefuk/testdata/gopher1.png | Bin 52993 -> 0 bytes kadai1/kynefuk/walker/walker.go | 41 ---------------- 13 files changed, 364 deletions(-) delete mode 100644 kadai1/kynefuk/.gitignore delete mode 100644 kadai1/kynefuk/README.md delete mode 100644 kadai1/kynefuk/cli/args.go delete mode 100644 kadai1/kynefuk/cli/args_test.go delete mode 100644 kadai1/kynefuk/cli/cli.go delete mode 100644 kadai1/kynefuk/cli/cli_test.go delete mode 100644 kadai1/kynefuk/converter/converter.go delete mode 100644 kadai1/kynefuk/go.mod delete mode 100644 kadai1/kynefuk/go.sum delete mode 100644 kadai1/kynefuk/main.go delete mode 100644 kadai1/kynefuk/testdata/gopher1.jpg delete mode 100644 kadai1/kynefuk/testdata/gopher1.png delete mode 100644 kadai1/kynefuk/walker/walker.go diff --git a/kadai1/kynefuk/.gitignore b/kadai1/kynefuk/.gitignore deleted file mode 100644 index 05ecac4..0000000 --- a/kadai1/kynefuk/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# Created by https://www.toptal.com/developers/gitignore/api/go -# Edit at https://www.toptal.com/developers/gitignore?templates=go - -### Go ### -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -### Go Patch ### -/vendor/ -/Godeps/ - -img - -# End of https://www.toptal.com/developers/gitign \ No newline at end of file diff --git a/kadai1/kynefuk/README.md b/kadai1/kynefuk/README.md deleted file mode 100644 index 4e39cc2..0000000 --- a/kadai1/kynefuk/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# 画像変換コマンドを作ろう - -## 概要 - -### 次の仕様を満たすコマンドを作って下さい - -- ディレクトリを指定する -- 指定したディレクトリ以下の JPG ファイルを PNG に変換(デフォルト) -- ディレクトリ以下は再帰的に処理する -- 変換前と変換後の画像形式を指定できる(オプション) - -### 以下を満たすように開発してください - -- main パッケージと分離する -- 自作パッケージと標準パッケージと準標準パッケージのみ使う -- 準標準パッケージ:golang.org/x 以下のパッケージ -- ユーザ定義型を作ってみる -- GoDoc を生成してみる -- Go Modules を使ってみる - -# Usage - -## build - -``` -cd kynefuk -go build -o imgconverter -``` - -## command - -``` -imgconverter -d [directory] -f [from format] -t [to format] -``` diff --git a/kadai1/kynefuk/cli/args.go b/kadai1/kynefuk/cli/args.go deleted file mode 100644 index 79cca38..0000000 --- a/kadai1/kynefuk/cli/args.go +++ /dev/null @@ -1,44 +0,0 @@ -package cli - -import ( - "fmt" -) - -// Args represents CLI's arguments object -type Args struct { - directory, from, to string -} - -// Validate is a validation method -func (args *Args) Validate() error { - fileExtMap := createFileExtMap() - if _, ok := fileExtMap[args.from]; !ok { - return fmt.Errorf("argument of \"-f, --from\" is not valid file format. invalid format: %s", args.from) - } - if _, ok := fileExtMap[args.to]; !ok { - return fmt.Errorf("argument of \"-t, --to\" is not valid file format. invalid format: %s", args.to) - } - - return nil -} - -func createFileExtMap() map[string]string { - fileExtMap := make(map[string]string) - list := []string{ - "jpg", - "jpeg", - "png", - "gif", - "bmp", - "tiff", - } - for _, v := range list { - fileExtMap[v] = "" - } - return fileExtMap -} - -// NewArgs is a constructor of Args -func NewArgs(directory, from, to string) *Args { - return &Args{directory: directory, from: from, to: to} -} diff --git a/kadai1/kynefuk/cli/args_test.go b/kadai1/kynefuk/cli/args_test.go deleted file mode 100644 index 239ba86..0000000 --- a/kadai1/kynefuk/cli/args_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package cli - -import ( - "testing" -) - -const dummyDir = "dummy" - -func TestArgs(t *testing.T) { - tests := []struct{ name, fromFormat, toFormat, expectedMessage string }{ - {name: "valid arguments", fromFormat: "jpeg", toFormat: "png", expectedMessage: ""}, - {name: "invalid from format", fromFormat: "hoge", toFormat: "jpg", expectedMessage: "argument of \"-f, --from\" is not valid file format. invalid format: hoge"}, - {name: "invalid to format", fromFormat: "gif", toFormat: "hage", expectedMessage: "argument of \"-t, --to\" is not valid file format. invalid format: hage"}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - args := NewArgs(dummyDir, tt.fromFormat, tt.toFormat) - actual := args.Validate() - if actual == nil { - if tt.expectedMessage != "" { - t.Errorf("want %s, got %s", actual, tt.expectedMessage) - } - } else if actual.Error() != tt.expectedMessage { - t.Errorf("want %s, got %s", actual, tt.expectedMessage) - } - }) - } -} diff --git a/kadai1/kynefuk/cli/cli.go b/kadai1/kynefuk/cli/cli.go deleted file mode 100644 index ad0dd13..0000000 --- a/kadai1/kynefuk/cli/cli.go +++ /dev/null @@ -1,44 +0,0 @@ -package cli - -import ( - "fmt" - "io" - - "github.com/gopherdojo/dojo8/kadai1/kynefuk/converter" - "github.com/gopherdojo/dojo8/kadai1/kynefuk/walker" -) - -// it represents Exit Code -const ( - ExitCodeOK = iota - ExitCodeError -) - -// Command represents CLI object -type Command struct { - OutStream, ErrStream io.Writer -} - -// Run invoke cli main logic -func (cli *Command) Run(args *Args) int { - dirWalker := walker.NewWalker(args.from) - files, err := dirWalker.Dirwalk(args.directory) - if err != nil { - fmt.Fprintf(cli.ErrStream, "failed to read directory: %s, err: %s\n", args.directory, err) - return ExitCodeError - } - imgConverter := converter.NewConverter(args.from, args.to) - for _, file := range files { - if err := imgConverter.ConvertFormat(file); err != nil { - fmt.Println(imgConverter.From, imgConverter.To) - fmt.Fprintf(cli.ErrStream, "failed to convert img, err: %s\n", err) - return ExitCodeError - } - } - return ExitCodeOK -} - -// NewCommand is a constructor of CLI -func NewCommand(outStream, errStream io.Writer) *Command { - return &Command{OutStream: outStream, ErrStream: errStream} -} diff --git a/kadai1/kynefuk/cli/cli_test.go b/kadai1/kynefuk/cli/cli_test.go deleted file mode 100644 index 20285cd..0000000 --- a/kadai1/kynefuk/cli/cli_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package cli - -import ( - "bytes" - "strings" - "testing" -) - -func TestCLI(t *testing.T) { - outStream, errStream := new(bytes.Buffer), new(bytes.Buffer) - command := NewCommand(outStream, errStream) - - tests := []struct { - name, directory, fromFormat, toFormat, outStream, errStream string - exitCode int - }{ - {name: "success", directory: "../testdata", fromFormat: "png", toFormat: "jpg", outStream: "", errStream: "", exitCode: 0}, - {name: "invalid directory", directory: "dummyDir", fromFormat: "jpg", toFormat: "png", outStream: "", errStream: "failed to read directory: dummyDir, err: open dummyDir: no such file or directory", exitCode: 1}, - {name: "invalid to format", directory: "../testdata", fromFormat: "jpg", toFormat: "hoge", outStream: "", errStream: "", exitCode: 1}, - {name: "invalid from format", directory: "../testdata", fromFormat: "hoge", toFormat: "png", outStream: "", errStream: "", exitCode: 1}, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - args := NewArgs(tt.directory, tt.fromFormat, tt.toFormat) - status := command.Run(args) - if status != tt.exitCode { - t.Errorf("want %d, got %d", tt.exitCode, status) - } - if !strings.Contains(outStream.String(), tt.outStream) { - t.Errorf("want %s, got %s", tt.outStream, outStream.String()) - } - if !strings.Contains(errStream.String(), tt.errStream) { - t.Errorf("want %s, got %s", tt.errStream, errStream.String()) - } - }) - } -} diff --git a/kadai1/kynefuk/converter/converter.go b/kadai1/kynefuk/converter/converter.go deleted file mode 100644 index bb3da66..0000000 --- a/kadai1/kynefuk/converter/converter.go +++ /dev/null @@ -1,66 +0,0 @@ -package converter - -import ( - "fmt" - "image" - "image/gif" - "image/jpeg" - "image/png" - "os" - "strings" - - "golang.org/x/image/bmp" - "golang.org/x/image/tiff" -) - -// Converter converts image file -type Converter struct { - From, To string -} - -// ConvertFormat converts file format -func (converter *Converter) ConvertFormat(filepath string) error { - file, err := os.Open(filepath) - if err != nil { - return fmt.Errorf("failed to open file. file: %s", filepath) - } - defer file.Close() - - img, _, err := image.Decode(file) - if err != nil { - return fmt.Errorf("failed to decode file. file: %s", filepath) - } - - out, err := os.Create(converter.ConvertExt(filepath)) - if err != nil { - return fmt.Errorf("failed to create output file. file: %s", converter.ConvertExt(filepath)) - } - defer out.Close() - - switch converter.To { - case "jpg", "jpeg": - err = jpeg.Encode(out, img, &jpeg.Options{Quality: 100}) - case "png": - err = png.Encode(out, img) - case "gif": - err = gif.Encode(out, img, &gif.Options{NumColors: 256, Quantizer: nil, Drawer: nil}) - case "bmp": - err = bmp.Encode(out, img) - case "tiff": - err = tiff.Encode(out, img, nil) - default: - return fmt.Errorf("unknown format type") - } - - return err -} - -// ConvertExt converts file format extention -func (converter *Converter) ConvertExt(filepath string) string { - return strings.Replace(filepath, converter.From, converter.To, 1) -} - -// NewConverter is a Constructor of Converter -func NewConverter(from, to string) *Converter { - return &Converter{From: from, To: to} -} diff --git a/kadai1/kynefuk/go.mod b/kadai1/kynefuk/go.mod deleted file mode 100644 index f9a7d77..0000000 --- a/kadai1/kynefuk/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/gopherdojo/dojo8/kadai1/kynefuk - -go 1.14 - -require golang.org/x/image v0.0.0-20200618115811-c13761719519 diff --git a/kadai1/kynefuk/go.sum b/kadai1/kynefuk/go.sum deleted file mode 100644 index 394251b..0000000 --- a/kadai1/kynefuk/go.sum +++ /dev/null @@ -1,3 +0,0 @@ -golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/kadai1/kynefuk/main.go b/kadai1/kynefuk/main.go deleted file mode 100644 index 77a2f0f..0000000 --- a/kadai1/kynefuk/main.go +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - - "github.com/gopherdojo/dojo8/kadai1/kynefuk/cli" -) - -func main() { - var directory string - var from string - var to string - flag.StringVar(&directory, "directory", "./", "directory") - flag.StringVar(&directory, "d", "./", "directory(short)") - flag.StringVar(&from, "from", "jpg", "from format") - flag.StringVar(&from, "f", "jpg", "from format(short)") - flag.StringVar(&to, "to", "png", "to format") - flag.StringVar(&to, "t", "png", "to format(short)") - flag.Parse() - - command := cli.NewCommand(os.Stdout, os.Stderr) - - args := cli.NewArgs(directory, from, to) - if err := args.Validate(); err != nil { - fmt.Fprintf(command.ErrStream, "error: %s\n", err) - os.Exit(cli.ExitCodeError) - } - - os.Exit(command.Run(args)) -} diff --git a/kadai1/kynefuk/testdata/gopher1.jpg b/kadai1/kynefuk/testdata/gopher1.jpg deleted file mode 100644 index 0acc83dea50de71ca69b8f64aefb0a27d38e6832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40013 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 XkAZCa{I4i=|6l6i|9DR0$Jl=W(!#xQ diff --git a/kadai1/kynefuk/testdata/gopher1.png b/kadai1/kynefuk/testdata/gopher1.png deleted file mode 100644 index cbdfd8c68dc821e688060dcc850bd607ebece65a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52993 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 TD{?Yh8Thcvu|wr(+|_>p-D^E< diff --git a/kadai1/kynefuk/walker/walker.go b/kadai1/kynefuk/walker/walker.go deleted file mode 100644 index c2c069c..0000000 --- a/kadai1/kynefuk/walker/walker.go +++ /dev/null @@ -1,41 +0,0 @@ -package walker - -import ( - "io/ioutil" - "path/filepath" - "strings" -) - -// Walker walk directory to extract files -type Walker struct { - TargetExt string -} - -// Dirwalk walk directory and collect files -func (walker *Walker) Dirwalk(directory string) ([]string, error) { - items, err := ioutil.ReadDir(directory) - if err != nil { - return nil, err - } - - var paths []string - for _, item := range items { - if item.IsDir() { - items, err := walker.Dirwalk(filepath.Join(directory, item.Name())) - if err != nil { - return nil, err - } - paths = append(paths, items...) - continue - } - if strings.HasSuffix(item.Name(), walker.TargetExt) { - paths = append(paths, filepath.Join(directory, item.Name())) - } - } - return paths, nil -} - -// NewWalker is a constructor of Walker -func NewWalker(targetExt string) *Walker { - return &Walker{TargetExt: targetExt} -}