Skip to content

Commit

Permalink
Treat literal ints as floats in settings files
Browse files Browse the repository at this point in the history
This is a quality of life improvement for a handful of things such as
rate limits so you don't need to specify 1.0 instead of just 1.
  • Loading branch information
skizzerz committed Mar 12, 2024
1 parent b0f2b53 commit 036c26c
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
5 changes: 4 additions & 1 deletion src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,8 @@ def merge(metadata: dict[str, Any], base, settings, *path: str,
return value

elif settings_type == "float":
if settings is not Empty and not isinstance(settings, float):
# Treat literal ints as floats too for ease of writing settings
if settings is not Empty and not isinstance(settings, float) and type(settings) is not int:
raise TypeError("Expected type float for path '{}', got {} instead".format(".".join(path), type(settings)))
# float supports three merge types: replace (default), max, min
if merge_type is None:
Expand All @@ -398,6 +399,8 @@ def merge(metadata: dict[str, Any], base, settings, *path: str,
else:
value = metadata["_default"]

if type(value) is int:
value = float(value)
assert isinstance(value, float)
if merge_type == "replace":
return value
Expand Down
23 changes: 21 additions & 2 deletions test/test_config_merge.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ def test_invalid_float(self):
with self.subTest("value required"):
self.assertRaises(TypeError, merge, metadata, Empty, Empty)
with self.subTest("invalid type"):
self.assertRaises(TypeError, merge, metadata, Empty, 2)
# ints are also valid floats, so do not test for that here
self.assertRaises(TypeError, merge, metadata, Empty, "2.0")
self.assertRaises(TypeError, merge, metadata, Empty, [])
self.assertRaises(TypeError, merge, metadata, Empty, {})
Expand Down Expand Up @@ -540,7 +540,26 @@ def test_default_multitype(self):
metadata = {"_type": ["int", "float"], "_default": None}
with self.subTest("first"):
metadata["_default"] = 3
self.assertEqual(merge(metadata, Empty, Empty), 3)
test = merge(metadata, Empty, Empty)
self.assertEqual(test, 3)
self.assertIsInstance(test, int)
with self.subTest("second"):
metadata["_default"] = 2.7
self.assertEqual(merge(metadata, Empty, Empty), 2.7)

def test_coerce_int_to_float(self):
metadata = {"_type": "float", "_default": None}
with self.subTest("as default"):
metadata["_default"] = 1
test = merge(metadata, Empty, Empty)
self.assertEqual(test, 1.0)
self.assertIsInstance(test, float)
with self.subTest("as base"):
metadata["_default"] = 1.0
test = merge(metadata, 2, Empty)
self.assertEqual(test, 2.0)
self.assertIsInstance(test, float)
with self.subTest("as settings"):
test = merge(metadata, Empty, 3)
self.assertEqual(test, 3.0)
self.assertIsInstance(test, float)

0 comments on commit 036c26c

Please sign in to comment.