comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:8f4df159f06b
1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error
3 local pairs = Luan.pairs or error()
4 local String = require "luan:String.luan"
5 local starts_with = String.starts_with or error()
6 local Math = require "luan:Math.luan"
7 local random = Math.random or error()
8 local Parsers = require "luan:Parsers.luan"
9 local json_string = Parsers.json_string or error()
10 local Io = require "luan:Io.luan"
11 local uri = Io.uri or error()
12 local output_to = Io.output_to or error()
13 local Http = require "luan:http/Http.luan"
14 local Utils = require "site:/lib/Utils.luan"
15 local list_to_set = Utils.list_to_set or error()
16 local compressed = Utils.compressed or error()
17 local Logging = require "luan:logging/Logging.luan"
18 local logger = Logging.logger "Ab_test"
19
20
21 local Ab_test = {}
22
23 Ab_test.tests = {
24 --[[
25 dummy = {
26 values = { "a", "b" }
27 }
28 --]]
29 home = {
30 values = { "old", "new" }
31 }
32 }
33
34 local function write(fn)
35 local request = Http.request
36 if request.ab_uri == nil then
37 request.ab_uri = uri("string:")
38 request.ab_out = request.ab_uri.text_writer()
39 end
40 output_to( request.ab_out, fn )
41 end
42
43 local cookie_names = list_to_set{}
44
45 do
46 local function set_cookie(name,value)
47 Http.response.set_persistent_cookie( name, value )
48 Http.request.cookies[name] = value
49 end
50
51 for name, info in pairs(Ab_test.tests) do
52 local cookie_name = "test_"..name
53 local values = info.values
54 cookie_names[cookie_name] = true
55
56 local value_set = list_to_set(values)
57
58 function info.value()
59 local value = Http.request.cookies[cookie_name]
60 if not value_set[value] then
61 value = values[random(#values)]
62 set_cookie( cookie_name, value )
63 write( function() %>
64 setAbTest( <%=json_string(cookie_name)%>, <%=json_string(values,compressed)%> );
65 <% end )
66 end
67 return value
68 end
69
70 function info.has_value()
71 return Http.request.cookies[cookie_name] ~= nil
72 end
73
74 end_for
75 end_do
76
77 local function remove_tests()
78 write( function() %>
79 removeAbTest('test_dummy');
80 <% end )
81 end
82
83 function Ab_test.head()
84 for cookie_name in pairs(Http.request.cookies) do
85 if starts_with(cookie_name,"test_") and not cookie_names[cookie_name] then
86 Http.response.remove_cookie(cookie_name)
87 end
88 end
89 -- remove_tests()
90 local request = Http.request
91 if request.ab_uri ~= nil then
92 request.ab_out.close()
93 request.ab_out = nil
94 %>
95 <script>
96 <%= request.ab_uri.read_text() %>
97 </script>
98 <%
99 end
100 end
101
102 return Ab_test