Mercurial Hosting > linkmystyle
view src/lib/Ab_test.luan @ 3:b016e4b7c8da default tip
add read_me
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 12 Jul 2025 12:51:36 -0600 |
parents | 8f4df159f06b |
children |
line wrap: on
line source
local Luan = require "luan:Luan.luan" local error = Luan.error local pairs = Luan.pairs or error() local String = require "luan:String.luan" local starts_with = String.starts_with or error() local Math = require "luan:Math.luan" local random = Math.random or error() local Parsers = require "luan:Parsers.luan" local json_string = Parsers.json_string or error() local Io = require "luan:Io.luan" local uri = Io.uri or error() local output_to = Io.output_to or error() local Http = require "luan:http/Http.luan" local Utils = require "site:/lib/Utils.luan" local list_to_set = Utils.list_to_set or error() local compressed = Utils.compressed or error() local Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "Ab_test" local Ab_test = {} Ab_test.tests = { --[[ dummy = { values = { "a", "b" } } --]] home = { values = { "old", "new" } } } local function write(fn) local request = Http.request if request.ab_uri == nil then request.ab_uri = uri("string:") request.ab_out = request.ab_uri.text_writer() end output_to( request.ab_out, fn ) end local cookie_names = list_to_set{} do local function set_cookie(name,value) Http.response.set_persistent_cookie( name, value ) Http.request.cookies[name] = value end for name, info in pairs(Ab_test.tests) do local cookie_name = "test_"..name local values = info.values cookie_names[cookie_name] = true local value_set = list_to_set(values) function info.value() local value = Http.request.cookies[cookie_name] if not value_set[value] then value = values[random(#values)] set_cookie( cookie_name, value ) write( function() %> setAbTest( <%=json_string(cookie_name)%>, <%=json_string(values,compressed)%> ); <% end ) end return value end function info.has_value() return Http.request.cookies[cookie_name] ~= nil end end_for end_do local function remove_tests() write( function() %> removeAbTest('test_dummy'); <% end ) end function Ab_test.head() for cookie_name in pairs(Http.request.cookies) do if starts_with(cookie_name,"test_") and not cookie_names[cookie_name] then Http.response.remove_cookie(cookie_name) end end -- remove_tests() local request = Http.request if request.ab_uri ~= nil then request.ab_out.close() request.ab_out = nil %> <script> <%= request.ab_uri.read_text() %> </script> <% end end return Ab_test