ExAbby (ex_abby v0.5.1)

Copy Markdown

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

Excludes every active trial belonging to the supplied session IDs.

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.

Restores every excluded trial belonging to the supplied session IDs.

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

exclude_session_trials(session_ids, opts \\ [])

Excludes every active trial belonging to the supplied session IDs.

Excluded trials remain available for audit and can be restored with restore_session_trials/1. Returns {:ok, count} where count is the number of rows changed.

get_variation(conn, experiment_name)

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")

get_variation(socket, session, experiment_name)

get_variations(conn, experiment_names)

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"])

get_variations(socket, session, experiment_names)

record_success(context, experiment_name, opts \\ [])

Records a success for a single experiment. Convenience wrapper around record_successes.

record_successes(context, experiment_names, opts \\ [])

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 :success1 or :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

restore_session_trials(session_ids)

Restores every excluded trial belonging to the supplied session IDs.

Returns {:ok, count} where count is the number of rows changed.

save_session_data(socket, session)

@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

set_variation(conn, experiment_name)

set_variation(conn, experiment_name, variation_name)

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")

upsert_experiment_and_update_weights(experiment_name, description, variations, opts \\ [])

See ExAbby.Experiments.upsert_experiment_and_update_weights/4.