From 9f606d0fbb16a11536ff7b1256c163d8bfd2824f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 May 2023 18:34:50 +0200 Subject: [PATCH] metadata: auto-convert YAML special float values: .nan .inf -.inf Even for people who know what the special floats not-a-number, infinity, and negative infinity, they don't necessarily know the YAML 1.2 syntax for these. I didn't. And I've spent some quality time fighting things with those values. They are also easy to reliably convert to string values. --- fdroidserver/metadata.py | 9 +++++++++ tests/metadata.TestCase | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index c4b332d0..7f406e7d 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -20,6 +20,7 @@ import git from pathlib import Path +import math import platform import os import re @@ -897,6 +898,14 @@ def _normalize_type_string(v): if v: return 'true' return 'false' + if isinstance(v, float): + # YAML 1.2 values for NaN, Inf, and -Inf + if math.isnan(v): + return '.nan' + if math.isinf(v): + if v > 0: + return '.inf' + return '-.inf' return str(v) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 89ce3e8b..2da4b16c 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -965,6 +965,24 @@ class MetadataTest(unittest.TestCase): {'AntiFeatures': {'true': {}}}, ) + def test_parse_yaml_app_antifeatures_float_nan(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: .nan')), + {'AntiFeatures': {'.nan': {}}}, + ) + + def test_parse_yaml_app_antifeatures_float_inf(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: .inf')), + {'AntiFeatures': {'.inf': {}}}, + ) + + def test_parse_yaml_app_antifeatures_float_negative_inf(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: -.inf')), + {'AntiFeatures': {'-.inf': {}}}, + ) + def test_parse_yaml_app_antifeatures_int(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: 1')),