From 636c259474a5e7c5743d3084cca7b50f658d982c Mon Sep 17 00:00:00 2001 From: Alexander Zielenski Date: Tue, 14 Mar 2023 11:16:30 -0700 Subject: [PATCH] use referred type's type when it is not an object i think we should also do this when it has no GVK? objects with no GVK cant be explained --- .../pkg/explain/v2/templates/plaintext.tmpl | 26 +++++++++++++------ .../explain/v2/templates/plaintext_test.go | 24 +++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext.tmpl b/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext.tmpl index eab8a372d84..03681b744eb 100644 --- a/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext.tmpl +++ b/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext.tmpl @@ -88,7 +88,7 @@ Takes dictionary as argument with keys: {{- $subschema := index $resolved.properties (first $.FieldPath) -}} {{- if eq 1 (len $.FieldPath) -}} {{- /* TODO: The original explain would say RESOURCE instead of FIELD here under some circumstances */ -}} - FIELD: {{first $.FieldPath}} <{{ template "typeGuess" (dict "schema" $subschema) }}>{{"\n"}} + FIELD: {{first $.FieldPath}} <{{ template "typeGuess" (dict "schema" $subschema "Document" $.Document) }}>{{"\n"}} {{- "\n" -}} {{- end -}} {{- template "output" (set $nextContext "history" (dict) "FieldPath" (slice $.FieldPath 1) "schema" $subschema ) -}} @@ -149,7 +149,7 @@ Takes dictionary as argument with keys: {{- $nextContext := set $ "history" (set $.history $refString 1) -}} {{- $resolved := or (resolveRef $refString $.Document) $.schema -}} {{- range $k, $v := $resolved.properties -}} - {{- template "fieldDetail" (dict "name" $k "schema" $resolved "short" $.Recursive "level" $.level) -}} + {{- template "fieldDetail" (dict "name" $k "schema" $resolved "short" $.Recursive "level" $.level "Document" $.Document) -}} {{- if $.Recursive -}} {{- /* Check if we already know about this element */}} {{- template "fieldList" (set $nextContext "schema" $v "level" (add $.level 1)) -}} @@ -174,12 +174,13 @@ Takes dictionary as argument with keys: name: name of field short: limit printing to a single-line summary level: indentation amount + Document: openapi document */ -}} {{- define "fieldDetail" -}} {{- $level := or $.level 0 -}} {{- $indentAmount := mul $level 2 -}} {{- $fieldSchema := index $.schema.properties $.name -}} - {{- $.name | indent $indentAmount -}}{{"\t"}}<{{ template "typeGuess" (dict "schema" $fieldSchema) }}> + {{- $.name | indent $indentAmount -}}{{"\t"}}<{{ template "typeGuess" (dict "schema" $fieldSchema "Document" $.Document) }}> {{- if contains $.schema.required $.name}} -required-{{- end -}} {{- "\n" -}} {{- if not $.short -}} @@ -225,22 +226,31 @@ Takes dictionary as argument with keys: Takes dictionary as argument with keys: schema: openapiv3 JSON schema + Document: openapi document */ -}} {{- define "typeGuess" -}} {{- with $.schema -}} {{- if .items -}} - []{{template "typeGuess" (dict "schema" .items)}} + []{{template "typeGuess" (set $ "schema" .items)}} {{- else if .additionalProperties -}} - map[string]{{template "typeGuess" (dict "schema" .additionalProperties)}} + map[string]{{template "typeGuess" (set $ "schema" .additionalProperties)}} {{- else if and .allOf (not .properties) (eq (len .allOf) 1) -}} {{- /* If allOf has a single element and there are no direct properties on the schema, defer to the allOf */ -}} - {{- template "typeGuess" (dict "schema" (first .allOf)) -}} + {{- template "typeGuess" (set $ "schema" (first .allOf)) -}} {{- else if index . "$ref"}} {{- /* Parse the #!/components/schemas/io.k8s.Kind string into just the Kind name */ -}} {{- $ref := index . "$ref" -}} - {{- $name := split $ref "/" | last -}} - {{- or (split $name "." | last) "Object" -}} + {{- /* Look up ref schema to see primitive type. Only put the ref type name if it is an object. */ -}} + {{- $refSchema := resolveRef $ref $.Document -}} + {{- if (or (not $refSchema) (or (not $refSchema.type) (eq $refSchema.type "object"))) -}} + {{- $name := split $ref "/" | last -}} + {{- or (split $name "." | last) "Object" -}} + {{- else if $refSchema.type -}} + {{- or $refSchema.type "Object" -}} + {{- else -}} + {{- or .type "Object" -}} + {{- end -}} {{- else -}} {{/* Old explain used capitalized "Object". Just follow suit */}} {{- if eq .type "object" -}}Object diff --git a/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext_test.go b/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext_test.go index e0100f04d42..8b4048d0ede 100644 --- a/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext_test.go +++ b/staging/src/k8s.io/kubectl/pkg/explain/v2/templates/plaintext_test.go @@ -295,6 +295,30 @@ func TestPlaintext(t *testing.T) { checkEquals("string"), }, }, + { + // Show that a ref to a primitive type uses the referred type's type + Name: "PrimitiveRef", + Subtemplate: "typeGuess", + Context: map[string]any{ + "schema": map[string]any{ + "description": "a cool field", + "$ref": "#/components/schemas/v1.Time", + }, + "Document": map[string]any{ + "components": map[string]any{ + "schemas": map[string]any{ + "v1.Time": map[string]any{ + "type": "string", + "format": "date-time", + }, + }, + }, + }, + }, + Checks: []check{ + checkEquals("string"), + }, + }, { // Shows that the typeguess template behaves correctly given an // array with unknown items