From 8b4a3b27c085d2a625df265a6590cee1c98b4dba Mon Sep 17 00:00:00 2001 From: Sky Johnson Date: Thu, 24 Jul 2025 17:52:58 -0500 Subject: [PATCH] migrate json module to global --- modules/http/http.lua | 1 - modules/{json => json+}/json.lua | 4 +-- modules/sessions/sessions.lua | 1 - modules/string+/string.lua | 10 ++++++-- tests/json.lua | 42 ++++++++++++++++---------------- tests/string.lua | 10 ++++---- 6 files changed, 35 insertions(+), 33 deletions(-) rename modules/{json => json+}/json.lua (99%) diff --git a/modules/http/http.lua b/modules/http/http.lua index c091357..16f7e32 100644 --- a/modules/http/http.lua +++ b/modules/http/http.lua @@ -1,4 +1,3 @@ -local json = require("json") local http = {} -- Global routing tables diff --git a/modules/json/json.lua b/modules/json+/json.lua similarity index 99% rename from modules/json/json.lua rename to modules/json+/json.lua index f60a127..1a851d3 100644 --- a/modules/json/json.lua +++ b/modules/json+/json.lua @@ -1,4 +1,4 @@ -local json = {} +json = {} function json.encode(value) local buffer = {} @@ -596,5 +596,3 @@ function json.validate(data, schema) return validate_value(data, schema) end - -return json diff --git a/modules/sessions/sessions.lua b/modules/sessions/sessions.lua index 1387fb2..16abcc0 100644 --- a/modules/sessions/sessions.lua +++ b/modules/sessions/sessions.lua @@ -1,6 +1,5 @@ local kv = require("kv") local crypto = require("crypto") -local json = require("json") local sessions = {} local stores = {} diff --git a/modules/string+/string.lua b/modules/string+/string.lua index 1da4f69..28dee2a 100644 --- a/modules/string+/string.lua +++ b/modules/string+/string.lua @@ -273,17 +273,23 @@ function string.slice(s, start, end_pos) end getmetatable("").__index.slice = string.slice --- Custom find that returns matched substring instead of position function string.find(s, pattern, init, plain) if type(s) ~= "string" then error("string.find: first argument must be a string", 2) end if type(pattern) ~= "string" then error("string.find: second argument must be a string", 2) end + return _orig_find(s, pattern, init, plain) +end +getmetatable("").__index.find = string.find + +function string.find_match(s, pattern, init, plain) + if type(s) ~= "string" then error("string.find_match: first argument must be a string", 2) end + if type(pattern) ~= "string" then error("string.find_match: second argument must be a string", 2) end local start_pos, end_pos = _orig_find(s, pattern, init, plain) if start_pos then return s:sub(start_pos, end_pos) end return nil end -getmetatable("").__index.find = string.find +getmetatable("").__index.find_match = string.find_match function string.find_all(s, pattern) if type(s) ~= "string" then error("string.find_all: first argument must be a string", 2) end diff --git a/tests/json.lua b/tests/json.lua index dbb9afd..e9e34b6 100644 --- a/tests/json.lua +++ b/tests/json.lua @@ -1,5 +1,5 @@ require("tests") -local json = require("json") +--local json = require("json") -- Test data local test_data = { @@ -39,7 +39,7 @@ test("Round-trip Encoding/Decoding", function() local decoded = json.decode(encoded) local re_encoded = json.encode(decoded) local re_decoded = json.decode(re_encoded) - + assert_equal(re_decoded.name, test_data.name) assert_equal(re_decoded.address.city, test_data.address.city) end) @@ -50,7 +50,7 @@ test("Pretty Printing", function() assert_equal(type(pretty), "string") assert(string.find(pretty, "\n"), "pretty should contain newlines") assert(string.find(pretty, " "), "pretty should contain indentation") - + -- Should still be valid JSON local decoded = json.decode(pretty) assert_equal(decoded.name, test_data.name) @@ -61,7 +61,7 @@ test("Object Merging", function() local obj1 = {a = 1, b = 2} local obj2 = {b = 3, c = 4} local obj3 = {d = 5} - + local merged = json.merge(obj1, obj2, obj3) assert_equal(merged.a, 1) assert_equal(merged.b, 3) -- later wins @@ -73,13 +73,13 @@ end) test("Data Extraction", function() local name = json.extract(test_data, "name") assert_equal(name, "John Doe") - + local city = json.extract(test_data, "address.city") assert_equal(city, "Springfield") - + local first_score = json.extract(test_data, "scores.[0]") assert_equal(first_score, 85) - + local missing = json.extract(test_data, "nonexistent.field") assert_equal(missing, nil) end) @@ -95,10 +95,10 @@ test("Schema Validation", function() }, required = {name = true, age = true} } - + local valid, err = json.validate(test_data, schema) assert_equal(valid, true) - + local invalid_data = {name = "John", age = "not_a_number"} local invalid, err2 = json.validate(invalid_data, schema) assert_equal(invalid, false) @@ -108,18 +108,18 @@ end) -- Test 8: File operations test("File Save/Load", function() local filename = "test_output.json" - + -- Save to file json.save_file(filename, test_data, true) -- pretty format - + -- Check file exists assert(file_exists(filename), "file should exist after save") - + -- Load from file local loaded = json.load_file(filename) assert_equal(loaded.name, test_data.name) assert_equal(loaded.address.zip, test_data.address.zip) - + -- Clean up os.remove(filename) end) @@ -130,8 +130,8 @@ test("Error Handling", function() local success, err = pcall(json.decode, '{"invalid": json}') assert_equal(success, false) assert_equal(type(err), "string") - - -- Missing file should throw error + + -- Missing file should throw error local success2, err2 = pcall(json.load_file, "nonexistent_file.json") assert_equal(success2, false) assert_equal(type(err2), "string") @@ -144,7 +144,7 @@ test("Edge Cases", function() local encoded_empty = json.encode(empty_obj) local decoded_empty = json.decode(encoded_empty) assert_equal(type(decoded_empty), "table") - + -- Special numbers local special = { zero = 0, @@ -168,21 +168,21 @@ test("Performance Test", function() data = {x = i * 2, y = i * 3, z = i * 4} } end - + local start = os.clock() local encoded = json.encode(large_data) local encode_time = os.clock() - start - + start = os.clock() local decoded = json.decode(encoded) local decode_time = os.clock() - start - + print(string.format(" Encoded 1000 objects in %.3f seconds", encode_time)) print(string.format(" Decoded 1000 objects in %.3f seconds", decode_time)) - + assert_equal(#decoded, 1000) assert_equal(decoded[500].name, "User 500") end) summary() -test_exit() \ No newline at end of file +test_exit() diff --git a/tests/string.lua b/tests/string.lua index 56f161a..eefd1d5 100644 --- a/tests/string.lua +++ b/tests/string.lua @@ -290,11 +290,11 @@ test("string.match", function() assert_equal(true, string.match("testing", "test") ~= nil) end) -test("string.find", function() - assert_equal("123", string.find("hello123world", "%d+")) - assert_equal(nil, string.find("hello", "%d+")) - assert_equal("test", string.find("testing", "test")) - assert_equal("world", string.find("hello world", "world")) +test("string.find_match", function() + assert_equal("123", string.find_match("hello123world", "%d+")) + assert_equal(nil, string.find_match("hello", "%d+")) + assert_equal("test", string.find_match("testing", "test")) + assert_equal("world", string.find_match("hello world", "world")) end) test("string.find_all", function()