Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP]Kadai3-1-annkara #28

Open
wants to merge 50 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
56390d6
- .gitkeep削除
annkara Jul 11, 2019
de49554
https://github.com/golang-standards/project-layout に倣ってプロジェクトを構成。
annkara Jul 14, 2019
09fa84c
ディレクトリ直下に入ってしまったgo.modファイルを削除
annkara Jul 14, 2019
2c7f5bb
イメージ変換処理の実装。
annkara Jul 14, 2019
3a3c394
テスト用ファイルの追加
annkara Jul 14, 2019
61990f3
https://deeeet.com/writing/2014/12/18/golang-cli-test/ を参考にmain関数を実装
annkara Jul 14, 2019
f50acba
主処理を記述するcli.goの追加
annkara Jul 14, 2019
142b43b
オプション解析処理を追加
Jul 14, 2019
3752501
ヘルプメッセージを修正
Jul 15, 2019
0b2374f
テストケースを追加
Jul 15, 2019
4dd8215
ロングオプション指定時のケースを追加
Jul 15, 2019
2268171
環境依存を避けるため、strings.Joinを利用
Jul 15, 2019
a084bca
ディレクトリをトラバースして、変換処理を呼び出すメソッドを追加
Jul 15, 2019
ef69c3c
- ディレクトリスキップ処理を削除
Jul 15, 2019
093fdc7
1. 同一ディレクトリ内に変換後のファイルが出力されない事象の修正
Jul 15, 2019
65f73f5
オブションがわかりづらいので修正
Jul 15, 2019
e9fad64
引数名をオプションに統一
annkara Jul 15, 2019
b7c9643
1. オプションの変更に伴い失敗していたテストコードの修正
annkara Jul 15, 2019
4db2b3e
終了コードにiotaを利用しないように修正
annkara Jul 15, 2019
21cdc17
利用方法の説明を修正
annkara Jul 15, 2019
727eab9
README.mdに追記
annkara Jul 15, 2019
88e7852
polish
annkara Jul 15, 2019
06e5c40
タイポの修正
annkara Jul 15, 2019
55ada61
imageパッケージのドキュメントを追加
annkara Jul 15, 2019
23726d9
タイポ修正
annkara Jul 15, 2019
1fca16f
変換後のファイル出力失敗時に不要なファイルを削除する実装を追加
annkara Jul 15, 2019
5df1869
課題2のディレクトリを作成
annkara Jul 17, 2019
e2cfaf2
io.Reader/io.Writerについての記述を追加
annkara Jul 22, 2019
6ce6be0
利点の具体例を追記
annkara Jul 23, 2019
4fffca8
ディレクトリ名を変更
annkara Jul 23, 2019
570f416
利点の具体例を修正
annkara Jul 24, 2019
43248ce
テスト用画像ディレクトリ名をtestからtestdataへと変更し、ディレクトリの格納場所も変更
annkara Jul 27, 2019
56a5228
テスト用ディレクトリ名とパスを変更したため、テストコードを修正
annkara Jul 27, 2019
b9fde8e
testdataディレクトリの配置場所を変更したため、不要なファイルパスの処理を削除
annkara Jul 27, 2019
29b2d0d
convertor_test.goの修正
annkara Jul 27, 2019
5ad6545
テストコードの修正
annkara Jul 28, 2019
b2e3034
テストコードを実装するためのパッケージ構成の見直し
annkara Jul 28, 2019
e96e705
コメントの修正
annkara Jul 28, 2019
d75bc8e
ディレクトリトラバース処理のテストコード・テストデータを追加
annkara Jul 28, 2019
95e2c86
課題3-1のブランチを作成
annkara Aug 4, 2019
170d9a8
ディレクトリ構成の変更
annkara Aug 4, 2019
c874e57
mainパッケージ追加
annkara Aug 4, 2019
6939902
gotypingパッケージ追加
annkara Aug 4, 2019
5c887ce
ゲームの説明を追記
annkara Aug 4, 2019
682d765
パッケージ構成の変更
annkara Aug 4, 2019
5a0a818
初期実装追加
annkara Aug 5, 2019
f44d686
入力時のエラーハンドリングを追加
annkara Aug 6, 2019
60caad7
微修正
annkara Aug 6, 2019
6422639
利用していない変数を削除
annkara Aug 6, 2019
eb3b039
不要なパラメータ削除
annkara Aug 6, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module github.com/dojo6

go 1.12
Empty file removed kadai1/.gitkeep
Empty file.
48 changes: 48 additions & 0 deletions kadai1/annkara/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 課題1

## 次の仕様を満たすコマンドを作って下さい

- ディレクトリを指定する
- 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト)
- ディレクトリ以下は再帰的に処理する
- 変換前と変換後の画像形式を指定できる(オプション)

## 以下を満たすように開発してください

- mainパッケージと分離する
- 自作パッケージと標準パッケージと準標準パッケージのみ使う
- 準標準パッケージ:golang.org/x以下のパッケージ
- ユーザ定義型を作ってみる
- GoDocを生成してみる

---

## コマンドの説明

`i2i` コマンドは指定されたディレクトリ内の画像ファイルの形式を別の画像形式へと変換し、新規画像ファイルを作成するコマンドです。画像の形式はjpg(jpeg)とpngに対応しています。

ディレクトリ内に別のディレクトリが存在した場合には、そのディレクトリ内のファイルも変換対象と見なされます。

画像の形式が指定されない場合には、jpg(jpeg)ファイルを対象に、同一ディレクトリ内に新たにpngファイルを作成します。

変換前のファイルは削除されません。

## 使い方

```sh
i2i -b jpg -a png <directory>
```

---

## 実装方針

- mainパッケージとpkg/imageパッケージの構成
- 標準パッケージのみを利用する
- オプションの指定
flag パッケージを利用して変換前、変換後の画像形式を受け取る。
変換前のデフォルト値としてはjpg、変換後はpngを指定する。
- ディレクトリの再帰処理
filepath.Walk関数を利用する。
- 画像変換処理
image.Decode関数を利用し、指定された拡張子に応じた形式のEncode関数を利用し変換処理を行う。
124 changes: 124 additions & 0 deletions kadai1/annkara/cmd/i2i/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package main

import (
"flag"
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"

"github.com/dojo6/kadai1/annkara/pkg/image"
)

const (
exitCodeOK = 0
exitCodeErr = 10
)

type cli struct {
outStream, errStream io.Writer
}

func (c *cli) walk(root, before, after string) error {

err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {

if err != nil {
return err
}

n := info.Name()
if strings.HasSuffix(n, before) {
origin, err := os.Open(path)
if err != nil {
return err
}
defer origin.Close()

// 拡張子を含まない出力用ファイル名
n := filepath.Base(n[:len(n)-len(filepath.Ext(n))])
dir := filepath.Dir(path)
out, err := os.Create(filepath.Join(dir, n+"."+after))
if err != nil {
return err
}

err = image.Convert(origin, out, after)
if err != nil {
// 変換処理に失敗した場合、不要なファイルが作成されてしまうため、削除する
// ファイルを閉じた後でないと、Windowsの場合削除できないのでここでCloseする
out.Close()
e := os.Remove(filepath.Join(dir, n+"."+after))
if e != nil {
return e
}
return err
}
}

return nil
})

if err != nil {
return err
}

return nil
}

func (c *cli) run(args []string) int {

log.SetOutput(c.outStream)

var (
before string
after string
debug bool
)

flags := flag.NewFlagSet(args[0], flag.ContinueOnError)
flags.SetOutput(c.errStream)
flags.Usage = func() {
fmt.Fprint(c.errStream, helpText)
}

flags.StringVar(&before, "b", "jpg", "変換前の画像形式を指定")
flags.StringVar(&before, "before", "jpg", "変換前の画像形式を指定")
flags.StringVar(&after, "a", "png", "変換後の画像形式を指定")
flags.StringVar(&after, "after", "png", "変換後の画像形式を指定")
flags.BoolVar(&debug, "debug", false, "")

if err := flags.Parse(args[1:]); err != nil {
if debug {
log.Printf("failed: %+v\n", err)
}
return exitCodeErr
}

for _, v := range flags.Args() {
err := c.walk(v, before, after)
if err != nil {
if debug {
log.Printf("failed: %+v\n", err)
}
return exitCodeErr
}
}

return exitCodeOK
}

var helpText = `Usage: i2i [options] directory

i2i は指定されたディレクトリ内の画像ファイルを変換するコマンドラインツールです。
オプションを指定しない場合には、JPEGファイルを対象にPNG形式へと変換します。
変換後のファイルは同一ディレクトリ内に出力され、変換前のファイルは削除されません。
JPEGまたはPNG形式をサポートします。

Options:
-a, -after 変換後の画像形式を指定
-b, -before 変換前の画像形式を指定
-h, -help ヘルプを表示
`
44 changes: 44 additions & 0 deletions kadai1/annkara/cmd/i2i/cli_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package main

import (
"bytes"
"strings"
"testing"
)

func TestRun(t *testing.T) {
tests := []struct {
desc string
arg string
expectedStatus int
}{
{
desc: "正常終了 : コマンド名のみを指定",
arg: "i2i",
expectedStatus: exitCodeOK,
}, {
desc: "正常終了 : ショートオプションを指定",
arg: "i2i -b jpeg -a png",
expectedStatus: exitCodeOK,
}, {
desc: "正常終了 : ロングオプションを指定",
arg: "i2i -before jpeg -after png",
expectedStatus: exitCodeOK,
}, {
desc: "異常終了:不正なオプションを指定",
arg: "i2i -u unkonwn",
expectedStatus: exitCodeErr,
},
}

outSteam, errStream := new(bytes.Buffer), new(bytes.Buffer)
cli := &cli{outStream: outSteam, errStream: errStream}

for _, tc := range tests {
args := strings.Split(tc.arg, " ")
status := cli.run(args)
if status != tc.expectedStatus {
t.Errorf("desc: %v, status should be %v, not %v", tc.desc, tc.expectedStatus, status)
}
}
}
13 changes: 13 additions & 0 deletions kadai1/annkara/cmd/i2i/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package main

import "os"

func main() {

cli := &cli{
outStream: os.Stdout,
errStream: os.Stderr,
}
os.Exit(cli.run(os.Args))

}
35 changes: 35 additions & 0 deletions kadai1/annkara/pkg/image/convertor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Package image provides image convert function.
package image

import (
"fmt"
"image"
"image/jpeg"
"image/png"
"io"
)

// Convert is the function that converts an image format to another image format.
// origin is original file, target is converted image, and format is target image format.
func Convert(origin io.Reader, target io.Writer, format string) error {

var err error
img, _, err := image.Decode(origin)
if err != nil {
return err
}

switch format {
case "jpg", "jpeg":
err = jpeg.Encode(target, img, nil)
case "png":
err = png.Encode(target, img)
default:
err = fmt.Errorf("対応していないフォーマットです")
}

if err != nil {
return err
}
return nil
}
28 changes: 28 additions & 0 deletions kadai1/annkara/pkg/image/convertor_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package image

import (
"os"
"path/filepath"
"testing"
)

var path = filepath.Join("..", "..", "test")

func TestConvertSuccess(t *testing.T) {
in, err := os.Open(filepath.Join(path, "test.jpg"))
if err != nil {
t.Fatalf("failed test %#v", err)
}
defer in.Close()

out, err := os.Create(filepath.Join(path, "test.png"))
if err != nil {
t.Fatalf("failed test %#v", err)
}
defer out.Close()

err = Convert(in, out, "jpg")
if err != nil {
t.Fatalf("failed test %#v", err)
}
}
Binary file added kadai1/annkara/test/test.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/annkara/test/test.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions kadai2/annkara/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# 課題2

## io.Readerとio.Writerについて調べてみよう

- 標準パッケージでどのように使われているか
- io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる

## 1回目の宿題のテストを作ってみて下さい

- テストのしやすさを考えてリファクタリングしてみる
- テストのカバレッジを取ってみる
- テーブル駆動テストを行う
- テストヘルパーを作ってみる
74 changes: 74 additions & 0 deletions kadai2/annkara/cmd/i2i/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package main

import (
"flag"
"fmt"
"io"
"log"

"github.com/dojo6/kadai2/annkara/pkg/dir"
)

const (
exitCodeOK = 0
exitCodeErr = 10
)

type cli struct {
outStream, errStream io.Writer
}

func (c *cli) run(args []string) int {

log.SetOutput(c.outStream)

var (
before string
after string
debug bool
)

flags := flag.NewFlagSet(args[0], flag.ContinueOnError)
flags.SetOutput(c.errStream)
flags.Usage = func() {
fmt.Fprint(c.errStream, helpText)
}

flags.StringVar(&before, "b", "jpg", "変換前の画像形式を指定")
flags.StringVar(&before, "before", "jpg", "変換前の画像形式を指定")
flags.StringVar(&after, "a", "png", "変換後の画像形式を指定")
flags.StringVar(&after, "after", "png", "変換後の画像形式を指定")
flags.BoolVar(&debug, "debug", false, "")

if err := flags.Parse(args[1:]); err != nil {
if debug {
log.Printf("failed: %+v\n", err)
}
return exitCodeErr
}

for _, v := range flags.Args() {
err := dir.Walk(v, before, after)
if err != nil {
if debug {
log.Printf("failed: %+v\n", err)
}
return exitCodeErr
}
}

return exitCodeOK
}

var helpText = `Usage: i2i [options] directory

i2i は指定されたディレクトリ内の画像ファイルを変換するコマンドラインツールです。
オプションを指定しない場合には、JPEGファイルを対象にPNG形式へと変換します。
変換後のファイルは同一ディレクトリ内に出力され、変換前のファイルは削除されません。
JPEGまたはPNG形式をサポートします。

Options:
-a, -after 変換後の画像形式を指定
-b, -before 変換前の画像形式を指定
-h, -help ヘルプを表示
`
Loading