Skip to content

Commit 8eb1183

Browse files
authored
Added allOf properties to the schema definition (#256)
* Added allOf properties to the schema definition (#255) * Better PM * Fixed formatting
1 parent 8e2e350 commit 8eb1183

File tree

3 files changed

+53
-9
lines changed

3 files changed

+53
-9
lines changed

src/SwaggerProvider.DesignTime/v3/DefinitionCompiler.fs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable) as this =
233233

234234
and compileBySchema (ns: NamespaceAbstraction) tyName (schemaObj: OpenApiSchema) isRequired registerNew fromByPathCompiler =
235235
let compileNewObject() =
236-
if schemaObj.Properties.Count = 0 then
236+
if schemaObj.Properties.Count = 0 && schemaObj.AllOf.Count = 0 then
237237
if not <| isNull tyName then
238238
ns.MarkTypeAsNameAlias tyName
239239

@@ -245,18 +245,37 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable) as this =
245245
let ty = ProvidedTypeDefinition(tyName, Some typeof<obj>, isErased = false)
246246
registerNew(tyName, ty :> Type)
247247

248+
// Combine composite schemas
249+
let schemaObjProperties =
250+
match schemaObj.AllOf.Count > 0 with
251+
| true ->
252+
schemaObj.AllOf
253+
|> Seq.append [ schemaObj ]
254+
|> Seq.collect(fun x -> x.Properties)
255+
| false -> schemaObj.Properties
256+
257+
let schemaObjRequired =
258+
match schemaObj.AllOf.Count > 0 with
259+
| true ->
260+
schemaObj.AllOf
261+
|> Seq.append [ schemaObj ]
262+
|> Seq.collect(fun x -> x.Required)
263+
|> System.Collections.Generic.HashSet
264+
:> System.Collections.Generic.ISet<string>
265+
| false -> schemaObj.Required
266+
248267
// Generate fields and properties
249268
let members =
250269
let generateProperty = generateProperty(UniqueNameGenerator())
251270

252-
List.ofSeq schemaObj.Properties
271+
List.ofSeq schemaObjProperties
253272
|> List.map(fun p ->
254273
let propName, propSchema = p.Key, p.Value
255274

256275
if String.IsNullOrEmpty(propName) then
257276
failwithf $"Property cannot be created with empty name. TypeName:%A{tyName}; SchemaObj:%A{schemaObj}"
258277

259-
let isRequired = schemaObj.Required.Contains(propName)
278+
let isRequired = schemaObjRequired.Contains(propName)
260279

261280
let pTy =
262281
compileBySchema ns (ns.ReserveUniqueName tyName (nicePascalName propName)) propSchema isRequired ns.RegisterType false
@@ -279,15 +298,15 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable) as this =
279298
// Add full-init constructor
280299
let ctorParams, fields =
281300
let required, optional =
282-
List.zip (List.ofSeq schemaObj.Properties) members
283-
|> List.partition(fun (x, _) -> schemaObj.Required.Contains(x.Key))
301+
List.zip (List.ofSeq schemaObjProperties) members
302+
|> List.partition(fun (x, _) -> schemaObjRequired.Contains(x.Key))
284303

285304
(required @ optional)
286305
|> List.map(fun (x, (f, p)) ->
287306
let paramName = niceCamelName p.Name
288307

289308
let prParam =
290-
if schemaObj.Required.Contains(x.Key) then
309+
if schemaObjRequired.Contains(x.Key) then
291310
ProvidedParameter(paramName, f.FieldType)
292311
else
293312
let paramDefaultValue = this.GetDefaultValue f.FieldType
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
openapi: 3.0.0
2+
paths:
3+
/run:
4+
summary: Do nothing.
5+
components:
6+
schemas:
7+
Person:
8+
title: Person
9+
allOf:
10+
- type: object
11+
properties:
12+
first_name:
13+
type: string
14+
description: "First Name"

tests/SwaggerProvider.Tests/Schema.Parser.Tests.fs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ module V3 =
3333
let defCompiler = DefinitionCompiler(schema, false)
3434
let opCompiler = OperationCompiler(schema, defCompiler, true, false, true)
3535
opCompiler.CompileProvidedClients(defCompiler.Namespace)
36-
ignore <| defCompiler.Namespace.GetProvidedTypes()
36+
defCompiler.Namespace.GetProvidedTypes()
3737
with e when e.Message.IndexOf("not supported yet") >= 0 ->
38-
()
38+
List.Empty
3939

4040
let parserTestBody(path: string) =
4141
task {
@@ -49,7 +49,7 @@ let parserTestBody(path: string) =
4949
if path.IndexOf("v2") >= 0 then
5050
V2.testSchema schemaStr
5151
else
52-
V3.testSchema schemaStr
52+
V3.testSchema schemaStr |> ignore
5353
}
5454

5555
let rootFolder =
@@ -89,6 +89,17 @@ let ``Parse PetStore``() =
8989
+ "/../SwaggerProvider.ProviderTests/Schemas/v2/petstore.json"
9090
)
9191

92+
[<Fact>]
93+
let ``Add definition for schema with only allOf properties``() =
94+
let definitions =
95+
__SOURCE_DIRECTORY__
96+
+ "/../SwaggerProvider.ProviderTests/Schemas/v3/issue255.yaml"
97+
|> File.ReadAllText
98+
|> V3.testSchema
99+
100+
definitions |> shouldHaveLength 1
101+
definitions[0].GetDeclaredProperty("FirstName") |> shouldNotEqual null
102+
92103
(*
93104
[<Tests>]
94105
let parseJsonSchemaTests =

0 commit comments

Comments
 (0)