func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, inputPath string, boilerplate []byte, generatedBy string) generator.Package { outputPackagePath := filepath.Join(packageBasePath, gv.Group, gv.Version) return &generator.DefaultPackage{ PackageName: gv.Version, PackagePath: outputPackagePath, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// This package has the automatically generated typed clients. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range typeList { generators = append(generators, &genClientForType{ DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(c.Namers["private"].Name(t)), }, outputPackage: outputPackagePath, group: normalization.BeforeFirstDot(gv.Group), version: gv.Version, typeToMatch: t, imports: generator.NewImportTracker(), }) } generators = append(generators, &genGroup{ DefaultGen: generator.DefaultGen{ OptionalName: normalization.BeforeFirstDot(gv.Group) + "_client", }, outputPackage: outputPackagePath, inputPacakge: inputPath, group: gv.Group, version: gv.Version, types: typeList, imports: generator.NewImportTracker(), }) expansionFileName := "generated_expansion" generators = append(generators, &genExpansion{ groupPath: filepath.Join(srcTreePath, outputPackagePath), DefaultGen: generator.DefaultGen{ OptionalName: expansionFileName, }, types: typeList, }) return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, } }
func factoryPackage(basePackage string, boilerplate []byte, groupVersions map[string]clientgentypes.GroupVersions, internalClientSetPackage, versionedClientSetPackage string, typesForGroupVersion map[clientgentypes.GroupVersion][]*types.Type) generator.Package { return &generator.DefaultPackage{ PackageName: filepath.Base(basePackage), PackagePath: basePackage, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = append(generators, &factoryGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "factory", }, outputPackage: basePackage, imports: generator.NewImportTracker(), groupVersions: groupVersions, internalClientSetPackage: internalClientSetPackage, versionedClientSetPackage: versionedClientSetPackage, internalInterfacesPackage: packageForInternalInterfaces(basePackage), }) generators = append(generators, &genericGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "generic", }, outputPackage: basePackage, imports: generator.NewImportTracker(), groupVersions: groupVersions, typesForGroupVersion: typesForGroupVersion, }) return generators }, } }
func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, inputPath string, boilerplate []byte, generatedBy string) generator.Package { outputPackagePath := strings.ToLower(filepath.Join(packageBasePath, gv.Group.NonEmpty(), gv.Version.NonEmpty(), "fake")) // TODO: should make this a function, called by here and in client-generator.go realClientPath := filepath.Join(packageBasePath, gv.Group.NonEmpty(), gv.Version.NonEmpty()) return &generator.DefaultPackage{ PackageName: "fake", PackagePath: outputPackagePath, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// Package fake has the automatically generated clients. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range typeList { generators = append(generators, &genFakeForType{ DefaultGen: generator.DefaultGen{ OptionalName: "fake_" + strings.ToLower(c.Namers["private"].Name(t)), }, outputPackage: outputPackagePath, group: gv.Group.NonEmpty(), version: gv.Version.String(), inputPackage: inputPath, typeToMatch: t, imports: generator.NewImportTracker(), }) } generators = append(generators, &genFakeForGroup{ DefaultGen: generator.DefaultGen{ OptionalName: "fake_" + gv.Group.NonEmpty() + "_client", }, outputPackage: outputPackagePath, realClientPath: realClientPath, group: gv.Group.NonEmpty(), version: gv.Version.String(), types: typeList, imports: generator.NewImportTracker(), }) return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, } }
func packageForClientset(customArgs clientgenargs.Args, typedClientBasePath string, boilerplate []byte, generatedBy string) generator.Package { return &generator.DefaultPackage{ PackageName: customArgs.ClientsetName, PackagePath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// This package has the automatically generated clientset. `), // GeneratorFunc returns a list of generators. Each generator generates a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, &genClientset{ DefaultGen: generator.DefaultGen{ OptionalName: "clientset", }, groupVersions: customArgs.GroupVersions, typedClientPath: typedClientBasePath, outputPackage: customArgs.ClientsetName, imports: generator.NewImportTracker(), }, } return generators }, } }
func groupPackage(basePackage string, groupVersions clientgentypes.GroupVersions, boilerplate []byte) generator.Package { packagePath := filepath.Join(basePackage, strings.ToLower(groupVersions.Group.NonEmpty())) return &generator.DefaultPackage{ PackageName: strings.ToLower(groupVersions.Group.NonEmpty()), PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = append(generators, &groupInterfaceGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "interface", }, outputPackage: packagePath, groupVersions: groupVersions, imports: generator.NewImportTracker(), internalInterfacesPackage: packageForInternalInterfaces(basePackage), }) return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { // piggy-back on types that are tagged for client-gen return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, } }
func PackageForClientset(customArgs clientgenargs.Args, typedClientBasePath string, boilerplate []byte, generatedBy string) generator.Package { return &generator.DefaultPackage{ // TODO: we'll generate fake clientset for different release in the future. // Package name and path are hard coded for now. PackageName: "fake", PackagePath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName, "fake"), HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// This package has the automatically generated fake clientset. `), // GeneratorFunc returns a list of generators. Each generator generates a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, &genClientset{ DefaultGen: generator.DefaultGen{ OptionalName: "clientset_generated", }, groups: customArgs.Groups, typedClientPath: typedClientBasePath, outputPackage: "fake", imports: generator.NewImportTracker(), clientsetPath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), }, } return generators }, } }
func NewOpenAPIGen(sanitizedName string, targetPackage *types.Package, context *generator.Context) generator.Generator { return &openAPIGen{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, imports: generator.NewImportTracker(), targetPackage: targetPackage, context: context, } }
func versionPackage(basePackage string, gv clientgentypes.GroupVersion, boilerplate []byte, typesToGenerate []*types.Type, internalClientSetPackage, versionedClientSetPackage, listersPackage string) generator.Package { packagePath := filepath.Join(basePackage, strings.ToLower(gv.Group.NonEmpty()), strings.ToLower(gv.Version.NonEmpty())) return &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = append(generators, &versionInterfaceGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "interface", }, outputPackage: packagePath, imports: generator.NewImportTracker(), types: typesToGenerate, internalInterfacesPackage: packageForInternalInterfaces(basePackage), }) for _, t := range typesToGenerate { generators = append(generators, &informerGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(t.Name.Name), }, outputPackage: packagePath, groupVersion: gv, typeToGenerate: t, imports: generator.NewImportTracker(), internalClientSetPackage: internalClientSetPackage, versionedClientSetPackage: versionedClientSetPackage, listersPackage: listersPackage, internalInterfacesPackage: packageForInternalInterfaces(basePackage), }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { // piggy-back on types that are tagged for client-gen return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, } }
func NewGenDeepCopy(sanitizedName, targetPackage string, boundingDirs []string, allTypes, registerTypes bool) generator.Generator { return &genDeepCopy{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, boundingDirs: boundingDirs, allTypes: allTypes, registerTypes: registerTypes, imports: generator.NewImportTracker(), typesForInit: make([]*types.Type, 0), } }
func NewGenDefaulter(sanitizedName, targetPackage string, existingDefaulters, newDefaulters defaulterFuncMap, peerPkgs []string) generator.Generator { return &genDefaulter{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, peerPackages: peerPkgs, newDefaulters: newDefaulters, existingDefaulters: existingDefaulters, imports: generator.NewImportTracker(), typesForInit: make([]*types.Type, 0), } }
func NewGenConversion(sanitizedName, targetPackage string, manualConversions conversionFuncMap, manualDefaulters defaulterFuncMap, peerPkgs []string) generator.Generator { return &genConversion{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, peerPackages: peerPkgs, manualConversions: manualConversions, manualDefaulters: manualDefaulters, imports: generator.NewImportTracker(), types: []*types.Type{}, skippedFields: map[*types.Type][]string{}, } }
func factoryInterfacePackage(basePackage string, boilerplate []byte, internalClientSetPackage, versionedClientSetPackage string, typesForGroupVersion map[clientgentypes.GroupVersion][]*types.Type) generator.Package { packagePath := packageForInternalInterfaces(basePackage) return &generator.DefaultPackage{ PackageName: filepath.Base(packagePath), PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = append(generators, &factoryInterfaceGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "internal_interfaces", }, outputPackage: packagePath, imports: generator.NewImportTracker(), internalClientSetPackage: internalClientSetPackage, versionedClientSetPackage: versionedClientSetPackage, }) return generators }, } }
// Packages makes the sets package definition. func Packages(_ *generator.Context, arguments *args.GeneratorArgs) generator.Packages { boilerplate, err := arguments.LoadGoBoilerplate() if err != nil { glog.Fatalf("Failed loading boilerplate: %v", err) } return generator.Packages{&generator.DefaultPackage{ PackageName: "sets", PackagePath: arguments.OutputPackagePath, HeaderText: append(boilerplate, []byte( ` // This file was autogenerated by set-gen. Do not edit it manually! `)...), PackageDocumentation: []byte( `// Package sets has auto-generated set types. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, // Make a separate file for the Empty type, since it's shared by every type. generator.DefaultGen{ OptionalName: "empty", OptionalBody: []byte(emptyTypeDecl), }, } // Since we want a file per type that we generate a set for, we // have to provide a function for this. for _, t := range c.Order { generators = append(generators, &genSet{ DefaultGen: generator.DefaultGen{ // Use the privatized version of the // type name as the file name. // // TODO: make a namer that converts // camelCase to '-' separation for file // names? OptionalName: c.Namers["private"].Name(t), }, outputPackage: arguments.OutputPackagePath, typeToMatch: t, imports: generator.NewImportTracker(), }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { // It would be reasonable to filter by the type's package here. // It might be necessary if your input directory has a big // import graph. switch t.Kind { case types.Map, types.Slice, types.Pointer: // These types can't be keys in a map. return false case types.Builtin: return true case types.Struct: // Only some structs can be keys in a map. This is triggered by the line // // +genset // or // // +genset=true return extractBoolTagOrDie("genset", t.CommentLines) == true } return false }, }} }
// Packages makes the client package definition. func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages { boilerplate, err := arguments.LoadGoBoilerplate() if err != nil { glog.Fatalf("Failed loading boilerplate: %v", err) } boilerplate = append(boilerplate, []byte(generatedBy())...) var packageList generator.Packages for _, inputDir := range arguments.InputDirs { p := context.Universe.Package(inputDir) objectMeta, err := objectMetaForPackage(p) if err != nil { glog.Fatal(err) } if objectMeta == nil { // no types in this package had genclient continue } var gv clientgentypes.GroupVersion var internalGVPkg string if isInternal(objectMeta) { lastSlash := strings.LastIndex(p.Path, "/") if lastSlash == -1 { glog.Fatalf("error constructing internal group version for package %q", p.Path) } gv.Group = clientgentypes.Group(p.Path[lastSlash+1:]) internalGVPkg = p.Path } else { parts := strings.Split(p.Path, "/") gv.Group = clientgentypes.Group(parts[len(parts)-2]) gv.Version = clientgentypes.Version(parts[len(parts)-1]) internalGVPkg = strings.Join(parts[0:len(parts)-1], "/") } var typesToGenerate []*types.Type for _, t := range p.Types { // filter out types which dont have genclient=true. if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { continue } typesToGenerate = append(typesToGenerate, t) } orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} typesToGenerate = orderer.OrderTypes(typesToGenerate) packagePath := filepath.Join(arguments.OutputPackagePath, strings.ToLower(gv.Group.NonEmpty()), strings.ToLower(gv.Version.NonEmpty())) packageList = append(packageList, &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = append(generators, &expansionGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "expansion_generated", }, packagePath: filepath.Join(arguments.OutputBase, packagePath), types: typesToGenerate, }) for _, t := range typesToGenerate { generators = append(generators, &listerGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(t.Name.Name), }, outputPackage: arguments.OutputPackagePath, groupVersion: gv, internalGVPkg: internalGVPkg, typeToGenerate: t, imports: generator.NewImportTracker(), objectMeta: objectMeta, }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { // piggy-back on types that are tagged for client-gen return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, }) } return packageList }