Module:SimpleDebug
Contains a functions to help debug the lua modules. It allows to collect and view the values of several variables and/or points in your lua program, from a module (which is usual) or in several modules (which are required from the main module).
It is designed so that its functions are called from within the module that is to be debugged, calls that will have to be part of the code (of the module that you have designed, or that you want to improve or adapt) until you decide to delete them (when you already have determined the bug). Thus, you do not have to call any of its functions from an invoke.
Uses
One or several points to watch | ||
---|---|---|
Function abbreviations: w : where. n : names. v : variables. s : string.
| ||
Variables | ||
Name | Default | |
tab.oneline |
true |
|
tab.allidx |
false |
If it is true then also displays the numerical indexes of a table. |
dec |
-1 |
Spaces for the decimals:
|
enabled |
true |
If it is false all calls to the below functions do nothing. |
nohtml |
false |
In strings, it replaces < for ⪡ and > for ⪢. |
plaintext |
false |
Deletes html format. |
One point to watch | ||
Functions | ||
w (where) |
| |
v (...) |
| |
wv (where, ...) |
| |
nv (...) |
| |
wnv (where, ...) |
| |
Several points to watch | ||
Variables | ||
Name | Default | |
s |
The string variable that holds the returned values from the next functions. | |
maxlines.num |
100 |
The maxim number of lines (on calling the next functions). |
maxlines.doerror |
true |
If it is true and |
counter |
false |
Adds an autoincremental number at the beginning of each call of a function. |
Functions | ||
breakline () |
Adds a break line in | |
wtos (where) |
Equal to | |
vtos (...) |
Equal to | |
wvtos (where, ...) |
Equal to | |
nvtos (...) |
Equal to | |
wnvtos (where, ...) |
Igual a |
Examples
One point to watch
Following the flow
local SD = require "Module:SimpleDebug"
return SD.v ('Here is reached')
returns:
Here is reached
Number of decimal places and value of a variable
local SD = require "Module:SimpleDebug"
SD.dec = 2
return SD.v (1/3)
returns:
0.33
Nohtml
local SD = require "Module:SimpleDebug"
SD.nohtml = true
return SD.v ("<b>bold</b>")
returns:
"⪡b⪢bold⪡/b⪢"
Plaintext
local SD = require "Module:SimpleDebug"
SD.plaintext = true
return SD.v ("<b>bold</b>")
returns:
"bold"
The value of several variables
local SD = require "Module:SimpleDebug"
local a = 12
local b = 'Hello'
return SD.v (a,b)
returns:
12 • "Hello"
Non-assigned variable detection
local SD = require "Module:SimpleDebug"
local a = true
return SD.v (a,b)
returns:
true • nil
The value of a table
local SD = require "Module:SimpleDebug"
local a = {1, tab='a', 'b'}
return SD.v (a)
returns: { 1, "b", [tab]="a", }
local SD = require "Module:SimpleDebug"
local a = {{1,2,3},{4,5,6},{7,8,9}}
return SD.v (a)
returns:
{ [1] = {1, 2, 3, }, [2] = {4, 5, 6, }, [3] = {7, 8, 9, }, }
local SD = require "Module:SimpleDebug"
local a = {{First=1,2,3},{4,Second=5,6},{7,8,9}}
return SD.v (a)
returns:
{ [1] = {2, 3, [First]=1, }, [2] = {4, 6, [Second]=5, }, [3] = {7, 8, 9, }, }
local SD = require "Module:SimpleDebug"
SD.tab.allidx = true
local a = {{1,2,3},{4,nil,6},{7,8,9}}
return SD.v (a)
returns:
{ [1]={[1]=1, [2]=2, [3]=3, }, [2]={[1]=4, [3]=6, }, [3]={[1]=7, [2]=8, [3]=9, }, }
Usually, you implement these functions with error function:
local SD = require "Module:SimpleDebug"
local a = {{1,2,3},{4,5,6},{7,8,9}}
error (SD.v (a))
displays:
Lua error:Module:YourModule:Line:{
[1] = {1, 2, 3, },
[2] = {4, 5, 6, },
[3] = {7, 8, 9, },
}
All values of a table in multiline
local SD = require "Module:SimpleDebug"
SD.tab.oneline = false
local a = {{First=1,2,3},'Middle',{4,Second=5,6}}
return SD.v (a)
retorna:
{ [1] = { [1] = 2, [2] = 3, ["First"] = 1, }, [2] = "Middle", [3] = { [1] = 4, [2] = 6, ["Second"] = 5, }, }
The value of several variables with their name in a point
local SD = require "Module:SimpleDebug"
local a = 12
local b = 'Hello'
return SD.nv ('a',a,'b',b)
returns:
a: 12 • b: "Hello"
Several points to watch
Following the flow
local SD = require "Module:SimpleDebug"
local tab = {1,12,7}
function p.CheckValues ()
local function LittleNum()
SD.wtos ('little number')
end
local function BigNum(num)
SD.wtos ('big='..num)
end
for i, num in ipairs(tab) do
if num > 9 then
BigNum(num)
else
LittleNum()
end
end
error (SD.s)
end
returns:
Lua Error:Module:Your module:Line:
little number
big=12
little number.
With counter
local SD = require "Module:SimpleDebug"
function Increm()
local n = 0
for i = 1, 3 do
n = n + 2
SD.vtos (n)
end
end
SD.counter = true
Increm()
return SD.s
returns:
1 • 2
2 • 4
3 • 6
Monitoring of several variables
local SD = require "Module:SimpleDebug"
a = 12
b = 'Hello'
SD.vtos (1,a,b)
a = a + a
b = b..' world!'
SD.vtos ('Finally',a,b)
return SD.s
returns:
1 => 12 • "Hello"
Finally => 24 • "Hello world!"
local SD = require "Module:SimpleDebug"
SD.breakline ()
a = 12
b = 'Hello'
c = false
SD.nvtos (1,'a',a,'b',b,'c',c)
a = a + a
b = b..' world!'
SD.nvtos ('Finally','a',a,'b',b)
error (SD.s)
displays:
Lua error:Module:YourModule:Line:
1 => a: 12 • b: "Hello" • c: false
Finally => a: 24 • b: "Hello world!"
Variables and their presentation with conditions
local SD = require "Module:SimpleDebug"
SD.breakline()
SD.enabled = false
SD.maxlines.num = 3
local a = 'AA'
for i = 1, 10 do
a = a + 'AA'
if i == 3 then
SD.enabled = true
end
SD.nvtos (i, string.len(a), a)
end
displays:
Lua error:Module:YourModule:Line:
3 => 8 • "AAAAAAAA"
4 => 10 • "AAAAAAAAAA"
5 => 12 • "AAAAAAAAAAAA".
local p = {}
p.s = ''
p.tab = {
oneline = true,
allidx = false,
}
p.dec = -1
p.maxlines = {
num = 100,
doerror = true,
}
p.enabled = true
local LinCount = 0
function p.breakline ()
if p.s ~= '' then
LinCount = LinCount + 1
end
p.s = p.s..'\n\n'
if (LinCount > p.maxlines.num) and p.maxlines.doerror then
error (p.s,0)
end
end
function p.var (avar, where)
if p.enabled then
if type(avar) == 'table' then
if p.tab.oneline then
local wds = '{ '
for k,v in pairs(avar) do
if (p.tab.allidx == true) or (type(k) ~= 'number') then
wds = wds..'['..k..']='..p.var(v)..', '
else
wds = wds..p.var(v)..', '
end
end
EndStr = wds .. '} '
else
EndStr = mw.dumpObject(avar)
end
elseif type(avar) == 'number' then
if (p.dec == -1) or (avar == math.floor(avar)) then
EndStr = tostring(avar)
else
EndStr = tostring (math.floor ((avar*10^p.dec)+0.5) / (10^p.dec))
end
elseif type(avar) == 'boolean' then
if avar == true then
EndStr = 'true'
else
EndStr = 'false'
end
else
EndStr = '"'..tostring(avar)..'"'
end
if where == nil then
return EndStr
else
return where.. ' => '..EndStr
end
end
end --var
function p.array (anarray, where)
if p.enabled then
local EndStr = ''
if type(anarray) ~= 'table' then
EndStr = 'The param to debug is not a table'
else
local s = ''
local C = 0
function Concat(wds)
if s ~= '' then
s = s..' - '
end
s = s..wds
end
for i, avar in pairs(anarray) do
Concat (p.var(avar))
C = C + 1
end
local Dif = #anarray - C
if Dif == 1 then
s = '1 variable is nil! '..s
elseif Dif > 1 then
s = Dif..' variables are nil! '..s
end
EndStr = s
end
if where == nil then
return EndStr
else
return where.. ' => '..EndStr
end
end
end --array
function p.namearray (anarray, where)
if p.enabled then
local EndStr = ''
if type(anarray) ~= 'table' then
EndStr = 'The param to debug is not a table'
elseif math.mod(#anarray,2) ~= 0 then
EndStr = 'Any parameter has not a name or variable; or any variable is nil'
else
local s = ''
local C = 0
local IsName = true
function Concat(wds)
if s ~= '' then
if IsName then
s = s..' • '
else
s = s..': '
end
end
s = s..wds
end
for i, avar in pairs(anarray) do
if IsName then
Concat (avar)
IsName = false
else
Concat (p.var(avar))
IsName = true
end
C = C + 1
end
local Dif = #anarray - C
if Dif == 1 then
s = '1 variable is nil! '..s
elseif Dif > 1 then
s = Dif..' variables are nil! '..s
end
EndStr = s
end
if where == nil then
return EndStr
else
return where.. ' => '..EndStr
end
end
end --namearray
function p.wheretos (where)
if p.enabled and (LinCount < p.maxlines.num) then
if p.s ~= '' then
p.breakline ()
end
if where == nil then
where = '"where" not assigned'
end
p.s = p.s..where
end
end --wheretos
function p.vartos (avar, where)
if p.enabled and (LinCount < p.maxlines.num) then
if p.s ~= '' then
p.breakline ()
end
p.s = p.s..p.var (avar, where)
end
end --vartos
function p.arraytos (anarray, where)
if p.enabled and (LinCount < p.maxlines.num) then
if p.s ~= '' then
p.breakline ()
end
p.s = p.s..p.array (anarray, where)
end
end --arraytos
function p.namearraytos (anarray, where)
if p.enabled and (LinCount < p.maxlines.num) then
if p.s ~= '' then
p.breakline ()
end
p.s = p.s..p.namearray (anarray, where)
end
end --namearraytos
return p