Module:Version: Difference between revisions

From Path of Exile Wiki
Jump to navigation Jump to search
>TheFrz
mNo edit summary
>TheFrz
mNo edit summary
Line 4: Line 4:
local error = error
local error = error
local tostring = tostring
local tostring = tostring
local tonumber = tonumber
local pairs = pairs
local pairs = pairs


Line 22: Line 23:
         datatype = 'String',
         datatype = 'String',
         property = 'Is version',
         property = 'Is version',
        validate = tostring,
     },
     },
     release_date = {
     release_date = {
         datatype = 'String',
         datatype = 'String',
         property = 'Has release date',
         property = 'Has release date',
        validate = tostring,
     },
     },
     major_part = {
     major_part = {
         datatype = 'Integer',
         datatype = 'Integer',
         property = 'Has major version part',
         property = 'Has major version part',
        validate = tonumber,
     },
     },
     minor_part = {
     minor_part = {
         datatype = 'Integer',
         datatype = 'Integer',
         property = 'Has minor version part',
         property = 'Has minor version part',
        validate = tonumber,
     },
     },
     patch_part = {
     patch_part = {
         datatype = 'Integer',
         datatype = 'Integer',
         property = 'Has patch version part',
         property = 'Has patch version part',
        validate = tonumber,
     },
     },
     revision_part = {
     revision_part = {
         datatype = 'String',
         datatype = 'String',
         property = 'Has revision version part',
         property = 'Has revision version part',
        validate = tostring,
     },
     },
     before = {
     before = {
         datatype = 'String',
         datatype = 'String',
         property = 'Has version before',
         property = 'Has version before',
        validate = tostring,
         show = function(this)
         show = function(this)
             local version = this.value
             local version = this.value
Line 59: Line 67:
         datatype = 'String',
         datatype = 'String',
         property = 'Has version after',
         property = 'Has version after',
        validate = tostring,
         show = function(this)
         show = function(this)
             local version = this.value
             local version = this.value
Line 71: Line 80:
}
}


local temp_map_for_cargo = {'version', 'release_date' }
local temp_map_for_cargo = {'version', 'release_date', 'major_part'}




Line 94: Line 103:
     local version = util.cast.version(args.patch)
     local version = util.cast.version(args.patch)


     local version_struct = util.Struct(version_map)
     local v_struct = util.Struct(version_map)


     version_struct:set('version', args.patch)
     v_struct:set('version', args.patch)
     version_struct:set('release_date', args.patchdate)
     v_struct:set('release_date', args.patchdate)


     local part_names = {'major_part', 'minor_part', 'patch_part', 'revision_part'}
     local part_names = {'major_part', 'minor_part', 'patch_part', 'revision_part'}
Line 104: Line 113:


         if part then
         if part then
             version_struct:set(part_names[i], part)
             v_struct:set(part_names[i], part)
         end
         end
     end
     end
Line 122: Line 131:
             local results = util.smw.query(query, frame)
             local results = util.smw.query(query, frame)
             if #results == 1 then
             if #results == 1 then
                 version_struct:set(edge_names[i], edge_version)
                 v_struct:set(edge_names[i], edge_version)
                 version_struct:set_prop(edge_names[i], 'release_date', results[1]['Has release date'])
                 v_struct:set_prop(edge_names[i], 'release_date', results[1]['Has release date'])
             elseif #results > 1 then
             elseif #results > 1 then
                 error('There are versions with the same name')
                 error('There are versions with the same name')
Line 136: Line 145:
         _table = 'Versions',
         _table = 'Versions',
     }
     }
     for i, _ in pairs(version_struct.map) do
     for i, _ in pairs(v_struct.map) do
         local value = version_struct:get(i)
         local value = v_struct:get(i)
         if value then
         if value then
             props_smw[version_struct:get_prop(i, 'property')] = value
             props_smw[v_struct:get_prop(i, 'property')] = value
         end
         end
         --props_cargo[i] = value or ''
         --props_cargo[i] = value or ''
Line 149: Line 158:
     for i = 1, #temp_map_for_cargo do
     for i = 1, #temp_map_for_cargo do
         local v = temp_map_for_cargo[i]
         local v = temp_map_for_cargo[i]
         props_cargo[v] = version_struct:get(v) or ''
         props_cargo[v] = v_struct:get(v) or ''
     end
     end


Line 158: Line 167:
     -- Generate output
     -- Generate output
     -- todo: rework it somehow
     -- todo: rework it somehow
     local release_date = frame:callParserFunction('#show: Version ' .. version_struct:get('version'), {'?Has release date'})
     local release_date = frame:callParserFunction('#show: Version ' .. v_struct:get('version'), {'?Has release date'})


     local tbl = mw_html.create('table')
     local tbl = mw_html.create('table')
Line 172: Line 181:
             :tag('td')
             :tag('td')
                 :cssText('width: 30%')
                 :cssText('width: 30%')
                 :wikitext(version_struct:show('before'))
                 :wikitext(v_struct:show('before'))
                 :done()
                 :done()
             :tag('td')
             :tag('td')
                 :cssText('width: 40%')
                 :cssText('width: 40%')
                 :wikitext(string_format('[[Version %s]]<br>%s', version_struct:get('version'), release_date))
                 :wikitext(string_format('[[Version %s]]<br>%s', v_struct:get('version'), release_date))
                 :done()
                 :done()
             :tag('td')
             :tag('td')
                 :cssText('width: 30%')
                 :cssText('width: 30%')
                 :wikitext(version_struct:show('after'))
                 :wikitext(v_struct:show('after'))


     local cats = {
     local cats = {

Revision as of 23:34, 21 January 2017

Module documentation[view] [edit] [history] [purge]


Templates

local getArgs = require('Module:Arguments').getArgs
local util = require('Module:Util')

local error = error
local tostring = tostring
local tonumber = tonumber
local pairs = pairs

local string_format = string.format
local table_concat = table.concat

local mw_html = mw.html

local p = {}

-----

------------------------------------------------------------------------------------------------------
-- Template: Version

local version_map = {
    version = {
        datatype = 'String',
        property = 'Is version',
        validate = tostring,
    },
    release_date = {
        datatype = 'String',
        property = 'Has release date',
        validate = tostring,
    },
    major_part = {
        datatype = 'Integer',
        property = 'Has major version part',
        validate = tonumber,
    },
    minor_part = {
        datatype = 'Integer',
        property = 'Has minor version part',
        validate = tonumber,
    },
    patch_part = {
        datatype = 'Integer',
        property = 'Has patch version part',
        validate = tonumber,
    },
    revision_part = {
        datatype = 'String',
        property = 'Has revision version part',
        validate = tostring,
    },
    before = {
        datatype = 'String',
        property = 'Has version before',
        validate = tostring,
        show = function(this)
            local version = this.value
            local date = this.release_date
            if version and date then
                return string_format('← [[Version %s|%s]]<br>%s', version, version, date)
            else
                return ''
            end
        end,
    },
    after = {
        datatype = 'String',
        property = 'Has version after',
        validate = tostring,
        show = function(this)
            local version = this.value
            local date = this.release_date
            if version and date then
                return string_format('[[Version %s|%s]] →<br>%s', version, version, date)
            else
                return ''
            end
        end,
    },
}

local temp_map_for_cargo = {'version', 'release_date', 'major_part'}


p.version = function(frame)
    local args = getArgs(frame, {parentFirst = true})
    local frame = util.misc.get_frame(frame)

    --[[
    = p.version({
        before = '2.4.1a',
        patch = '2.4.1b',
        patchdate = 'October 18, 2016',
        after = '2.4.2',
    })
    --]]


    if not args.patch or not args.patchdate then
        error('Arguments "patch" and "patchdate" are required')
    end

    local version = util.cast.version(args.patch)

    local v_struct = util.Struct(version_map)

    v_struct:set('version', args.patch)
    v_struct:set('release_date', args.patchdate)

    local part_names = {'major_part', 'minor_part', 'patch_part', 'revision_part'}
    for i = 1, #part_names do
        local part = version[i]

        if part then
            v_struct:set(part_names[i], part)
        end
    end


    -- Check and set 'before' and 'after' args
    local edge_names = {'before', 'after'}
    for i = 1, #edge_names do
        local v = args[edge_names[i]]
        if v then
            local edge_version = util.cast.version(v, {return_type = 'string'})

            local query = {
                string_format('[[Is version::%s]] [[Has release date::+]]', edge_version),
                '?Has release date',
            }
            local results = util.smw.query(query, frame)
            if #results == 1 then
                v_struct:set(edge_names[i], edge_version)
                v_struct:set_prop(edge_names[i], 'release_date', results[1]['Has release date'])
            elseif #results > 1 then
                error('There are versions with the same name')
            end
        end
    end


    -- Set SMW and Cargo data
    local props_smw = {}
    local props_cargo = {
        _table = 'Versions',
    }
    for i, _ in pairs(v_struct.map) do
        local value = v_struct:get(i)
        if value then
            props_smw[v_struct:get_prop(i, 'property')] = value
        end
        --props_cargo[i] = value or ''
    end

    util.smw.set(frame, props_smw)


    for i = 1, #temp_map_for_cargo do
        local v = temp_map_for_cargo[i]
        props_cargo[v] = v_struct:get(v) or ''
    end

    -- mw.logObject(props_cargo)
    util.cargo.store(frame, props_cargo)


    -- Generate output
    -- todo: rework it somehow
    local release_date = frame:callParserFunction('#show: Version ' .. v_struct:get('version'), {'?Has release date'})

    local tbl = mw_html.create('table')
    tbl
        :addClass('wikitable successionbox')
        :tag('tr')
            :tag('th')
                :attr('colspan', 3)
                :wikitext('[[Version history|Version History]]')
                :done()
            :done()
        :tag('tr')
            :tag('td')
                :cssText('width: 30%')
                :wikitext(v_struct:show('before'))
                :done()
            :tag('td')
                :cssText('width: 40%')
                :wikitext(string_format('[[Version %s]]<br>%s', v_struct:get('version'), release_date))
                :done()
            :tag('td')
                :cssText('width: 30%')
                :wikitext(v_struct:show('after'))

    local cats = {
        'Versions',
    }

    return tostring(tbl) .. util.misc.add_category(cats)
end

-----

p.version_declare = function(frame)
    -- local args = getArgs(frame, {parentFirst = true})
    local frame = util.misc.get_frame(frame)

    local props = {
        _table = 'Versions',
    }

--    for i, _ in pairs(version_map) do
--        props[i] = _.datatype
--    end

    for i = 1, #temp_map_for_cargo do
        local v = temp_map_for_cargo[i]
        local _ = version_map[v]
        props[v] = _.datatype
    end

    --mw.logObject(props)

    return util.cargo.declare(frame, props)
end

-----

------------------------------------------------------------------------------------------------------
-- Template: Version history list

p.version_history_list = function(frame)
    local args = getArgs(frame, {parentFirst = true})
    local frame = util.misc.get_frame(frame)

    -- = p.version_history_list({conditions='[[Is version::~1*||~2*]]'})
    -- = p.version_history_list({conditions='[[Is version::~0.9*]]'})
    -- = p.version_history_list({conditions='[[Is version::~0.5*]]'})

    if args.conditions then
        args.conditions = args.conditions .. '[[Has release date::+]]'
    else
        args.conditions = '[[Is version::+]][[Has release date::+]]'
    end

    local query = {
        args.conditions,
        '?Is version',
        '?Has release date',
        sort = 'Has release date, Is version',
        order = 'desc, desc',
        link = 'none',
        offset = 0,
    }

    local results = {}
    repeat
        local result = util.smw.query(query, frame)
        local length = #result
        query.offset = query.offset + length

        for i = 1, length do
            results[#results + 1] = result[i]
        end
    until length < 1000

    local out = {}
    local last_minor_version, current_list

    for i = 1, #results do
        local result = results[i]
        local date = result['Has release date']
        local version = result['Is version']

        local v = util.cast.version(result['Is version'])
        local minor_version = table_concat({v[1], v[2], v[3]}, '.') -- todo: rework it

        if minor_version ~= last_minor_version then
            if current_list ~= nil then
                out[#out + 1] = tostring(current_list)
            end

            out[#out + 1] = string_format('===Version %s===', minor_version)
            current_list = mw_html.create('ul')
        end

        current_list:tag('li'):wikitext(string_format('%s &ndash; [[Version %s]]', date, version))

        -- save the last list
        if i == #results and current_list ~= nil then
            out[#out + 1] = tostring(current_list)
        end

        last_minor_version = minor_version
    end

    return table_concat(out, '\n')
end

-----

p.version_history_list_2 = function(frame)
    local args = getArgs(frame, {parentFirst = true})
    local frame = util.misc.get_frame(frame)

    -- = p.version_history_list({conditions='[[Is version::~1*||~2*]]'})
    -- = p.version_history_list({conditions='[[Is version::~0.9*]]'})
    -- = p.version_history_list({conditions='[[Is version::~0.5*]]'})

    if args.conditions then
        args.conditions = args.conditions .. '[[Has release date::+]]'
    else
        args.conditions = '[[Is version::+]] [[Has release date::+]]'
    end

    local query = {
        args.conditions,
        '?Is version',
        '?Has release date',
        '?Has major version part',
        '?Has minor version part',
        '?Has patch version part',
--        '?Has revision version part',
        sort = 'Has major version part, Has minor version part, Has patch version part, Is version',
        order = 'desc, desc, desc, desc',
        link = 'none',
        offset = 0,
    }

    local results = {}
    repeat
        local result = util.smw.query(query, frame)
        local length = #result
        query.offset = query.offset + length

        for i = 1, length do
            results[#results + 1] = result[i]
        end
    until length < 1000

--    mw.logObject(results)

    local out = {}
    local last_minor_version, current_list

    for i = 1, #results do
        local result = results[i]
        local date = result['Has release date']
        local version = result['Is version']

        local patch_version = string_format('%s.%s.%s',
            result['Has major version part'], result['Has minor version part'], result['Has patch version part'])

        if patch_version ~= last_minor_version then
            if current_list ~= nil then
                out[#out + 1] = tostring(current_list)
            end

            out[#out + 1] = string_format('===Version %s===', patch_version)
            current_list = mw_html.create('ul')
        end

        current_list:tag('li'):wikitext(string_format('%s &ndash; [[Version %s]]', date, version))

        -- save the last list
        if i == #results and current_list ~= nil then
            out[#out + 1] = tostring(current_list)
        end

        last_minor_version = patch_version
    end

    return table_concat(out, '\n')
end

-----

return p