Skip to content

Commit d8316c0

Browse files
authored
fix: regex imports and validation when schema has pattern defined (#70)
Signed-off-by: amy <[email protected]>
1 parent 35bf76e commit d8316c0

File tree

4 files changed

+51
-13
lines changed

4 files changed

+51
-13
lines changed

examples/kube_resource/complex/muti_models/models/core_oam_dev_v1alpha2_containerized_workload.k

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
This file was generated by the KCL auto-gen tool. DO NOT EDIT.
33
Editing this file might prove futile when you re-run the KCL auto-gen generate command.
44
"""
5+
import regex
56
import k8s.apimachinery.pkg.apis.meta.v1
67

78

@@ -148,7 +149,7 @@ schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0EnvItems0:
148149

149150

150151
check:
151-
matchPattern(name, ^[-_a-zA-Z0-9]+$)
152+
regex.match(name, r"(^[-_a-zA-Z0-9]+$")
152153

153154

154155
schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0LivenessProbe:
@@ -284,7 +285,7 @@ schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0PortsItems0:
284285

285286

286287
check:
287-
matchPattern(name, ^[a-z]+$)
288+
regex.match(name, r"(^[a-z]+$")
288289

289290

290291
schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0ReadiessProbe:

pkg/kube_resource/generator/testdata/muti_models/models/core_oam_dev_v1alpha2_containerized_workload.k

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
This file was generated by the KCL auto-gen tool. DO NOT EDIT.
33
Editing this file might prove futile when you re-run the KCL auto-gen generate command.
44
"""
5+
import regex
56
import k8s.apimachinery.pkg.apis.meta.v1
67

78

@@ -148,7 +149,7 @@ schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0EnvItems0:
148149

149150

150151
check:
151-
matchPattern(name, ^[-_a-zA-Z0-9]+$)
152+
regex.match(name, r"(^[-_a-zA-Z0-9]+$")
152153

153154

154155
schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0LivenessProbe:
@@ -284,7 +285,7 @@ schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0PortsItems0:
284285

285286

286287
check:
287-
matchPattern(name, ^[a-z]+$)
288+
regex.match(name, r"(^[a-z]+$")
288289

289290

290291
schema CoreOamDevV1alpha2ContainerizedWorkloadSpecContainersItems0ReadiessProbe:

pkg/swagger/generator/model.go

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,31 +155,67 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema,
155155
GenSchema: pg.GenSchema,
156156
DependsOn: pg.Dependencies,
157157
ExtraSchemas: gatherExtraSchemas(pg.ExtraSchemas),
158-
Imports: collectSortedImports(pg.GenSchema),
158+
Imports: pg.collectSortedImports(),
159159
}, nil
160160
}
161161

162162
type importStmt struct {
163163
ImportPath string
164164
AsName string
165165
MustAsName bool
166+
IsBuiltIn bool
166167
}
167168

168-
func collectSortedImports(model GenSchema) []importStmt {
169-
importMap := map[string]importStmt{}
170-
collectImports(&model, model.Pkg, importMap)
171-
sortedPkgPaths := make([]string, 0, len(importMap))
172-
sortedImports := make([]importStmt, 0, len(importMap))
173-
for k := range importMap {
169+
func (sg *schemaGenContext) collectSortedImports() []importStmt {
170+
// collect built-in imports
171+
builtInImps := sg.GenSchema.getBuiltInImports()
172+
for _, schema := range sg.ExtraSchemas {
173+
imps := schema.getBuiltInImports()
174+
for pkg, imp := range imps {
175+
builtInImps[pkg] = imp
176+
}
177+
}
178+
179+
// collect pkg imports
180+
pkgImps := map[string]importStmt{}
181+
collectImports(&sg.GenSchema, sg.GenSchema.Pkg, pkgImps)
182+
183+
// sort imports with rules:
184+
// 1. built-in imports always appears before pkg imports
185+
// 2. the import paths are sorted in lexicographical order
186+
sortedImports := sortImports(builtInImps)
187+
for _, imp := range sortImports(pkgImps) {
188+
sortedImports = append(sortedImports, imp)
189+
}
190+
return sortedImports
191+
}
192+
193+
func sortImports(imports map[string]importStmt) []importStmt {
194+
sortedPkgPaths := make([]string, 0, len(imports))
195+
sortedImports := make([]importStmt, 0, len(imports))
196+
for k := range imports {
174197
sortedPkgPaths = append(sortedPkgPaths, k)
175198
}
176199
sort.Strings(sortedPkgPaths)
177200
for _, k := range sortedPkgPaths {
178-
sortedImports = append(sortedImports, importMap[k])
201+
sortedImports = append(sortedImports, imports[k])
179202
}
180203
return sortedImports
181204
}
182205

206+
func (schema *GenSchema) getBuiltInImports() map[string]importStmt {
207+
imp := map[string]importStmt{}
208+
for _, property := range schema.Properties {
209+
if len(property.Pattern) != 0 {
210+
imp["regex"] = importStmt{
211+
ImportPath: "regex",
212+
IsBuiltIn: true,
213+
}
214+
}
215+
}
216+
return imp
217+
}
218+
183219
// getImportAsName infers the <import as> name by the context of all the existing import paths and the current pkg to be imported.
184220
// the parent package name will be added as prefix to avoid import conflict
185221
func getImportAsName(imp map[string]importStmt, pkg string, module string) string {

pkg/swagger/generator/templates/schemavalidator.gotmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
len({{ .EscapedName }}) >= {{.MinLength}}
1515
{{- end }}
1616
{{- if .Pattern }}
17-
matchPattern({{ .EscapedName }}, {{.Pattern}})
17+
regex.match({{ .EscapedName }}, r"({{.Pattern}}"){{ if not .Required }} if {{ .EscapedName }}{{ end }}
1818
{{- end }}
1919
{{- if .UniqueItems }}
2020
isunique({{ .EscapedName }})

0 commit comments

Comments
 (0)