aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2023-11-30 13:42:44 +0000
committerMatthew Wild <mwild1@gmail.com>2023-11-30 13:42:44 +0000
commita669ffb5a2ea3d73e7f7c460deef52579d5ba57b (patch)
tree93196b86d1773a8310a596d4a1e9d709c2cd87e8
parent56d45091bdcc75292a73a789a017b36721efa2e6 (diff)
downloadprosody-a669ffb5a2ea3d73e7f7c460deef52579d5ba57b.tar.gz
prosody-a669ffb5a2ea3d73e7f7c460deef52579d5ba57b.zip
util.human.io: Don't accept ambiguous durations by default
The new method parse_duration_lax() exports the old behaviour, mainly for compatibility purposes.
-rw-r--r--spec/util_human_io_spec.lua33
-rw-r--r--util/human/io.lua20
2 files changed, 49 insertions, 4 deletions
diff --git a/spec/util_human_io_spec.lua b/spec/util_human_io_spec.lua
index be850a96..91a87b39 100644
--- a/spec/util_human_io_spec.lua
+++ b/spec/util_human_io_spec.lua
@@ -47,6 +47,37 @@ describe("util.human.io", function ()
local function test(expected, duration)
return assert.equal(expected, human_io.parse_duration(duration), ("%q -> %d"):format(duration, expected));
end
+ local function should_fail(duration)
+ assert.is_nil(human_io.parse_duration(duration), "invalid duration should fail: %q");
+ end
+ it("works", function ()
+ test(1, "1s");
+ test(60, "1min");
+ test(60, "1 min");
+ test(60, "1 minute");
+ test(120, "2min");
+ test(7200, "2h");
+ test(7200, "2 hours");
+ test(86400, "1d");
+ test(604800, "1w");
+ test(604800, "1week");
+ test(1814400, "3 weeks");
+ test(2678400, "1month");
+ test(2678400, "1 month");
+ test(31536000, "365 days");
+ test(31556952, "1 year");
+
+ should_fail("two weeks");
+ should_fail("1m");
+ should_fail("1mi");
+ should_fail("1mo");
+ end);
+ end);
+
+ describe("parse_duration_lax", function ()
+ local function test(expected, duration)
+ return assert.equal(expected, human_io.parse_duration_lax(duration), ("%q -> %d"):format(duration, expected));
+ end
it("works", function ()
test(1, "1s");
test(60, "1mi");
@@ -66,7 +97,7 @@ describe("util.human.io", function ()
test(2678400, "1 month");
test(31536000, "365 days");
test(31556952, "1 year");
- return assert.is_nil(human_io.parse_duration("two weeks"), "\"2 weeks\" -> nil");
+ return assert.is_nil(human_io.parse_duration_lax("two weeks"), "\"2 weeks\" -> nil");
end);
end);
end);
diff --git a/util/human/io.lua b/util/human/io.lua
index 5af8d13e..d6112b3b 100644
--- a/util/human/io.lua
+++ b/util/human/io.lua
@@ -200,13 +200,26 @@ end
local day = 86400;
local multipliers = {
- d = day, w = day * 7, m = 31 * day, mo = 31 * day, y = 365.2425 * day;
- s = 1, mi = 60, h = 3600, ho = 3600
+ d = day, w = day * 7, mon = 31 * day, y = 365.2425 * day;
+ s = 1, min = 60, h = 3600, ho = 3600
};
+
local function parse_duration(duration_string)
+ local n, m = duration_string:lower():match("(%d+)%s*([smhdwy]?[io]?n?)");
+ if not n or not multipliers[m] then return nil; end
+ return tonumber(n) * ( multipliers[m] or 1 );
+end
+
+local multipliers_lax = setmetatable({
+ m = multipliers.mon;
+ mo = multipliers.mon;
+ mi = multipliers.min;
+}, { __index = multipliers });
+
+local function parse_duration_lax(duration_string)
local n, m = duration_string:lower():match("(%d+)%s*([smhdwy]?[io]?)");
if not n then return nil; end
- return tonumber(n) * ( multipliers[m] or 1 );
+ return tonumber(n) * ( multipliers_lax[m] or 1 );
end
return {
@@ -223,4 +236,5 @@ return {
ellipsis = ellipsis;
table = new_table;
parse_duration = parse_duration;
+ parse_duration_lax = parse_duration_lax;
};