Module:No globals: Difference between revisions
Jump to navigation
Jump to search
Created page with "local mt = getmetatable(_G) or {} function mt.__index (t, k) if k ~= 'arg' then error('Tried to read nil global ' .. tostring(k), 2) end return nil end function mt.__newi..." |
No edit summary Tag: Reverted |
||
Line 1: | Line 1: | ||
-- <pre> | |||
-------------------------------------------------------------------------------- | |||
--- No globals prevents nil global variables from being written to or read. | |||
-- This module greatly reduces the chance of errors from overriding globals. | |||
-- | |||
-- To use the module, add the following code below your module table | |||
-- definition: | |||
-- | |||
-- {{#tag:pre|require('Module:No globals')}}
 | |||
-- | |||
-- The @{require} function sets the `arg` global in the package library when | |||
-- loading a module - see the [source code](https://git.io/JfKu8) in Scribunto | |||
-- core. To ensure Scribunto can load modules, the `arg` global is whitelisted. | |||
-- | |||
-- @script getmetatable(_G) | |||
-- @alias mt | |||
-- @release stable | |||
-- @author [[wikipedia:User:Jackmcbarn|Jackmcbarn]] (Wikipedia) | |||
-- @author [[User:Dessamator|Dessamator]] | |||
-- @attribution [[wikipedia:Module:No globals|Wikipedia]] | |||
-- @todo Remove `name` exception in all metamethods. On Fandom, | |||
-- legacy Scribunto has a typo in the package library | |||
-- where `name` is accessed instead of `modname` - see | |||
-- the [source code](https://git.io/JfKzh). This bug was | |||
-- fixed in MediaWiki 1.23 | |||
-- (see [this commit](https://git.io/JUilh)). | |||
local mt = getmetatable(_G) or {} | local mt = getmetatable(_G) or {} | ||
function mt.__index (t, k) | |||
-- begin dev wikia change | |||
local siteVersion = mw.site.currentVersion | |||
local isNameDisallowed = tonumber(siteVersion:match('^%d%.%d+')) >= 1.23 | |||
-- end dev wikia change | |||
--- Read access restriction on @{_G} global table. | |||
-- @function mt.__index | |||
-- @param {table} t Global table - @{_G}. | |||
-- @param k Indexed key. | |||
-- @error[opt,28] {string} 'tried to read nil global $k' | |||
function mt.__index(t, k) | |||
-- begin dev wikia change | |||
if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then | |||
-- end dev wikia change | |||
error('Tried to read nil global ' .. tostring(k), 2) | |||
end | |||
return nil | |||
end | end | ||
--- Write access restriction on @{_G} global table. | |||
-- @function mt.__newindex | |||
-- @param {table} t Global table - @{_G}. | |||
-- @param k Indexed key. | |||
-- @param v Value to be assigned. | |||
-- @error[opt,42] {string} 'tried to write global $k' | |||
function mt.__newindex(t, k, v) | function mt.__newindex(t, k, v) | ||
-- begin dev wikia change | |||
if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then | |||
-- end dev wikia change | |||
error('Tried to write global ' .. tostring(k), 2) | |||
end | |||
rawset(t, k, v) | |||
end | end | ||
setmetatable(_G, mt) | setmetatable(_G, mt) |
Revision as of 03:00, 30 April 2021
Documentation for this module may be created at Module:No globals/doc
-- <pre>
--------------------------------------------------------------------------------
--- No globals prevents nil global variables from being written to or read.
-- This module greatly reduces the chance of errors from overriding globals.
--
-- To use the module, add the following code below your module table
-- definition:
--
-- {{#tag:pre|require('Module:No globals')}}

--
-- The @{require} function sets the `arg` global in the package library when
-- loading a module - see the [source code](https://git.io/JfKu8) in Scribunto
-- core. To ensure Scribunto can load modules, the `arg` global is whitelisted.
--
-- @script getmetatable(_G)
-- @alias mt
-- @release stable
-- @author [[wikipedia:User:Jackmcbarn|Jackmcbarn]] (Wikipedia)
-- @author [[User:Dessamator|Dessamator]]
-- @attribution [[wikipedia:Module:No globals|Wikipedia]]
-- @todo Remove `name` exception in all metamethods. On Fandom,
-- legacy Scribunto has a typo in the package library
-- where `name` is accessed instead of `modname` - see
-- the [source code](https://git.io/JfKzh). This bug was
-- fixed in MediaWiki 1.23
-- (see [this commit](https://git.io/JUilh)).
local mt = getmetatable(_G) or {}
-- begin dev wikia change
local siteVersion = mw.site.currentVersion
local isNameDisallowed = tonumber(siteVersion:match('^%d%.%d+')) >= 1.23
-- end dev wikia change
--- Read access restriction on @{_G} global table.
-- @function mt.__index
-- @param {table} t Global table - @{_G}.
-- @param k Indexed key.
-- @error[opt,28] {string} 'tried to read nil global $k'
function mt.__index(t, k)
-- begin dev wikia change
if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then
-- end dev wikia change
error('Tried to read nil global ' .. tostring(k), 2)
end
return nil
end
--- Write access restriction on @{_G} global table.
-- @function mt.__newindex
-- @param {table} t Global table - @{_G}.
-- @param k Indexed key.
-- @param v Value to be assigned.
-- @error[opt,42] {string} 'tried to write global $k'
function mt.__newindex(t, k, v)
-- begin dev wikia change
if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then
-- end dev wikia change
error('Tried to write global ' .. tostring(k), 2)
end
rawset(t, k, v)
end
setmetatable(_G, mt)