Mercurial Hosting > linkmystyle
diff src/lib/Ab_test.luan @ 0:8f4df159f06b
start public repo
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 11 Jul 2025 20:57:49 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/Ab_test.luan Fri Jul 11 20:57:49 2025 -0600 @@ -0,0 +1,102 @@ +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