Skip to content

Commit c3585da

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents cbdbe19 + c64a627 commit c3585da

File tree

80 files changed

+1447
-312
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1447
-312
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Licensed under MIT No Attribution, see LICENSE file at the root.
2+
// Copyright 2013 Andreas Gullberg Larsen (andreas.larsen84@gmail.com). Maintained at https://github.com/angularsen/UnitsNet.
3+
4+
using System;
5+
using System.Runtime.Serialization;
6+
7+
namespace CodeGen.Exceptions
8+
{
9+
internal class UnitsNetCodeGenException : Exception
10+
{
11+
public UnitsNetCodeGenException()
12+
{
13+
}
14+
15+
protected UnitsNetCodeGenException(SerializationInfo info, StreamingContext context) : base(info, context)
16+
{
17+
}
18+
19+
public UnitsNetCodeGenException(string message) : base(message)
20+
{
21+
}
22+
23+
public UnitsNetCodeGenException(string message, Exception innerException) : base(message, innerException)
24+
{
25+
}
26+
}
27+
}

CodeGen/Generators/QuantityJsonFilesParser.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
// Licensed under MIT No Attribution, see LICENSE file at the root.
1+
// Licensed under MIT No Attribution, see LICENSE file at the root.
22
// Copyright 2013 Andreas Gullberg Larsen (andreas.larsen84@gmail.com). Maintained at https://github.com/angularsen/UnitsNet.
33

44
using System;
55
using System.Collections.Generic;
66
using System.IO;
77
using System.Linq;
88
using System.Text;
9+
using CodeGen.Exceptions;
910
using CodeGen.Helpers;
1011
using CodeGen.JsonTypes;
1112
using Newtonsoft.Json;
@@ -41,11 +42,9 @@ private static Quantity ParseQuantityFile(string jsonFile)
4142
{
4243
try
4344
{
44-
var quantity = JsonConvert.DeserializeObject<Quantity>(File.ReadAllText(jsonFile, Encoding.UTF8), JsonSerializerSettings);
45-
if (quantity == null)
46-
{
47-
throw new NullReferenceException(); // CS8604: Possible null reference argument for parameter quantity
48-
}
45+
var quantity = JsonConvert.DeserializeObject<Quantity>(File.ReadAllText(jsonFile, Encoding.UTF8), JsonSerializerSettings)
46+
?? throw new UnitsNetCodeGenException($"Unable to parse quantity from JSON file: {jsonFile}");
47+
4948
AddPrefixUnits(quantity);
5049
FixConversionFunctionsForDecimalValueTypes(quantity);
5150
OrderUnitsByName(quantity);
@@ -90,8 +89,7 @@ private static void AddPrefixUnits(Quantity quantity)
9089
{
9190
SingularName = $"{prefix}{unit.SingularName.ToCamelCase()}", // "Kilo" + "NewtonPerMeter" => "KilonewtonPerMeter"
9291
PluralName = $"{prefix}{unit.PluralName.ToCamelCase()}", // "Kilo" + "NewtonsPerMeter" => "KilonewtonsPerMeter"
93-
BaseUnits = null, // Can we determine this somehow?,
94-
UnitSystems = unit.UnitSystems, // Unit systems mappings are inherited for prefixed units
92+
BaseUnits = null, // Can we determine this somehow?
9593
FromBaseToUnitFunc = $"({unit.FromBaseToUnitFunc}) / {prefixInfo.Factor}",
9694
FromUnitToBaseFunc = $"({unit.FromUnitToBaseFunc}) * {prefixInfo.Factor}",
9795
Localization = GetLocalizationForPrefixUnit(unit.Localization, prefixInfo)

CodeGen/Generators/UnitsNetGen/IQuantityTestClassGenerator.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
// Licensed under MIT No Attribution, see LICENSE file at the root.
22
// Copyright 2013 Andreas Gullberg Larsen (andreas.larsen84@gmail.com). Maintained at https://github.com/angularsen/UnitsNet.
33

4-
using System;
4+
using System.Diagnostics.CodeAnalysis;
55
using System.Linq;
66
using CodeGen.JsonTypes;
77

88
namespace CodeGen.Generators.UnitsNetGen
99
{
10+
// ReSharper disable once InconsistentNaming
11+
[SuppressMessage("ReSharper", "EnforceForeachStatementBraces")]
1012
internal class IQuantityTestClassGenerator : GeneratorBase
1113
{
1214
private readonly Quantity[] _quantities;

CodeGen/Generators/UnitsNetGen/NumberExtensionsTestClassGenerator.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ internal class NumberExtensionsTestClassGenerator : GeneratorBase
1010

1111
public NumberExtensionsTestClassGenerator(Quantity quantity)
1212
{
13-
if (quantity is null)
14-
throw new ArgumentNullException(nameof(quantity));
13+
if (quantity is null) throw new ArgumentNullException(nameof(quantity));
1514

1615
_units = quantity.Units;
1716
_quantityName = quantity.Name;

CodeGen/Generators/UnitsNetGen/QuantityGenerator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,16 +1148,16 @@ ulong IConvertible.ToUInt64(IFormatProvider provider)
11481148
}
11491149

11501150
/// <inheritdoc cref="GetObsoleteAttributeOrNull(string)"/>
1151-
internal static string GetObsoleteAttributeOrNull(Quantity quantity) => GetObsoleteAttributeOrNull(quantity.ObsoleteText);
1151+
internal static string? GetObsoleteAttributeOrNull(Quantity quantity) => GetObsoleteAttributeOrNull(quantity.ObsoleteText);
11521152

11531153
/// <inheritdoc cref="GetObsoleteAttributeOrNull(string)"/>
1154-
internal static string GetObsoleteAttributeOrNull(Unit unit) => GetObsoleteAttributeOrNull(unit.ObsoleteText);
1154+
internal static string? GetObsoleteAttributeOrNull(Unit unit) => GetObsoleteAttributeOrNull(unit.ObsoleteText);
11551155

11561156
/// <summary>
11571157
/// Returns the Obsolete attribute if ObsoleteText has been defined on the JSON input - otherwise returns empty string
11581158
/// It is up to the consumer to wrap any padding/new lines in order to keep to correct indentation formats
11591159
/// </summary>
1160-
private static string GetObsoleteAttributeOrNull(string obsoleteText) => string.IsNullOrWhiteSpace(obsoleteText)
1160+
private static string? GetObsoleteAttributeOrNull(string obsoleteText) => string.IsNullOrWhiteSpace(obsoleteText)
11611161
? null
11621162
: $"[System.Obsolete(\"{obsoleteText}\")]";
11631163
}

CodeGen/Generators/UnitsNetGen/UnitTestBaseClassGenerator.cs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ internal class UnitTestBaseClassGenerator : GeneratorBase
3838
private readonly Dictionary<string, Unit> _unitSystemUnits = new Dictionary<string, Unit>();
3939

4040
/// <summary>
41-
/// Example: "m" for Length quantity.
41+
/// Example: " m" for Length quantity with leading whitespace or "" for Ratio quantity where base unit does not have an abbreviation.
4242
/// </summary>
4343
private readonly string _baseUnitEnglishAbbreviation;
4444

@@ -76,8 +76,13 @@ public UnitTestBaseClassGenerator(Quantity quantity)
7676

7777
/// <summary>
7878
/// Gets the first en-US abbreviation for the unit -or- empty string if none is defined.
79+
/// If a unit abbreviation exists, a leading whitespace is added to separate the number and the abbreviation like "1 m".
7980
/// </summary>
80-
private static string GetEnglishAbbreviation(Unit unit) => unit.Localization.First(l => l.Culture == "en-US").Abbreviations.FirstOrDefault() ?? "";
81+
private static string GetEnglishAbbreviation(Unit unit)
82+
{
83+
var unitAbbreviation = unit.Localization.First(l => l.Culture == "en-US").Abbreviations.FirstOrDefault();
84+
return string.IsNullOrEmpty(unitAbbreviation) ? "" : $" {unitAbbreviation}";
85+
}
8186

8287
public override string Generate()
8388
{
@@ -522,7 +527,7 @@ public void ToString_ReturnsValueAndUnitAbbreviationInCurrentCulture()
522527
foreach (var unit in _quantity.Units)
523528
{
524529
Writer.WL($@"
525-
Assert.Equal(""1 {GetEnglishAbbreviation(unit)}"", new {_quantity.Name}(1, {GetUnitFullName(unit)}).ToString());");
530+
Assert.Equal(""1{GetEnglishAbbreviation(unit)}"", new {_quantity.Name}(1, {GetUnitFullName(unit)}).ToString());");
526531
}
527532
Writer.WL($@"
528533
}}
@@ -541,7 +546,7 @@ public void ToString_WithSwedishCulture_ReturnsUnitAbbreviationForEnglishCulture
541546
foreach (var unit in _quantity.Units)
542547
{
543548
Writer.WL($@"
544-
Assert.Equal(""1 {GetEnglishAbbreviation(unit)}"", new {_quantity.Name}(1, {GetUnitFullName(unit)}).ToString(swedishCulture));");
549+
Assert.Equal(""1{GetEnglishAbbreviation(unit)}"", new {_quantity.Name}(1, {GetUnitFullName(unit)}).ToString(swedishCulture));");
545550
}
546551
Writer.WL($@"
547552
}}
@@ -553,10 +558,10 @@ public void ToString_SFormat_FormatsNumberWithGivenDigitsAfterRadixForCurrentCul
553558
try
554559
{{
555560
CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture;
556-
Assert.Equal(""0.1 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s1""));
557-
Assert.Equal(""0.12 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s2""));
558-
Assert.Equal(""0.123 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s3""));
559-
Assert.Equal(""0.1235 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s4""));
561+
Assert.Equal(""0.1{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s1""));
562+
Assert.Equal(""0.12{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s2""));
563+
Assert.Equal(""0.123{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s3""));
564+
Assert.Equal(""0.1235{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s4""));
560565
}}
561566
finally
562567
{{
@@ -568,10 +573,10 @@ public void ToString_SFormat_FormatsNumberWithGivenDigitsAfterRadixForCurrentCul
568573
public void ToString_SFormatAndCulture_FormatsNumberWithGivenDigitsAfterRadixForGivenCulture()
569574
{{
570575
var culture = CultureInfo.InvariantCulture;
571-
Assert.Equal(""0.1 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s1"", culture));
572-
Assert.Equal(""0.12 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s2"", culture));
573-
Assert.Equal(""0.123 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s3"", culture));
574-
Assert.Equal(""0.1235 {_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s4"", culture));
576+
Assert.Equal(""0.1{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s1"", culture));
577+
Assert.Equal(""0.12{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s2"", culture));
578+
Assert.Equal(""0.123{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s3"", culture));
579+
Assert.Equal(""0.1235{_baseUnitEnglishAbbreviation}"", new {_quantity.Name}(0.123456{_numberSuffix}, {_baseUnitFullName}).ToString(""s4"", culture));
575580
}}
576581
577582

CodeGen/Helpers/MyTextWriter.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public MyTextWriter(string indentString = " ", int initialIndentLevel = 0)
1616
{
1717
IndentString = indentString;
1818
IndentLevel = initialIndentLevel;
19+
_currentIndentationString = GetIndent(0);
1920
}
2021

2122
public string IndentString { get; }
@@ -89,9 +90,9 @@ public override string ToString()
8990
/// </summary>
9091
/// <param name="indentLevel">The level of indentation to prepend to the text.</param>
9192
/// <param name="text">The text to write.</param>
92-
public void WLIfText(int indentLevel, string text)
93+
public void WLIfText(int indentLevel, string? text)
9394
{
94-
if (string.IsNullOrWhiteSpace(text)) return;
95+
if (text == null || string.IsNullOrWhiteSpace(text)) return;
9596
WL(indentLevel, text);
9697
}
9798

@@ -102,8 +103,7 @@ public void WLIfText(int indentLevel, string text)
102103
/// <param name="text">The text to write.</param>
103104
public void WLCondition(bool condition, string text)
104105
{
105-
if (condition)
106-
WL(text);
106+
if (condition) WL(text);
107107
}
108108
}
109109
}

Common/UnitDefinitions/Angle.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,18 @@
9292
"Abbreviations": [ "r" ]
9393
}
9494
]
95+
},
96+
{
97+
"SingularName": "Tilt",
98+
"PluralName": "Tilt",
99+
"FromUnitToBaseFunc": "Math.Asin(x)*180/Math.PI",
100+
"FromBaseToUnitFunc": "Math.Sin(x/180*Math.PI)",
101+
"Localization": [
102+
{
103+
"Culture": "en-US",
104+
"Abbreviations": [ "sin(θ)" ]
105+
}
106+
]
95107
}
96108
]
97109
}

Common/UnitDefinitions/Force.json

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,17 @@
125125
"PluralName": "PoundsForce",
126126
"FromUnitToBaseFunc": "x*4.4482216152605095551842641431421",
127127
"FromBaseToUnitFunc": "x/4.4482216152605095551842641431421",
128+
"Prefixes": [ "Kilo" ],
128129
"Localization": [
129130
{
130131
"Culture": "en-US",
131-
"Abbreviations": [ "lbf" ]
132+
"Abbreviations": [ "lbf" ],
133+
"AbbreviationsForPrefixes": { "Kilo": [ "kipf", "kip", "k" ] }
132134
},
133135
{
134136
"Culture": "ru-RU",
135-
"Abbreviations": [ "фунт-сила" ]
137+
"Abbreviations": [ "фунт-сила" ],
138+
"AbbreviationsForPrefixes": { "Kilo": [ "кипф", "койка", "К" ] }
136139
}
137140
]
138141
},
@@ -148,22 +151,6 @@
148151
}
149152
]
150153
},
151-
{
152-
"SingularName": "KilopoundForce",
153-
"PluralName": "KilopoundsForce",
154-
"FromUnitToBaseFunc": "x*4448.2216152605095551842641431421",
155-
"FromBaseToUnitFunc": "x/4448.2216152605095551842641431421",
156-
"Localization": [
157-
{
158-
"Culture": "en-US",
159-
"Abbreviations": [ "kipf", "kip", "k" ]
160-
},
161-
{
162-
"Culture": "ru-RU",
163-
"Abbreviations": [ "кипф", "койка", "К" ]
164-
}
165-
]
166-
},
167154
{
168155
"SingularName": "ShortTonForce",
169156
"PluralName": "ShortTonsForce",

Common/UnitDefinitions/ForceChangeRate.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,34 @@
3333
"Abbreviations": [ "N/s" ]
3434
}
3535
]
36+
},
37+
{
38+
"SingularName": "PoundForcePerMinute",
39+
"PluralName": "PoundsForcePerMinute",
40+
"FromUnitToBaseFunc": "x*4.4482216152605095551842641431421/60",
41+
"FromBaseToUnitFunc": "x/4.4482216152605095551842641431421*60",
42+
"Prefixes": [ "Kilo" ],
43+
"Localization": [
44+
{
45+
"Culture": "en-US",
46+
"Abbreviations": [ "lbf/min" ],
47+
"AbbreviationsForPrefixes": { "Kilo": [ "kipf/min", "kip/min", "k/min" ] }
48+
}
49+
]
50+
},
51+
{
52+
"SingularName": "PoundForcePerSecond",
53+
"PluralName": "PoundsForcePerSecond",
54+
"FromUnitToBaseFunc": "x*4.4482216152605095551842641431421",
55+
"FromBaseToUnitFunc": "x/4.4482216152605095551842641431421",
56+
"Prefixes": [ "Kilo" ],
57+
"Localization": [
58+
{
59+
"Culture": "en-US",
60+
"Abbreviations": [ "lbf/s" ],
61+
"AbbreviationsForPrefixes": { "Kilo": [ "kipf/s", "kip/s", "k/s" ] }
62+
}
63+
]
3664
}
3765
]
3866
}

0 commit comments

Comments
 (0)