Skip to content

Commit

Permalink
More mangling for generated package names and path
Browse files Browse the repository at this point in the history
Makes generation functional and consistent regarding:
* dashes in names
* reserved suffixes, which are meaningful for go, like 'test'
* sub-directories specified as target names (e.g. 'api/subdir')
* packages for client, model and server

* fixes go-swagger#1683
* fixes go-swagger#1157
* fixes go-swagger#1624

* replaces go-swagger#1790

Signed-off-by: Frederic BIDON <[email protected]>
  • Loading branch information
fredbi committed Nov 18, 2018
1 parent 1f7a333 commit 2b5c275
Show file tree
Hide file tree
Showing 22 changed files with 5,878 additions and 144 deletions.
5 changes: 4 additions & 1 deletion cmd/swagger/commands/generate/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,11 @@ func (c *Client) log(rp string) {
For this generation to compile you need to have some packages in your GOPATH:
* github.com/go-openapi/errors
* github.com/go-openapi/strfmt
* github.com/go-openapi/runtime
* golang.org/x/net/context/ctxhttp
* github.com/go-openapi/runtime/client
* golang.org/x/net/context
You can get these now with: go get -u -f %s/...
`, rp)
Expand Down
4 changes: 4 additions & 0 deletions fixtures/bugs/1683/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
gen-*
target*
!gen-fixtures.sh
*.log
5,432 changes: 5,432 additions & 0 deletions fixtures/bugs/1683/README.md

Large diffs are not rendered by default.

70 changes: 70 additions & 0 deletions fixtures/bugs/1683/fixture-1683.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
swagger: "2.0"
info:
title: "tag name conflict"
version: "0.0.1"
description: "repro issue 1683"
license:
name: "Apache 2.0"
url: "http://www.apache.org/licenses/LICENSE-2.0.html"
definitions:
records:
type: array
maxItems: 10
items:
type: object
paths:
/my/route:
get:
operationId: getRecords
summary: get some data
tags: [test]
parameters:
- name: inBody
in: body
required: true
schema:
type: array
items:
$ref: '#/definitions/records'
responses:
200:
description: "OK"
schema:
$ref: '#/definitions/records'
/her/route:
get:
operationId: getOthers
summary: get some other data
tags: [test-dash]
parameters:
- name: inBody
in: body
required: true
schema:
type: array
items:
$ref: '#/definitions/records'
responses:
200:
description: "OK"
schema:
$ref: '#/definitions/records'
/our/route:
get:
operationId: getYetAnother
summary: get yet some other data
tags: [test_underscore]
parameters:
- name: inBody
in: body
required: true
schema:
type: array
items:
$ref: '#/definitions/records'
responses:
200:
description: "OK"
schema:
$ref: '#/definitions/records'
84 changes: 84 additions & 0 deletions fixtures/bugs/1683/gen-fixtures.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#! /bin/bash
# Verifies consistent generation, for client, server and models
# of a simple spec with various target packages params.
set -euxo pipefail
testcases="fixture-1683.yaml"

allTargets="target target-withDash target/subDir target-test target/sub1/sub2"
#for dir in ${allTargets}; do
# rm -rf ${dir}*
#done
rm -rf codegen*

#targetDirs=${allTargets}
targetDirs="target"
#modelPkgs="mabc"
modelPkgs="mabc mabc/msubdir mabc-dashed mabc-dashed/msubdir mabc/sub1/msub2 mabc-test"
#serverPkgs="sabc"
serverPkgs="sabc sabc/ssubdir sabc-dashed sabc-dashed/ssubdir sabc/sub1/ssub2 sabc-test"
#clientPkgs="cabc"
clientPkgs="cabc cabc/csubdir cabc-dashed cabc-dashed/csubdir cabc/sub1/csub2 cabc-test"
#apiPkgs="aabc"
apiPkgs="aabc aabc/asubdir aabc-dashed aabc-dashed/asubdir aabc/sub1/asub2 aabc-test"
serverNames="nrcodegen"
#serverNames="nrcodegen nrcodegen-test nrcodegen_underscored" #no slashes to support here

opts=""
t=0
for spec in ${testcases} ; do
log=${spec%.*}.log
for target in ${targetDirs} ; do
let t=t+1
target="codegen${t}/${target}"
echo "Testing target: ${target}"
i=0
for modelPkg in "" ${modelPkgs} ; do
echo "Testing model package: ${modelPkg:-models}"
let i=i+1
tg=${target}${i}
rm -rf ${tg} && mkdir -p ${tg}
cmd="swagger generate model --skip-validation ${opts} --spec=${spec} --model-package=${modelPkg:-models} --target=${tg}"
echo ${cmd} > ${tg}/README.md
${cmd} 1>${tg}/${log} 2>&1
gen=${tg}/${modelPkg:-models}
path=`dirname ${gen}`
base=`basename ${gen}`
base=`echo ${base}|tr '-' '_'`
gen=${path}/${base}
(cd ${gen}; go build && echo "Model OK")

for serverPkg in "" ${serverPkgs} ; do
echo "Testing server package: ${serverPkg:-restapi}"
for serverName in ${serverNames} ; do
for apiPkg in "" ${apiPkgs} ; do
echo "Testing API package: ${apiPkg:-operations}"
let i=i+1
tg=${target}${i}
rm -rf ${tg} && mkdir -p ${tg}
cmd="swagger generate server --skip-validation ${opts} --spec=${spec} --model-package=${modelPkg:-models} --server-package=${serverPkg:-restapi} --api-package=${apiPkg:-operations} --target=${tg} --name=${serverName}"
echo ${cmd} > ${tg}/README.md
${cmd} 1>${tg}/${log} 2>&1
newName=$(echo ${serverName}|sed 's/-*test$//'|tr '_' '-')
(cd ${tg}/cmd/${newName}"-server"; go build && echo "Server OK")
done
done
done

for clientPkg in "" ${clientPkgs} ; do
echo "Testing client package: ${clientPkg:-client}"
let i=i+1
tg=${target}${i}
rm -rf ${tg} && mkdir -p ${tg}
cmd="swagger generate client --skip-validation ${opts} --spec=${spec} --model-package=${modelPkg:-models} --client-package=${clientPkg:-client} --target=${tg} --name=${serverName}"
echo ${cmd} > ${tg}/README.md
${cmd} 1>${tg}/${log} 2>&1
gen=${tg}/${clientPkg:-client}
path=`dirname ${gen}`
base=`basename ${gen}`
base=`echo ${base}|tr '-' '_'`
gen=${path}/${base}
(cd ${gen} ; go build && echo "Client OK")
done
done
done
done
24 changes: 12 additions & 12 deletions generator/bindata.go

Large diffs are not rendered by default.

15 changes: 11 additions & 4 deletions generator/build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ import (
flags "github.com/jessevdk/go-flags"
)

const (
defaultAPIPackage = "operations"
defaultClientPackage = "client"
defaultModelPackage = "models"
defaultServerPackage = "restapi"
)

func TestGenerateAndBuild(t *testing.T) {
defer func() {
log.SetOutput(os.Stdout)
Expand Down Expand Up @@ -76,9 +83,9 @@ func newTestClient(input, output string) *generate.Client {
}
c.Spec = flags.Filename(input)
c.Target = flags.Filename(output)
c.APIPackage = "operations"
c.ModelPackage = "models"
c.ServerPackage = "restapi"
c.ClientPackage = "client"
c.APIPackage = defaultAPIPackage
c.ModelPackage = defaultModelPackage
c.ServerPackage = defaultServerPackage
c.ClientPackage = defaultClientPackage
return c
}
68 changes: 12 additions & 56 deletions generator/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import (
"sort"

"github.com/go-openapi/analysis"
"github.com/go-openapi/loads"
"github.com/go-openapi/runtime"
"github.com/go-openapi/swag"
)
Expand All @@ -48,19 +47,7 @@ func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpt
}

// Load the spec
var err error
var specDoc *loads.Document
opts.Spec, err = findSwaggerSpec(opts.Spec)
if err != nil {
return err
}

if !filepath.IsAbs(opts.Spec) {
cwd, _ := os.Getwd()
opts.Spec = filepath.Join(cwd, opts.Spec)
}

opts.Spec, specDoc, err = loadSpec(opts.Spec)
_, specDoc, err := loadSpec(opts.Spec)
if err != nil {
return err
}
Expand Down Expand Up @@ -107,12 +94,12 @@ func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpt
Operations: operations,
Target: opts.Target,
DumpData: opts.DumpData,
Package: opts.LanguageOpts.MangleName(swag.ToFileName(opts.ClientPackage), "client"),
APIPackage: opts.LanguageOpts.MangleName(swag.ToFileName(opts.APIPackage), "api"),
ModelsPackage: opts.LanguageOpts.MangleName(swag.ToFileName(opts.ModelPackage), "definitions"),
ServerPackage: opts.LanguageOpts.MangleName(swag.ToFileName(opts.ServerPackage), "server"),
ClientPackage: opts.LanguageOpts.MangleName(swag.ToFileName(opts.ClientPackage), "client"),
OperationsPackage: opts.LanguageOpts.MangleName(swag.ToFileName(opts.ClientPackage), "client"),
Package: opts.LanguageOpts.ManglePackageName(opts.ClientPackage, "client"),
APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"),
ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"),
ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"),
ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"),
OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"),
Principal: opts.Principal,
DefaultScheme: defaultScheme,
DefaultProduces: defaultProduces,
Expand All @@ -123,11 +110,6 @@ func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpt
return (&clientGenerator{generator}).Generate()
}

func manglePackageName(opts *GenOpts, nm, def string) string {
dir, fn := filepath.Split(nm)
return opts.LanguageOpts.MangleName(filepath.Join(dir, swag.ToFileName(fn)), def)
}

type clientGenerator struct {
appGenerator
}
Expand All @@ -143,9 +125,10 @@ func (c *clientGenerator) Generate() error {
if app.Imports == nil {
app.Imports = make(map[string]string)
}
app.Imports[c.ModelsPackage] = filepath.ToSlash(filepath.Join(baseImport, manglePackageName(c.GenOpts, c.GenOpts.ModelPackage, "models")))
pkgAlias := c.GenOpts.LanguageOpts.ManglePackageName(c.ModelsPackage, "models")
app.Imports[pkgAlias] = filepath.ToSlash(filepath.Join(baseImport, c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ModelPackage, "models")))
} else {
app.DefaultImports = append(app.DefaultImports, c.GenOpts.ExistingModels)
app.DefaultImports = append(app.DefaultImports, c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ExistingModels, ""))
}
if err != nil {
return err
Expand All @@ -157,28 +140,18 @@ func (c *clientGenerator) Generate() error {
return nil
}

// errChan := make(chan error, 100)
// wg := nsync.NewControlWaitGroup(20)

if c.GenOpts.IncludeModel {
for _, mod := range app.Models {
// if len(errChan) > 0 {
// wg.Wait()
// return <-errChan
// }
modCopy := mod
// wg.Do(func() {
modCopy.IncludeValidator = true
if !mod.IsStream {
if err := c.GenOpts.renderDefinition(&modCopy); err != nil {
return err
}
}
// })
}
}

// wg.Wait()
if c.GenOpts.IncludeHandler {
sort.Sort(app.OperationGroups)
for i := range app.OperationGroups {
Expand All @@ -189,45 +162,28 @@ func (c *clientGenerator) Generate() error {
app.OperationGroups[i] = opGroup
sort.Sort(opGroup.Operations)
for _, op := range opGroup.Operations {
// if len(errChan) > 0 {
// wg.Wait()
// return <-errChan
// }
opCopy := op
if opCopy.Package == "" {
opCopy.Package = c.Package
}
// wg.Do(func() {
if err := c.GenOpts.renderOperation(&opCopy); err != nil {
return err
}
// })
}
app.DefaultImports = append(app.DefaultImports, filepath.ToSlash(filepath.Join(baseImport, c.ClientPackage, opGroup.Name)))
app.DefaultImports = append(app.DefaultImports, filepath.ToSlash(filepath.Join(baseImport,
c.GenOpts.LanguageOpts.ManglePackagePath(c.ClientPackage, "client"), opGroup.Name)))

// wg.Do(func() {
if err := c.GenOpts.renderOperationGroup(&opGroup); err != nil {
// errChan <- err
return err
}
// })
}
// wg.Wait()
}

if c.GenOpts.IncludeSupport {
// wg.Do(func() {
if err := c.GenOpts.renderApplication(&app); err != nil {
return err
}
// })
}

// wg.Wait()

// if len(errChan) > 0 {
// return <-errChan
// }

return nil
}
Loading

0 comments on commit 2b5c275

Please sign in to comment.