Module:WikiProject assessment progression/sandbox

require('strict')

local assessedClasses = { 'List','Stub','Start','C','B', 'GA','A','FA','FL','FM', 'Book','Category','Disambig','File', 'Portal','Project','Redirect','Template', }

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

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 countCategoryArticles(classesToCount, project) local classCount = 0 for _, class in ipairs(classesToCount) do		classCount = classCount + categoryCount(class..'-Class', project) end return classCount end

local function calculateProjectTotal(project) return countCategoryArticles(assessedClasses, project) + categoryCount('Unassessed', project) end

local function countHigherCategories(targetClass, project) local higherCategories = {} local classKey = getKeyForValue(targetClass, assessedClasses) for k, v in ipairs(assessedClasses) do		if k > classKey then higherCategories[k - classKey] = v		end end return countCategoryArticles(higherCategories, project) end

local function getKeyForValue(value, enclosingTable) for k, v in ipairs(enclosingTable) do		if v == value then return k		end end return nil end

local function setClasses(args) local classes = {} if args['class'] then classes = {args['class']} else classes = assessedClasses end return classes end

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

function p._main(args) local project = args['project'] local classes = setClasses(args) local classCount = countCategoryArticles(classes, project) local total = calculateProjectTotal(project) if total == 0 then return errorMessage('Error: project not found for project name "'..project..'"') else return percentComplete(classCount, total) end end

return p