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