Skip to content

Commit

Permalink
feat(travis): add showdoc support
Browse files Browse the repository at this point in the history
  • Loading branch information
vinson committed Nov 13, 2020
1 parent d9633cf commit 1420886
Show file tree
Hide file tree
Showing 8 changed files with 256 additions and 171 deletions.
2 changes: 1 addition & 1 deletion controller/test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package a

/**
//@doc OnGetAppVersionHandler
//#doc OnGetAppVersionHandler
//@class app版本管理
//@title 版本查询
//@description 查询版本信息和更新信息
Expand Down
129 changes: 1 addition & 128 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,17 @@ import (
"annotation-parse/parsor"
"annotation-parse/statement"
"annotation-parse/utils"
"bytes"
"encoding/base64"
"encoding/json"
"errors"
"flag"
"fmt"
"io/ioutil"
"os"
"path"
"regexp"
"strings"
"sync"
"time"
)

// 带有此标识的匹配注释才会进行文档解析
const CiFlag = "#doc"

// 支持的文件格式
var ExtSupported = []string{".go", ".js", ".java", ".php", ".py"}

Expand Down Expand Up @@ -151,7 +144,7 @@ func ParseFile(ctx *statement.Context, f *os.FileInfo, fs *[]*statement.Request,
fmt.Println((*f).Name(), "*", l)
}
for _, part := range s {
context, err := Parse(part[0])
context, err := utils.Parse(part[0])
if nil != err {
continue
}
Expand All @@ -174,123 +167,3 @@ func ParseFile(ctx *statement.Context, f *os.FileInfo, fs *[]*statement.Request,
fmt.Println("reg initialize Failed")
}
}

// the function can parse the annotation str to a Content obj
func Parse(annotation string) (*model.Content, error) {
// 解析@
if !strings.Contains(annotation, CiFlag) {
return nil, errors.New("no doc annotation")
}
tagReg := regexp.MustCompile(`@[\w\W]*?\n`)
tagLine := tagReg.FindAllStringSubmatch(annotation, -1)
var content = &model.Content{}
for _, tv := range tagLine {
tv[0] = strings.ReplaceAll(tv[0], "\r", "")
tv[0] = strings.ReplaceAll(tv[0], "\n", "")
if i := strings.LastIndex(tv[0], "@class "); i != -1 {
// 名称
content.Class = tv[0][i+7:]
continue
}
if i := strings.LastIndex(tv[0], "@title "); i != -1 {
// 名称
content.Title = tv[0][i+7:]
continue
}
if i := strings.LastIndex(tv[0], "@description "); i != -1 {
// 描述
content.Description = tv[0][i+13:]
continue
}
if i := strings.LastIndex(tv[0], "@method "); i != -1 {
// 方法
content.Method = tv[0][i+8:]
continue
}
if i := strings.LastIndex(tv[0], "@url "); i != -1 {
// url
content.URL = tv[0][i+5:]
continue
}
if i := strings.LastIndex(tv[0], "@return "); i != -1 {
// return str
str := tv[0][i+8:]
sb := []byte(str)
if json.Valid(sb) {
var sj bytes.Buffer
_ = json.Indent(&sj, sb, "", "\t")
content.Return = sj.String()
} else {
content.Return = str
}
continue
}
if i := strings.LastIndex(tv[0], "@remark "); i != -1 {
// remark
content.Remark = tv[0][i+8:]
continue
}
if i := strings.LastIndex(tv[0], "@number "); i != -1 {
// number
content.Number = tv[0][i+8:]
continue
}
if i := strings.LastIndex(tv[0], "@header "); i != -1 {
// header
func() {
defer func() {
if recover() != nil {
return
}
}()
qs := strings.Split(tv[0][i+8:], " ")
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` | ` + qs[3] + ` |` + "\n"
content.Header += q
}()
continue
}
if i := strings.LastIndex(tv[0], "@query "); i != -1 {
// param
func() {
defer func() {
if recover() != nil {
return
}
}()
qs := strings.Split(tv[0][i+7:], " ")
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` | ` + qs[3] + ` |` + "\n"
content.Query += q
}()
continue
}
if i := strings.LastIndex(tv[0], "@body "); i != -1 {
// param
func() {
defer func() {
if recover() != nil {
return
}
}()
qs := strings.Split(tv[0][i+6:], " ")
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` | ` + qs[3] + ` |` + "\n"
content.Body += q
}()
continue
}
if i := strings.LastIndex(tv[0], "@return_param "); i != -1 {
// return_param
func() {
defer func() {
if recover() != nil {
return
}
}()
qs := strings.Split(tv[0][i+14:], " ")
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` |` + "\n"
content.ReturnParam += q
}()
continue
}
}
return content, nil
}
1 change: 0 additions & 1 deletion main_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// Copyright The ZHIYUN Co. All rights reserved.
// Created by vinson on 2020/11/5.

package main
Expand Down
27 changes: 13 additions & 14 deletions model/model.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
// Copyright The ZHIYUN Co. All rights reserved.
// Created by vinson on 2020/11/13.

package model

type Content struct {
Catalog string // catalog xx/xx/
Class string // class string
Title string // title title
Description string // description description
Method string // method method
URL string // url url
Header string // @header 名称 必选 类型 释义
Query string // @param 名称 必选 类型 释义
Body string // @body 名称 必选 类型 释义
Return string // @return str
ReturnParam string // @return_param 名称 类型 释义
Remark string // @remark str
Number string // number int
Catalog string // catalog xx/xx/
Class string // class string
Title string // title title
Description string // description description
Method string // method method
URL string // url url
Header [][4]string // @header 名称 必选 类型 释义
Query [][4]string // @param 名称 必选 类型 释义
Body [][4]string // @body 名称 必选 类型 释义
Return string // @return str
ReturnParam [][3]string // @return_param 名称 类型 释义
Remark string // @remark str
Number string // number int
}

type Condition struct {
Expand Down
1 change: 0 additions & 1 deletion parsor/rap.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// Copyright The ZHIYUN Co. All rights reserved.
// Created by vinson on 2020/11/13.

package parsor
90 changes: 71 additions & 19 deletions parsor/showdoc.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,7 @@ func (r *ShowDoc) RequestQueue() *[]*statement.Request {

// 获取Request
func (r *ShowDoc) NewRequest(condition *model.Condition, content *model.Content) *statement.Request {
var buf bytes.Buffer
err := r.template.Execute(&buf, content)
if nil != err {
fmt.Println(err)
return nil
}
if v, ok := (interface{}(&Request{condition.URL, condition.Key, condition.Token, condition.Cat, content.Class, content.Title, buf.String()})).(statement.Request); ok {
if v, ok := (interface{}(&Request{condition.URL, condition.Key, condition.Token, condition.Cat, r.template, content})).(statement.Request); ok {
return &v
}
return nil
Expand All @@ -64,13 +58,13 @@ func (req *Request) Post() {
urlValues := url.Values{}
urlValues.Add("api_key", req.Key)
urlValues.Add("api_token", req.Token)
if req.Class != "" {
urlValues.Add("cat_name", req.Cat+req.Class)
if req._content.Class != "" {
urlValues.Add("cat_name", req.Cat+req._content.Class)
} else {
urlValues.Add("cat_name", req.Cat)
}
urlValues.Add("page_title", req.Title)
urlValues.Add("page_content", req.Content)
urlValues.Add("page_title", req._content.Title)
urlValues.Add("page_content", req.buildTemplate())
var resp, err = http.PostForm(req.URL, urlValues)
if nil != err {
fmt.Println(err)
Expand All @@ -93,16 +87,74 @@ func (req *Request) Post() {
rs := "Ok"
if result["error_code"].(float64) != 0 {
rs = "Failed"
fmt.Println(result)
return
}
fmt.Println(req.Class+req.Title, "-", rs)
fmt.Println(req._content.Class+req._content.Title, "-", rs)
}

type Request struct {
URL string
Key string
Token string
Cat string
Class string
Title string
Content string
URL string
Key string
Token string
Cat string
_template *template.Template
_content *model.Content
}

func (req *Request) buildTemplate() string {
content := &content{
req._content.Catalog,
req._content.Class,
req._content.Title,
req._content.Description,
req._content.Method,
req._content.URL,
"",
"",
"",
req._content.Return,
"",
req._content.Remark,
req._content.Number,
}
for _, qs := range req._content.Header {
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` | ` + qs[3] + ` |` + "\n"
content.Header = q
}
for _, qs := range req._content.Query {
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` | ` + qs[3] + ` |` + "\n"
content.Query += q
}
for _, qs := range req._content.Body {
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` | ` + qs[3] + ` |` + "\n"
content.Body += q
}
for _, qs := range req._content.ReturnParam {
q := `| ` + qs[0] + ` | ` + qs[1] + ` | ` + qs[2] + ` |` + "\n"
content.ReturnParam += q
}
var buf bytes.Buffer
err := req._template.Execute(&buf, content)
if nil != err {
fmt.Println(err)
return ""
}
return buf.String()
}

type content struct {
Catalog string // catalog xx/xx/
Class string // class string
Title string // title title
Description string // description description
Method string // method method
URL string // url url
Header string // @header 名称 必选 类型 释义
Query string // @param 名称 必选 类型 释义
Body string // @body 名称 必选 类型 释义
Return string // @return str
ReturnParam string // @return_param 名称 类型 释义
Remark string // @remark str
Number string // number int
}
42 changes: 35 additions & 7 deletions parsor/yapi.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// Copyright The ZHIYUN Co. All rights reserved.
// Created by vinson on 2020/11/13.

package parsor
Expand Down Expand Up @@ -85,20 +84,49 @@ type YApiRequest struct {
}

func (req YApiRequest) build() string {
raw := make(map[string]interface{}, 0)
raw := make(map[string]interface{})
raw["token"] = req.condition.Token
raw["title"] = req.content.Title
raw["catid"] = req.condition.Cat
raw["path"] = req.content.URL
raw["status"] = "done" // TODO
raw["res_body_type"] = "json" //TODO
raw["res_body_type"] = "json" // TODO
raw["res_body"] = req.content.Return
raw["req_query"] = []interface{}{}
raw["req_headers"] = []interface{}{}
raw["req_body_form"] = []interface{}{}
raw["desc"] = req.content.Description
raw["method"] = req.content.Method
raw["req_params"] = []interface{}{}

var header = make([]map[string]string, 0)
var query = make([]map[string]string, 0)
var body = make([]map[string]string, 0)
var returnParam = make([]map[string]string, 0)
required := func(a string) string {
if a == "必选" {
return "1"
}
return "0"
}
body_form_type := func(a string) string {
if a == "file" {
return "file"
}
return "text"
}
for _, qs := range req.content.Header {
header = append(header, map[string]string{"name": qs[0], "required": required(qs[1])})
}
for _, qs := range req.content.Query {
query = append(query, map[string]string{"name": qs[0], "required": required(qs[1])})
}
for _, qs := range req.content.Body {
body = append(body, map[string]string{"name": qs[0], "required": required(qs[1]), "type": body_form_type(qs[2])})
}
for _, qs := range req.content.ReturnParam {
returnParam = append(returnParam, map[string]string{"name": qs[0], "required": required(qs[1])})
}
raw["req_query"] = query
raw["req_headers"] = header
raw["req_body_form"] = body
raw["req_params"] = returnParam
bs, err := json.Marshal(raw)
if err == nil {
return string(bs)
Expand Down
Loading

0 comments on commit 1420886

Please sign in to comment.