From bc6e9b269b8851dfa44e25fa3cb8a789f5e54dcc Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Mon, 16 Dec 2019 23:10:19 +0800 Subject: [PATCH] feat: add api size count --- README.md | 21 +++++++++++++++++++++ cmd/api.go | 20 ++++++++++++++------ src/domain/call_graph.go | 22 ++++++++++++++++------ src/domain/call_model.go | 7 +++++++ 4 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 src/domain/call_model.go diff --git a/README.md b/README.md index d550c30..3201ecc 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,27 @@ coca api -p examples/api -d deps.json ![API Demo](docs/sample/api.svg) +With Count + +``` +coca api -p . -d deps.json -c true -r com.macro.mall. +``` + +``` ++------+------------------------------------------------+------------------------------------------------------------------------+ +| SIZE | API | CALLER | ++------+------------------------------------------------+------------------------------------------------------------------------+ +| 17 | GET /returnReason/list | controller.OmsOrderReturnReasonController.list | +| 17 | GET /returnApply/list | controller.OmsOrderReturnApplyController.list | +| 17 | GET /order/list | controller.OmsOrderController.list | +| 17 | GET /subject/list | controller.CmsSubjectController.getList | +| 17 | GET /esProduct/search/simple | search.controller.EsProductController.search | +| 17 | GET /flash/{id} | controller.SmsFlashPromotionController.getItem | +| 21 | POST /aliyun/osscallback | controller.OssController.callback | +| 36 | GET /aliyun/oss/policy | controller.OssController.policy | ++------+------------------------------------------------+------------------------------------------------------------------------+ +``` + ### Git Analysis ``` diff --git a/cmd/api.go b/cmd/api.go index efc5fd2..fe9b3f0 100644 --- a/cmd/api.go +++ b/cmd/api.go @@ -6,10 +6,12 @@ import ( "coca/src/domain" . "coca/src/utils" "encoding/json" - "fmt" + "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" "log" + "os" "os/exec" + "strconv" "strings" ) @@ -38,12 +40,18 @@ var apiCmd *cobra.Command = &cobra.Command{ _ = json.Unmarshal(file, &parsedDeps) analyser := domain.NewCallGraph() - dotContent, countMap := analyser.AnalysisByFiles(restApis, parsedDeps) + dotContent, counts := analyser.AnalysisByFiles(restApis, parsedDeps) - if isShowApiCount != "" { - for _, count := range countMap { - fmt.Println(count.Value, count.Key) + if isShowApiCount == "true" { + table := tablewriter.NewWriter(os.Stdout) + + table.SetHeader([]string{"Size", "API", "Caller"}) + + for _, v := range counts { + replaceCaller := strings.ReplaceAll(v.Caller, remove, "") + table.Append([]string{strconv.Itoa(v.Size), v.ApiName, replaceCaller}) } + table.Render() } if remove != "" { @@ -67,5 +75,5 @@ func init() { apiCmd.PersistentFlags().StringP("path", "p", "", "path") apiCmd.PersistentFlags().StringP("dependence", "d", "", "get dependence file") apiCmd.PersistentFlags().StringP("remove", "r", "", "remove package name") - apiCmd.PersistentFlags().StringP("count", "c", "", "count api size") + apiCmd.PersistentFlags().BoolP("count", "c", false, "count api size") } diff --git a/src/domain/call_graph.go b/src/domain/call_graph.go index 979195c..9c8fa83 100644 --- a/src/domain/call_graph.go +++ b/src/domain/call_graph.go @@ -3,7 +3,7 @@ package domain import ( "coca/src/adapter/api" "coca/src/adapter/models" - "coca/src/algo" + "sort" "strings" ) @@ -53,9 +53,9 @@ func BuildCallChain(funcName string, methodMap map[string][]string) string { } -func (c CallGraph) AnalysisByFiles(restApis []api.RestApi, deps []models.JClassNode) (string, algo.PairList) { +func (c CallGraph) AnalysisByFiles(restApis []api.RestApi, deps []models.JClassNode) (string, []CallApiCount) { methodMap := c.BuildMethodMap(deps) - apiCallSizeMap := make(map[string]int) + var apiCallSCounts []CallApiCount results := "digraph G { \n" @@ -67,11 +67,21 @@ func (c CallGraph) AnalysisByFiles(restApis []api.RestApi, deps []models.JClassN apiCallChain := BuildCallChain(caller, methodMap) chain = chain + apiCallChain - apiCallSizeMap[caller + " " + restApi.HttpMethod + " " + restApi.Uri] = len(strings.Split(apiCallChain, " -> ")) + count := &CallApiCount{ + Caller: caller, + ApiName: restApi.HttpMethod + " " + restApi.Uri, + Size: len(strings.Split(apiCallChain, " -> ")), + } + apiCallSCounts = append(apiCallSCounts, *count) + results = results + "\n" + chain } - byWordCount := algo.RankByWordCount(apiCallSizeMap) - return results + "}\n", byWordCount + + sort.Slice(apiCallSCounts, func(i, j int) bool { + return apiCallSCounts[i].Size < apiCallSCounts[j].Size + }) + + return results + "}\n", apiCallSCounts } func (c CallGraph) BuildMethodMap(clzs []models.JClassNode) map[string][]string { diff --git a/src/domain/call_model.go b/src/domain/call_model.go new file mode 100644 index 0000000..1fa7bb2 --- /dev/null +++ b/src/domain/call_model.go @@ -0,0 +1,7 @@ +package domain + +type CallApiCount struct { + Caller string + ApiName string + Size int +} -- GitLab