From 2b3d105bd51b265140f7c3f3afdcff6399466add Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Sat, 7 Sep 2019 01:40:16 +0900 Subject: [PATCH 01/14] =?UTF-8?q?=E8=AA=B2=E9=A1=8C1=20=E6=9C=80=E4=BD=8E?= =?UTF-8?q?=E9=99=90=E6=8F=90=E5=87=BA=E5=8F=AF=E8=83=BD=E7=8A=B6=E6=85=8B?= =?UTF-8?q?=E3=81=BE=E3=81=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/shinta/.gitignore | 1 + kadai1/shinta/README.md | 31 ++++ kadai1/shinta/go.mod | 3 + .../shinta/imageconversion/imageconversion.go | 145 ++++++++++++++++++ kadai1/shinta/main.go | 15 ++ 5 files changed, 195 insertions(+) create mode 100644 kadai1/shinta/.gitignore create mode 100644 kadai1/shinta/README.md create mode 100644 kadai1/shinta/go.mod create mode 100644 kadai1/shinta/imageconversion/imageconversion.go create mode 100644 kadai1/shinta/main.go diff --git a/kadai1/shinta/.gitignore b/kadai1/shinta/.gitignore new file mode 100644 index 0000000..27a4e8f --- /dev/null +++ b/kadai1/shinta/.gitignore @@ -0,0 +1 @@ +/testdatadir \ No newline at end of file diff --git a/kadai1/shinta/README.md b/kadai1/shinta/README.md new file mode 100644 index 0000000..7ed1d61 --- /dev/null +++ b/kadai1/shinta/README.md @@ -0,0 +1,31 @@ +# 課題1 +## 次の仕様を満たすコマンドを作って下さい +[ ] ディレクトリを指定する + +[ ] 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) + +[ ] ディレクトリ以下は再帰的に処理する + +[ ] 変換前と変換後の画像形式を指定できる(オプション) + +[ ] 以下を満たすように開発してください + +[ ] mainパッケージと分離する + +[ ] 自作パッケージと標準パッケージと準標準パッケージのみ使う + +[ ] ユーザ定義型を作ってみる + +[ ] GoDocを生成してみる + +## 使い方 +``` +# build +go build -o "任意のコマンド名" +# 例 +go build -o imgcov +# 実行方法(上記の例の場合) +imgcov [-d=ディレクトリ(default ./), -p=変更対象の拡張子(default jpg), -a=変更後の拡張子(default png)] +# 変換可能な拡張子として、jpg、jpeg、png、gif としています。 +``` + diff --git a/kadai1/shinta/go.mod b/kadai1/shinta/go.mod new file mode 100644 index 0000000..c0cd2bc --- /dev/null +++ b/kadai1/shinta/go.mod @@ -0,0 +1,3 @@ +module github.com/gopherdojo/dojo7/kadai1/shinta + +go 1.12 diff --git a/kadai1/shinta/imageconversion/imageconversion.go b/kadai1/shinta/imageconversion/imageconversion.go new file mode 100644 index 0000000..b452e70 --- /dev/null +++ b/kadai1/shinta/imageconversion/imageconversion.go @@ -0,0 +1,145 @@ +//Package imageconversion は画像ファイル形式の変換を行います。 +//option で、実行するディレクトリと変換前と変換後の画像形式を指定できます。 +//option を指定しない場合、コマンドを実行するディレクトリと、 変換前の画像タイプがjpeg、変換後の画像タイプがpngになります。 +// 変換可能な拡張子として、jpg、jpeg、png、gif としています。 +package imageconversion + +import ( + "errors" + "flag" + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "path/filepath" + "strings" +) + +type imageFile struct { + path string + base string + ext string +} + +type imageList []imageFile + +func judgeArgExt(preExt string, afterExt string) (err error) { + allowExtList := []string{"jpg", "jpeg", "png", "gif"} + argExtList := []string{preExt, afterExt} + var judgeExt bool + for i, argExt := range argExtList { + if i == len(argExtList)-1 { + judgeExt = false + } + for _, allowExt := range allowExtList { + if allowExt == argExt { + judgeExt = true + break + } + } + } + if !judgeExt { + err = errors.New("指定できる拡張子:" + strings.Join(allowExtList, ",")) + } + return +} + +func passArgs() (dir string, preExt string, afterExt string, err error) { + d := flag.String("d", "./", "対象ディレクトリ") + p := flag.String("p", "jpeg", "変更前画像拡張子") + a := flag.String("a", "png", "変更後画像拡張子") + flag.Parse() + dir, preExt, afterExt = *d, *p, *a + err = judgeArgExt(preExt, afterExt) + if err != nil { + return + } + preExt = "." + preExt + afterExt = "." + afterExt + return +} + +func getFileNameWithoutExt(path string) string { + return filepath.Base(path[:len(path)-len(filepath.Ext(path))]) +} + +func createImgList(path string) (image imageFile) { + base := getFileNameWithoutExt(path) + image = imageFile{filepath.Dir(path), base, filepath.Ext(path)} + return +} + +func searchImages(dir string, preExt string) (list imageList, err error) { + // 変換対象ファイルが jpeg or jpg かを確認する + jpgType := [2]string{".jpg", ".jpeg"} + var jpgFlag bool + for _, v := range jpgType { + if preExt == v { + jpgFlag = true + } + } + err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if jpgFlag { + // jpeg は jpgも変換対象とする + if filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg" { + image := createImgList(path) + list = append(list, image) + } + } else { + if filepath.Ext(path) == preExt { + image := createImgList(path) + list = append(list, image) + } + } + return nil + }) + return +} + +func convetImages(list imageList, afterExt string) (err error) { + for _, img := range list { + targetImg, err := os.Open(img.path + "/" + img.base + img.ext) + if err != nil { + return err + } + readImg, _, err := image.Decode(targetImg) + if err != nil { + return err + } + outputImg, err := os.Create((img.path + "/" + img.base + afterExt)) + if err != nil { + return err + } + + switch afterExt { + case "jpeg": + jpeg.Encode(outputImg, readImg, nil) + case "gif": + gif.Encode(outputImg, readImg, nil) + default: + png.Encode(outputImg, readImg) + } + + targetImg.Close() + outputImg.Close() + } + return +} + +// Excute は画像変換処理を実行します。 +func Excute() error { + dir, preExt, afterExt, err := passArgs() + if err != nil { + return err + } + list, err := searchImages(dir, preExt) + if err != nil { + return err + } + err = convetImages(list, afterExt) + return err +} diff --git a/kadai1/shinta/main.go b/kadai1/shinta/main.go new file mode 100644 index 0000000..6d45d2f --- /dev/null +++ b/kadai1/shinta/main.go @@ -0,0 +1,15 @@ +package main + +import ( + "fmt" + "os" + + "github.com/gopherdojo/dojo7/kadai1/shinta/imageconversion/imageconversion" +) + +func main() { + err := imageconversion.Excute() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } +} From a679450a26764afd3d6b9a811002b04ca4d0df2a Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Sat, 7 Sep 2019 01:51:57 +0900 Subject: [PATCH 02/14] fix README --- kadai1/shinta/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/kadai1/shinta/README.md b/kadai1/shinta/README.md index 7ed1d61..7ec84f5 100644 --- a/kadai1/shinta/README.md +++ b/kadai1/shinta/README.md @@ -1,22 +1,22 @@ # 課題1 ## 次の仕様を満たすコマンドを作って下さい -[ ] ディレクトリを指定する +- ディレクトリを指定する -[ ] 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) +- 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) -[ ] ディレクトリ以下は再帰的に処理する +- ディレクトリ以下は再帰的に処理する -[ ] 変換前と変換後の画像形式を指定できる(オプション) +- 変換前と変換後の画像形式を指定できる(オプション) -[ ] 以下を満たすように開発してください +- 以下を満たすように開発してください -[ ] mainパッケージと分離する +- mainパッケージと分離する -[ ] 自作パッケージと標準パッケージと準標準パッケージのみ使う +- 自作パッケージと標準パッケージと準標準パッケージのみ使う -[ ] ユーザ定義型を作ってみる +- ユーザ定義型を作ってみる -[ ] GoDocを生成してみる +- GoDocを生成してみる ## 使い方 ``` From 64d4b9470cb71aebf3015c9a6e11efed790a230a Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Sun, 8 Sep 2019 02:43:13 +0900 Subject: [PATCH 03/14] =?UTF-8?q?=E9=96=A2=E6=95=B0=E5=90=8D=E3=81=A8packa?= =?UTF-8?q?ge=20import=E9=83=A8=E5=88=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/shinta/imageconversion/imageconversion.go | 8 ++++---- kadai1/shinta/main.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kadai1/shinta/imageconversion/imageconversion.go b/kadai1/shinta/imageconversion/imageconversion.go index b452e70..a2bc941 100644 --- a/kadai1/shinta/imageconversion/imageconversion.go +++ b/kadai1/shinta/imageconversion/imageconversion.go @@ -64,7 +64,7 @@ func getFileNameWithoutExt(path string) string { return filepath.Base(path[:len(path)-len(filepath.Ext(path))]) } -func createImgList(path string) (image imageFile) { +func createImgStruct(path string) (image imageFile) { base := getFileNameWithoutExt(path) image = imageFile{filepath.Dir(path), base, filepath.Ext(path)} return @@ -86,12 +86,12 @@ func searchImages(dir string, preExt string) (list imageList, err error) { if jpgFlag { // jpeg は jpgも変換対象とする if filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg" { - image := createImgList(path) + image := createImgStruct(path) list = append(list, image) } } else { if filepath.Ext(path) == preExt { - image := createImgList(path) + image := createImgStruct(path) list = append(list, image) } } @@ -116,7 +116,7 @@ func convetImages(list imageList, afterExt string) (err error) { } switch afterExt { - case "jpeg": + case "jpeg", "jpg": jpeg.Encode(outputImg, readImg, nil) case "gif": gif.Encode(outputImg, readImg, nil) diff --git a/kadai1/shinta/main.go b/kadai1/shinta/main.go index 6d45d2f..becfcc3 100644 --- a/kadai1/shinta/main.go +++ b/kadai1/shinta/main.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/gopherdojo/dojo7/kadai1/shinta/imageconversion/imageconversion" + "github.com/gopherdojo/dojo7/kadai1/shinta/imageconversion" ) func main() { From 83715d4c31e700ab5fc334c6558b432026c69049 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Mon, 9 Sep 2019 01:29:56 +0900 Subject: [PATCH 04/14] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/shinta/.gitignore | 2 +- .../shinta/imageconversion/imageconversion.go | 135 ++++++++++-------- 2 files changed, 74 insertions(+), 63 deletions(-) diff --git a/kadai1/shinta/.gitignore b/kadai1/shinta/.gitignore index 27a4e8f..4aa6a67 100644 --- a/kadai1/shinta/.gitignore +++ b/kadai1/shinta/.gitignore @@ -1 +1 @@ -/testdatadir \ No newline at end of file +testdatadir \ No newline at end of file diff --git a/kadai1/shinta/imageconversion/imageconversion.go b/kadai1/shinta/imageconversion/imageconversion.go index a2bc941..f522b37 100644 --- a/kadai1/shinta/imageconversion/imageconversion.go +++ b/kadai1/shinta/imageconversion/imageconversion.go @@ -1,7 +1,9 @@ -//Package imageconversion は画像ファイル形式の変換を行います。 -//option で、実行するディレクトリと変換前と変換後の画像形式を指定できます。 -//option を指定しない場合、コマンドを実行するディレクトリと、 変換前の画像タイプがjpeg、変換後の画像タイプがpngになります。 -// 変換可能な拡張子として、jpg、jpeg、png、gif としています。 +/* +Package imageconversion は画像ファイル形式の変換を行います。 +optionで、実行するディレクトリと変換前と変換後の画像形式を指定できます。 +option を指定しない場合、コマンドを実行するディレクトリと、 変換前の画像タイプがjpeg、変換後の画像タイプがpngになります。 +変換可能な拡張子として、jpg、jpeg、png、gif としています。 +*/ package imageconversion import ( @@ -16,14 +18,7 @@ import ( "strings" ) -type imageFile struct { - path string - base string - ext string -} - -type imageList []imageFile - +// judgeArgExt は引数に設定された拡張子が変換可能なものか判別する func judgeArgExt(preExt string, afterExt string) (err error) { allowExtList := []string{"jpg", "jpeg", "png", "gif"} argExtList := []string{preExt, afterExt} @@ -45,10 +40,11 @@ func judgeArgExt(preExt string, afterExt string) (err error) { return } +// passArgs は引数を受け取りその引数(ディレクトリ、変換前拡張子、変換後拡張子)が正しいか判別し、引数の値を返します。 func passArgs() (dir string, preExt string, afterExt string, err error) { d := flag.String("d", "./", "対象ディレクトリ") - p := flag.String("p", "jpeg", "変更前画像拡張子") - a := flag.String("a", "png", "変更後画像拡張子") + p := flag.String("p", "jpg", "変換前拡張子") + a := flag.String("a", "png", "変換後拡張子") flag.Parse() dir, preExt, afterExt = *d, *p, *a err = judgeArgExt(preExt, afterExt) @@ -60,17 +56,64 @@ func passArgs() (dir string, preExt string, afterExt string, err error) { return } +// imageFile struct は変換対象の画像のpath(path)、拡張子を除いたファイル名(base)、拡張子(ext)を持っています。 +type imageFile struct { + path string + base string + ext string +} + +// getFileNameWithoutExt は対象ファイルのpathと拡張子を除いたファイル名を返します。 func getFileNameWithoutExt(path string) string { return filepath.Base(path[:len(path)-len(filepath.Ext(path))]) } +// createImgStrunct は、imageFile structを生成し、返します。 func createImgStruct(path string) (image imageFile) { base := getFileNameWithoutExt(path) image = imageFile{filepath.Dir(path), base, filepath.Ext(path)} return } -func searchImages(dir string, preExt string) (list imageList, err error) { +/* +convertExec は画像ファイルを引数で指定された変換後の拡張子(defaultはpng)に変換した新しい画像ファイルを生成します。 +処理が成功するとnil、errorが起きた場合、errorを返します。 +*/ +func convertExec(path string, afterExt string) (err error) { + img := createImgStruct(path) + targetImg, err := os.Open(img.path + "/" + img.base + img.ext) + if err != nil { + return err + } + readImg, _, err := image.Decode(targetImg) + if err != nil { + return err + } + outputImg, err := os.Create((img.path + "/" + img.base + afterExt)) + if err != nil { + return err + } + + switch afterExt { + case "jpeg", "jpg": + jpeg.Encode(outputImg, readImg, nil) + case "gif": + gif.Encode(outputImg, readImg, nil) + default: + png.Encode(outputImg, readImg) + } + + targetImg.Close() + outputImg.Close() + return +} + +/* +convertImages は、引数で指定されたディレクトリ以下から引数で指定した変換前拡張子(defaultはjpg)のファイルを、 +変換後拡張子(defaultはpng)に変換した新しい画像ファイルを生成します。 +処理が成功するとnil、errorが起きた場合、errorを返します。 +*/ +func convertImages(dir string, preExt string, afterExt string) (err error) { // 変換対象ファイルが jpeg or jpg かを確認する jpgType := [2]string{".jpg", ".jpeg"} var jpgFlag bool @@ -83,63 +126,31 @@ func searchImages(dir string, preExt string) (list imageList, err error) { if err != nil { return err } - if jpgFlag { - // jpeg は jpgも変換対象とする - if filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg" { - image := createImgStruct(path) - list = append(list, image) - } - } else { - if filepath.Ext(path) == preExt { - image := createImgStruct(path) - list = append(list, image) - } + // jpeg は jpgも変換対象とする + if jpgFlag && filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg" { + convertExec(path, afterExt) + } + if filepath.Ext(path) == preExt { + convertExec(path, afterExt) } return nil }) return } -func convetImages(list imageList, afterExt string) (err error) { - for _, img := range list { - targetImg, err := os.Open(img.path + "/" + img.base + img.ext) - if err != nil { - return err - } - readImg, _, err := image.Decode(targetImg) - if err != nil { - return err - } - outputImg, err := os.Create((img.path + "/" + img.base + afterExt)) - if err != nil { - return err - } - - switch afterExt { - case "jpeg", "jpg": - jpeg.Encode(outputImg, readImg, nil) - case "gif": - gif.Encode(outputImg, readImg, nil) - default: - png.Encode(outputImg, readImg) - } - - targetImg.Close() - outputImg.Close() - } - return -} - -// Excute は画像変換処理を実行します。 +/* +Excute は画像変換処理を実行します。 +このpackageで呼び出せる唯一の関数です。 +引数で、ディレクトリ(デフォルトは ./)、変換前拡張子(デフォルトは jpg)、変換後拡張子(デフォルトは png)を受け取ります。 +引数が指定されない場合はデフォルトの値が適用されます。 +引数で受け取ったディレクトリ以下の変換前拡張子のファイルを変換後拡張子に変換した新しいファイルを作成します。 +処理が成功の場合、nilをerrorが起きた場合はerrorを返します。 +*/ func Excute() error { dir, preExt, afterExt, err := passArgs() if err != nil { return err } - list, err := searchImages(dir, preExt) - if err != nil { - return err - } - err = convetImages(list, afterExt) + err = convertImages(dir, preExt, afterExt) return err } From a92ff4dd887aa2ebfebb556102da284f8560f96a Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Mon, 9 Sep 2019 01:50:47 +0900 Subject: [PATCH 05/14] =?UTF-8?q?=E6=8B=A1=E5=BC=B5=E5=AD=90=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shinta/imageconversion/imageconversion.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/kadai1/shinta/imageconversion/imageconversion.go b/kadai1/shinta/imageconversion/imageconversion.go index f522b37..2b0b70b 100644 --- a/kadai1/shinta/imageconversion/imageconversion.go +++ b/kadai1/shinta/imageconversion/imageconversion.go @@ -22,19 +22,24 @@ import ( func judgeArgExt(preExt string, afterExt string) (err error) { allowExtList := []string{"jpg", "jpeg", "png", "gif"} argExtList := []string{preExt, afterExt} - var judgeExt bool - for i, argExt := range argExtList { - if i == len(argExtList)-1 { - judgeExt = false + var judgeExtFlag bool + for _, argExt := range argExtList { + // 変換前の拡張子の判定結果が正しい場合、フラグを初期化する。 + if judgeExtFlag { + judgeExtFlag = false } + // 拡張子が正しい拡張子か判定する。 for _, allowExt := range allowExtList { if allowExt == argExt { - judgeExt = true - break + judgeExtFlag = true } } + // 拡張子判定結果が正しくない場合breakする。フラグはfalseになる。 + if !judgeExtFlag { + break + } } - if !judgeExt { + if !judgeExtFlag { err = errors.New("指定できる拡張子:" + strings.Join(allowExtList, ",")) } return From e2f69b0f98c20e3aa1e9949af4d0a6f38858f895 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Tue, 10 Sep 2019 02:14:14 +0900 Subject: [PATCH 06/14] =?UTF-8?q?review=20=E3=82=92=E5=8F=97=E3=81=91?= =?UTF-8?q?=E3=81=A6=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shinta/imageconversion/imageconversion.go | 97 ++++--------------- kadai1/shinta/main.go | 43 +++++++- 2 files changed, 60 insertions(+), 80 deletions(-) diff --git a/kadai1/shinta/imageconversion/imageconversion.go b/kadai1/shinta/imageconversion/imageconversion.go index 2b0b70b..fea08fc 100644 --- a/kadai1/shinta/imageconversion/imageconversion.go +++ b/kadai1/shinta/imageconversion/imageconversion.go @@ -7,60 +7,14 @@ option を指定しない場合、コマンドを実行するディレクトリ package imageconversion import ( - "errors" - "flag" "image" "image/gif" "image/jpeg" "image/png" "os" "path/filepath" - "strings" ) -// judgeArgExt は引数に設定された拡張子が変換可能なものか判別する -func judgeArgExt(preExt string, afterExt string) (err error) { - allowExtList := []string{"jpg", "jpeg", "png", "gif"} - argExtList := []string{preExt, afterExt} - var judgeExtFlag bool - for _, argExt := range argExtList { - // 変換前の拡張子の判定結果が正しい場合、フラグを初期化する。 - if judgeExtFlag { - judgeExtFlag = false - } - // 拡張子が正しい拡張子か判定する。 - for _, allowExt := range allowExtList { - if allowExt == argExt { - judgeExtFlag = true - } - } - // 拡張子判定結果が正しくない場合breakする。フラグはfalseになる。 - if !judgeExtFlag { - break - } - } - if !judgeExtFlag { - err = errors.New("指定できる拡張子:" + strings.Join(allowExtList, ",")) - } - return -} - -// passArgs は引数を受け取りその引数(ディレクトリ、変換前拡張子、変換後拡張子)が正しいか判別し、引数の値を返します。 -func passArgs() (dir string, preExt string, afterExt string, err error) { - d := flag.String("d", "./", "対象ディレクトリ") - p := flag.String("p", "jpg", "変換前拡張子") - a := flag.String("a", "png", "変換後拡張子") - flag.Parse() - dir, preExt, afterExt = *d, *p, *a - err = judgeArgExt(preExt, afterExt) - if err != nil { - return - } - preExt = "." + preExt - afterExt = "." + afterExt - return -} - // imageFile struct は変換対象の画像のpath(path)、拡張子を除いたファイル名(base)、拡張子(ext)を持っています。 type imageFile struct { path string @@ -84,7 +38,7 @@ func createImgStruct(path string) (image imageFile) { convertExec は画像ファイルを引数で指定された変換後の拡張子(defaultはpng)に変換した新しい画像ファイルを生成します。 処理が成功するとnil、errorが起きた場合、errorを返します。 */ -func convertExec(path string, afterExt string) (err error) { +func convertExec(path, afterExt string) error { img := createImgStruct(path) targetImg, err := os.Open(img.path + "/" + img.base + img.ext) if err != nil { @@ -108,54 +62,39 @@ func convertExec(path string, afterExt string) (err error) { png.Encode(outputImg, readImg) } - targetImg.Close() - outputImg.Close() - return + err = targetImg.Close() + if err != nil { + return err + } + return outputImg.Close() } /* -convertImages は、引数で指定されたディレクトリ以下から引数で指定した変換前拡張子(defaultはjpg)のファイルを、 +Excute は画像変換処理を実行します。 +このpackageで呼び出せる唯一の関数です。 +引数で、ディレクトリ(デフォルトは ./)、変換前拡張子(デフォルトは jpg)、変換後拡張子(デフォルトは png)を受け取ります。 +引数が指定されない場合はデフォルトの値が適用されます。 +引数で受け取ったディレクトリ以下の変換前拡張子のファイルを変換後拡張子に変換した新しいファイルを作成します。 +処理が成功の場合、nilをerrorが起きた場合はerrorを返します。 +引数で指定されたディレクトリ以下から引数で指定した変換前拡張子(defaultはjpg)のファイルを、 変換後拡張子(defaultはpng)に変換した新しい画像ファイルを生成します。 処理が成功するとnil、errorが起きた場合、errorを返します。 */ -func convertImages(dir string, preExt string, afterExt string) (err error) { +func Excute(dir, preExt, afterExt string) error { // 変換対象ファイルが jpeg or jpg かを確認する - jpgType := [2]string{".jpg", ".jpeg"} - var jpgFlag bool - for _, v := range jpgType { - if preExt == v { - jpgFlag = true - } - } - err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + jpgType := map[string]bool{".jpg": true, ".jpeg": true} + err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // jpeg は jpgも変換対象とする - if jpgFlag && filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg" { + if jpgType[afterExt] && (filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg") { convertExec(path, afterExt) } if filepath.Ext(path) == preExt { convertExec(path, afterExt) } - return nil - }) - return -} - -/* -Excute は画像変換処理を実行します。 -このpackageで呼び出せる唯一の関数です。 -引数で、ディレクトリ(デフォルトは ./)、変換前拡張子(デフォルトは jpg)、変換後拡張子(デフォルトは png)を受け取ります。 -引数が指定されない場合はデフォルトの値が適用されます。 -引数で受け取ったディレクトリ以下の変換前拡張子のファイルを変換後拡張子に変換した新しいファイルを作成します。 -処理が成功の場合、nilをerrorが起きた場合はerrorを返します。 -*/ -func Excute() error { - dir, preExt, afterExt, err := passArgs() - if err != nil { return err - } - err = convertImages(dir, preExt, afterExt) + }) return err } diff --git a/kadai1/shinta/main.go b/kadai1/shinta/main.go index becfcc3..3235f5b 100644 --- a/kadai1/shinta/main.go +++ b/kadai1/shinta/main.go @@ -1,15 +1,56 @@ package main import ( + "errors" + "flag" "fmt" "os" + "strings" "github.com/gopherdojo/dojo7/kadai1/shinta/imageconversion" ) +// judgeArgExt は引数に設定された拡張子が変換可能なものか判別する +func judgeArgExt(preExt, afterExt string) error { + if preExt == afterExt { + return errors.New("変換前と変換後で拡張子が同じです。") + } + allowExtList := []string{"jpg", "jpeg", "png", "gif"} + allowExtMap := map[string]bool{} + for _, ext := range allowExtList { + allowExtMap[ext] = true + } + if !allowExtMap[preExt] || !allowExtMap[afterExt] { + return errors.New("指定できる拡張子: " + strings.Join(allowExtList, ",")) + } + return nil +} + +// passArgs は引数を受け取りその引数(ディレクトリ、変換前拡張子、変換後拡張子)が正しいか判別し、引数の値を返します。 +func passArgs() (dir string, preExt string, afterExt string, err error) { + d := flag.String("d", "./", "対象ディレクトリ") + p := flag.String("p", "jpg", "変換前拡張子") + a := flag.String("a", "png", "変換後拡張子") + flag.Parse() + dir, preExt, afterExt = *d, *p, *a + err = judgeArgExt(preExt, afterExt) + if err != nil { + return + } + preExt = "." + preExt + afterExt = "." + afterExt + return +} + func main() { - err := imageconversion.Excute() + dir, preExt, afterExt, err := passArgs() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + err = imageconversion.Excute(dir, preExt, afterExt) if err != nil { fmt.Fprintln(os.Stderr, err) + os.Exit(1) } } From 3f051bfd52c5e332d67ea66eec8751819b3dd318 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Tue, 10 Sep 2019 02:33:54 +0900 Subject: [PATCH 07/14] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E5=87=A6?= =?UTF-8?q?=E7=90=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shinta/imageconversion/imageconversion.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/kadai1/shinta/imageconversion/imageconversion.go b/kadai1/shinta/imageconversion/imageconversion.go index fea08fc..8004e48 100644 --- a/kadai1/shinta/imageconversion/imageconversion.go +++ b/kadai1/shinta/imageconversion/imageconversion.go @@ -61,12 +61,9 @@ func convertExec(path, afterExt string) error { default: png.Encode(outputImg, readImg) } - err = targetImg.Close() - if err != nil { - return err - } - return outputImg.Close() + err = outputImg.Close() + return err } /* @@ -89,10 +86,16 @@ func Excute(dir, preExt, afterExt string) error { } // jpeg は jpgも変換対象とする if jpgType[afterExt] && (filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg") { - convertExec(path, afterExt) + err = convertExec(path, afterExt) + if err != nil { + return err + } } if filepath.Ext(path) == preExt { - convertExec(path, afterExt) + err = convertExec(path, afterExt) + if err != nil { + return err + } } return err }) From a87ec7bd02f2fababd6f526c21b0347877e45267 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Wed, 11 Sep 2019 01:23:08 +0900 Subject: [PATCH 08/14] =?UTF-8?q?kadai2=E3=81=B8=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {kadai1 => kadai2}/.gitkeep | 0 {kadai1 => kadai2}/shinta/.gitignore | 0 {kadai1 => kadai2}/shinta/README.md | 0 {kadai1 => kadai2}/shinta/go.mod | 0 {kadai1 => kadai2}/shinta/imageconversion/imageconversion.go | 0 {kadai1 => kadai2}/shinta/main.go | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {kadai1 => kadai2}/.gitkeep (100%) rename {kadai1 => kadai2}/shinta/.gitignore (100%) rename {kadai1 => kadai2}/shinta/README.md (100%) rename {kadai1 => kadai2}/shinta/go.mod (100%) rename {kadai1 => kadai2}/shinta/imageconversion/imageconversion.go (100%) rename {kadai1 => kadai2}/shinta/main.go (100%) diff --git a/kadai1/.gitkeep b/kadai2/.gitkeep similarity index 100% rename from kadai1/.gitkeep rename to kadai2/.gitkeep diff --git a/kadai1/shinta/.gitignore b/kadai2/shinta/.gitignore similarity index 100% rename from kadai1/shinta/.gitignore rename to kadai2/shinta/.gitignore diff --git a/kadai1/shinta/README.md b/kadai2/shinta/README.md similarity index 100% rename from kadai1/shinta/README.md rename to kadai2/shinta/README.md diff --git a/kadai1/shinta/go.mod b/kadai2/shinta/go.mod similarity index 100% rename from kadai1/shinta/go.mod rename to kadai2/shinta/go.mod diff --git a/kadai1/shinta/imageconversion/imageconversion.go b/kadai2/shinta/imageconversion/imageconversion.go similarity index 100% rename from kadai1/shinta/imageconversion/imageconversion.go rename to kadai2/shinta/imageconversion/imageconversion.go diff --git a/kadai1/shinta/main.go b/kadai2/shinta/main.go similarity index 100% rename from kadai1/shinta/main.go rename to kadai2/shinta/main.go From 8f87ec4eee3a20aeb0ab5e3aee2ae011801b63b4 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Thu, 12 Sep 2019 01:43:26 +0900 Subject: [PATCH 09/14] =?UTF-8?q?io.Reader=20io.Writer=E3=81=AB=E3=81=A4?= =?UTF-8?q?=E3=81=84=E3=81=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/shinta/README.md | 48 +++++++++++++++++------------------------ kadai2/shinta/go.mod | 2 +- kadai2/shinta/main.go | 2 +- 3 files changed, 22 insertions(+), 30 deletions(-) diff --git a/kadai2/shinta/README.md b/kadai2/shinta/README.md index 7ec84f5..8bfe7e0 100644 --- a/kadai2/shinta/README.md +++ b/kadai2/shinta/README.md @@ -1,31 +1,23 @@ -# 課題1 -## 次の仕様を満たすコマンドを作って下さい -- ディレクトリを指定する +# 課題2 +## io.Readerとio.Writerについて調べてみよう +### 標準パッケージでどのように使われているか +- os(os.Open, os.Create, os.Stdin, os.Stdout, os.Stderr) + - *os.File型、ファイルを開いたりするときに使う +- bytes.Buffer (struct), bytes.Reader (struct) + - ファイルではなくメモリへデータを書き込むのに使う。*bytes.Buffer が io.Writer として利用可能。 + - *bytes.Reader が io.Reader として利用可能。 +- bufio.Scanner + - ファイルや標準入力から作られた io.Reader から1行ずつ文字列を読み込む。 +- io/ioutil.ReadAll, io/ioutil.ReadFile, io/ioutil.WriteFile, io.Copy + - io/ioutil.ReadAll: io.Reader から全てデータを読み込んで[]byte を作成する。 + - io/ioutil.ReadFile: 指定されたファイル名から全てのデータを読み込んで[]byte を作成する。 + - io/ioutil.WriteFile: 指定されたファイル名に[]byte を書き込む。os.Create に合わせるなら第三引数permは0666を渡す。 + - io.Copy: io.Reader から io.Writer にデータを全てコピーする便利関数 + +### io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる +- io.Reader io.Writerを持っている関数であれば、抽象的にIOしていると考えて良い +- 呼び出し側はI/O処理がどんなことをしているのかを理解する必要が無い +- DIPにできる。 -- 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) -- ディレクトリ以下は再帰的に処理する - -- 変換前と変換後の画像形式を指定できる(オプション) - -- 以下を満たすように開発してください - -- mainパッケージと分離する - -- 自作パッケージと標準パッケージと準標準パッケージのみ使う - -- ユーザ定義型を作ってみる - -- GoDocを生成してみる - -## 使い方 -``` -# build -go build -o "任意のコマンド名" -# 例 -go build -o imgcov -# 実行方法(上記の例の場合) -imgcov [-d=ディレクトリ(default ./), -p=変更対象の拡張子(default jpg), -a=変更後の拡張子(default png)] -# 変換可能な拡張子として、jpg、jpeg、png、gif としています。 -``` diff --git a/kadai2/shinta/go.mod b/kadai2/shinta/go.mod index c0cd2bc..ddc7d85 100644 --- a/kadai2/shinta/go.mod +++ b/kadai2/shinta/go.mod @@ -1,3 +1,3 @@ -module github.com/gopherdojo/dojo7/kadai1/shinta +module github.com/gopherdojo/dojo7/kadai2/shinta go 1.12 diff --git a/kadai2/shinta/main.go b/kadai2/shinta/main.go index 3235f5b..eb693aa 100644 --- a/kadai2/shinta/main.go +++ b/kadai2/shinta/main.go @@ -7,7 +7,7 @@ import ( "os" "strings" - "github.com/gopherdojo/dojo7/kadai1/shinta/imageconversion" + "github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion" ) // judgeArgExt は引数に設定された拡張子が変換可能なものか判別する From 83f2edbbf8e25993359bbedc62bc18dc1a660a78 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Sat, 14 Sep 2019 02:27:49 +0900 Subject: [PATCH 10/14] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/shinta/.gitignore | 2 +- .../shinta/imageconversion/imageconversion.go | 51 ++++++++++++++----- .../imageconversion/imageconversion_test.go | 13 +++++ kadai2/shinta/main.go | 28 ++-------- 4 files changed, 55 insertions(+), 39 deletions(-) create mode 100644 kadai2/shinta/imageconversion/imageconversion_test.go diff --git a/kadai2/shinta/.gitignore b/kadai2/shinta/.gitignore index 4aa6a67..830f581 100644 --- a/kadai2/shinta/.gitignore +++ b/kadai2/shinta/.gitignore @@ -1 +1 @@ -testdatadir \ No newline at end of file +testdata \ No newline at end of file diff --git a/kadai2/shinta/imageconversion/imageconversion.go b/kadai2/shinta/imageconversion/imageconversion.go index 8004e48..5ff3805 100644 --- a/kadai2/shinta/imageconversion/imageconversion.go +++ b/kadai2/shinta/imageconversion/imageconversion.go @@ -7,14 +7,41 @@ option を指定しない場合、コマンドを実行するディレクトリ package imageconversion import ( + "errors" "image" "image/gif" "image/jpeg" "image/png" "os" "path/filepath" + "strings" ) +type arg struct { + dir string + preExt string + afterExt string +} + +func (a *arg) valid() error { + if a.preExt == a.afterExt { + return errors.New("変換前と変換後で拡張子が同じです。") + } + allowExtList := []string{"jpg", "jpeg", "png", "gif"} + allowExtMap := map[string]bool{} + for _, ext := range allowExtList { + allowExtMap[ext] = true + } + if !allowExtMap[a.preExt] || !allowExtMap[a.afterExt] { + return errors.New("指定できる拡張子: " + strings.Join(allowExtList, ",")) + } + return nil +} + +func (a *arg) convertExt() { + a.preExt, a.afterExt = "."+a.preExt, "."+a.afterExt +} + // imageFile struct は変換対象の画像のpath(path)、拡張子を除いたファイル名(base)、拡張子(ext)を持っています。 type imageFile struct { path string @@ -54,9 +81,9 @@ func convertExec(path, afterExt string) error { } switch afterExt { - case "jpeg", "jpg": + case ".jpeg", ".jpg": jpeg.Encode(outputImg, readImg, nil) - case "gif": + case ".gif": gif.Encode(outputImg, readImg, nil) default: png.Encode(outputImg, readImg) @@ -78,21 +105,17 @@ Excute は画像変換処理を実行します。 処理が成功するとnil、errorが起きた場合、errorを返します。 */ func Excute(dir, preExt, afterExt string) error { - // 変換対象ファイルが jpeg or jpg かを確認する - jpgType := map[string]bool{".jpg": true, ".jpeg": true} - err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + arg := &arg{dir, preExt, afterExt} + if err := arg.valid(); err != nil { + return err + } + arg.convertExt() + err := filepath.Walk(arg.dir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } - // jpeg は jpgも変換対象とする - if jpgType[afterExt] && (filepath.Ext(path) == ".jpeg" || filepath.Ext(path) == ".jpg") { - err = convertExec(path, afterExt) - if err != nil { - return err - } - } - if filepath.Ext(path) == preExt { - err = convertExec(path, afterExt) + if filepath.Ext(path) == arg.preExt { + err = convertExec(path, arg.afterExt) if err != nil { return err } diff --git a/kadai2/shinta/imageconversion/imageconversion_test.go b/kadai2/shinta/imageconversion/imageconversion_test.go new file mode 100644 index 0000000..5fe0854 --- /dev/null +++ b/kadai2/shinta/imageconversion/imageconversion_test.go @@ -0,0 +1,13 @@ +package imageconversion + +import ( + "testing" +) + +func TestImageConversionExcute(t *testing.T) { + dir, preExt, afterExt := "./", "jpg", "png" + err := Excute(dir, preExt, afterExt) + if err != nil { + t.Error("failed to call Imageconversion Excute", err) + } +} diff --git a/kadai2/shinta/main.go b/kadai2/shinta/main.go index eb693aa..439542f 100644 --- a/kadai2/shinta/main.go +++ b/kadai2/shinta/main.go @@ -5,40 +5,20 @@ import ( "flag" "fmt" "os" - "strings" "github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion" ) -// judgeArgExt は引数に設定された拡張子が変換可能なものか判別する -func judgeArgExt(preExt, afterExt string) error { - if preExt == afterExt { - return errors.New("変換前と変換後で拡張子が同じです。") - } - allowExtList := []string{"jpg", "jpeg", "png", "gif"} - allowExtMap := map[string]bool{} - for _, ext := range allowExtList { - allowExtMap[ext] = true - } - if !allowExtMap[preExt] || !allowExtMap[afterExt] { - return errors.New("指定できる拡張子: " + strings.Join(allowExtList, ",")) - } - return nil -} - // passArgs は引数を受け取りその引数(ディレクトリ、変換前拡張子、変換後拡張子)が正しいか判別し、引数の値を返します。 func passArgs() (dir string, preExt string, afterExt string, err error) { d := flag.String("d", "./", "対象ディレクトリ") - p := flag.String("p", "jpg", "変換前拡張子") + p := flag.String("p", "jpeg", "変換前拡張子") a := flag.String("a", "png", "変換後拡張子") - flag.Parse() - dir, preExt, afterExt = *d, *p, *a - err = judgeArgExt(preExt, afterExt) - if err != nil { + if flag.Parse(); flag.Parsed() { + dir, preExt, afterExt = *d, *p, *a return } - preExt = "." + preExt - afterExt = "." + afterExt + err = errors.New("引数のparseに失敗しました。") return } From 576da628ff5f1c997080bf40d93aad5751ef272d Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Tue, 17 Sep 2019 02:12:11 +0900 Subject: [PATCH 11/14] =?UTF-8?q?public=E3=81=AA=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E3=81=BFtest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/shinta/README.md | 11 ++++- .../imageconversion/imageconversion_test.go | 49 +++++++++++++++++-- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/kadai2/shinta/README.md b/kadai2/shinta/README.md index 8bfe7e0..7a04175 100644 --- a/kadai2/shinta/README.md +++ b/kadai2/shinta/README.md @@ -19,5 +19,14 @@ - 呼び出し側はI/O処理がどんなことをしているのかを理解する必要が無い - DIPにできる。 +### test +``` +// 通常のtest +go test ./imageconversion +``` - +``` +// カバレッジつき +go test -cover ./imageconversion +go test -coverprofile=profile ./imageconversio +``` \ No newline at end of file diff --git a/kadai2/shinta/imageconversion/imageconversion_test.go b/kadai2/shinta/imageconversion/imageconversion_test.go index 5fe0854..9df4712 100644 --- a/kadai2/shinta/imageconversion/imageconversion_test.go +++ b/kadai2/shinta/imageconversion/imageconversion_test.go @@ -4,10 +4,51 @@ import ( "testing" ) +type exampleArg struct { + dir string + preExt string + afterExt string +} + +var testDatas = []string{"./testdata/1.jpeg", "./testdata/sub/3.jpeg"} + +var exampleArgs = []exampleArg{ + {"./", "jpeg", "png"}, {"./", "png", "gifffff"}, +} + func TestImageConversionExcute(t *testing.T) { - dir, preExt, afterExt := "./", "jpg", "png" - err := Excute(dir, preExt, afterExt) - if err != nil { - t.Error("failed to call Imageconversion Excute", err) + t.Helper() + for _, arg := range exampleArgs { + err := Excute(arg.dir, arg.preExt, arg.afterExt) + if err != nil { + t.Error("failed to call Imageconversion Excute", err) + t.Error("exampleArg:", arg.dir, arg.preExt, arg.afterExt) + } } } + +func TestConvertExec(t *testing.T) { + // for _, arg := range exampleArgs { + // for _, data := range testDatas { + // err := convertExec(data, arg.afterExt) + // if err != nil { + // t.Error("failed to call Imageconversion ConvertExcute", err) + // t.Error("exampleArg:", arg.afterExt) + // t.Error("testData:", data) + // } + // } + // } + t.Skip("func convertExec") +} +func TestCreateImgStruct(t *testing.T) { + t.Skip("func createImgStruct") +} +func TestGetFileNamaWithoutExt(t *testing.T) { + t.Skip("func getFileNameWithoutExt") +} +func TestConvertExt(t *testing.T) { + t.Skip("func convertExt") +} +func TestValid(t *testing.T) { + t.Skip("func valid") +} From 6fe640c10b8c6b63ac05cc1d12b5946a2bd56361 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Wed, 18 Sep 2019 03:30:11 +0900 Subject: [PATCH 12/14] =?UTF-8?q?=E5=85=A8=E3=81=A6=E3=81=AE=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=81=AEtest=E3=82=92=E6=9B=B8=E3=81=84=E3=81=9F?= =?UTF-8?q?=E3=81=8C=E3=82=AB=E3=83=90=E3=83=AC=E3=83=83=E3=82=B8=E3=81=AF?= =?UTF-8?q?80%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/shinta/cover.html | 228 ++++++++++++++++++ kadai2/shinta/cover.out | 32 +++ .../imageconversion/imageconversion_test.go | 137 ++++++++--- 3 files changed, 368 insertions(+), 29 deletions(-) create mode 100644 kadai2/shinta/cover.html create mode 100644 kadai2/shinta/cover.out diff --git a/kadai2/shinta/cover.html b/kadai2/shinta/cover.html new file mode 100644 index 0000000..9195677 --- /dev/null +++ b/kadai2/shinta/cover.html @@ -0,0 +1,228 @@ + + + + + + + + +
+ +
+ not tracked + + not covered + covered + +
+
+
+ + + +
+ + + diff --git a/kadai2/shinta/cover.out b/kadai2/shinta/cover.out new file mode 100644 index 0000000..8cd4670 --- /dev/null +++ b/kadai2/shinta/cover.out @@ -0,0 +1,32 @@ +mode: set +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:26.29,27.28 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:30.2,32.35 3 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:35.2,35.56 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:38.2,38.12 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:27.28,29.3 1 0 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:32.35,34.3 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:35.56,37.3 1 0 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:41.28,43.2 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:53.48,55.2 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:58.53,62.2 3 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:68.47,71.16 3 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:74.2,75.16 2 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:78.2,79.16 2 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:83.2,83.18 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:91.2,93.12 3 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:71.16,73.3 1 0 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:75.16,77.3 1 0 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:79.16,81.3 1 0 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:84.23,85.39 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:86.14,87.38 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:88.10,89.33 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:107.49,109.36 2 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:112.2,113.85 2 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:125.2,125.12 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:109.36,111.3 1 0 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:113.85,114.17 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:117.3,117.39 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:123.3,123.13 1 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:114.17,116.4 1 0 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:117.39,119.18 2 1 +github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion/imageconversion.go:119.18,121.5 1 0 diff --git a/kadai2/shinta/imageconversion/imageconversion_test.go b/kadai2/shinta/imageconversion/imageconversion_test.go index 9df4712..a75f416 100644 --- a/kadai2/shinta/imageconversion/imageconversion_test.go +++ b/kadai2/shinta/imageconversion/imageconversion_test.go @@ -1,54 +1,133 @@ package imageconversion import ( + "errors" + "strings" "testing" ) +// os でdestdataディレクトリから取得するべきか +var testDatas = []string{"testdata/1.jpeg", "testdata/sub/3.jpeg"} + type exampleArg struct { + testCase string dir string preExt string afterExt string } -var testDatas = []string{"./testdata/1.jpeg", "./testdata/sub/3.jpeg"} - var exampleArgs = []exampleArg{ - {"./", "jpeg", "png"}, {"./", "png", "gifffff"}, + {"カレントディレクトリ以下のjpeg=>png", "./", "jpeg", "png"}, + {"カレントディレクトリ以下のpng=>gif", "./", "png", "gif"}, + {"カレントディレクトリ以下のpng=>jpeg", "./", "png", "jpeg"}, +} +var convertedExtArgs = []exampleArg{ + {"カレントディレクトリ以下のjpeg=>png", "./", ".jpeg", ".png"}, + {"カレントディレクトリ以下のpng=>gif", "./", ".png", ".gif"}, + {"カレントディレクトリ以下のpng=>jpeg", "./", ".png", ".jpeg"}, } -func TestImageConversionExcute(t *testing.T) { +type expectedImageFile struct { + path string + base string + ext string +} + +var expectedImageFiles = []expectedImageFile{ + {"testdata", "1", ".jpeg"}, {"testdata/sub", "3", ".jpeg"}, +} + +func (a *exampleArg) valid() error { + if a.preExt == a.afterExt { + return errors.New("変換前と変換後で拡張子が同じです。") + } + allowExtList := []string{"jpg", "jpeg", "png", "gif"} + allowExtMap := map[string]bool{} + for _, ext := range allowExtList { + allowExtMap[ext] = true + } + if !allowExtMap[a.preExt] || !allowExtMap[a.afterExt] { + return errors.New("指定できる拡張子: " + strings.Join(allowExtList, ",")) + } + return nil +} + +func (a *exampleArg) convertExt() { + a.preExt, a.afterExt = "."+a.preExt, "."+a.afterExt +} + +func TestValid(t *testing.T) { t.Helper() for _, arg := range exampleArgs { - err := Excute(arg.dir, arg.preExt, arg.afterExt) - if err != nil { - t.Error("failed to call Imageconversion Excute", err) - t.Error("exampleArg:", arg.dir, arg.preExt, arg.afterExt) - } + t.Run(arg.testCase, func(t *testing.T) { + if err := arg.valid(); err != nil { + t.Error("failed to call Imageconversion valid", err, "expected: nil") + } + }) } + // t.Skip("func valid") } -func TestConvertExec(t *testing.T) { - // for _, arg := range exampleArgs { - // for _, data := range testDatas { - // err := convertExec(data, arg.afterExt) - // if err != nil { - // t.Error("failed to call Imageconversion ConvertExcute", err) - // t.Error("exampleArg:", arg.afterExt) - // t.Error("testData:", data) - // } - // } - // } - t.Skip("func convertExec") -} -func TestCreateImgStruct(t *testing.T) { - t.Skip("func createImgStruct") +func TestConvertExt(t *testing.T) { + t.Helper() + for i, arg := range exampleArgs { + t.Run(arg.testCase, func(t *testing.T) { + arg.convertExt() + if arg.preExt != convertedExtArgs[i].preExt || arg.afterExt != convertedExtArgs[i].afterExt { + t.Error("failed to call Imageconversion convertExt", arg.preExt, arg.afterExt, "expected:", convertedExtArgs[i].preExt, convertedExtArgs[i].afterExt) + } + }) + } + // t.Skip("func convertExt") } + func TestGetFileNamaWithoutExt(t *testing.T) { - t.Skip("func getFileNameWithoutExt") + t.Helper() + for i, data := range testDatas { + t.Run("testdata:"+data, func(t *testing.T) { + res := getFileNameWithoutExt(data) + if res != expectedImageFiles[i].base { + t.Error("failed to call Imageconversion getFileNameWithoutExt", res, "expected", expectedImageFiles[i].base) + } + }) + } + // t.Skip("func getFileNameWithoutExt") } -func TestConvertExt(t *testing.T) { - t.Skip("func convertExt") +func TestCreateImgStruct(t *testing.T) { + t.Helper() + for i, data := range testDatas { + t.Run("testdata:"+data, func(t *testing.T) { + img := createImgStruct(data) + if img.path != expectedImageFiles[i].path || img.base != expectedImageFiles[i].base || img.ext != expectedImageFiles[i].ext { + t.Error("failed to call Imageconversion createImgStruct", img, "expected:", expectedImageFiles[i]) + } + }) + } + // t.Skip("func createImgStruct") } -func TestValid(t *testing.T) { - t.Skip("func valid") +func TestConvertExec(t *testing.T) { + t.Helper() + for _, arg := range convertedExtArgs { + for _, data := range testDatas { + t.Run("exampleArg:"+arg.afterExt+"testdata:"+data, func(t *testing.T) { + err := convertExec(data, arg.afterExt) + if err != nil { + t.Error("failed to call Imageconversion ConvertExcute", err, "expected: nil") + } + }) + } + } + // t.Skip("func convertExec") +} +func TestImageConversionExcute(t *testing.T) { + t.Helper() + for _, arg := range exampleArgs { + t.Run("exampleArg:"+arg.testCase, func(t *testing.T) { + err := Excute(arg.dir, arg.preExt, arg.afterExt) + if err != nil { + t.Error("failed to call Imageconversion Excute", err, "expected: nil") + } + }) + } + // t.Skip("Execute") } From 44fb5a0f3ceeba9c5c60b9f27b820f6e6967e495 Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Wed, 18 Sep 2019 03:35:55 +0900 Subject: [PATCH 13/14] fix:README --- kadai2/shinta/README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/kadai2/shinta/README.md b/kadai2/shinta/README.md index 7a04175..e5e7d10 100644 --- a/kadai2/shinta/README.md +++ b/kadai2/shinta/README.md @@ -26,7 +26,11 @@ go test ./imageconversion ``` ``` -// カバレッジつき +// カバレッジ go test -cover ./imageconversion -go test -coverprofile=profile ./imageconversio -``` \ No newline at end of file +go test -coverprofile=cover.out ./imageconversion +go tool cover -html=cover.out -o cover.html +``` + +- エラーケースのテストがまだできていない。 +- test しやすい設計についてもっと考えないといけない。 \ No newline at end of file From 142568805c77708d577edbff6388110489bf4d5b Mon Sep 17 00:00:00 2001 From: ShintaNakama Date: Fri, 20 Sep 2019 01:05:25 +0900 Subject: [PATCH 14/14] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E3=81=AE=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA?= =?UTF-8?q?=E3=82=B0=E3=80=81test=E3=83=98=E3=83=AB=E3=83=91=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E9=96=A2=E3=81=97=E3=81=A6=E3=81=AF=E3=81=BE=E3=81=9F?= =?UTF-8?q?=E4=BB=8A=E5=BA=A6=E3=82=84=E3=82=8D=E3=81=86...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai2/shinta/imageconversion/export_test.go | 6 + .../shinta/imageconversion/imageconversion.go | 37 +++--- .../imageconversion/imageconversion_test.go | 116 +++++++----------- kadai2/shinta/main.go | 8 +- 4 files changed, 76 insertions(+), 91 deletions(-) create mode 100644 kadai2/shinta/imageconversion/export_test.go diff --git a/kadai2/shinta/imageconversion/export_test.go b/kadai2/shinta/imageconversion/export_test.go new file mode 100644 index 0000000..af66041 --- /dev/null +++ b/kadai2/shinta/imageconversion/export_test.go @@ -0,0 +1,6 @@ +package imageconversion + +// var ImageFile imageFile +var GetFileNameWithoutExt = getFileNameWithoutExt +var CreateImgStruct = createImgStruct +var ConvertExec = convertExec diff --git a/kadai2/shinta/imageconversion/imageconversion.go b/kadai2/shinta/imageconversion/imageconversion.go index 5ff3805..c37e0fa 100644 --- a/kadai2/shinta/imageconversion/imageconversion.go +++ b/kadai2/shinta/imageconversion/imageconversion.go @@ -28,9 +28,11 @@ func (a *arg) valid() error { return errors.New("変換前と変換後で拡張子が同じです。") } allowExtList := []string{"jpg", "jpeg", "png", "gif"} - allowExtMap := map[string]bool{} - for _, ext := range allowExtList { - allowExtMap[ext] = true + allowExtMap := map[string]bool{ + "jpg": true, + "jpeg": true, + "png": true, + "gif": true, } if !allowExtMap[a.preExt] || !allowExtMap[a.afterExt] { return errors.New("指定できる拡張子: " + strings.Join(allowExtList, ",")) @@ -38,15 +40,15 @@ func (a *arg) valid() error { return nil } -func (a *arg) convertExt() { - a.preExt, a.afterExt = "."+a.preExt, "."+a.afterExt -} +// func (a *arg) convertExt() { +// a.preExt, a.afterExt = "."+a.preExt, "."+a.afterExt +// } // imageFile struct は変換対象の画像のpath(path)、拡張子を除いたファイル名(base)、拡張子(ext)を持っています。 type imageFile struct { - path string - base string - ext string + Path string + Base string + Ext string } // getFileNameWithoutExt は対象ファイルのpathと拡張子を除いたファイル名を返します。 @@ -55,10 +57,9 @@ func getFileNameWithoutExt(path string) string { } // createImgStrunct は、imageFile structを生成し、返します。 -func createImgStruct(path string) (image imageFile) { +func createImgStruct(path string) imageFile { base := getFileNameWithoutExt(path) - image = imageFile{filepath.Dir(path), base, filepath.Ext(path)} - return + return imageFile{filepath.Dir(path), base, filepath.Ext(path)} } /* @@ -67,7 +68,7 @@ convertExec は画像ファイルを引数で指定された変換後の拡張 */ func convertExec(path, afterExt string) error { img := createImgStruct(path) - targetImg, err := os.Open(img.path + "/" + img.base + img.ext) + targetImg, err := os.Open(filepath.Join(img.Path, (img.Base + img.Ext))) if err != nil { return err } @@ -75,7 +76,7 @@ func convertExec(path, afterExt string) error { if err != nil { return err } - outputImg, err := os.Create((img.path + "/" + img.base + afterExt)) + outputImg, err := os.Create(filepath.Join(img.Path, (img.Base + "." + afterExt))) if err != nil { return err } @@ -88,7 +89,9 @@ func convertExec(path, afterExt string) error { default: png.Encode(outputImg, readImg) } - err = targetImg.Close() + if err = targetImg.Close(); err != nil { + return err + } err = outputImg.Close() return err } @@ -109,12 +112,12 @@ func Excute(dir, preExt, afterExt string) error { if err := arg.valid(); err != nil { return err } - arg.convertExt() + // arg.convertExt() err := filepath.Walk(arg.dir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } - if filepath.Ext(path) == arg.preExt { + if filepath.Ext(path) == ("." + arg.preExt) { err = convertExec(path, arg.afterExt) if err != nil { return err diff --git a/kadai2/shinta/imageconversion/imageconversion_test.go b/kadai2/shinta/imageconversion/imageconversion_test.go index a75f416..36423a3 100644 --- a/kadai2/shinta/imageconversion/imageconversion_test.go +++ b/kadai2/shinta/imageconversion/imageconversion_test.go @@ -1,13 +1,12 @@ -package imageconversion +package imageconversion_test import ( "errors" "strings" "testing" -) -// os でdestdataディレクトリから取得するべきか -var testDatas = []string{"testdata/1.jpeg", "testdata/sub/3.jpeg"} + "github.com/gopherdojo/dojo7/kadai2/shinta/imageconversion" +) type exampleArg struct { testCase string @@ -16,27 +15,12 @@ type exampleArg struct { afterExt string } -var exampleArgs = []exampleArg{ - {"カレントディレクトリ以下のjpeg=>png", "./", "jpeg", "png"}, - {"カレントディレクトリ以下のpng=>gif", "./", "png", "gif"}, - {"カレントディレクトリ以下のpng=>jpeg", "./", "png", "jpeg"}, -} -var convertedExtArgs = []exampleArg{ - {"カレントディレクトリ以下のjpeg=>png", "./", ".jpeg", ".png"}, - {"カレントディレクトリ以下のpng=>gif", "./", ".png", ".gif"}, - {"カレントディレクトリ以下のpng=>jpeg", "./", ".png", ".jpeg"}, -} - type expectedImageFile struct { path string base string ext string } -var expectedImageFiles = []expectedImageFile{ - {"testdata", "1", ".jpeg"}, {"testdata/sub", "3", ".jpeg"}, -} - func (a *exampleArg) valid() error { if a.preExt == a.afterExt { return errors.New("変換前と変換後で拡張子が同じです。") @@ -52,82 +36,74 @@ func (a *exampleArg) valid() error { return nil } -func (a *exampleArg) convertExt() { - a.preExt, a.afterExt = "."+a.preExt, "."+a.afterExt -} - func TestValid(t *testing.T) { - t.Helper() + var exampleArgs = []exampleArg{ + {"カレントディレクトリ以下のjpeg=>png", "./", "jpeg", "png"}, + {"カレントディレクトリ以下のpng=>gif", "./", "png", "gif"}, + {"カレントディレクトリ以下のpng=>jpeg", "./", "png", "jpeg"}, + } for _, arg := range exampleArgs { - t.Run(arg.testCase, func(t *testing.T) { - if err := arg.valid(); err != nil { - t.Error("failed to call Imageconversion valid", err, "expected: nil") - } - }) + if err := arg.valid(); err != nil { + t.Error("failed to call Imageconversion valid", err, "expected: nil") + } } // t.Skip("func valid") } -func TestConvertExt(t *testing.T) { - t.Helper() - for i, arg := range exampleArgs { - t.Run(arg.testCase, func(t *testing.T) { - arg.convertExt() - if arg.preExt != convertedExtArgs[i].preExt || arg.afterExt != convertedExtArgs[i].afterExt { - t.Error("failed to call Imageconversion convertExt", arg.preExt, arg.afterExt, "expected:", convertedExtArgs[i].preExt, convertedExtArgs[i].afterExt) - } - }) - } - // t.Skip("func convertExt") -} - func TestGetFileNamaWithoutExt(t *testing.T) { - t.Helper() + var testDatas = []string{"testdata/1.jpeg", "testdata/sub/3.jpeg"} + var expectedImageFiles = []expectedImageFile{ + {"testdata", "1", ".jpeg"}, {"testdata/sub", "3", ".jpeg"}, + } for i, data := range testDatas { - t.Run("testdata:"+data, func(t *testing.T) { - res := getFileNameWithoutExt(data) - if res != expectedImageFiles[i].base { - t.Error("failed to call Imageconversion getFileNameWithoutExt", res, "expected", expectedImageFiles[i].base) - } - }) + res := imageconversion.GetFileNameWithoutExt(data) + if res != expectedImageFiles[i].base { + t.Error("failed to call Imageconversion getFileNameWithoutExt", res, "expected", expectedImageFiles[i].base) + } } // t.Skip("func getFileNameWithoutExt") } func TestCreateImgStruct(t *testing.T) { - t.Helper() + var testDatas = []string{"testdata/1.jpeg", "testdata/sub/3.jpeg"} + var expectedImageFiles = []expectedImageFile{ + {"testdata", "1", ".jpeg"}, {"testdata/sub", "3", ".jpeg"}, + } for i, data := range testDatas { - t.Run("testdata:"+data, func(t *testing.T) { - img := createImgStruct(data) - if img.path != expectedImageFiles[i].path || img.base != expectedImageFiles[i].base || img.ext != expectedImageFiles[i].ext { - t.Error("failed to call Imageconversion createImgStruct", img, "expected:", expectedImageFiles[i]) - } - }) + img := imageconversion.CreateImgStruct(data) + if img.Path != expectedImageFiles[i].path || img.Base != expectedImageFiles[i].base || img.Ext != expectedImageFiles[i].ext { + t.Error("failed to call Imageconversion createImgStruct", img, "expected:", expectedImageFiles[i]) + } } // t.Skip("func createImgStruct") } func TestConvertExec(t *testing.T) { - t.Helper() + var convertedExtArgs = []exampleArg{ + {"カレントディレクトリ以下のjpeg=>png", "./", ".jpeg", ".png"}, + {"カレントディレクトリ以下のpng=>gif", "./", ".png", ".gif"}, + {"カレントディレクトリ以下のpng=>jpeg", "./", ".png", ".jpeg"}, + } + var testDatas = []string{"testdata/1.jpeg", "testdata/sub/3.jpeg"} for _, arg := range convertedExtArgs { for _, data := range testDatas { - t.Run("exampleArg:"+arg.afterExt+"testdata:"+data, func(t *testing.T) { - err := convertExec(data, arg.afterExt) - if err != nil { - t.Error("failed to call Imageconversion ConvertExcute", err, "expected: nil") - } - }) + err := imageconversion.ConvertExec(data, arg.afterExt) + if err != nil { + t.Error("failed to call Imageconversion ConvertExcute", err, "expected: nil") + } } } // t.Skip("func convertExec") } func TestImageConversionExcute(t *testing.T) { - t.Helper() + var exampleArgs = []exampleArg{ + {"カレントディレクトリ以下のjpeg=>png", "./", "jpeg", "png"}, + {"カレントディレクトリ以下のpng=>gif", "./", "png", "gif"}, + {"カレントディレクトリ以下のpng=>jpeg", "./", "png", "jpeg"}, + } for _, arg := range exampleArgs { - t.Run("exampleArg:"+arg.testCase, func(t *testing.T) { - err := Excute(arg.dir, arg.preExt, arg.afterExt) - if err != nil { - t.Error("failed to call Imageconversion Excute", err, "expected: nil") - } - }) + err := imageconversion.Excute(arg.dir, arg.preExt, arg.afterExt) + if err != nil { + t.Error("failed to call Imageconversion Excute", err, "expected: nil") + } } // t.Skip("Execute") } diff --git a/kadai2/shinta/main.go b/kadai2/shinta/main.go index 439542f..c7d1da8 100644 --- a/kadai2/shinta/main.go +++ b/kadai2/shinta/main.go @@ -11,11 +11,10 @@ import ( // passArgs は引数を受け取りその引数(ディレクトリ、変換前拡張子、変換後拡張子)が正しいか判別し、引数の値を返します。 func passArgs() (dir string, preExt string, afterExt string, err error) { - d := flag.String("d", "./", "対象ディレクトリ") - p := flag.String("p", "jpeg", "変換前拡張子") - a := flag.String("a", "png", "変換後拡張子") + flag.StringVar(&dir, "d", "./", "対象ディレクトリ") + flag.StringVar(&preExt, "p", "jpeg", "変換前拡張子") + flag.StringVar(&afterExt, "a", "png", "変換後拡張子") if flag.Parse(); flag.Parsed() { - dir, preExt, afterExt = *d, *p, *a return } err = errors.New("引数のparseに失敗しました。") @@ -24,6 +23,7 @@ func passArgs() (dir string, preExt string, afterExt string, err error) { func main() { dir, preExt, afterExt, err := passArgs() + fmt.Println(dir, preExt, afterExt) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1)