Skip to content

Commit 0623de4

Browse files
committed
♻️Fix inconsistent ordering of UnitRelations.json, use OrdinalIgnoreCase
1 parent 1c9459a commit 0623de4

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

CodeGen/Generators/QuantityRelationsParser.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Collections.Immutable;
67
using System.IO;
78
using System.Linq;
89
using CodeGen.Exceptions;
@@ -61,7 +62,7 @@ public static void ParseAndApplyRelations(string rootDir, Quantity[] quantities)
6162
RightUnit = r.LeftUnit,
6263
})
6364
.ToList());
64-
65+
6566
// We can infer division relations from multiplication relations.
6667
relations.AddRange(relations
6768
.Where(r => r is { Operator: "*", NoInferredDivision: false })
@@ -91,7 +92,7 @@ public static void ParseAndApplyRelations(string rootDir, Quantity[] quantities)
9192
var list = string.Join("\n ", duplicates);
9293
throw new UnitsNetCodeGenException($"Duplicate inferred relations:\n {list}");
9394
}
94-
95+
9596
var ambiguous = relations
9697
.GroupBy(r => $"{r.LeftQuantity.Name} {r.Operator} {r.RightQuantity.Name}")
9798
.Where(g => g.Count() > 1)
@@ -133,12 +134,14 @@ private static List<QuantityRelation> ParseRelations(string rootDir, IReadOnlyDi
133134
try
134135
{
135136
var text = File.ReadAllText(relationsFileName);
136-
var relationStrings = JsonConvert.DeserializeObject<SortedSet<string>>(text) ?? [];
137137

138-
var parsedRelations = relationStrings.Select(relationString => ParseRelation(relationString, quantities)).ToList();
138+
// Explicitly sort to keep the file consistent.
139+
var relationStringsOrdered = (JsonConvert.DeserializeObject<List<string>>(text) ?? []).ToImmutableSortedSet(StringComparer.OrdinalIgnoreCase);
140+
141+
var parsedRelations = relationStringsOrdered.Select(relationString => ParseRelation(relationString, quantities)).ToList();
139142

140143
// File parsed successfully, save it back to disk in the sorted state.
141-
File.WriteAllText(relationsFileName, JsonConvert.SerializeObject(relationStrings, Formatting.Indented));
144+
File.WriteAllText(relationsFileName, JsonConvert.SerializeObject(relationStringsOrdered, Formatting.Indented));
142145

143146
return parsedRelations;
144147
}
@@ -210,4 +213,4 @@ Unit GetUnit(Quantity quantity, string? unitName)
210213
}
211214
}
212215
}
213-
}
216+
}

Common/UnitRelations.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
"AreaMomentOfInertia.MeterToTheFourth = Volume.CubicMeter * Length.Meter",
1414
"double = SpecificEnergy.JoulePerKilogram * BrakeSpecificFuelConsumption.KilogramPerJoule",
1515
"DynamicViscosity.NewtonSecondPerMeterSquared = Density.KilogramPerCubicMeter * KinematicViscosity.SquareMeterPerSecond",
16-
"ElectricCurrent.Ampere = ElectricCurrentGradient.AmperePerSecond * Duration.Second",
1716
"ElectricCharge.AmpereHour = ElectricCurrent.Ampere * Duration.Hour",
17+
"ElectricCurrent.Ampere = ElectricCurrentGradient.AmperePerSecond * Duration.Second",
1818
"ElectricPotential.Volt = ElectricCurrent.Ampere * ElectricResistance.Ohm",
1919
"Energy.Joule = ElectricPotential.Volt * ElectricCharge.Coulomb",
2020
"Energy.Joule = EnergyDensity.JoulePerCubicMeter * Volume.CubicMeter",
@@ -73,8 +73,8 @@
7373
"SpecificEnergy.JoulePerKilogram = Speed.MeterPerSecond * Speed.MeterPerSecond",
7474
"SpecificWeight.NewtonPerCubicMeter = Acceleration.MeterPerSecondSquared * Density.KilogramPerCubicMeter",
7575
"Speed.MeterPerSecond = Acceleration.MeterPerSecondSquared * Duration.Second",
76-
"TemperatureDelta.DegreeCelsius = TemperatureGradient.DegreeCelsiusPerKilometer * Length.Kilometer",
7776
"TemperatureDelta.DegreeCelsius = TemperatureChangeRate.DegreeCelsiusPerSecond * Duration.Second",
77+
"TemperatureDelta.DegreeCelsius = TemperatureGradient.DegreeCelsiusPerKilometer * Length.Kilometer",
7878
"Torque.NewtonMeter = ForcePerLength.NewtonPerMeter * Area.SquareMeter",
7979
"Torque.NewtonMeter = Length.Meter * Force.Newton",
8080
"Torque.NewtonMeter = RotationalStiffness.NewtonMeterPerRadian * Angle.Radian",

0 commit comments

Comments
 (0)