Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adding support for EXPFACTORY_EXPERIMENT_FIRST and EXPFACTORY_EXPERIMENT_LAST #162

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Critical items to know are:


## [v3.x](https://github.com/expfactory/expfactory/tree/master) (master)
- adding support for first/last experiment (3.2.14)
- updating sqlalchemy (3.2.13)
- updating flask to 1.1.4 (3.2.12)
- updating yaml to use safe_load (3.2.11)
Expand Down
2 changes: 2 additions & 0 deletions expfactory/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@
EXPFACTORY_EXPERIMENTS = getenv("EXPFACTORY_EXPERIMENTS", [])
EXPFACTORY_RANDOMIZE = convert2boolean(getenv("EXPFACTORY_RANDOM", True))
EXPFACTORY_HEADLESS = convert2boolean(getenv("EXPFACTORY_HEADLESS", False))
EXPFACTORY_EXPERIMENT_FIRST = getenv("EXPFACTORY_EXPERIMENT_FIRST")
EXPFACTORY_EXPERIMENT_LAST = getenv("EXPFACTORY_EXPERIMENT_LAST")

# Runtime Variables
EXPFACTORY_RUNTIME_VARS = getenv("EXPFACTORY_RUNTIME_VARS")
Expand Down
50 changes: 46 additions & 4 deletions expfactory/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,15 @@ def setup(self):
self.base = EXPFACTORY_BASE
self.randomize = EXPFACTORY_RANDOMIZE
self.headless = EXPFACTORY_HEADLESS
self.first_experiment = EXPFACTORY_EXPERIMENT_FIRST
self.last_experiment = EXPFACTORY_EXPERIMENT_LAST

# Generate variables, if they exist
self.vars = generate_runtime_vars() or None

available = get_experiments("%s" % self.base)
available = get_experiments(self.base)
self.experiments = get_selection(available, self.selection)
self.check_experiments()
self.logger.debug(self.experiments)
self.lookup = make_lookup(self.experiments)
final = "\n".join(list(self.lookup.keys()))
Expand All @@ -96,6 +99,28 @@ def setup(self):
bot.log("Randomize: %s" % self.randomize)
bot.log("Final Set \n%s" % final)

def check_experiments(self):
"""
Given we have first or last experiments, ensure they exist
"""
if self.first_experiment and self.first_experiment not in self.experiments:
bot.warning(
"First experiment should be %s, but not found in experiment listing."
% self.first_experiment
)
if self.last_experiment and self.last_experiment not in self.experiments:
bot.warning(
"Last experiment should be %s, but not found in experiment listing."
% self.last_experiment
)

def choose_random_experiment(self, experiments):
"""
Choose a random experiment from experiments.
"""
next = random.choice(range(0, len(experiments)))
return experiments[next]

def get_next(self, session):
"""return the name of the next experiment, depending on the user's
choice to randomize. We don't remove any experiments here, that is
Expand All @@ -106,9 +131,26 @@ def get_next(self, session):
next = None
experiments = session.get("experiments", [])
if len(experiments) > 0:
if app.randomize is True:
next = random.choice(range(0, len(experiments)))
next = experiments[next]

# Grab the first experiment if haven't done it yet
if self.first_experiment and self.first_experiment in experiments:
next = self.first_experiment

# Quickly grab the last experiment
elif self.last_experiment and self.last_experiment in experiments:
next = self.last_experiment

# If we have a last experiment, don't choose if there are > 1 left
elif self.last_experiment and len(experiments) > 1:
subset = [x for x in experiments if x != self.last_experiment]
if self.randomize is True:
next = self.choose_random_experiment(subset)
else:
next = subset[0]

# Last cases, randomize or not!
elif self.randomize is True:
next = self.choose_random_experiment(experiments)
else:
next = experiments[0]
return next
Expand Down