diff --git a/cmd/swag/main.go b/cmd/swag/main.go index 31403e012..ce1c228e4 100644 --- a/cmd/swag/main.go +++ b/cmd/swag/main.go @@ -19,8 +19,9 @@ const ( parseVendorFlag = "parseVendor" parseDependencyFlag = "parseDependency" markdownFilesFlag = "markdownFiles" - parseInternal = "parseInternal" + parseInternalFlag = "parseInternal" generatedTimeFlag = "generatedTime" + parseDepthFlag = "parseDepth" ) var initFlags = []cli.Flag{ @@ -67,13 +68,18 @@ var initFlags = []cli.Flag{ Usage: "Parse folder containing markdown files to use as description, disabled by default", }, &cli.BoolFlag{ - Name: "parseInternal", + Name: parseInternalFlag, Usage: "Parse go files in internal packages, disabled by default", }, &cli.BoolFlag{ - Name: "generatedTime", + Name: generatedTimeFlag, Usage: "Generate timestamp at the top of docs.go, true by default", }, + &cli.IntFlag{ + Name: parseDepthFlag, + Value: 100, + Usage: "Dependency parse depth", + }, } func initAction(c *cli.Context) error { @@ -94,8 +100,9 @@ func initAction(c *cli.Context) error { ParseVendor: c.Bool(parseVendorFlag), ParseDependency: c.Bool(parseDependencyFlag), MarkdownFilesDir: c.String(markdownFilesFlag), - ParseInternal: c.Bool(parseInternal), + ParseInternal: c.Bool(parseInternalFlag), GeneratedTime: c.Bool(generatedTimeFlag), + ParseDepth: c.Int(parseDepthFlag), }) } diff --git a/gen/gen.go b/gen/gen.go index d51b42246..949275cd7 100644 --- a/gen/gen.go +++ b/gen/gen.go @@ -65,6 +65,9 @@ type Config struct { // GeneratedTime whether swag should generate the timestamp at the top of docs.go GeneratedTime bool + + // ParseDepth dependency parse depth + ParseDepth int } // Build builds swagger json file for given searchDir and mainAPIFile. Returns json @@ -81,7 +84,7 @@ func (g *Gen) Build(config *Config) error { p.ParseDependency = config.ParseDependency p.ParseInternal = config.ParseInternal - if err := p.ParseAPI(config.SearchDir, config.MainAPIFile); err != nil { + if err := p.ParseAPI(config.SearchDir, config.MainAPIFile, config.ParseDepth); err != nil { return err } swagger := p.GetSwagger() diff --git a/parser.go b/parser.go index f1364cab0..7cf86692d 100644 --- a/parser.go +++ b/parser.go @@ -145,7 +145,7 @@ func SetExcludedDirsAndFiles(excludes string) func(*Parser) { } // ParseAPI parses general api info for given searchDir and mainAPIFile -func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error { +func (parser *Parser) ParseAPI(searchDir, mainAPIFile string, parseDepth int) error { Printf("Generate general API Info, search dir:%s", searchDir) packageDir, err := getPkgName(searchDir) @@ -157,15 +157,16 @@ func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error { return err } - var t depth.Tree - t.ResolveInternal = true - absMainAPIFilePath, err := filepath.Abs(filepath.Join(searchDir, mainAPIFile)) if err != nil { return err } if parser.ParseDependency { + var t depth.Tree + t.ResolveInternal = true + t.MaxDepth = parseDepth + pkgName, err := getPkgName(filepath.Dir(absMainAPIFilePath)) if err != nil { return err diff --git a/parser_test.go b/parser_test.go index e3802782b..069417620 100644 --- a/parser_test.go +++ b/parser_test.go @@ -12,6 +12,8 @@ import ( "github.com/stretchr/testify/assert" ) +const defaultParseDepth = 100 + func TestNew(t *testing.T) { swagMode = test New() @@ -282,7 +284,7 @@ func TestParseSimpleApi1(t *testing.T) { mainAPIFile := "main.go" p := New() p.PropNamingStrategy = PascalCase - err = p.ParseAPI(searchDir, mainAPIFile) + err = p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") @@ -765,7 +767,7 @@ func TestParseSimpleApi_ForSnakecase(t *testing.T) { mainAPIFile := "main.go" p := New() p.PropNamingStrategy = SnakeCase - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") @@ -1220,7 +1222,7 @@ func TestParseSimpleApi_ForLowerCamelcase(t *testing.T) { searchDir := "testdata/simple3" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") @@ -1310,7 +1312,7 @@ func TestParseStructComment(t *testing.T) { searchDir := "testdata/struct_comment" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") assert.Equal(t, expected, string(b)) @@ -1385,7 +1387,7 @@ func TestParseNonExportedJSONFields(t *testing.T) { searchDir := "testdata/non_exported_json_fields" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") assert.Equal(t, expected, string(b)) @@ -1418,7 +1420,7 @@ func TestParsePetApi(t *testing.T) { searchDir := "testdata/pet" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") assert.Equal(t, expected, string(b)) @@ -1487,7 +1489,7 @@ func TestParseModelAsTypeAlias(t *testing.T) { searchDir := "testdata/alias_type" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") @@ -1498,7 +1500,7 @@ func TestParseComposition(t *testing.T) { searchDir := "testdata/composition" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) expected, err := ioutil.ReadFile(filepath.Join(searchDir, "expected.json")) @@ -1514,7 +1516,7 @@ func TestParseImportAliases(t *testing.T) { searchDir := "testdata/alias_import" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) expected, err := ioutil.ReadFile(filepath.Join(searchDir, "expected.json")) @@ -1530,7 +1532,7 @@ func TestParseNested(t *testing.T) { mainAPIFile := "main.go" p := New() p.ParseDependency = true - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) expected, err := ioutil.ReadFile(filepath.Join(searchDir, "expected.json")) @@ -1545,7 +1547,7 @@ func TestParseDuplicated(t *testing.T) { mainAPIFile := "main.go" p := New() p.ParseDependency = true - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.Errorf(t, err, "duplicated @id declarations successfully found") } @@ -1554,7 +1556,7 @@ func TestParseConflictSchemaName(t *testing.T) { mainAPIFile := "main.go" p := New() p.ParseDependency = true - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") expected, err := ioutil.ReadFile(filepath.Join(searchDir, "expected.json")) @@ -2104,7 +2106,7 @@ func Test3(){ // for i := 0; i < 100; i++ { // p := New() // p.PropNamingStrategy = PascalCase -// err := p.ParseAPI(searchDir, mainAPIFile) +// err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) // b, _ := json.MarshalIndent(p.swagger, "", " ") // assert.NotEqual(t, "", string(b)) @@ -2123,7 +2125,7 @@ func TestApiParseTag(t *testing.T) { mainAPIFile := "main.go" p := New(SetMarkdownFileDirectory(searchDir)) p.PropNamingStrategy = PascalCase - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) if len(p.swagger.Tags) != 3 { @@ -2152,7 +2154,7 @@ func TestParseTagMarkdownDescription(t *testing.T) { mainAPIFile := "main.go" p := New(SetMarkdownFileDirectory(searchDir)) p.PropNamingStrategy = PascalCase - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) if err != nil { t.Error("Failed to parse api description: " + err.Error()) } @@ -2172,7 +2174,7 @@ func TestParseApiMarkdownDescription(t *testing.T) { mainAPIFile := "main.go" p := New(SetMarkdownFileDirectory(searchDir)) p.PropNamingStrategy = PascalCase - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) if err != nil { t.Error("Failed to parse api description: " + err.Error()) } @@ -2186,7 +2188,7 @@ func TestIgnoreInvalidPkg(t *testing.T) { searchDir := "testdata/deps_having_invalid_pkg" mainAPIFile := "main.go" p := New() - if err := p.ParseAPI(searchDir, mainAPIFile); err != nil { + if err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth); err != nil { t.Error("Failed to ignore valid pkg: " + err.Error()) } } @@ -2196,7 +2198,7 @@ func TestFixes432(t *testing.T) { mainAPIFile := "cmd/main.go" p := New() - if err := p.ParseAPI(searchDir, mainAPIFile); err != nil { + if err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth); err != nil { t.Error("Failed to ignore valid pkg: " + err.Error()) } } @@ -2207,7 +2209,7 @@ func TestParseOutsideDependencies(t *testing.T) { p := New() p.ParseDependency = true - if err := p.ParseAPI(searchDir, mainAPIFile); err != nil { + if err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth); err != nil { t.Error("Failed to parse api: " + err.Error()) } } @@ -2408,7 +2410,7 @@ func TestParseJSONFieldString(t *testing.T) { searchDir := "testdata/json_field_string" mainAPIFile := "main.go" p := New() - err := p.ParseAPI(searchDir, mainAPIFile) + err := p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) assert.NoError(t, err) b, _ := json.MarshalIndent(p.swagger, "", " ") assert.Equal(t, expected, string(b))