split 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/Appraisals +7 -3
- data/CHANGELOG.md +25 -0
- data/README.md +26 -17
- data/gemfiles/3.2.gemfile +1 -1
- data/gemfiles/4.0.gemfile +1 -1
- data/gemfiles/4.1.gemfile +1 -1
- data/gemfiles/4.2.gemfile +8 -0
- data/lib/split/algorithms/whiplash.rb +21 -19
- data/lib/split/dashboard/public/style.css +0 -1
- data/lib/split/dashboard/views/index.erb +1 -1
- data/lib/split/dashboard/views/layout.erb +1 -1
- data/lib/split/encapsulated_helper.rb +4 -1
- data/lib/split/experiment_catalog.rb +3 -9
- data/lib/split/helper.rb +4 -11
- data/lib/split/metric.rb +2 -2
- data/lib/split/persistence.rb +4 -7
- data/lib/split/trial.rb +1 -1
- data/lib/split/version.rb +1 -1
- data/lib/split/zscore.rb +1 -1
- data/spec/helper_spec.rb +31 -0
- data/spec/spec_helper.rb +6 -4
- data/split.gemspec +3 -3
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b771c2496cd674b0512e956fcdb3bf67768ba4a8
|
4
|
+
data.tar.gz: cd3ac62720dbaa5968d58be74ebc689854fd0fac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f94c6eca1509241995790fefc2407ae8cdc546ceae8aad2a4fa4975c47dd4370f5cc835b630a9c91a1cd7682a24bf49c34af422a31f576af70162003717f396e
|
7
|
+
data.tar.gz: 9e47de4c77fa41c39d525c2c79448c3d1e5fdc564dfa340d00857a91cedd11517fc3e871b7f4bb208eab9a5dfe29e2a026dcd40139569d471e146d68bfbc982c
|
data/.travis.yml
CHANGED
data/Appraisals
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
appraise "3.2" do
|
2
|
-
gem "rails", "~> 3.2.
|
2
|
+
gem "rails", "~> 3.2.21"
|
3
3
|
end
|
4
4
|
|
5
5
|
appraise "4.0" do
|
6
|
-
gem "rails", "~> 4.0.
|
6
|
+
gem "rails", "~> 4.0.13"
|
7
7
|
end
|
8
8
|
|
9
9
|
appraise "4.1" do
|
10
|
-
gem "rails", "~> 4.1.
|
10
|
+
gem "rails", "~> 4.1.10"
|
11
|
+
end
|
12
|
+
|
13
|
+
appraise "4.2" do
|
14
|
+
gem "rails", "~> 4.2.1"
|
11
15
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## 1.2.1 (May 17th, 2015)
|
2
|
+
|
3
|
+
Features
|
4
|
+
|
5
|
+
- Handle redis DNS resolution failures gracefully (@fusion2004, #310)
|
6
|
+
- Push metadata to ab_test block (@ekorneeff, #296)
|
7
|
+
- Helper methods are now private when included in controllers (@ipoval, #303)
|
8
|
+
|
9
|
+
Bugfixes:
|
10
|
+
|
11
|
+
- Return an empty hash as metadata when Split is disabled (@tomasdundacek, #313)
|
12
|
+
- Don't use capture helper from ActionView (@tomasdundacek, #312)
|
13
|
+
|
14
|
+
Misc:
|
15
|
+
|
16
|
+
- Remove body "max-width" from dashboard (@xicreative, #299)
|
17
|
+
- fix private for class methods (@ipoval, #301)
|
18
|
+
- minor memoization fix in spec (@ipoval, #304)
|
19
|
+
- Minor documentation fixes (#295, #297, #305, #308)
|
20
|
+
|
1
21
|
## 1.2.0 (January 24th, 2015)
|
2
22
|
|
3
23
|
Features
|
@@ -11,6 +31,11 @@ Bugfixes:
|
|
11
31
|
|
12
32
|
## 1.1.0 (January 9th, 2015)
|
13
33
|
|
34
|
+
Changes:
|
35
|
+
|
36
|
+
- Public class methods on `Split::Experiment` (e.g., `find_or_create`)
|
37
|
+
have been moved to `Split::ExperimentCatalog`.
|
38
|
+
|
14
39
|
Features:
|
15
40
|
|
16
41
|
- Decouple trial from Split::Helper (@joshdover, #286)
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Split
|
1
|
+
# [Split](http://libraries.io/rubygems/split)
|
2
2
|
|
3
3
|
Split is a rack based ab testing framework designed to work with Rails, Sinatra or any other rack based app.
|
4
4
|
|
@@ -7,10 +7,10 @@ Split is heavily inspired by the Abingo and Vanity rails ab testing plugins and
|
|
7
7
|
Split is designed to be hacker friendly, allowing for maximum customisation and extensibility.
|
8
8
|
|
9
9
|
[![Gem Version](https://badge.fury.io/rb/split.svg)](http://badge.fury.io/rb/split)
|
10
|
-
[![Build Status](https://secure.travis-ci.org/
|
11
|
-
[![Dependency Status](https://gemnasium.com/
|
12
|
-
[![Code Climate](https://codeclimate.com/github/
|
13
|
-
[![Coverage Status](http://img.shields.io/coveralls/
|
10
|
+
[![Build Status](https://secure.travis-ci.org/splitrb/split.svg?branch=master)](http://travis-ci.org/splitrb/split)
|
11
|
+
[![Dependency Status](https://gemnasium.com/splitrb/split.svg)](https://gemnasium.com/splitrb/split)
|
12
|
+
[![Code Climate](https://codeclimate.com/github/splitrb/split.svg)](https://codeclimate.com/github/splitrb/split)
|
13
|
+
[![Coverage Status](http://img.shields.io/coveralls/splitrb/split.svg)](https://coveralls.io/r/splitrb/split)
|
14
14
|
|
15
15
|
## Requirements
|
16
16
|
|
@@ -87,7 +87,7 @@ Example: View
|
|
87
87
|
|
88
88
|
```erb
|
89
89
|
<% ab_test("login_button", "/images/button1.jpg", "/images/button2.jpg") do |button_file| %>
|
90
|
-
<%=
|
90
|
+
<%= image_tag(button_file, :alt => "Login!") %>
|
91
91
|
<% end %>
|
92
92
|
```
|
93
93
|
|
@@ -115,7 +115,7 @@ Example: Conversion tracking (in a view)
|
|
115
115
|
Thanks for signing up, dude! <% finished("signup_page_redesign") %>
|
116
116
|
```
|
117
117
|
|
118
|
-
You can find more examples, tutorials and guides on the [wiki](https://github.com/
|
118
|
+
You can find more examples, tutorials and guides on the [wiki](https://github.com/splitrb/split/wiki).
|
119
119
|
|
120
120
|
## Statistical Validity
|
121
121
|
|
@@ -250,7 +250,7 @@ For example:
|
|
250
250
|
|
251
251
|
``` ruby
|
252
252
|
Split.configure do |config|
|
253
|
-
config.on_trial_choose = :
|
253
|
+
config.on_trial_choose = :log_trial_choose
|
254
254
|
config.on_trial_complete = :log_trial_complete
|
255
255
|
end
|
256
256
|
```
|
@@ -455,8 +455,8 @@ my_first_experiment:
|
|
455
455
|
meta:
|
456
456
|
a:
|
457
457
|
text: "Have a fantastic day"
|
458
|
-
|
459
|
-
|
458
|
+
b:
|
459
|
+
text: "Don't get hit by a bus"
|
460
460
|
```
|
461
461
|
|
462
462
|
This allows for some advanced experiment configuration using methods like:
|
@@ -467,6 +467,15 @@ trial.alternative.name # => "a"
|
|
467
467
|
trial.metadata['text'] # => "Have a fantastic day"
|
468
468
|
```
|
469
469
|
|
470
|
+
or in views:
|
471
|
+
|
472
|
+
```erb
|
473
|
+
<% ab_test("my_first_experiment") do |alternative, meta| %>
|
474
|
+
<%= alternative %>
|
475
|
+
<small><%= meta['text'] %></small>
|
476
|
+
<% end %>
|
477
|
+
```
|
478
|
+
|
470
479
|
#### Metrics
|
471
480
|
|
472
481
|
You might wish to track generic metrics, such as conversions, and use
|
@@ -605,7 +614,7 @@ conduct experiments that are not tied to a web session.
|
|
605
614
|
|
606
615
|
```ruby
|
607
616
|
# create a new experiment
|
608
|
-
experiment = Split::
|
617
|
+
experiment = Split::ExperimentCatalog.find_or_create('color', 'red', 'blue')
|
609
618
|
# create a new trial
|
610
619
|
trial = Split::Trial.new(:experiment => experiment)
|
611
620
|
# run trial
|
@@ -641,8 +650,8 @@ end
|
|
641
650
|
|
642
651
|
## Extensions
|
643
652
|
|
644
|
-
- [Split::Export](http://github.com/
|
645
|
-
- [Split::Analytics](http://github.com/
|
653
|
+
- [Split::Export](http://github.com/splitrb/split-export) - easily export ab test data out of Split
|
654
|
+
- [Split::Analytics](http://github.com/splitrb/split-analytics) - push test data to google analytics
|
646
655
|
- [Split::Mongoid](https://github.com/MongoHQ/split-mongoid) - store experiment data in mongoid (still uses redis)
|
647
656
|
- [Split::Cacheable](https://github.com/harrystech/split_cacheable) - automatically create cache buckets per test
|
648
657
|
- [Split::Counters](https://github.com/bernardkroes/split-counters) - add counters per experiment and alternative
|
@@ -659,12 +668,12 @@ Ryan bates has produced an excellent 10 minute screencast about split on the Rai
|
|
659
668
|
|
660
669
|
## Contributors
|
661
670
|
|
662
|
-
Over 70 different people have contributed to the project, you can see them all here: https://github.com/
|
671
|
+
Over 70 different people have contributed to the project, you can see them all here: https://github.com/splitrb/split/graphs/contributors
|
663
672
|
|
664
673
|
## Development
|
665
674
|
|
666
|
-
Source hosted at [GitHub](http://github.com/
|
667
|
-
Report Issues/Feature requests on [GitHub Issues](http://github.com/
|
675
|
+
Source hosted at [GitHub](http://github.com/splitrb/split).
|
676
|
+
Report Issues/Feature requests on [GitHub Issues](http://github.com/splitrb/split/issues).
|
668
677
|
Discussion at [Google Groups](https://groups.google.com/d/forum/split-ruby)
|
669
678
|
|
670
679
|
Tests can be ran with `rake spec`
|
@@ -682,4 +691,4 @@ Tests can be ran with `rake spec`
|
|
682
691
|
|
683
692
|
## Copyright
|
684
693
|
|
685
|
-
Copyright (c) 2015 Andrew Nesbitt. See [LICENSE](https://github.com/
|
694
|
+
Copyright (c) 2015 Andrew Nesbitt. See [LICENSE](https://github.com/splitrb/split/blob/master/LICENSE) for details.
|
data/gemfiles/3.2.gemfile
CHANGED
data/gemfiles/4.0.gemfile
CHANGED
data/gemfiles/4.1.gemfile
CHANGED
@@ -5,30 +5,32 @@ require 'simple-random'
|
|
5
5
|
module Split
|
6
6
|
module Algorithms
|
7
7
|
module Whiplash
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
class << self
|
9
|
+
def choose_alternative(experiment)
|
10
|
+
experiment[best_guess(experiment.alternatives)]
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
+
private
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
def arm_guess(participants, completions)
|
16
|
+
a = [participants, 0].max
|
17
|
+
b = [participants-completions, 0].max
|
18
|
+
s = SimpleRandom.new; s.set_seed; s.beta(a+fairness_constant, b+fairness_constant)
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
def best_guess(alternatives)
|
22
|
+
guesses = {}
|
23
|
+
alternatives.each do |alternative|
|
24
|
+
guesses[alternative.name] = arm_guess(alternative.participant_count, alternative.all_completed_count)
|
25
|
+
end
|
26
|
+
gmax = guesses.values.max
|
27
|
+
best = guesses.keys.select { |name| guesses[name] == gmax }
|
28
|
+
best.sample
|
24
29
|
end
|
25
|
-
gmax = guesses.values.max
|
26
|
-
best = guesses.keys.select {|name| guesses[name] == gmax }
|
27
|
-
return best.sample
|
28
|
-
end
|
29
30
|
|
30
|
-
|
31
|
-
|
31
|
+
def fairness_constant
|
32
|
+
7
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -13,5 +13,5 @@
|
|
13
13
|
<% end %>
|
14
14
|
<% else %>
|
15
15
|
<p class="intro">No experiments have started yet, you need to define them in your code and introduce them to your users.</p>
|
16
|
-
<p class="intro">Check out the <a href='https://github.com/
|
16
|
+
<p class="intro">Check out the <a href='https://github.com/splitrb/split#readme'>Readme</a> for more help getting started.</p>
|
17
17
|
<% end %>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# mix into our model classes.
|
3
3
|
#
|
4
4
|
# This module exposes only two methods
|
5
|
-
# - ab_test and
|
5
|
+
# - ab_test and
|
6
6
|
# - ab_test_finished
|
7
7
|
# that can safely be mixed into any class.
|
8
8
|
#
|
@@ -14,9 +14,12 @@ module Split
|
|
14
14
|
|
15
15
|
class ContextShim
|
16
16
|
include Split::Helper
|
17
|
+
public :ab_test, :finished
|
18
|
+
|
17
19
|
def initialize(context)
|
18
20
|
@context = context
|
19
21
|
end
|
22
|
+
|
20
23
|
def ab_user
|
21
24
|
@ab_user ||= Split::Persistence.adapter.new(@context)
|
22
25
|
end
|
@@ -12,13 +12,8 @@ module Split
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.find(name)
|
15
|
-
|
16
|
-
|
17
|
-
obj.load_from_redis
|
18
|
-
else
|
19
|
-
obj = nil
|
20
|
-
end
|
21
|
-
obj
|
15
|
+
return unless Split.redis.exists(name)
|
16
|
+
Experiment.new(name).tap { |exp| exp.load_from_redis }
|
22
17
|
end
|
23
18
|
|
24
19
|
def self.find_or_initialize(metric_descriptor, control = nil, *alternatives)
|
@@ -39,8 +34,6 @@ module Split
|
|
39
34
|
experiment.save
|
40
35
|
end
|
41
36
|
|
42
|
-
private
|
43
|
-
|
44
37
|
def self.normalize_experiment(metric_descriptor)
|
45
38
|
if Hash === metric_descriptor
|
46
39
|
experiment_name = metric_descriptor.keys.first
|
@@ -51,6 +44,7 @@ module Split
|
|
51
44
|
end
|
52
45
|
return experiment_name, goals
|
53
46
|
end
|
47
|
+
private_class_method :normalize_experiment
|
54
48
|
|
55
49
|
end
|
56
50
|
end
|
data/lib/split/helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Split
|
2
2
|
module Helper
|
3
|
+
module_function
|
3
4
|
|
4
5
|
def ab_test(metric_descriptor, control = nil, *alternatives)
|
5
6
|
begin
|
@@ -15,7 +16,7 @@ module Split
|
|
15
16
|
else
|
16
17
|
control_variable(experiment.control)
|
17
18
|
end
|
18
|
-
rescue Errno::ECONNREFUSED, Redis::CannotConnectError => e
|
19
|
+
rescue Errno::ECONNREFUSED, Redis::CannotConnectError, SocketError => e
|
19
20
|
raise(e) unless Split.configuration.db_failover
|
20
21
|
Split.configuration.db_failover_on_db_error.call(e)
|
21
22
|
|
@@ -28,13 +29,8 @@ module Split
|
|
28
29
|
end
|
29
30
|
|
30
31
|
if block_given?
|
31
|
-
|
32
|
-
|
33
|
-
concat(capture(alternative, &block))
|
34
|
-
false
|
35
|
-
else
|
36
|
-
yield(alternative)
|
37
|
-
end
|
32
|
+
metadata = trial ? trial.metadata : {}
|
33
|
+
yield(alternative, metadata)
|
38
34
|
else
|
39
35
|
alternative
|
40
36
|
end
|
@@ -63,7 +59,6 @@ module Split
|
|
63
59
|
end
|
64
60
|
end
|
65
61
|
|
66
|
-
|
67
62
|
def finished(metric_descriptor, options = {:reset => true})
|
68
63
|
return if exclude_visitor? || Split.configuration.disabled?
|
69
64
|
metric_descriptor, goals = normalize_metric(metric_descriptor)
|
@@ -130,8 +125,6 @@ module Split
|
|
130
125
|
return experiment_pairs
|
131
126
|
end
|
132
127
|
|
133
|
-
protected
|
134
|
-
|
135
128
|
def normalize_metric(metric_descriptor)
|
136
129
|
if Hash === metric_descriptor
|
137
130
|
experiment_name = metric_descriptor.keys.first
|
data/lib/split/metric.rb
CHANGED
@@ -84,8 +84,6 @@ module Split
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
private
|
88
|
-
|
89
87
|
def self.normalize_metric(label)
|
90
88
|
if Hash === label
|
91
89
|
metric_name = label.keys.first
|
@@ -96,5 +94,7 @@ module Split
|
|
96
94
|
end
|
97
95
|
return metric_name, goals
|
98
96
|
end
|
97
|
+
private_class_method :normalize_metric
|
98
|
+
|
99
99
|
end
|
100
100
|
end
|
data/lib/split/persistence.rb
CHANGED
@@ -7,22 +7,19 @@ module Split
|
|
7
7
|
ADAPTERS = {
|
8
8
|
:cookie => Split::Persistence::CookieAdapter,
|
9
9
|
:session => Split::Persistence::SessionAdapter
|
10
|
-
}
|
10
|
+
}.freeze
|
11
11
|
|
12
12
|
def self.adapter
|
13
13
|
if persistence_config.is_a?(Symbol)
|
14
|
-
|
15
|
-
raise Split::InvalidPersistenceAdapterError unless adapter_class
|
14
|
+
ADAPTERS.fetch(persistence_config) { raise Split::InvalidPersistenceAdapterError }
|
16
15
|
else
|
17
|
-
|
16
|
+
persistence_config
|
18
17
|
end
|
19
|
-
adapter_class
|
20
18
|
end
|
21
19
|
|
22
|
-
private
|
23
|
-
|
24
20
|
def self.persistence_config
|
25
21
|
Split.configuration.persistence
|
26
22
|
end
|
23
|
+
private_class_method :persistence_config
|
27
24
|
end
|
28
25
|
end
|
data/lib/split/trial.rb
CHANGED
data/lib/split/version.rb
CHANGED
data/lib/split/zscore.rb
CHANGED
@@ -34,7 +34,7 @@ module Split
|
|
34
34
|
|
35
35
|
# Formula for pooled error of the difference of the means: root(π*(1-π)*(1/na+1/nc)
|
36
36
|
# π = (xa + xc) / (na + nc)
|
37
|
-
pi = (p_1*n_1 + p_2*n_2)/(n_1 + n_2)
|
37
|
+
pi = (p_1*n_1 + p_2*n_2)/(n_1 + n_2)
|
38
38
|
s_p = Math.sqrt(pi*(1-pi)*(1/n_1 + 1/n_2))
|
39
39
|
|
40
40
|
# Formula for unpooled error of the difference of the means: root(sa**2/na + sc**2/nc)
|
data/spec/helper_spec.rb
CHANGED
@@ -198,6 +198,37 @@ describe Split::Helper do
|
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
201
|
+
describe 'metadata' do
|
202
|
+
before do
|
203
|
+
Split.configuration.experiments = {
|
204
|
+
:my_experiment => {
|
205
|
+
:alternatives => ["one", "two"],
|
206
|
+
:resettable => false,
|
207
|
+
:metadata => { 'one' => 'Meta1', 'two' => 'Meta2' }
|
208
|
+
}
|
209
|
+
}
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'should be passed to helper block' do
|
213
|
+
@params = {'my_experiment' => 'one'}
|
214
|
+
expect(ab_test('my_experiment')).to eq 'one'
|
215
|
+
expect(ab_test('my_experiment') do |alternative, meta|
|
216
|
+
meta
|
217
|
+
end).to eq('Meta1')
|
218
|
+
end
|
219
|
+
|
220
|
+
it 'should pass empty hash to helper block if library disabled' do
|
221
|
+
Split.configure do |config|
|
222
|
+
config.enabled = false
|
223
|
+
end
|
224
|
+
|
225
|
+
expect(ab_test('my_experiment')).to eq 'one'
|
226
|
+
expect(ab_test('my_experiment') do |_, meta|
|
227
|
+
meta
|
228
|
+
end).to eq({})
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
201
232
|
describe 'finished' do
|
202
233
|
before(:each) do
|
203
234
|
@experiment_name = 'link_color'
|
data/spec/spec_helper.rb
CHANGED
@@ -32,8 +32,10 @@ def params
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def request(ua = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27')
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
@request ||= begin
|
36
|
+
r = OpenStruct.new
|
37
|
+
r.user_agent = ua
|
38
|
+
r.ip = '192.168.1.1'
|
39
|
+
r
|
40
|
+
end
|
39
41
|
end
|
data/split.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ["Andrew Nesbitt"]
|
10
10
|
s.licenses = ['MIT']
|
11
11
|
s.email = ["andrewnez@gmail.com"]
|
12
|
-
s.homepage = "https://github.com/
|
12
|
+
s.homepage = "https://github.com/splitrb/split"
|
13
13
|
s.summary = %q{Rack based split testing framework}
|
14
14
|
|
15
15
|
s.required_ruby_version = '>= 1.9.2'
|
@@ -25,9 +25,9 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_dependency 'sinatra', '>= 1.2.6'
|
26
26
|
s.add_dependency 'simple-random'
|
27
27
|
|
28
|
-
s.add_development_dependency 'bundler', '~> 1.
|
28
|
+
s.add_development_dependency 'bundler', '~> 1.7'
|
29
29
|
s.add_development_dependency 'coveralls'
|
30
30
|
s.add_development_dependency 'rack-test'
|
31
31
|
s.add_development_dependency 'rake'
|
32
|
-
s.add_development_dependency 'rspec', '~> 3.0'
|
32
|
+
s.add_development_dependency 'rspec', '~> 3.1.0'
|
33
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: split
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Nesbitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '1.
|
75
|
+
version: '1.7'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '1.
|
82
|
+
version: '1.7'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: coveralls
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,14 +128,14 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
131
|
+
version: 3.1.0
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
138
|
+
version: 3.1.0
|
139
139
|
description:
|
140
140
|
email:
|
141
141
|
- andrewnez@gmail.com
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- gemfiles/3.2.gemfile
|
156
156
|
- gemfiles/4.0.gemfile
|
157
157
|
- gemfiles/4.1.gemfile
|
158
|
+
- gemfiles/4.2.gemfile
|
158
159
|
- lib/split.rb
|
159
160
|
- lib/split/algorithms.rb
|
160
161
|
- lib/split/algorithms/weighted_sample.rb
|
@@ -208,7 +209,7 @@ files:
|
|
208
209
|
- spec/support/cookies_mock.rb
|
209
210
|
- spec/trial_spec.rb
|
210
211
|
- split.gemspec
|
211
|
-
homepage: https://github.com/
|
212
|
+
homepage: https://github.com/splitrb/split
|
212
213
|
licenses:
|
213
214
|
- MIT
|
214
215
|
metadata: {}
|