-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Revert "rm experiment data methods for stability"
This reverts commit 211731b.
- Loading branch information
Kristján Pétursson
committed
Nov 9, 2010
1 parent
63783f1
commit a2a9899
Showing
2 changed files
with
111 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,75 @@ | ||
module Modesty | ||
class Experiment | ||
def data | ||
@data ||= (Modesty.data.class)::ExperimentData.new(self) | ||
end | ||
|
||
def chooses(alt, options={}) | ||
raise Experiment::Error, <<-msg.squish unless self.alternatives.include? alt | ||
Unknown alternative #{alt.inspect} | ||
msg | ||
|
||
id = options.include?(:for) ? options[:for] : Modesty.identity | ||
|
||
raise IdentityError, <<-msg.squish unless id | ||
Experiment#chooses doesn't work for guests. | ||
Either identify globally or pass in :for => id | ||
msg | ||
|
||
self.data.register!(alt, id) | ||
rescue Datastore::ConnectionError => e | ||
Modesty.handle_error(e) | ||
alt | ||
end | ||
|
||
def group(id=Modesty.identity) | ||
return :control unless id | ||
self.alternatives[ | ||
"#{@slug}#{id}".hash % self.alternatives.count | ||
] | ||
fetch_or_generate_group(id) | ||
end | ||
|
||
# usage: `e.group?(:experiment)` | ||
def group?(alt) | ||
self.group == alt | ||
end | ||
|
||
def num_users(alt=nil) | ||
if self.data.respond_to? :num_users | ||
self.data.num_users(alt) | ||
else | ||
self.users(alt).count | ||
end | ||
end | ||
|
||
def users(alt=nil) | ||
self.data.users(alt) | ||
end | ||
|
||
private | ||
# used to fetch the cached alternative from redis | ||
def fetch_group(identity) | ||
self.data.get_cached_alternative(identity) | ||
rescue Datastore::ConnectionError => e | ||
Modesty.handle_error(e) | ||
nil | ||
end | ||
|
||
# this is the method with the fallbacks - fetch it from redis or create it. | ||
def fetch_or_generate_group(id=Modesty.identity) | ||
alt = begin | ||
fetch_group(id) | ||
rescue Datastore::ConnectionError | ||
nil | ||
end || generate_group(id) | ||
end | ||
|
||
# generates an alternative and stores it in redis | ||
def generate_group(identity) | ||
alternative = self.alternatives[ | ||
"#{@slug}#{identity}".hash % self.alternatives.count | ||
] | ||
self.chooses(alternative, :for => identity) | ||
return alternative | ||
end | ||
|
||
end | ||
end |