diff --git a/checklist_test.go b/checklist_test.go new file mode 100644 index 0000000..1b9d7d4 --- /dev/null +++ b/checklist_test.go @@ -0,0 +1,116 @@ +package gdag_test + +import ( + "fmt" + "os" + + g "github.com/ddddddO/gdag" +) + +func ExampleNode_CheckList() { + dag := g.DAG("ゴール(目的)") + + design := g.Task("設計") + reviewDesign := g.Task("レビュー対応") + + developFeature1 := g.Task("feature1開発") + developFeature1.Note("xxが担当") + reviewDevelopFeature1 := g.Task("レビュー対応") + + developFeature2 := g.Task("feature2開発") + developFeature2.Note("yyが担当") + reviewDevelopFeature2 := g.Task("レビュー対応") + + prepareInfra := g.Task("インフラ準備") + prepareInfra.Note("zzが担当") + + test := g.Task("結合テスト") + release := g.Task("リリース") + finish := g.Task("finish") + + dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) + reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) + reviewDesign.Con(prepareInfra).Con(test) + test.Con(release).Con(finish) + + g.Done(design, reviewDesign, developFeature2, finish) + + checkList, err := dag.CheckList() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(checkList) + // Output: + // ### ゴール(目的) + // - [x] 設計 + // - [x] レビュー対応 + // - [ ] feature1開発 + // - [ ] レビュー対応 + // - [x] feature2開発 + // - [ ] レビュー対応 + // - [ ] インフラ準備 + // - [ ] 結合テスト + // - [ ] リリース + // - [x] finish +} + +func ExampleNode_CheckList_Multiple() { + dag := g.DAG("ゴール(目的)") + + design := g.Task("設計") + reviewDesign := g.Task("レビュー対応") + + developFeature1 := g.Task("feature1開発") + developFeature1.Note("xxが担当") + reviewDevelopFeature1 := g.Task("レビュー対応") + + developFeature2 := g.Task("feature2開発") + developFeature2.Note("yyが担当") + reviewDevelopFeature2 := g.Task("レビュー対応") + + prepareInfra := g.Task("インフラ準備") + prepareInfra.Note("zzが担当") + + test := g.Task("結合テスト") + release := g.Task("リリース") + finish := g.Task("finish") + + dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) + reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) + reviewDesign.Con(prepareInfra).Con(test) + test.Con(release).Con(finish) + + g.Done(design, reviewDesign, developFeature2, finish) + + dagCheckList, err := dag.CheckList() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(dagCheckList) + + infraCheckList, err := prepareInfra.CheckList() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(infraCheckList) + // Output: + // ### ゴール(目的) + // - [x] 設計 + // - [x] レビュー対応 + // - [ ] feature1開発 + // - [ ] レビュー対応 + // - [x] feature2開発 + // - [ ] レビュー対応 + // - [ ] インフラ準備 + // - [ ] 結合テスト + // - [ ] リリース + // - [x] finish + // + // - [ ] インフラ準備 + // - [ ] 結合テスト + // - [ ] リリース + // - [x] finish +} diff --git a/gdag_test.go b/gdag_test.go index 1fdb5e4..262c36a 100644 --- a/gdag_test.go +++ b/gdag_test.go @@ -2,6 +2,7 @@ package gdag_test import ( "fmt" + "os" g "github.com/ddddddO/gdag" ) @@ -34,152 +35,8 @@ func Example() { uml, err := dag.UML() if err != nil { - fmt.Println(err) - return - } - fmt.Println(uml) - // Output: - // @startuml - // rectangle "ゴール(目的)" as 1 - // usecase "設計" as 2 #DarkGray - // usecase "レビュー対応" as 3 #DarkGray - // usecase "feature1開発" as 4 - // note left - // xxが担当 - // end note - // usecase "レビュー対応" as 5 - // usecase "結合テスト" as 9 - // usecase "リリース" as 10 - // usecase "finish" as 11 #DarkGray - // usecase "feature2開発" as 6 #DarkGray - // note left - // yyが担当 - // end note - // usecase "レビュー対応" as 7 - // usecase "インフラ準備" as 8 - // note left - // zzが担当 - // end note - // - // 1 --> 2 - // 2 --> 3 - // 3 --> 4 - // 4 --> 5 - // 5 --> 9 - // 9 --> 10 - // 10 --> 11 - // 3 --> 6 - // 6 --> 7 - // 7 --> 9 - // 3 --> 8 - // 8 --> 9 - // - // @enduml -} - -func ExampleUML() { - var dag *g.Node = g.DAG("ゴール(目的)") - - var design *g.Node = g.Task("設計") - reviewDesign := g.Task("レビュー対応") - - developFeature1 := g.Task("feature1開発") - developFeature1.Note("xxが担当") - reviewDevelopFeature1 := g.Task("レビュー対応") - - developFeature2 := g.Task("feature2開発") - developFeature2.Note("yyが担当") - reviewDevelopFeature2 := g.Task("レビュー対応") - - prepareInfra := g.Task("インフラ準備") - prepareInfra.Note("zzが担当") - - test := g.Task("結合テスト") - release := g.Task("リリース") - finish := g.Task("finish") - - dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) - reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) - reviewDesign.Con(prepareInfra).Con(test) - test.Con(release).Con(finish) - - g.Done(design, reviewDesign, developFeature2, finish) - - uml, err := dag.UML() - if err != nil { - fmt.Println(err) - return - } - fmt.Println(uml) - // Output: - // @startuml - // rectangle "ゴール(目的)" as 12 - // usecase "設計" as 13 #DarkGray - // usecase "レビュー対応" as 14 #DarkGray - // usecase "feature1開発" as 15 - // note left - // xxが担当 - // end note - // usecase "レビュー対応" as 16 - // usecase "結合テスト" as 20 - // usecase "リリース" as 21 - // usecase "finish" as 22 #DarkGray - // usecase "feature2開発" as 17 #DarkGray - // note left - // yyが担当 - // end note - // usecase "レビュー対応" as 18 - // usecase "インフラ準備" as 19 - // note left - // zzが担当 - // end note - // - // 12 --> 13 - // 13 --> 14 - // 14 --> 15 - // 15 --> 16 - // 16 --> 20 - // 20 --> 21 - // 21 --> 22 - // 14 --> 17 - // 17 --> 18 - // 18 --> 20 - // 14 --> 19 - // 19 --> 20 - // - // @enduml -} - -func ExampleShortMethod() { - var dag *g.Node = g.DAG("ゴール(目的)") - - var design *g.Node = g.T("設計") - reviewDesign := g.T("レビュー対応") - - developFeature1 := g.T("feature1開発") - developFeature1.N("xxが担当") - reviewDevelopFeature1 := g.T("レビュー対応") - - developFeature2 := g.T("feature2開発").N("yyが担当") - reviewDevelopFeature2 := g.T("レビュー対応") - - prepareInfra := g.T("インフラ準備").N("zzが担当") - - test := g.T("結合テスト") - release := g.T("リリース") - finish := g.T("finish") - - dag.C(design).C(reviewDesign).C(developFeature1).C(reviewDevelopFeature1).C(test) - reviewDesign.C(developFeature2).C(reviewDevelopFeature2).C(test) - reviewDesign.C(prepareInfra).C(test) - test.C(release).C(finish) - - g.D(design, reviewDesign, developFeature2, finish) - - uml, err := dag.UML() - if err != nil { - fmt.Println(err) - return + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } fmt.Println(uml) // Output: @@ -220,272 +77,3 @@ func ExampleShortMethod() { // // @enduml } - -func ExampleCheckList() { - dag := g.DAG("ゴール(目的)") - - design := g.Task("設計") - reviewDesign := g.Task("レビュー対応") - - developFeature1 := g.Task("feature1開発") - developFeature1.Note("xxが担当") - reviewDevelopFeature1 := g.Task("レビュー対応") - - developFeature2 := g.Task("feature2開発") - developFeature2.Note("yyが担当") - reviewDevelopFeature2 := g.Task("レビュー対応") - - prepareInfra := g.Task("インフラ準備") - prepareInfra.Note("zzが担当") - - test := g.Task("結合テスト") - release := g.Task("リリース") - finish := g.Task("finish") - - dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) - reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) - reviewDesign.Con(prepareInfra).Con(test) - test.Con(release).Con(finish) - - g.Done(design, reviewDesign, developFeature2, finish) - - checkList, err := dag.CheckList() - if err != nil { - fmt.Println(err) - return - } - fmt.Println(checkList) - // Output: - // ### ゴール(目的) - // - [x] 設計 - // - [x] レビュー対応 - // - [ ] feature1開発 - // - [ ] レビュー対応 - // - [x] feature2開発 - // - [ ] レビュー対応 - // - [ ] インフラ準備 - // - [ ] 結合テスト - // - [ ] リリース - // - [x] finish -} - -func ExampleMultipleUMLs() { - var dag *g.Node = g.DAG("ゴール(目的)") - - var design *g.Node = g.Task("設計") - reviewDesign := g.Task("レビュー対応") - - developFeature1 := g.Task("feature1開発") - developFeature1.Note("xxが担当") - reviewDevelopFeature1 := g.Task("レビュー対応") - - developFeature2 := g.Task("feature2開発") - developFeature2.Note("yyが担当") - reviewDevelopFeature2 := g.Task("レビュー対応") - - prepareInfra := g.Task("インフラ準備") - prepareInfra.Note("zzが担当") - - test := g.Task("結合テスト") - release := g.Task("リリース") - finish := g.Task("finish") - - dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) - reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) - reviewDesign.Con(prepareInfra).Con(test) - test.Con(release).Con(finish) - - g.Done(design, reviewDesign, developFeature2, finish) - - dagUML, err := dag.UML() - if err != nil { - fmt.Println(err) - return - } - fmt.Println(dagUML) - - fmt.Println() - - infraUML, err := prepareInfra.UML() - if err != nil { - fmt.Println(err) - return - } - fmt.Println(infraUML) - // Output: - // @startuml - // rectangle "ゴール(目的)" as 45 - // usecase "設計" as 46 #DarkGray - // usecase "レビュー対応" as 47 #DarkGray - // usecase "feature1開発" as 48 - // note left - // xxが担当 - // end note - // usecase "レビュー対応" as 49 - // usecase "結合テスト" as 53 - // usecase "リリース" as 54 - // usecase "finish" as 55 #DarkGray - // usecase "feature2開発" as 50 #DarkGray - // note left - // yyが担当 - // end note - // usecase "レビュー対応" as 51 - // usecase "インフラ準備" as 52 - // note left - // zzが担当 - // end note - // - // 45 --> 46 - // 46 --> 47 - // 47 --> 48 - // 48 --> 49 - // 49 --> 53 - // 53 --> 54 - // 54 --> 55 - // 47 --> 50 - // 50 --> 51 - // 51 --> 53 - // 47 --> 52 - // 52 --> 53 - // - // @enduml - // - // @startuml - // usecase "インフラ準備" as 52 - // note left - // zzが担当 - // end note - // usecase "結合テスト" as 53 - // usecase "リリース" as 54 - // usecase "finish" as 55 #DarkGray - // - // 52 --> 53 - // 53 --> 54 - // 54 --> 55 - // - // @enduml -} - -func ExampleMultipleCheckLists() { - dag := g.DAG("ゴール(目的)") - - design := g.Task("設計") - reviewDesign := g.Task("レビュー対応") - - developFeature1 := g.Task("feature1開発") - developFeature1.Note("xxが担当") - reviewDevelopFeature1 := g.Task("レビュー対応") - - developFeature2 := g.Task("feature2開発") - developFeature2.Note("yyが担当") - reviewDevelopFeature2 := g.Task("レビュー対応") - - prepareInfra := g.Task("インフラ準備") - prepareInfra.Note("zzが担当") - - test := g.Task("結合テスト") - release := g.Task("リリース") - finish := g.Task("finish") - - dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) - reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) - reviewDesign.Con(prepareInfra).Con(test) - test.Con(release).Con(finish) - - g.Done(design, reviewDesign, developFeature2, finish) - - dagCheckList, err := dag.CheckList() - if err != nil { - fmt.Println(err) - return - } - fmt.Println(dagCheckList) - - infraCheckList, err := prepareInfra.CheckList() - if err != nil { - fmt.Println(err) - return - } - fmt.Println(infraCheckList) - // Output: - // ### ゴール(目的) - // - [x] 設計 - // - [x] レビュー対応 - // - [ ] feature1開発 - // - [ ] レビュー対応 - // - [x] feature2開発 - // - [ ] レビュー対応 - // - [ ] インフラ準備 - // - [ ] 結合テスト - // - [ ] リリース - // - [x] finish - // - // - [ ] インフラ準備 - // - [ ] 結合テスト - // - [ ] リリース - // - [x] finish -} - -func ExampleMermaid() { - var dag *g.Node = g.DAG("ゴール(目的)") - - var design *g.Node = g.Task("設計") - reviewDesign := g.Task("レビュー対応") - - developFeature1 := g.Task("feature1開発") - developFeature1.Note("noop") - reviewDevelopFeature1 := g.Task("レビュー対応") - - developFeature2 := g.Task("feature2開発") - developFeature2.Note("noop") - reviewDevelopFeature2 := g.Task("レビュー対応") - - prepareInfra := g.Task("インフラ準備") - prepareInfra.Note("noop") - - test := g.Task("結合テスト") - release := g.Task("リリース") - finish := g.Task("finish") - - dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) - reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) - reviewDesign.Con(prepareInfra).Con(test) - test.Con(release).Con(finish) - - g.Done(design, reviewDesign, developFeature2, finish) - - mermaid, err := dag.Mermaid() - if err != nil { - fmt.Println(err) - return - } - fmt.Println(mermaid) - // Output: - // graph TD - // classDef doneColor fill:#868787 - // 67("ゴール(目的)") - // 68(["設計"]):::doneColor - // 69(["レビュー対応"]):::doneColor - // 70(["feature1開発"]) - // 71(["レビュー対応"]) - // 75(["結合テスト"]) - // 76(["リリース"]) - // 77(["finish"]):::doneColor - // 72(["feature2開発"]):::doneColor - // 73(["レビュー対応"]) - // 74(["インフラ準備"]) - // - // 67 --> 68 - // 68 --> 69 - // 69 --> 70 - // 70 --> 71 - // 71 --> 75 - // 75 --> 76 - // 76 --> 77 - // 69 --> 72 - // 72 --> 73 - // 73 --> 75 - // 69 --> 74 - // 74 --> 75 - -} diff --git a/mermaid_test.go b/mermaid_test.go new file mode 100644 index 0000000..4909157 --- /dev/null +++ b/mermaid_test.go @@ -0,0 +1,72 @@ +package gdag_test + +import ( + "fmt" + "os" + + g "github.com/ddddddO/gdag" +) + +func ExampleNode_Mermaid() { + var dag *g.Node = g.DAG("ゴール(目的)") + + var design *g.Node = g.Task("設計") + reviewDesign := g.Task("レビュー対応") + + developFeature1 := g.Task("feature1開発") + developFeature1.Note("noop") + reviewDevelopFeature1 := g.Task("レビュー対応") + + developFeature2 := g.Task("feature2開発") + developFeature2.Note("noop") + reviewDevelopFeature2 := g.Task("レビュー対応") + + prepareInfra := g.Task("インフラ準備") + prepareInfra.Note("noop") + + test := g.Task("結合テスト") + release := g.Task("リリース") + finish := g.Task("finish") + + dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) + reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) + reviewDesign.Con(prepareInfra).Con(test) + test.Con(release).Con(finish) + + g.Done(design, reviewDesign, developFeature2, finish) + + mermaid, err := dag.Mermaid() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(mermaid) + // Output: + // graph TD + // classDef doneColor fill:#868787 + // 34("ゴール(目的)") + // 35(["設計"]):::doneColor + // 36(["レビュー対応"]):::doneColor + // 37(["feature1開発"]) + // 38(["レビュー対応"]) + // 42(["結合テスト"]) + // 43(["リリース"]) + // 44(["finish"]):::doneColor + // 39(["feature2開発"]):::doneColor + // 40(["レビュー対応"]) + // 41(["インフラ準備"]) + // + // 34 --> 35 + // 35 --> 36 + // 36 --> 37 + // 37 --> 38 + // 38 --> 42 + // 42 --> 43 + // 43 --> 44 + // 36 --> 39 + // 39 --> 40 + // 40 --> 42 + // 36 --> 41 + // 41 --> 42 + +} diff --git a/plantuml_test.go b/plantuml_test.go new file mode 100644 index 0000000..49a468b --- /dev/null +++ b/plantuml_test.go @@ -0,0 +1,249 @@ +package gdag_test + +import ( + "fmt" + "os" + + g "github.com/ddddddO/gdag" +) + +func ExampleNode_UML() { + var dag *g.Node = g.DAG("ゴール(目的)") + + var design *g.Node = g.Task("設計") + reviewDesign := g.Task("レビュー対応") + + developFeature1 := g.Task("feature1開発") + developFeature1.Note("xxが担当") + reviewDevelopFeature1 := g.Task("レビュー対応") + + developFeature2 := g.Task("feature2開発") + developFeature2.Note("yyが担当") + reviewDevelopFeature2 := g.Task("レビュー対応") + + prepareInfra := g.Task("インフラ準備") + prepareInfra.Note("zzが担当") + + test := g.Task("結合テスト") + release := g.Task("リリース") + finish := g.Task("finish") + + dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) + reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) + reviewDesign.Con(prepareInfra).Con(test) + test.Con(release).Con(finish) + + g.Done(design, reviewDesign, developFeature2, finish) + + uml, err := dag.UML() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(uml) + // Output: + // @startuml + // rectangle "ゴール(目的)" as 45 + // usecase "設計" as 46 #DarkGray + // usecase "レビュー対応" as 47 #DarkGray + // usecase "feature1開発" as 48 + // note left + // xxが担当 + // end note + // usecase "レビュー対応" as 49 + // usecase "結合テスト" as 53 + // usecase "リリース" as 54 + // usecase "finish" as 55 #DarkGray + // usecase "feature2開発" as 50 #DarkGray + // note left + // yyが担当 + // end note + // usecase "レビュー対応" as 51 + // usecase "インフラ準備" as 52 + // note left + // zzが担当 + // end note + // + // 45 --> 46 + // 46 --> 47 + // 47 --> 48 + // 48 --> 49 + // 49 --> 53 + // 53 --> 54 + // 54 --> 55 + // 47 --> 50 + // 50 --> 51 + // 51 --> 53 + // 47 --> 52 + // 52 --> 53 + // + // @enduml +} + +func ExampleNode_UML_ShortMethod() { + var dag *g.Node = g.DAG("ゴール(目的)") + + var design *g.Node = g.T("設計") + reviewDesign := g.T("レビュー対応") + + developFeature1 := g.T("feature1開発") + developFeature1.N("xxが担当") + reviewDevelopFeature1 := g.T("レビュー対応") + + developFeature2 := g.T("feature2開発").N("yyが担当") + reviewDevelopFeature2 := g.T("レビュー対応") + + prepareInfra := g.T("インフラ準備").N("zzが担当") + + test := g.T("結合テスト") + release := g.T("リリース") + finish := g.T("finish") + + dag.C(design).C(reviewDesign).C(developFeature1).C(reviewDevelopFeature1).C(test) + reviewDesign.C(developFeature2).C(reviewDevelopFeature2).C(test) + reviewDesign.C(prepareInfra).C(test) + test.C(release).C(finish) + + g.D(design, reviewDesign, developFeature2, finish) + + uml, err := dag.UML() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(uml) + // Output: + // @startuml + // rectangle "ゴール(目的)" as 56 + // usecase "設計" as 57 #DarkGray + // usecase "レビュー対応" as 58 #DarkGray + // usecase "feature1開発" as 59 + // note left + // xxが担当 + // end note + // usecase "レビュー対応" as 60 + // usecase "結合テスト" as 64 + // usecase "リリース" as 65 + // usecase "finish" as 66 #DarkGray + // usecase "feature2開発" as 61 #DarkGray + // note left + // yyが担当 + // end note + // usecase "レビュー対応" as 62 + // usecase "インフラ準備" as 63 + // note left + // zzが担当 + // end note + // + // 56 --> 57 + // 57 --> 58 + // 58 --> 59 + // 59 --> 60 + // 60 --> 64 + // 64 --> 65 + // 65 --> 66 + // 58 --> 61 + // 61 --> 62 + // 62 --> 64 + // 58 --> 63 + // 63 --> 64 + // + // @enduml +} + +func ExampleNode_UML_Multiple() { + var dag *g.Node = g.DAG("ゴール(目的)") + + var design *g.Node = g.Task("設計") + reviewDesign := g.Task("レビュー対応") + + developFeature1 := g.Task("feature1開発") + developFeature1.Note("xxが担当") + reviewDevelopFeature1 := g.Task("レビュー対応") + + developFeature2 := g.Task("feature2開発") + developFeature2.Note("yyが担当") + reviewDevelopFeature2 := g.Task("レビュー対応") + + prepareInfra := g.Task("インフラ準備") + prepareInfra.Note("zzが担当") + + test := g.Task("結合テスト") + release := g.Task("リリース") + finish := g.Task("finish") + + dag.Con(design).Con(reviewDesign).Con(developFeature1).Con(reviewDevelopFeature1).Con(test) + reviewDesign.Con(developFeature2).Con(reviewDevelopFeature2).Con(test) + reviewDesign.Con(prepareInfra).Con(test) + test.Con(release).Con(finish) + + g.Done(design, reviewDesign, developFeature2, finish) + + dagUML, err := dag.UML() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(dagUML) + + fmt.Println() + + infraUML, err := prepareInfra.UML() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(infraUML) + // Output: + // @startuml + // rectangle "ゴール(目的)" as 67 + // usecase "設計" as 68 #DarkGray + // usecase "レビュー対応" as 69 #DarkGray + // usecase "feature1開発" as 70 + // note left + // xxが担当 + // end note + // usecase "レビュー対応" as 71 + // usecase "結合テスト" as 75 + // usecase "リリース" as 76 + // usecase "finish" as 77 #DarkGray + // usecase "feature2開発" as 72 #DarkGray + // note left + // yyが担当 + // end note + // usecase "レビュー対応" as 73 + // usecase "インフラ準備" as 74 + // note left + // zzが担当 + // end note + // + // 67 --> 68 + // 68 --> 69 + // 69 --> 70 + // 70 --> 71 + // 71 --> 75 + // 75 --> 76 + // 76 --> 77 + // 69 --> 72 + // 72 --> 73 + // 73 --> 75 + // 69 --> 74 + // 74 --> 75 + // + // @enduml + // + // @startuml + // usecase "インフラ準備" as 74 + // note left + // zzが担当 + // end note + // usecase "結合テスト" as 75 + // usecase "リリース" as 76 + // usecase "finish" as 77 #DarkGray + // + // 74 --> 75 + // 75 --> 76 + // 76 --> 77 + // + // @enduml +}