ExAbby (ex_abby v0.3.0)
ExAbby: an Elixir/Phoenix library for A/B testing.
Provides a unified interface for both Phoenix controllers and LiveView, automatically detecting and handling each case appropriately.
Summary
Functions
Gets or creates a trial for a single experiment. Convenience wrapper around get_variations.
Gets or creates trials for multiple experiments.
Links session-based trials to a user. This allows tracking experiments across both session and user contexts.
Records a success for a single experiment. Convenience wrapper around record_successes.
Records successes for multiple experiments.
Saves session info to socket. Used on pages where you call success so you do not create a new experiment before you call results
Sets a specific variation for an experiment. Returns {:ok, trial} if successful, {:error, reason} otherwise.
Functions
Gets or creates a trial for a single experiment. Convenience wrapper around get_variations.
Examples:
# In Phoenix controller:
{conn, variation} = ExAbby.get_variation(conn, "experiment_name")
# In LiveView:
socket = ExAbby.get_variation(socket, session, "experiment_name")
# For user-based:
variation = ExAbby.get_variation(user, "experiment_name")
Gets or creates trials for multiple experiments.
Examples:
# In Phoenix controller:
{conn, variations} = ExAbby.get_variations(conn, ["exp1", "exp2"])
# In LiveView:
socket = ExAbby.get_variations(socket, session, ["exp1", "exp2"])
# For user-based:
variations = ExAbby.get_variations(user, ["exp1", "exp2"])
Links session-based trials to a user. This allows tracking experiments across both session and user contexts.
Examples:
# Link all session experiments (default):
conn = ExAbby.link_session_to_user(conn, user)
# Link specific experiments:
conn = ExAbby.link_session_to_user(conn, user, ["exp1", "exp2"])
# In LiveView:
socket = ExAbby.link_session_to_user(socket, user)
# With user_id directly:
conn = ExAbby.link_session_to_user(conn, user_id)Returns updated conn/socket with the link operation results.
Records a success for a single experiment. Convenience wrapper around record_successes.
Records successes for multiple experiments.
Options
:amount- Optional numeric value to track with the success (default: 0.0):success_type- Type of success to record, either:success1or:success2(default::success1)
Examples:
# In Phoenix controller:
{:ok, results} = ExAbby.record_successes(conn, ["exp1", "exp2"])
{:error, %{successful: ["exp1"], failed: ["exp2"]}} = ExAbby.record_successes(conn, ["exp1", "exp2"])
# In LiveView:
{:ok, results} = ExAbby.record_successes(socket, ["exp1", "exp2"])
# For user-based:
{:ok, results} = ExAbby.record_successes(user, ["exp1", "exp2"])Returns either:
{:ok, %{experiment_name => {:ok, trial}}}if all successful{:error, %{successful: [...], failed: [...]}}if any failed
@spec save_session_data(Phoenix.LiveView.Socket.t(), map()) :: map()
Saves session info to socket. Used on pages where you call success so you do not create a new experiment before you call results
Sets a specific variation for an experiment. Returns {:ok, trial} if successful, {:error, reason} otherwise.
Examples:
# In Phoenix controller:
{:ok, trial} = ExAbby.set_variation(conn, "experiment_name", "variation_name")
# In LiveView:
{:ok, trial} = ExAbby.set_variation(socket, "experiment_name", "variation_name")
# For user-based:
{:ok, trial} = ExAbby.set_variation(user, "experiment_name", "variation_name")
See ExAbby.Experiments.upsert_experiment_and_update_weights/4.