Skip to content

Commit 7534a13

Browse files
authoredJul 18, 2023
add cli flag --pdl to determine whether parse operations in dependency (#1605)
* change cli flag to parse operations in dependency Signed-off-by: sdghchj <sdghchj@qq.com> * change cli flag to parse operations in dependency Signed-off-by: sdghchj <sdghchj@qq.com> * add cli flag --pdl to determine whether parse operations in dependency Signed-off-by: sdghchj <sdghchj@qq.com> * add cli flag --pdl to determine whether parse operations in dependency Signed-off-by: sdghchj <sdghchj@qq.com> * add cli flag --pdl to determine whether parse operations in dependency Signed-off-by: sdghchj <sdghchj@qq.com> --------- Signed-off-by: sdghchj <sdghchj@qq.com>
1 parent 1bf0078 commit 7534a13

9 files changed

+70
-58
lines changed
 

‎cmd/swag/main.go

+36-24
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,30 @@ import (
1515
)
1616

1717
const (
18-
searchDirFlag = "dir"
19-
excludeFlag = "exclude"
20-
generalInfoFlag = "generalInfo"
21-
propertyStrategyFlag = "propertyStrategy"
22-
outputFlag = "output"
23-
outputTypesFlag = "outputTypes"
24-
parseVendorFlag = "parseVendor"
25-
parseDependencyFlag = "parseDependency"
26-
markdownFilesFlag = "markdownFiles"
27-
codeExampleFilesFlag = "codeExampleFiles"
28-
parseInternalFlag = "parseInternal"
29-
generatedTimeFlag = "generatedTime"
30-
requiredByDefaultFlag = "requiredByDefault"
31-
parseDepthFlag = "parseDepth"
32-
instanceNameFlag = "instanceName"
33-
overridesFileFlag = "overridesFile"
34-
parseGoListFlag = "parseGoList"
35-
quietFlag = "quiet"
36-
tagsFlag = "tags"
37-
parseExtensionFlag = "parseExtension"
38-
templateDelimsFlag = "templateDelims"
39-
packageName = "packageName"
40-
collectionFormatFlag = "collectionFormat"
18+
searchDirFlag = "dir"
19+
excludeFlag = "exclude"
20+
generalInfoFlag = "generalInfo"
21+
propertyStrategyFlag = "propertyStrategy"
22+
outputFlag = "output"
23+
outputTypesFlag = "outputTypes"
24+
parseVendorFlag = "parseVendor"
25+
parseDependencyFlag = "parseDependency"
26+
parseDependencyLevelFlag = "parseDependencyLevel"
27+
markdownFilesFlag = "markdownFiles"
28+
codeExampleFilesFlag = "codeExampleFiles"
29+
parseInternalFlag = "parseInternal"
30+
generatedTimeFlag = "generatedTime"
31+
requiredByDefaultFlag = "requiredByDefault"
32+
parseDepthFlag = "parseDepth"
33+
instanceNameFlag = "instanceName"
34+
overridesFileFlag = "overridesFile"
35+
parseGoListFlag = "parseGoList"
36+
quietFlag = "quiet"
37+
tagsFlag = "tags"
38+
parseExtensionFlag = "parseExtension"
39+
templateDelimsFlag = "templateDelims"
40+
packageName = "packageName"
41+
collectionFormatFlag = "collectionFormat"
4142
)
4243

4344
var initFlags = []cli.Flag{
@@ -84,6 +85,11 @@ var initFlags = []cli.Flag{
8485
Name: parseVendorFlag,
8586
Usage: "Parse go files in 'vendor' folder, disabled by default",
8687
},
88+
&cli.IntFlag{
89+
Name: parseDependencyLevelFlag,
90+
Aliases: []string{"pdl"},
91+
Usage: "Parse go files inside dependency folder, 0 disabled, 1 only parse models, 2 only parse operations, 3 parse all",
92+
},
8793
&cli.BoolFlag{
8894
Name: parseDependencyFlag,
8995
Aliases: []string{"pd"},
@@ -198,6 +204,12 @@ func initAction(ctx *cli.Context) error {
198204
return fmt.Errorf("not supported %s collectionFormat", ctx.String(collectionFormat))
199205
}
200206

207+
var pdv = ctx.Int(parseDependencyLevelFlag)
208+
if pdv == 0 {
209+
if ctx.Bool(parseDependencyFlag) {
210+
pdv = 1
211+
}
212+
}
201213
return gen.New().Build(&gen.Config{
202214
SearchDir: ctx.String(searchDirFlag),
203215
Excludes: ctx.String(excludeFlag),
@@ -207,7 +219,7 @@ func initAction(ctx *cli.Context) error {
207219
OutputDir: ctx.String(outputFlag),
208220
OutputTypes: outputTypes,
209221
ParseVendor: ctx.Bool(parseVendorFlag),
210-
ParseDependency: ctx.Bool(parseDependencyFlag),
222+
ParseDependency: pdv,
211223
MarkdownFilesDir: ctx.String(markdownFilesFlag),
212224
ParseInternal: ctx.Bool(parseInternalFlag),
213225
GeneratedTime: ctx.Bool(generatedTimeFlag),

‎gen/gen.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ type Config struct {
103103
// ParseVendor whether swag should be parse vendor folder
104104
ParseVendor bool
105105

106-
// ParseDependencies whether swag should be parse outside dependency folder
107-
ParseDependency bool
106+
// ParseDependencies whether swag should be parse outside dependency folder: 0 none, 1 models, 2 operations, 3 all
107+
ParseDependency int
108108

109109
// ParseInternal whether swag should parse internal packages
110110
ParseInternal bool

‎gen/gen_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ func TestGen_cgoImports(t *testing.T) {
661661
OutputDir: "../testdata/simple_cgo/docs",
662662
OutputTypes: outputTypes,
663663
PropNamingStrategy: "",
664-
ParseDependency: true,
664+
ParseDependency: 1,
665665
}
666666

667667
assert.NoError(t, New().Build(config))

‎generics_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func TestParseGenericsPackageAlias(t *testing.T) {
127127
expected, err := os.ReadFile(filepath.Join(searchDir, "expected.json"))
128128
assert.NoError(t, err)
129129

130-
p := New(SetParseDependency(true))
130+
p := New(SetParseDependency(1))
131131
err = p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth)
132132
assert.NoError(t, err)
133133
b, err := json.MarshalIndent(p.swagger, "", " ")

‎golist.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func listPackages(ctx context.Context, dir string, env []string, args ...string)
4747
return pkgs, nil
4848
}
4949

50-
func (parser *Parser) getAllGoFileInfoFromDepsByList(pkg *build.Package) error {
50+
func (parser *Parser) getAllGoFileInfoFromDepsByList(pkg *build.Package, parseFlag ParseFlag) error {
5151
ignoreInternal := pkg.Goroot && !parser.ParseInternal
5252
if ignoreInternal { // ignored internal
5353
return nil
@@ -56,15 +56,15 @@ func (parser *Parser) getAllGoFileInfoFromDepsByList(pkg *build.Package) error {
5656
srcDir := pkg.Dir
5757
var err error
5858
for i := range pkg.GoFiles {
59-
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.GoFiles[i]), nil, ParseModels)
59+
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.GoFiles[i]), nil, parseFlag)
6060
if err != nil {
6161
return err
6262
}
6363
}
6464

6565
// parse .go source files that import "C"
6666
for i := range pkg.CgoFiles {
67-
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.CgoFiles[i]), nil, ParseModels)
67+
err = parser.parseFile(pkg.ImportPath, filepath.Join(srcDir, pkg.CgoFiles[i]), nil, parseFlag)
6868
if err != nil {
6969
return err
7070
}

‎golist_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func TestGetAllGoFileInfoFromDepsByList(t *testing.T) {
105105
p.ParseInternal = false
106106
}
107107
c.buildPackage.Dir = filepath.Join(pwd, c.buildPackage.Dir)
108-
err := p.getAllGoFileInfoFromDepsByList(c.buildPackage)
108+
err := p.getAllGoFileInfoFromDepsByList(c.buildPackage, ParseModels)
109109
if c.except != nil {
110110
assert.NotNil(t, err)
111111
} else {

‎packages.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type PackagesDefinitions struct {
1919
files map[*ast.File]*AstFileInfo
2020
packages map[string]*PackageDefinitions
2121
uniqueDefinitions map[string]*TypeSpecDef
22-
parseDependency bool
22+
parseDependency ParseFlag
2323
debug Debugger
2424
}
2525

@@ -324,7 +324,7 @@ func (pkgDefs *PackagesDefinitions) EvaluateConstValueByName(file *ast.File, pkg
324324
}
325325
}
326326
}
327-
if pkgDefs.parseDependency {
327+
if pkgDefs.parseDependency > 0 {
328328
for _, pkgPath := range externalPkgPaths {
329329
if err := pkgDefs.loadExternalPackage(pkgPath); err == nil {
330330
if pkg, ok := pkgDefs.packages[pkgPath]; ok {
@@ -513,7 +513,7 @@ func (pkgDefs *PackagesDefinitions) findTypeSpecFromPackagePaths(matchedPkgPaths
513513
}
514514
}
515515

516-
if pkgDefs.parseDependency {
516+
if pkgDefs.parseDependency > 0 {
517517
for _, pkgPath := range externalPkgPaths {
518518
if err := pkgDefs.loadExternalPackage(pkgPath); err == nil {
519519
typeDef = pkgDefs.findTypeSpec(pkgPath, name)

‎parser.go

+14-14
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ type ParseFlag int
7474
const (
7575
// ParseNone parse nothing
7676
ParseNone ParseFlag = 0x00
77-
// ParseOperations parse operations
78-
ParseOperations = 0x01
7977
// ParseModels parse models
80-
ParseModels = 0x02
78+
ParseModels = 0x01
79+
// ParseOperations parse operations
80+
ParseOperations = 0x02
8181
// ParseAll parse operations and models
8282
ParseAll = ParseOperations | ParseModels
8383
)
@@ -126,8 +126,8 @@ type Parser struct {
126126
// ParseVendor parse vendor folder
127127
ParseVendor bool
128128

129-
// ParseDependencies whether swag should be parse outside dependency folder
130-
ParseDependency bool
129+
// ParseDependencies whether swag should be parse outside dependency folder: 0 none, 1 models, 2 operations, 3 all
130+
ParseDependency ParseFlag
131131

132132
// ParseInternal whether swag should parse internal packages
133133
ParseInternal bool
@@ -237,11 +237,11 @@ func New(options ...func(*Parser)) *Parser {
237237
}
238238

239239
// SetParseDependency sets whether to parse the dependent packages.
240-
func SetParseDependency(parseDependency bool) func(*Parser) {
240+
func SetParseDependency(parseDependency int) func(*Parser) {
241241
return func(p *Parser) {
242-
p.ParseDependency = parseDependency
242+
p.ParseDependency = ParseFlag(parseDependency)
243243
if p.packages != nil {
244-
p.packages.parseDependency = parseDependency
244+
p.packages.parseDependency = p.ParseDependency
245245
}
246246
}
247247
}
@@ -365,7 +365,7 @@ func (parser *Parser) ParseAPIMultiSearchDir(searchDirs []string, mainAPIFile st
365365
}
366366

367367
// Use 'go list' command instead of depth.Resolve()
368-
if parser.ParseDependency {
368+
if parser.ParseDependency > 0 {
369369
if parser.parseGoList {
370370
pkgs, err := listPackages(context.Background(), filepath.Dir(absMainAPIFilePath), nil, "-deps")
371371
if err != nil {
@@ -374,7 +374,7 @@ func (parser *Parser) ParseAPIMultiSearchDir(searchDirs []string, mainAPIFile st
374374

375375
length := len(pkgs)
376376
for i := 0; i < length; i++ {
377-
err := parser.getAllGoFileInfoFromDepsByList(pkgs[i])
377+
err := parser.getAllGoFileInfoFromDepsByList(pkgs[i], parser.ParseDependency)
378378
if err != nil {
379379
return err
380380
}
@@ -394,7 +394,7 @@ func (parser *Parser) ParseAPIMultiSearchDir(searchDirs []string, mainAPIFile st
394394
return fmt.Errorf("pkg %s cannot find all dependencies, %s", pkgName, err)
395395
}
396396
for i := 0; i < len(t.Root.Deps); i++ {
397-
err := parser.getAllGoFileInfoFromDeps(&t.Root.Deps[i])
397+
err := parser.getAllGoFileInfoFromDeps(&t.Root.Deps[i], parser.ParseDependency)
398398
if err != nil {
399399
return err
400400
}
@@ -1642,7 +1642,7 @@ func (parser *Parser) getAllGoFileInfo(packageDir, searchDir string) error {
16421642
})
16431643
}
16441644

1645-
func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg) error {
1645+
func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg, parseFlag ParseFlag) error {
16461646
ignoreInternal := pkg.Internal && !parser.ParseInternal
16471647
if ignoreInternal || !pkg.Resolved { // ignored internal and not resolved dependencies
16481648
return nil
@@ -1666,13 +1666,13 @@ func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg) error {
16661666
}
16671667

16681668
path := filepath.Join(srcDir, f.Name())
1669-
if err := parser.parseFile(pkg.Name, path, nil, ParseModels); err != nil {
1669+
if err := parser.parseFile(pkg.Name, path, nil, parseFlag); err != nil {
16701670
return err
16711671
}
16721672
}
16731673

16741674
for i := 0; i < len(pkg.Deps); i++ {
1675-
if err := parser.getAllGoFileInfoFromDeps(&pkg.Deps[i]); err != nil {
1675+
if err := parser.getAllGoFileInfoFromDeps(&pkg.Deps[i], parseFlag); err != nil {
16761676
return err
16771677
}
16781678
}

‎parser_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -2176,7 +2176,7 @@ func TestParseNested(t *testing.T) {
21762176
t.Parallel()
21772177

21782178
searchDir := "testdata/nested"
2179-
p := New(SetParseDependency(true))
2179+
p := New(SetParseDependency(1))
21802180
err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth)
21812181
assert.NoError(t, err)
21822182

@@ -2191,7 +2191,7 @@ func TestParseDuplicated(t *testing.T) {
21912191
t.Parallel()
21922192

21932193
searchDir := "testdata/duplicated"
2194-
p := New(SetParseDependency(true))
2194+
p := New(SetParseDependency(1))
21952195
err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth)
21962196
assert.Errorf(t, err, "duplicated @id declarations successfully found")
21972197
}
@@ -2200,7 +2200,7 @@ func TestParseDuplicatedOtherMethods(t *testing.T) {
22002200
t.Parallel()
22012201

22022202
searchDir := "testdata/duplicated2"
2203-
p := New(SetParseDependency(true))
2203+
p := New(SetParseDependency(1))
22042204
err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth)
22052205
assert.Errorf(t, err, "duplicated @id declarations successfully found")
22062206
}
@@ -2209,7 +2209,7 @@ func TestParseDuplicatedFunctionScoped(t *testing.T) {
22092209
t.Parallel()
22102210

22112211
searchDir := "testdata/duplicated_function_scoped"
2212-
p := New(SetParseDependency(true))
2212+
p := New(SetParseDependency(1))
22132213
err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth)
22142214
assert.Errorf(t, err, "duplicated @id declarations successfully found")
22152215
}
@@ -2218,7 +2218,7 @@ func TestParseConflictSchemaName(t *testing.T) {
22182218
t.Parallel()
22192219

22202220
searchDir := "testdata/conflict_name"
2221-
p := New(SetParseDependency(true))
2221+
p := New(SetParseDependency(1))
22222222
err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth)
22232223
assert.NoError(t, err)
22242224
b, _ := json.MarshalIndent(p.swagger, "", " ")
@@ -2230,7 +2230,7 @@ func TestParseConflictSchemaName(t *testing.T) {
22302230
func TestParseExternalModels(t *testing.T) {
22312231
searchDir := "testdata/external_models/main"
22322232
mainAPIFile := "main.go"
2233-
p := New(SetParseDependency(true))
2233+
p := New(SetParseDependency(1))
22342234
err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth)
22352235
assert.NoError(t, err)
22362236
b, _ := json.MarshalIndent(p.swagger, "", " ")
@@ -2242,7 +2242,7 @@ func TestParseExternalModels(t *testing.T) {
22422242

22432243
func TestParseGoList(t *testing.T) {
22442244
mainAPIFile := "main.go"
2245-
p := New(ParseUsingGoList(true), SetParseDependency(true))
2245+
p := New(ParseUsingGoList(true), SetParseDependency(1))
22462246
go111moduleEnv := os.Getenv("GO111MODULE")
22472247

22482248
cases := []struct {
@@ -2454,7 +2454,7 @@ type ResponseWrapper struct {
24542454
}
24552455
}
24562456
}`
2457-
parser := New(SetParseDependency(true))
2457+
parser := New(SetParseDependency(1))
24582458

24592459
_ = parser.packages.ParseFile("api", "api/api.go", src, ParseAll)
24602460

@@ -3122,7 +3122,7 @@ func TestParseOutsideDependencies(t *testing.T) {
31223122
searchDir := "testdata/pare_outside_dependencies"
31233123
mainAPIFile := "cmd/main.go"
31243124

3125-
p := New(SetParseDependency(true))
3125+
p := New(SetParseDependency(1))
31263126
if err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth); err != nil {
31273127
t.Error("Failed to parse api: " + err.Error())
31283128
}

0 commit comments

Comments
 (0)
Please sign in to comment.