Skip to content

Commit 80cae4a

Browse files
committed
Fix recursive schema
1 parent 2420492 commit 80cae4a

File tree

2 files changed

+68
-12
lines changed

2 files changed

+68
-12
lines changed

src/compute/gcp/descriptor.clj

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,22 @@
7272
api-version))
7373

7474
(defn resolve-all-refs
75-
[lookup-map resolve-ref]
76-
(walk/prewalk
77-
(fn [form]
78-
(if-let [ref-val (get form "$ref")]
79-
(resolve-ref ref-val)
80-
form))
81-
lookup-map))
75+
([lookup-map resolve-ref] (resolve-all-refs lookup-map resolve-ref []))
76+
([lookup-map resolve-ref path]
77+
(cond
78+
(map? lookup-map) (if-let [ref-val (get lookup-map "$ref")]
79+
(if (some #{ref-val} path)
80+
(assoc lookup-map ::recursive? true)
81+
(resolve-all-refs (resolve-ref ref-val) resolve-ref (conj path ref-val)))
82+
(into {}
83+
(map (fn [[k v]]
84+
[k (resolve-all-refs v resolve-ref path)]))
85+
lookup-map))
86+
(coll? lookup-map) (mapv (fn [x]
87+
(resolve-all-refs x resolve-ref path))
88+
89+
lookup-map)
90+
:else lookup-map)))
8291

8392
(defn resolve-descriptor-refs
8493
[descriptor]
@@ -103,8 +112,8 @@
103112
(def descriptor (read-descriptor "compute" "v1"))
104113
(keys descriptor)
105114
(first (::schemas descriptor))
106-
(count (filter (fn [[k v]] (get v "$ref")) (::schemas descriptor)))
107-
)
115+
(count (filter (fn [[k v]] (get v "$ref")) (::schemas descriptor))))
116+
108117

109118
(defn load-descriptor
110119
[api api-version]
@@ -113,8 +122,8 @@
113122
(comment
114123
(def loaded-descriptor (load-descriptor "compute" "v1"))
115124
(keys (::op->info loaded-descriptor))
116-
(get-in loaded-descriptor [::op->info "compute.instances.insert"])
117-
)
125+
(get-in loaded-descriptor [::op->info "compute.instances.insert"]))
126+
118127

119128
(defn get-op-info
120129
[descriptor op]

test/compute/gcp/impl/descriptor_test.clj

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,51 @@
66

77
(deftest api-descriptor-resource-path-test
88
(is (= "computesoftware/api-descriptors/compute/v1/api-descriptor.edn"
9-
(descriptor/api-descriptor-resource-path :compute "v1"))))
9+
(descriptor/api-descriptor-resource-path :compute "v1"))))
10+
11+
12+
(deftest recursive-schema
13+
(is (= {"nonref" {"type" "object"}
14+
15+
"TableSchema"
16+
{"type" "object"
17+
"properties" {"fields" {"items" {"type" "object"
18+
"properties"
19+
{"fields"
20+
{"items"
21+
{"$ref" "TableFieldSchema"
22+
:compute.gcp.descriptor/recursive?
23+
true}
24+
"type" "array"}}
25+
"id" "TableFieldSchema"}
26+
"type" "array"}
27+
"fields2" {"items" {"type" "object"}, "type" "array"}
28+
"fields3" {"items" {"type" "object"}, "type" "array"}}
29+
"id" "TableSchema"}
30+
"TableFieldSchema"
31+
{"type" "object"
32+
"properties" {"fields" {"items" {"type" "object"
33+
"properties" {"fields" {"items" {"$ref" "TableFieldSchema"
34+
:compute.gcp.descriptor/recursive?
35+
true}
36+
"type" "array"}},
37+
"id" "TableFieldSchema"}
38+
"type" "array"}}
39+
"id" "TableFieldSchema"}}
40+
(-> (descriptor/resolve-descriptor-refs
41+
{:compute.gcp.descriptor/schemas
42+
{"nonref" {"type" "object"}
43+
"TableSchema" {"type" "object",
44+
"properties" {"fields" {"items" {"$ref" "TableFieldSchema"},
45+
"type" "array"}
46+
"fields2" {"items" {"$ref" "nonref"},
47+
"type" "array"}
48+
"fields3" {"items" {"$ref" "nonref"},
49+
"type" "array"}},
50+
"id" "TableSchema"}
51+
"TableFieldSchema" {"type" "object",
52+
"properties" {"fields" {"items" {"$ref" "TableFieldSchema"},
53+
"type" "array"}}
54+
"id" "TableFieldSchema"}}})
55+
:compute.gcp.descriptor/schemas))))
56+

0 commit comments

Comments
 (0)