in openapi-diff/src/modeler/AutoRest.Swagger/Model/Schema.cs [269:327]
private void CompareProperties(ComparisonContext<ServiceDefinition> context, Schema priorSchema)
{
// Case: Were any properties removed?
if (priorSchema.Properties != null)
{
foreach (var def in priorSchema.Properties)
{
if (Properties == null || !Properties.TryGetValue(def.Key, out var model))
{
context.LogBreakingChange(ComparisonMessages.RemovedProperty, def.Key);
}
else
{
// required to optional
if (Required != null && Required.Contains(def.Key) && (priorSchema.Required == null || !priorSchema.Required.Contains(def.Key)))
{
context.LogBreakingChange(ComparisonMessages.RequiredStatusChange, false, true);
}
// optional to required
if ((Required == null || !Required.Contains(def.Key)) && (priorSchema.Required != null && priorSchema.Required.Contains(def.Key)))
{
context.LogBreakingChange(ComparisonMessages.RequiredStatusChange, true, false);
}
context.PushProperty(def.Key);
model.Compare(context, def.Value);
context.Pop();
}
}
}
// Case: Were any properties added?
if (Properties != null)
{
foreach (KeyValuePair<string, Schema> property in Properties)
{
// Case: Were any required properties added?
if (priorSchema.Properties == null || !priorSchema.Properties.TryGetValue(property.Key, out var model))
{
if ((Required != null && Required.Contains(property.Key)))
{
context.LogBreakingChange(ComparisonMessages.AddedRequiredProperty, property.Key);
}
else if (context.Direction == DataDirection.Response && property.Value != null)
{
if (property.Value.ReadOnly == true)
context.LogInfo(ComparisonMessages.AddedReadOnlyPropertyInResponse, property.Key);
else
context.LogBreakingChange(ComparisonMessages.AddedPropertyInResponse, property.Key);
}
else if(IsReferenced && property.Value != null)
{
context.LogBreakingChange(ComparisonMessages.AddedOptionalProperty, property.Key);
}
}
}
}
}