Module:WikiProject assessment progression/sandbox

This is an old revision of this page, as edited by Sasuke Sarutobi (talk | contribs) at 18:09, 3 December 2020 (Returning project declaration to _main, attempting to wrap passed arg in lowercase function (since project names in categories are always lowercase)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
require('Module:No globals')

local classes = {
	{count = 0, class = 'List', category = 'List-Class'},
	{count = 0, class = 'Stub', category = 'Stub-Class'},
	{count = 0, class = 'Start', category = 'Start-Class'},
	{count = 0, class = 'C', category = 'C-Class'},
	{count = 0, class = 'B', category = 'B-Class'},
	{count = 0, class = 'GA', category = 'GA-Class'},
	{count = 0, class = 'A', category = 'A-Class'},
	{count = 0, class = 'FA', category = 'FA-Class'},
	{count = 0, class = 'FL', category = 'FL-Class'},
	{count = 0, class = 'FM', category = 'FM-Class'},
	{count = 0, class = 'Book', category = 'Book-Class'},
	{count = 0, class = 'Category', category = 'Category-Class'},
	{count = 0, class = 'Disambig', category = 'Disambig-Class'},
	{count = 0, class = 'File', category = 'File-Class'},
	{count = 0, class = 'Portal', category = 'Portal-Class'},
	{count = 0, class = 'Project', category = 'Project-Class'},
	{count = 0, class = 'Redirect', category = 'Redirect-Class'},
	{count = 0, class = 'Template', category = 'Template-Class'},
}

local p = {}
local getArgs = require('Module:Arguments').getArgs

local function categoryCount(category, project)
	return mw.site.stats.pagesInCategory(
		string.format('%s %s articles', category, project),
		'pages'
	)
end

-- rounding to first decimal, from http://lua-users.org/wiki/SimpleRound
local function round(num)
	return math.floor(num * 10 + 0.5) / 10
end

local function percentComplete(sum, total)
	return tostring(round(100 * sum / total))
end

local function arg_or_default(args, from_arg, default)
	if args[from_arg] and args[from_arg] ~= '' then
		return mw.ustring.lower(args[from_arg])
	else
		return default
	end
end

function p.main(frame)
	local args = getArgs(frame)
	return p._main(args)
end

function p._main(args)
	local project = arg_or_default(args, "project", nil)
	local classCount = 0
	for _, class in ipairs(classes) do
		classCount = classCount + categoryCount(class.category, project)
	end
	
	local total = classCount + categoryCount('Unassessed', project)
	return percentComplete(classCount, total)
end

return p