easy_ab 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1c7eddf36ea57f8a4c34fa66755ad8d93a55aeca
4
- data.tar.gz: e25036d29777b725fdc401bd5315fadeee044523
3
+ metadata.gz: be25942ed3b823b7bf8b4445eee642f884d6cff2
4
+ data.tar.gz: dc77331ec7b69a4a4c0f3cca37e3d7cd46b922bc
5
5
  SHA512:
6
- metadata.gz: afcc1ccfa3b319b894223e85997107dc1df50fbd2ba57fb70b7c1d0bb9d0886889c46a8e00694a4eb535923e116b1dfa2bc4564f4aa1bc7f375e120739ffc56e
7
- data.tar.gz: 78e202157604d52dd71f90a3aab4905c32ab70bc4cfc4f19042568336350897c6d10138c1226df3e1c5923113ffda7d2a84a9ecf4c9e6855f84afe7f8b8ce400
6
+ metadata.gz: 780ccb7138c2e6d0671fe6d2b1eda79cd04b68e517c941e22ce4fab91a89b31a937297a0e5f103e947db5c6d3e23fcdd3f33b0262f890039a6d90118d2674920
7
+ data.tar.gz: 11c2df2ef9ab91699e7c52b05894aff91fcaeb273d82a4adccee60849a943824f8b6cd2e42323501d8ef6f33ff059b61b604da29563b0cfeb0c93b2420403822
data/CHANGELOG.md CHANGED
@@ -1,2 +1,5 @@
1
+ # 0.1.0
2
+ * Support winner
3
+
1
4
  # 0.0.3
2
5
  * Add new API `all_participated_experiments` to list current user's all participated experiments
data/README.md CHANGED
@@ -7,8 +7,7 @@ Easy, flexible A/B testing tool for Rails.
7
7
  * Grouping your users to your predefined variants with very easy and flexible way:
8
8
  * Random with equal weightings.
9
9
  * Random with predefined weightings.
10
- * Define Proc(s) to setup your rules. Something like "sign up for 1 month to variant A, others to variant B", "user with odd id to variant A, with even id to variant B", ...
11
- Example of using proc to define rules:
10
+ * Define Proc(s) to setup your rules. Something like "sign up for 1 month to variant A, others to variant B", "user with odd id to variant A, with even id to variant B", ..., etc. Example of using proc to define rules:
12
11
 
13
12
  ```ruby
14
13
  # Example 1
@@ -30,9 +29,10 @@ Easy, flexible A/B testing tool for Rails.
30
29
  * check your view for different variants
31
30
  * output all experiments and the corresponding variants for your users. It's very useful when sending data to analytics services like Google Anayltics, Mixpanel, Kissmetrics, ...
32
31
  * No DSL, just setup your rules with pure Ruby (and Rails) :)
32
+ * Supports Rails 4 and 5
33
33
 
34
- # Notice
35
- Easy AB is under development and is in beta phase. Be sure to test before integrating with your production app.
34
+ # Changelog
35
+ [Click me](https://github.com/icarus4/easy_ab/blob/master/CHANGELOG.md)
36
36
 
37
37
  # Installation & Setup
38
38
 
@@ -69,7 +69,7 @@ EasyAb.experiments do |experiment|
69
69
  end
70
70
  ```
71
71
 
72
- Then you will be able to use the following helpers in controller or view:
72
+ Then you will be able to use `ab_test` helpers in controller or view:
73
73
 
74
74
  ```ruby
75
75
  color = ab_test(:button_color)
@@ -79,7 +79,7 @@ or pass a block
79
79
 
80
80
  ```erb
81
81
  <% ab_test(:button_color) do |color| %>
82
- <h1 class="<%= color %>">Welcome!</h1>
82
+ <button class="<%= color %>">Click Me!</button>
83
83
  <% end %>
84
84
  ```
85
85
 
@@ -114,13 +114,38 @@ EasyAb.experiments do |experiment|
114
114
  end
115
115
  ```
116
116
 
117
+ NOTICE: rules are executed in the order you defined in `config/initializers/easy_ab.rb`. If there are intersections among your rules, the former rule will be applied. For example:
118
+
119
+ ```ruby
120
+ EasyAb.experiments do |experiment|
121
+ experiment.define :extra_vip_duration,
122
+ variants: ['90', '30']
123
+ rules: [
124
+ -> { current_user.id <= 20 },
125
+ -> { current_user.id > 10 }
126
+ ]
127
+
128
+ # Users with id between 11 to 20 matches both lambdas, will get variant '90'
129
+ ```
130
+
117
131
  Keep in mind that `ab_test()` helper always returns String. You have to handle the type conversion by yourself.
118
132
 
119
- ```erb
133
+ ```ruby
120
134
  # In controller
121
135
  @extra_vip_duration = ab_test(:extra_vip_duration).to_i.days
122
136
  ```
123
137
 
138
+
139
+ When an experiment is finished, you can remove the experiment from `easy_ab.rb`, or specify the winner. `ab_test()` always returns the winner:
140
+
141
+ ```ruby
142
+ EasyAb.experiments do |experiment|
143
+ experiment.define :button_color,
144
+ variants: ['red', 'blue', 'green'],
145
+ winner: 'red'
146
+ end
147
+ ```
148
+
124
149
  You can dump experiment data of current user to analytics services (Mixpanel, Google Analytics, etc.) by `all_participated_experiments`
125
150
 
126
151
  ```erb
@@ -134,7 +159,7 @@ You can dump experiment data of current user to analytics services (Mixpanel, Go
134
159
  </script>
135
160
  ```
136
161
 
137
- The return format of `all_participated_experiments`
162
+ The return format of `all_participated_experiments`:
138
163
 
139
164
  ```ruby
140
165
  {
@@ -189,4 +214,7 @@ ab_test(:button_color).class # => String
189
214
  # Todo
190
215
  * Add comparisons with existing A/B testing gems
191
216
  * Convertion rate
192
- * Test code
217
+ * Test code
218
+
219
+ # Copyright
220
+ MIT License © 2017 Gary Chu (icarus4).
@@ -1,17 +1,19 @@
1
1
  module EasyAb
2
2
  class Experiment
3
- attr_reader :name, :variants, :weights, :rules
3
+ attr_reader :name, :variants, :weights, :rules, :winner
4
4
 
5
5
  def initialize(name, options = {})
6
- @name = name.to_s
7
- @variants = options[:variants]
8
- @weights = options[:weights]
9
- @rules = options[:rules]
6
+ @name = name.to_s
7
+ @variants = options[:variants].map(&:to_s)
8
+ @weights = options[:weights]
9
+ @rules = options[:rules]
10
+ @winner = options[:winner].nil? ? nil : options[:winner].to_s
10
11
 
11
12
  raise ArgumentError, 'Please define variants' if @variants.blank?
12
13
  raise ArgumentError, 'Number of variants and weights should be identical' if @weights.present? && @weights.size != @variants.size
13
14
  raise ArgumentError, 'Number of variants and rules should be identical' if @rules.present? && @rules.size != @variants.size
14
15
  raise ArgumentError, 'All rules should be a Proc' if @rules.present? && @rules.any? { |rule| !rule.is_a?(Proc) }
16
+ raise ArgumentError, 'winner should be one of variants' if @winner && !@variants.include?(@winner)
15
17
  end
16
18
 
17
19
  def self.find_by_name!(experiment_name)
@@ -22,10 +24,12 @@ module EasyAb
22
24
  end
23
25
 
24
26
  def assign_variant(user_recognition, options = {})
27
+ return winner if winner
28
+
25
29
  grouping = find_grouping_by_user_recognition(user_recognition) || ::EasyAb::Grouping.new(experiment: name, user_id: user_recognition[:id], cookie: user_recognition[:cookie])
26
30
 
27
- if options[:variant] && variants.include?(options[:variant])
28
- grouping.variant = options[:variant]
31
+ if options[:variant] && variants.include?(options[:variant].to_s)
32
+ grouping.variant = options[:variant].to_s
29
33
  else
30
34
  grouping.variant ||= flexible_variant(options[:contexted_rules])
31
35
  end
@@ -1,3 +1,3 @@
1
1
  module EasyAb
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -11,14 +11,14 @@ EasyAb.configure do |config|
11
11
  end
12
12
 
13
13
  EasyAb.experiments do |experiment|
14
- experiment.define :button_color,
15
- variants: ['red', 'blue', 'yellow'],
16
- weights: [8, 1, 1]
14
+ # experiment.define :button_color,
15
+ # variants: ['red', 'blue', 'yellow'],
16
+ # weights: [8, 1, 1]
17
17
 
18
- experiment.define :extra_vip_duration,
19
- variants: ['90', '30'], # Variants stored as String, you must handle the conversion in your app by yourself
20
- rules: [
21
- -> { current_user.id <= 100 },
22
- -> { current_user.id > 100 }
23
- ]
18
+ # experiment.define :extra_vip_duration,
19
+ # variants: ['90', '30'], # Variants stored as String, you must handle the conversion in your app by yourself
20
+ # rules: [
21
+ # -> { current_user.id <= 100 },
22
+ # -> { current_user.id > 100 }
23
+ # ]
24
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy_ab
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary Chu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-08 00:00:00.000000000 Z
11
+ date: 2017-08-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: icarus4.chu@gmail.com