view 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 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