Skip to content

Commit

Permalink
Correction in the generation of JsonSchemas of object and array type.
Browse files Browse the repository at this point in the history
SwagDoc library updated.
  • Loading branch information
joaoduarte19 committed May 2, 2020
1 parent 6c96a6e commit 4aff893
Show file tree
Hide file tree
Showing 16 changed files with 213 additions and 463 deletions.
7 changes: 7 additions & 0 deletions lib/swagdoc/Demos/SampleApi/Sample.Api.Employee.pas
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ implementation
uses
Json.Schema.Field.Strings,
Json.Schema.Field.Arrays,
Json.Schema.Field.Enums,
Swag.Common.Types;

{ TApiEmployee }
Expand Down Expand Up @@ -145,6 +146,7 @@ function TFakeApiEmployee.DocumentEmployeeModelSchema: TJsonSchema;
var
vName: TJsonFieldString;
vAddressSchema: TJsonSchema;
vGender: TJsonFieldEnum;
begin
Result := TJsonSchema.Create;
Result.Root.Description := 'Employee response data';
Expand All @@ -157,6 +159,11 @@ function TFakeApiEmployee.DocumentEmployeeModelSchema: TJsonSchema;
Result.AddField<TDate>('hireDate', 'The employee hire date.');
Result.AddField<Double>('salary', 'The employee gross salary.');

vGender := Result.AddFieldAsType<TJsonFieldEnum>('gender', 'The employee gender.');
vGender.Required := True;
vGender.EnumType := etString;
vGender.AddItems(['male', 'female']);

vAddressSchema := TJsonSchema.Create;
try
vAddressSchema.Root.Name := 'address';
Expand Down
70 changes: 65 additions & 5 deletions lib/swagdoc/Deploy/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@
"description":"Employee request data",
"required":
[
"name"
"name",
"gender"
]
,
"properties":
Expand Down Expand Up @@ -112,6 +113,17 @@
"type":"number",
"description":"The employee gross salary."
}
,
"gender":
{
"type":"string",
"description":"The employee gender.",
"enum":
[
"male",
"female"
]
}
,
"address":
{
Expand Down Expand Up @@ -199,7 +211,8 @@
"description":"Employee request data",
"required":
[
"name"
"name",
"gender"
]
,
"properties":
Expand Down Expand Up @@ -236,6 +249,17 @@
"type":"number",
"description":"The employee gross salary."
}
,
"gender":
{
"type":"string",
"description":"The employee gender.",
"enum":
[
"male",
"female"
]
}
,
"address":
{
Expand Down Expand Up @@ -320,7 +344,8 @@
"description":"Employee request data",
"required":
[
"name"
"name",
"gender"
]
,
"properties":
Expand Down Expand Up @@ -357,6 +382,17 @@
"type":"number",
"description":"The employee gross salary."
}
,
"gender":
{
"type":"string",
"description":"The employee gender.",
"enum":
[
"male",
"female"
]
}
,
"address":
{
Expand Down Expand Up @@ -449,7 +485,8 @@
"description":"Employee request data",
"required":
[
"name"
"name",
"gender"
]
,
"properties":
Expand Down Expand Up @@ -486,6 +523,17 @@
"type":"number",
"description":"The employee gross salary."
}
,
"gender":
{
"type":"string",
"description":"The employee gender.",
"enum":
[
"male",
"female"
]
}
,
"address":
{
Expand Down Expand Up @@ -570,7 +618,8 @@
"description":"Employee response data",
"required":
[
"name"
"name",
"gender"
]
,
"properties":
Expand Down Expand Up @@ -600,6 +649,17 @@
"type":"number",
"description":"The employee gross salary."
}
,
"gender":
{
"type":"string",
"description":"The employee gender.",
"enum":
[
"male",
"female"
]
}
,
"address":
{
Expand Down
28 changes: 25 additions & 3 deletions lib/swagdoc/Source/Json.Schema.Field.Enums.pas
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ interface
Json.Schema.Common.Types;

type
TJsonFieldEnumType = (etNumber, etString);

TJsonFieldEnumItem = class
strict private
fValue: Integer;
Expand All @@ -46,9 +48,12 @@ TJsonFieldEnumItem = class
TJsonFieldEnum = class(TJsonField)
strict private
fJsonEnumItems: TObjectList<TJsonFieldEnumItem>;
fEnumType: TJsonFieldEnumType;

function GetCount: Integer;
function GetItem(const pIndex: Byte): TJsonFieldEnumItem;
strict protected
function GetTypeName: string; override;
public
constructor Create; override;
destructor Destroy; override;
Expand All @@ -57,10 +62,12 @@ TJsonFieldEnum = class(TJsonField)
procedure AddItems(const pItemsDescriptions: array of string);

function ToJsonSchema: TJsonObject; override;

function Clone: TJsonField; override;

property Count: Integer read GetCount;
property Items[const pIndex: Byte]: TJsonFieldEnumItem read GetItem;
property EnumType: TJsonFieldEnumType read fEnumType write fEnumType;
end;

implementation
Expand All @@ -84,6 +91,7 @@ constructor TJsonFieldEnum.Create;
begin
inherited Create;
fJsonEnumItems := TObjectList<TJsonFieldEnumItem>.Create(True);
fEnumType := etNumber;
end;

destructor TJsonFieldEnum.Destroy;
Expand All @@ -102,14 +110,15 @@ procedure TJsonFieldEnum.AddItems(const pItemsDescriptions: array of string);
vItemIndex: Integer;
begin
for vItemIndex := 0 to Length(pItemsDescriptions) -1 do
Self.AddItem(vItemIndex + Self.GetCount, pItemsDescriptions[vItemIndex]);
Self.AddItem(vItemIndex, pItemsDescriptions[vItemIndex]);
end;

function TJsonFieldEnum.Clone: TJsonField;
var
vIndex: Integer;
begin
Result := inherited Clone;
TJsonFieldEnum(Result).EnumType := Self.EnumType;
for vIndex := 0 to Self.GetCount - 1 do
begin
TJsonFieldEnum(Result).AddItem(
Expand All @@ -131,6 +140,14 @@ function TJsonFieldEnum.GetItem(const pIndex: Byte): TJsonFieldEnumItem;
Result := nil;
end;

function TJsonFieldEnum.GetTypeName: string;
begin
case fEnumType of
etNumber: Result := inherited GetTypeName;
etString: Result := 'string';
end;
end;

function TJsonFieldEnum.ToJsonSchema: TJsonObject;
var
vJsonList: TJsonArray;
Expand All @@ -146,10 +163,15 @@ function TJsonFieldEnum.ToJsonSchema: TJsonObject;
if Assigned(vJsonEnumItem) then
begin
vHelpEnum := vHelpEnum + vJsonEnumItem.Value.ToString + '=' + vJsonEnumItem.Description + ', ';
vJsonList.Add(vJsonEnumItem.Value);
case fEnumType of
etNumber: vJsonList.Add(vJsonEnumItem.Value);
etString: vJsonList.Add(vJsonEnumItem.Description);
end;
end;
end;
vHelpEnum := fDescription + ' ' + Copy(vHelpEnum, 1, Length(vHelpEnum) - 2) + ']';

if (fEnumType = etNumber) then
fDescription := fDescription + ' ' + Copy(vHelpEnum, 1, Length(vHelpEnum) - 2) + ']';

Result := inherited ToJsonSchema;
Result.AddPair('enum', vJsonList);
Expand Down
5 changes: 4 additions & 1 deletion lib/swagdoc/Source/Json.Schema.Field.Objects.pas
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ function TJsonFieldObject.Clone(pSourceField: TJsonFieldObject): TJsonFieldObjec
end;

function TJsonFieldObject.ToJsonSchema: TJsonObject;
const
c_SchemaRef = '$ref';
c_PrefixDefinitionName = '#/definitions/';
var
vJsonObjectList: TJsonObject;
vJsonRequiredList: TJsonArray;
Expand All @@ -151,7 +154,7 @@ function TJsonFieldObject.ToJsonSchema: TJsonObject;
if (fRef.Length > 0) then
begin
Result := TJSONObject.Create;
Result.AddPair('$ref', FRef);
Result.AddPair('$ref', c_PrefixDefinitionName + FRef);
Exit;
end;

Expand Down
3 changes: 2 additions & 1 deletion lib/swagdoc/Source/Json.Schema.Field.pas
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,14 @@ TJsonFieldClass = class of TJsonField;
TJsonField = class abstract(TPersistent)
strict private
fTypeName: string;
function GetTypeName: string;
strict protected
fName: string;
fDescription: string;
fRequired: Boolean;
fNullable: Boolean;

function GetTypeName: string; virtual;

property TypeName: string read GetTypeName;
public
constructor Create; reintroduce; virtual;
Expand Down
9 changes: 9 additions & 0 deletions lib/swagdoc/Source/Json.Schema.pas
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ TJsonSchema = class(TObject)
function Clone(pSourceField: TJsonSchema): TJsonSchema; overload;
function AddField<T>(const pName: string; const pDescription: string = ''): TJsonField; overload;
function AddField(pSchemaObject: TJsonSchema): TJsonField; overload;
function AddFieldAsType<T>(const pName: string; const pDescription: string = ''): T;

property Root: TJsonFieldObject read fRoot;
property Ref: string read GetRef write SetRef;
Expand Down Expand Up @@ -191,6 +192,14 @@ function TJsonSchema.AddField<T>(const pName: string; const pDescription: string
fRoot.AddField(Result);
end;

function TJsonSchema.AddFieldAsType<T>(const pName, pDescription: string): T;
var
vValue: TValue;
begin
vValue := AddField<T>(pName, pDescription);
Result := vValue.AsType<T>;
end;

function TJsonSchema.Clone(pSourceField: TJsonSchema): TJsonSchema;
begin
Result := TJsonSchema.Create;
Expand Down
2 changes: 1 addition & 1 deletion lib/swagdoc/Source/Swag.Doc.Path.pas
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

interface

uses
uses
System.Classes,
System.Generics.Collections,
System.RegularExpressions,
Expand Down
Loading

1 comment on commit 4aff893

@joaoduarte19
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix #376

Please # to comment.