Skip to content

Commit 7ea316c

Browse files
committed
v2.1 generation
1 parent a45159b commit 7ea316c

File tree

41 files changed

+11622
-11288
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+11622
-11288
lines changed

examples_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import (
1414
"os"
1515

1616
"github.com/jfcote87/esign"
17-
"github.com/jfcote87/esign/v2/envelopes"
18-
"github.com/jfcote87/esign/v2/folders"
19-
"github.com/jfcote87/esign/v2/model"
17+
"github.com/jfcote87/esign/v2.1/envelopes"
18+
"github.com/jfcote87/esign/v2.1/folders"
19+
"github.com/jfcote87/esign/v2.1/model"
2020
)
2121

2222
func ExampleOAuth2Config() {

gen-esign/main.go

+197-53
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,31 @@ import (
2323

2424
const (
2525
openAPIdefinition = "https://github.com/docusign/eSign-OpenAPI-Specification"
26-
generatorVersion = "20171011"
26+
generatorVersion = "20190720"
2727
)
2828

2929
var (
3030
basePkg = flag.String("basepkg", "github.com/jfcote87/esign", "root package in gopath")
3131
baseDir = flag.String("src", ".", "src directory")
3232
templDir = flag.String("template", "gen-esign/templates", "directory containing output templates.")
3333
buildFlag = flag.Bool("build", false, "Compile generated packages.")
34-
swaggerFile = flag.String("swagger_file", "gen-esign/esignature.rest.swagger-v2.1.json", "If non-empty, the path to a local file on disk containing the API to generate. Exclusive with setting --api.")
34+
swaggerFile = flag.String("swagger_file", "gen-esign/esignature.rest.swagger-v2.1.json,gen-esign/esignature.rest.swagger.json", "If non-empty, comma separated list to local files containing the API version definitions.")
3535
skipFormat = flag.Bool("skip_format", false, "skip gofmt command")
36-
version = flag.String("version", "v2.1", "API Version - defaults to v2")
37-
docprefix = flag.String("docprefix", "v2.1/", "documentation prefix")
3836
)
3937

40-
// main program
38+
// Version contains parameters for generating an eSignature version
39+
type Version struct {
40+
FilePath string // json swagger file
41+
VersionNm string // Blank or v2 for version 2, v2.1 for version 2.1
42+
DocPrefix string
43+
CallVersion string
44+
Prefix string
45+
Templates *template.Template // templates
46+
BaseDir string // source directory
47+
BasePkg string
48+
SkipFormat bool
49+
}
50+
4151
func main() {
4252
flag.Parse()
4353

@@ -53,7 +63,139 @@ func main() {
5363
if err == nil && strings.HasPrefix(*baseDir, "/") {
5464
*baseDir, err = os.Getwd()
5565
}
56-
doc, err := getDocument()
66+
67+
if !strings.HasPrefix(*templDir, "/") {
68+
*templDir = path.Join(*baseDir, *templDir)
69+
}
70+
genTemplates, err := template.ParseFiles(path.Join(*templDir, "service.tmpl"), path.Join(*templDir, "/model.tmpl"))
71+
if err != nil {
72+
log.Fatalf("Templates: %v", err)
73+
}
74+
75+
for _, file := range strings.Split(*swaggerFile, ",") {
76+
if err := os.Chdir(*baseDir); err != nil {
77+
log.Fatalf("unable to change director to %s", *baseDir)
78+
}
79+
log.Printf("Starting %s", file)
80+
doc, err := getDocument(file)
81+
if err != nil {
82+
log.Fatalf("unable to open/parse %s: %v", file, err)
83+
}
84+
sort.Sort(doc.Definitions)
85+
86+
var filePath string
87+
var docPrefix string
88+
var callVersion string
89+
switch doc.Info.Version {
90+
case "v2":
91+
filePath = "v2/"
92+
docPrefix = "v2/"
93+
callVersion = ""
94+
case "v2.1":
95+
filePath = "v2.1/"
96+
docPrefix = ""
97+
callVersion = "esign.VersionV21"
98+
default:
99+
log.Fatalf("unknown version %s", doc.Info.Version)
100+
}
101+
log.Printf("starting %s generation", doc.Info.Version)
102+
103+
v := &Version{
104+
BasePkg: *basePkg,
105+
BaseDir: *baseDir,
106+
Templates: genTemplates,
107+
VersionNm: doc.Info.Version,
108+
DocPrefix: docPrefix,
109+
FilePath: filePath,
110+
SkipFormat: *skipFormat,
111+
CallVersion: callVersion,
112+
}
113+
if err := v.genVersion(doc); err != nil {
114+
log.Fatalf("%v", err)
115+
}
116+
log.Printf("%s completed", doc.Info.Version)
117+
118+
}
119+
}
120+
121+
func (ver *Version) genVersion(doc *Document) error {
122+
// Put the Definitions (structs) in order
123+
defMap := make(map[string]Definition)
124+
structName := ""
125+
defList := make([]Definition, 0, len(doc.Definitions))
126+
// create defMap for lookup later field and parameter
127+
// lookups. Make certain defList has only unique names.
128+
129+
for _, def := range doc.Definitions {
130+
defMap["#/definitions/"+def.ID] = def
131+
if structName != def.Name {
132+
defList = append(defList, def)
133+
}
134+
structName = def.Name
135+
}
136+
137+
// generate model.go first
138+
if err := ver.doModel(defList, defMap); err != nil {
139+
return fmt.Errorf("%v Generating model.go failed: %v", ver.VersionNm, err)
140+
}
141+
142+
sort.Sort(doc.Operations)
143+
ops := make(map[string][]Operation, 0)
144+
for _, op := range doc.Operations {
145+
if op.Status == "restricted" {
146+
log.Printf("Skipping: %s %s", op.Status, op.OperationID)
147+
continue
148+
}
149+
if op.Service == "" {
150+
log.Printf("No service specified: %s", op.OperationID)
151+
continue
152+
}
153+
if newServiceName, ok := ServiceNameOverride[op.Service]; ok {
154+
op.Service = newServiceName
155+
}
156+
if !OperationSkipList[op.OperationID] {
157+
if overrideService, ok := serviceOverrides[op.OperationID]; ok {
158+
op.Service = overrideService
159+
}
160+
opList := ops[op.Service]
161+
opList = append(opList, op)
162+
ops[op.Service] = opList
163+
}
164+
}
165+
tagDescMap := make(map[string]string)
166+
for _, tag := range doc.DSTags {
167+
tagDescMap[tag.Name] = tag.Description
168+
}
169+
170+
serviceTmpl := ver.Templates.Lookup("service.tmpl")
171+
for k, v := range ops {
172+
log.Printf("Generating %s", k)
173+
descrip, _ := tagDescMap[k]
174+
175+
if err := ver.doPackage(serviceTmpl, k, descrip, v, defMap); err != nil {
176+
return fmt.Errorf("%s generate %s.go failed: %v", ver.VersionNm, k, err)
177+
}
178+
}
179+
return nil
180+
}
181+
182+
// main program
183+
/* func main2() {
184+
flag.Parse()
185+
186+
err := os.Chdir(*baseDir)
187+
if err != nil {
188+
log.Fatalf("unable to set directory to %s: %v", *baseDir, err)
189+
}
190+
if !strings.HasPrefix(*baseDir, "/") {
191+
if *baseDir, err = os.Getwd(); err != nil {
192+
log.Fatalf("unable to retrieve working diretory: %v", err)
193+
}
194+
}
195+
if err == nil && strings.HasPrefix(*baseDir, "/") {
196+
*baseDir, err = os.Getwd()
197+
}
198+
doc, err := getDocument(*swaggerFile)
57199
if err != nil {
58200
log.Fatalf("%v", err)
59201
}
@@ -83,7 +225,7 @@ func main() {
83225
}
84226
85227
// generate model.go first
86-
if err := doModel(genTemplates.Lookup("model.tmpl"), defList, defMap); err != nil {
228+
if err := v.doModel(genTemplates.Lookup("model.tmpl"), defList, defMap); err != nil {
87229
log.Fatalf("Generating model.go failed: %v", err)
88230
}
89231
@@ -123,12 +265,12 @@ func main() {
123265
log.Fatalf("generate %s.go failed: %v", k, err)
124266
}
125267
}
126-
}
268+
} */
127269

128270
// getDocument loads the swagger def file and applies overrides
129-
func getDocument() (*Document, error) {
271+
func getDocument(fn string) (*Document, error) {
130272
// Open swagger file and parse
131-
f, err := os.Open(*swaggerFile)
273+
f, err := os.Open(fn)
132274
if err != nil {
133275
return nil, fmt.Errorf("Unable to open: %v", err)
134276
}
@@ -158,35 +300,36 @@ func getDocument() (*Document, error) {
158300
}
159301

160302
// doModel generates the model.go in the model package
161-
func doModel(modelTempl *template.Template, defList []Definition, defMap map[string]Definition) error {
303+
func (ver *Version) doModel(defList []Definition, defMap map[string]Definition) error {
304+
modelTempl := ver.Templates.Lookup("model.tmpl")
162305
// create model.go
163-
f, err := makePackageFile("model") //os.Create("model.go")
306+
f, err := ver.makePackageFile("model") //os.Create("model.go")
164307
if err != nil {
165308
return err
166309
}
167310
defer func() {
168311
f.Close()
169-
if err == nil && !*skipFormat {
312+
if err == nil && !ver.SkipFormat {
170313
exec.Command("gofmt", "-s", "-w", "model.go").Run()
171314
}
172315
}()
173316
// get field overrides and tab overrides
174317
fldOverrides := GetFieldOverrides()
175-
tabDefs := V21TabDefs(defMap, fldOverrides)
318+
tabDefs := TabDefs(ver.VersionNm, defMap, fldOverrides)
176319
var data = struct {
177-
Definitions []Definition
178-
DefMap map[string]Definition
179-
FldOverrides map[string]map[string]string
180-
CustomCode string
181-
DocPrefix string
182-
VersionPrefix string
320+
Definitions []Definition
321+
DefMap map[string]Definition
322+
FldOverrides map[string]map[string]string
323+
CustomCode string
324+
DocPrefix string
325+
VersionID string
183326
}{
184-
Definitions: append(tabDefs, defList...), // Prepend tab definitions
185-
DefMap: defMap,
186-
FldOverrides: fldOverrides,
187-
CustomCode: CustomCode,
188-
DocPrefix: *docprefix,
189-
VersionPrefix: *version,
327+
Definitions: append(tabDefs, defList...), // Prepend tab definitions
328+
DefMap: defMap,
329+
FldOverrides: fldOverrides,
330+
CustomCode: CustomCode,
331+
DocPrefix: ver.Prefix,
332+
VersionID: ver.VersionNm,
190333
}
191334
return modelTempl.Execute(f, data)
192335
}
@@ -206,13 +349,13 @@ type ExtOperation struct {
206349
}
207350

208351
// doPackage creates a subpackage go file
209-
func doPackage(resTempl *template.Template, serviceName, description string, ops []Operation, defMap map[string]Definition) error {
352+
func (ver *Version) doPackage(resTempl *template.Template, serviceName, description string, ops []Operation, defMap map[string]Definition) error {
210353
packageName := strings.ToLower(serviceName)
211354
comments := strings.Split(strings.TrimRight(description, "\n"), "\n")
212355
if packageName == "uncategorized" {
213356
comments = append(comments, "Uncategorized calls may change or move to other packages.")
214357
}
215-
f, err := makePackageFile(packageName)
358+
f, err := ver.makePackageFile(packageName)
216359
if err != nil {
217360
return err
218361
}
@@ -235,26 +378,27 @@ func doPackage(resTempl *template.Template, serviceName, description string, ops
235378
})
236379
}
237380
var data = struct {
238-
Service string
239-
Package string
240-
Directory string
241-
Operations []ExtOperation
242-
Comments []string
243-
Packages []string
244-
DocPrefix string
245-
VersionPrefix string
246-
VersionDef string
247-
AddDocLinks bool
381+
Service string
382+
Package string
383+
Directory string
384+
Operations []ExtOperation
385+
Comments []string
386+
Packages []string
387+
DocPrefix string
388+
VersionID string
389+
CallVersion string
390+
AddDocLinks bool
248391
}{
249-
Service: serviceName,
250-
Package: packageName,
251-
Directory: *basePkg,
252-
Operations: extOps,
253-
Comments: comments,
254-
Packages: []string{`"context"`, `"net/url"`},
255-
DocPrefix: *docprefix,
256-
VersionPrefix: *version,
257-
AddDocLinks: (serviceName != "Uncategorized"),
392+
Service: serviceName,
393+
Package: packageName,
394+
Directory: ver.BasePkg,
395+
Operations: extOps,
396+
Comments: comments,
397+
Packages: []string{`"context"`, `"net/url"`},
398+
DocPrefix: ver.DocPrefix,
399+
VersionID: ver.VersionNm,
400+
CallVersion: ver.CallVersion,
401+
AddDocLinks: (serviceName != "Uncategorized"),
258402
}
259403
importMap := make(map[string]bool)
260404
for _, op := range extOps {
@@ -290,7 +434,7 @@ func doPackage(resTempl *template.Template, serviceName, description string, ops
290434
data.Packages = append(data.Packages,
291435
"",
292436
"\""+*basePkg+"\"",
293-
"\""+*basePkg+"/"+*version+"/model\"")
437+
"\""+*basePkg+"/"+ver.VersionNm+"/model\"")
294438

295439
defer func() {
296440
f.Close()
@@ -301,16 +445,16 @@ func doPackage(resTempl *template.Template, serviceName, description string, ops
301445
return resTempl.Execute(f, data)
302446
}
303447

304-
func getEsignDir() string {
305-
p := path.Join(*baseDir, *version)
306-
if strings.HasPrefix(p, *version) {
448+
func (ver *Version) getEsignDir() string {
449+
p := path.Join(ver.BaseDir, ver.VersionNm)
450+
if strings.HasPrefix(p, ver.VersionNm) {
307451
p = "./" + p
308452
}
309453
return p
310454
}
311455

312-
func makePackageFile(packageName string) (*os.File, error) {
313-
pkgDir := getEsignDir() + "/" + packageName
456+
func (ver *Version) makePackageFile(packageName string) (*os.File, error) {
457+
pkgDir := ver.getEsignDir() + "/" + packageName
314458

315459
if err := os.Chdir(pkgDir); err != nil {
316460
if os.IsNotExist(err) {

0 commit comments

Comments
 (0)