summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-02-20 21:32:55 -0500
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-02-20 21:32:55 -0500
commitdd27b3bf35d01e4fd0703e47d538bd8cec03652b (patch)
tree3f3b00c4c1b9cb5fafcfc975e8de7e999b1dc36b /src
parent6a9bf10a81f4557d44668666117d99440d99d873 (diff)
downloadSMAPI-dd27b3bf35d01e4fd0703e47d538bd8cec03652b.tar.gz
SMAPI-dd27b3bf35d01e4fd0703e47d538bd8cec03652b.tar.bz2
SMAPI-dd27b3bf35d01e4fd0703e47d538bd8cec03652b.zip
fix parsing four-part versions from the update-check API
Diffstat (limited to 'src')
-rw-r--r--src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs4
-rw-r--r--src/SMAPI.Toolkit/SemanticVersion.cs9
-rw-r--r--src/SMAPI.Toolkit/Serialization/Converters/NonStandardSemanticVersionConverter.cs15
-rw-r--r--src/SMAPI.Toolkit/Serialization/Converters/SemanticVersionConverter.cs9
-rw-r--r--src/SMAPI.Web/Controllers/ModsApiController.cs22
-rw-r--r--src/SMAPI.Web/Framework/VersionConstraint.cs2
6 files changed, 38 insertions, 23 deletions
diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs
index dadb8c10..188db31d 100644
--- a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs
+++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryVersionModel.cs
@@ -1,3 +1,6 @@
+using Newtonsoft.Json;
+using StardewModdingAPI.Toolkit.Serialization.Converters;
+
namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
{
/// <summary>Metadata about a version.</summary>
@@ -7,6 +10,7 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
** Accessors
*********/
/// <summary>The version number.</summary>
+ [JsonConverter(typeof(NonStandardSemanticVersionConverter))]
public ISemanticVersion Version { get; set; }
/// <summary>The mod page URL.</summary>
diff --git a/src/SMAPI.Toolkit/SemanticVersion.cs b/src/SMAPI.Toolkit/SemanticVersion.cs
index 5ead6dc8..86db2820 100644
--- a/src/SMAPI.Toolkit/SemanticVersion.cs
+++ b/src/SMAPI.Toolkit/SemanticVersion.cs
@@ -199,18 +199,19 @@ namespace StardewModdingAPI.Toolkit
/// <returns>Returns whether parsing the version succeeded.</returns>
public static bool TryParse(string version, out ISemanticVersion parsed)
{
- return SemanticVersion.TryParseNonStandard(version, out parsed) && !parsed.IsNonStandard();
+ return SemanticVersion.TryParse(version, allowNonStandard: false, out parsed);
}
- /// <summary>Parse a version string without throwing an exception if it fails, including support for non-standard extensions like <see cref="IPlatformSpecificVersion"/>.</summary>
+ /// <summary>Parse a version string without throwing an exception if it fails.</summary>
/// <param name="version">The version string.</param>
+ /// <param name="allowNonStandard">Whether to allow non-standard extensions to semantic versioning.</param>
/// <param name="parsed">The parsed representation.</param>
/// <returns>Returns whether parsing the version succeeded.</returns>
- public static bool TryParseNonStandard(string version, out ISemanticVersion parsed)
+ public static bool TryParse(string version, bool allowNonStandard, out ISemanticVersion parsed)
{
try
{
- parsed = new SemanticVersion(version, true);
+ parsed = new SemanticVersion(version, allowNonStandard);
return true;
}
catch
diff --git a/src/SMAPI.Toolkit/Serialization/Converters/NonStandardSemanticVersionConverter.cs b/src/SMAPI.Toolkit/Serialization/Converters/NonStandardSemanticVersionConverter.cs
new file mode 100644
index 00000000..6f870bcf
--- /dev/null
+++ b/src/SMAPI.Toolkit/Serialization/Converters/NonStandardSemanticVersionConverter.cs
@@ -0,0 +1,15 @@
+namespace StardewModdingAPI.Toolkit.Serialization.Converters
+{
+ /// <summary>Handles deserialization of <see cref="ISemanticVersion"/>, allowing for non-standard extensions.</summary>
+ internal class NonStandardSemanticVersionConverter : SemanticVersionConverter
+ {
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ public NonStandardSemanticVersionConverter()
+ {
+ this.AllowNonStandard = true;
+ }
+ }
+}
diff --git a/src/SMAPI.Toolkit/Serialization/Converters/SemanticVersionConverter.cs b/src/SMAPI.Toolkit/Serialization/Converters/SemanticVersionConverter.cs
index e1b9db1d..3604956b 100644
--- a/src/SMAPI.Toolkit/Serialization/Converters/SemanticVersionConverter.cs
+++ b/src/SMAPI.Toolkit/Serialization/Converters/SemanticVersionConverter.cs
@@ -8,6 +8,13 @@ namespace StardewModdingAPI.Toolkit.Serialization.Converters
internal class SemanticVersionConverter : JsonConverter
{
/*********
+ ** Fields
+ *********/
+ /// <summary>Whether to allow non-standard extensions to semantic versioning.</summary>
+ protected bool AllowNonStandard { get; set; }
+
+
+ /*********
** Accessors
*********/
/// <summary>Get whether this converter can read JSON.</summary>
@@ -78,7 +85,7 @@ namespace StardewModdingAPI.Toolkit.Serialization.Converters
{
if (string.IsNullOrWhiteSpace(str))
return null;
- if (!SemanticVersion.TryParse(str, out ISemanticVersion version))
+ if (!SemanticVersion.TryParse(str, allowNonStandard: this.AllowNonStandard, out ISemanticVersion version))
throw new SParseException($"Can't parse semantic version from invalid value '{str}', should be formatted like 1.2, 1.2.30, or 1.2.30-beta (path: {path}).");
return version;
}
diff --git a/src/SMAPI.Web/Controllers/ModsApiController.cs b/src/SMAPI.Web/Controllers/ModsApiController.cs
index 8370fe09..06768f03 100644
--- a/src/SMAPI.Web/Controllers/ModsApiController.cs
+++ b/src/SMAPI.Web/Controllers/ModsApiController.cs
@@ -296,7 +296,7 @@ namespace StardewModdingAPI.Web.Controllers
{
if (result.Version == null)
result.SetError(RemoteModStatus.InvalidData, $"The update key '{updateKey}' matches a mod with no version number.");
- else if (!this.TryParseVersion(result.Version, allowNonStandardVersions, out _))
+ else if (!SemanticVersion.TryParse(result.Version, allowNonStandardVersions, out _))
result.SetError(RemoteModStatus.InvalidData, $"The update key '{updateKey}' matches a mod with invalid semantic version '{result.Version}'.");
}
@@ -360,11 +360,11 @@ namespace StardewModdingAPI.Web.Controllers
{
// try mapped version
string rawNewVersion = this.GetRawMappedVersion(version, map, allowNonStandard);
- if (this.TryParseVersion(rawNewVersion, allowNonStandard, out ISemanticVersion parsedNew))
+ if (SemanticVersion.TryParse(rawNewVersion, allowNonStandard, out ISemanticVersion parsedNew))
return parsedNew;
// return original version
- return this.TryParseVersion(version, allowNonStandard, out ISemanticVersion parsedOld)
+ return SemanticVersion.TryParse(version, allowNonStandard, out ISemanticVersion parsedOld)
? parsedOld
: null;
}
@@ -383,31 +383,19 @@ namespace StardewModdingAPI.Web.Controllers
return map[version];
// match parsed version
- if (this.TryParseVersion(version, allowNonStandard, out ISemanticVersion parsed))
+ if (SemanticVersion.TryParse(version, allowNonStandard, out ISemanticVersion parsed))
{
if (map.ContainsKey(parsed.ToString()))
return map[parsed.ToString()];
foreach (var pair in map)
{
- if (this.TryParseVersion(pair.Key, allowNonStandard, out ISemanticVersion target) && parsed.Equals(target) && this.TryParseVersion(pair.Value, allowNonStandard, out ISemanticVersion newVersion))
+ if (SemanticVersion.TryParse(pair.Key, allowNonStandard, out ISemanticVersion target) && parsed.Equals(target) && SemanticVersion.TryParse(pair.Value, allowNonStandard, out ISemanticVersion newVersion))
return newVersion.ToString();
}
}
return version;
}
-
- /// <summary>Try to parse a version string.</summary>
- /// <param name="version">The version string.</param>
- /// <param name="allowNonStandard">Whether to allow non-standard versions.</param>
- /// <param name="parsed">The parsed representation.</param>
- /// <returns>Returns whether parsing the version succeeded.</returns>
- public bool TryParseVersion(string version, bool allowNonStandard, out ISemanticVersion parsed)
- {
- return allowNonStandard
- ? SemanticVersion.TryParseNonStandard(version, out parsed)
- : SemanticVersion.TryParse(version, out parsed);
- }
}
}
diff --git a/src/SMAPI.Web/Framework/VersionConstraint.cs b/src/SMAPI.Web/Framework/VersionConstraint.cs
index 72f5ef84..f0c57c41 100644
--- a/src/SMAPI.Web/Framework/VersionConstraint.cs
+++ b/src/SMAPI.Web/Framework/VersionConstraint.cs
@@ -28,7 +28,7 @@ namespace StardewModdingAPI.Web.Framework
return
values.TryGetValue(routeKey, out object routeValue)
&& routeValue is string routeStr
- && SemanticVersion.TryParseNonStandard(routeStr, out _);
+ && SemanticVersion.TryParse(routeStr, allowNonStandard: true, out _);
}
}
}