ablab 0.2.11 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ablab/store/redis.rb +28 -10
- data/lib/ablab/version.rb +1 -1
- data/spec/ablab/store/redis_spec.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12f71c1bce10f9c02b35a34690b8c5a3f9116591
|
4
|
+
data.tar.gz: ac5b44830c77f57d30efa75bcd95b0c33648e5f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 149c7facb01e5c55f04890ed49afb0281d49068bf319e603b35df286098829d5d9f77c06b81e087a53b7578c1ca219f5f8828ee647b082315b5865b602d74aa9
|
7
|
+
data.tar.gz: 3f6446406904c78461b83d40a4b343cac2a13ae4a03b84f84e425cf3c1d9e4bf6ee87601e7d52c5993f1e919bcab673b528e6765755b704c167c8bd1c79fc246
|
data/lib/ablab/store/redis.rb
CHANGED
@@ -6,8 +6,9 @@ module Ablab
|
|
6
6
|
attr_reader :redis
|
7
7
|
|
8
8
|
def initialize(opts = {})
|
9
|
-
@key_prefix = opts[:key_prefix] || 'ablab'
|
9
|
+
@key_prefix = opts[:key_prefix] || 'ablab:1'
|
10
10
|
@redis = ::Redis.new(opts)
|
11
|
+
@session_duration = opts[:session_duration] || (60 * 30)
|
11
12
|
end
|
12
13
|
|
13
14
|
def track_view!(experiment, bucket, session_id)
|
@@ -23,7 +24,12 @@ module Ablab
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def sessions(experiment, bucket)
|
26
|
-
|
27
|
+
s, z = nil, nil
|
28
|
+
redis.multi do
|
29
|
+
s = redis.zcard(key(:sessions, experiment, bucket))
|
30
|
+
z = redis.get(key(:'sessions:spool', experiment, bucket))
|
31
|
+
end
|
32
|
+
(s.value || 0).to_i + (z.value || 0).to_i
|
27
33
|
end
|
28
34
|
|
29
35
|
def successes(experiment, bucket)
|
@@ -31,22 +37,29 @@ module Ablab
|
|
31
37
|
end
|
32
38
|
|
33
39
|
def conversions(experiment, bucket)
|
34
|
-
|
40
|
+
c, z = nil, nil
|
41
|
+
redis.multi do
|
42
|
+
c = redis.zcard(key(:conversions, experiment, bucket))
|
43
|
+
z = redis.get(key(:'conversions:spool', experiment, bucket))
|
44
|
+
end
|
45
|
+
(c.value || 0).to_i + (z.value || 0).to_i
|
35
46
|
end
|
36
47
|
|
37
48
|
def counts(experiment, bucket)
|
38
|
-
v, s, x, c = nil, nil, nil, nil
|
49
|
+
v, s, k, x, c, z = nil, nil, nil, nil, nil, nil
|
39
50
|
redis.multi do
|
40
51
|
v = redis.get(key(:views, experiment, bucket))
|
41
|
-
s = redis.
|
52
|
+
s = redis.zcard(key(:sessions, experiment, bucket))
|
53
|
+
k = redis.get(key(:'sessions:spool', experiment, bucket))
|
42
54
|
x = redis.get(key(:successes, experiment, bucket))
|
43
|
-
c = redis.
|
55
|
+
c = redis.zcard(key(:conversions, experiment, bucket))
|
56
|
+
z = redis.get(key(:'conversions:spool', experiment, bucket))
|
44
57
|
end
|
45
58
|
{
|
46
59
|
views: (v.value || 0).to_i,
|
47
|
-
sessions: (s.value || 0).to_i,
|
60
|
+
sessions: (s.value || 0).to_i + (k.value || 0).to_i,
|
48
61
|
successes: (x.value || 0).to_i,
|
49
|
-
conversions: (c.value || 0).to_i
|
62
|
+
conversions: (c.value || 0).to_i + (z.value || 0).to_i
|
50
63
|
}
|
51
64
|
end
|
52
65
|
|
@@ -58,10 +71,15 @@ module Ablab
|
|
58
71
|
return false if bucket.nil?
|
59
72
|
redis.pipelined do
|
60
73
|
redis.incr(key(counter, experiment, bucket))
|
61
|
-
redis.
|
74
|
+
redis.zadd(key(set, experiment, bucket), Time.now.to_i, session_id)
|
62
75
|
end
|
76
|
+
spool_set!(experiment, bucket, set) if rand(100) < 1
|
77
|
+
end
|
78
|
+
|
79
|
+
private def spool_set!(experiment, bucket, set)
|
80
|
+
n = redis.zremrangebyscore(key(set, experiment, bucket), 0, Time.now.to_i - @session_duration)
|
81
|
+
redis.incrby(key("#{set}:spool", experiment, bucket), n)
|
63
82
|
end
|
64
83
|
end
|
65
84
|
end
|
66
85
|
end
|
67
|
-
|
data/lib/ablab/version.rb
CHANGED
@@ -21,5 +21,17 @@ describe Ablab::Store::Redis do
|
|
21
21
|
|
22
22
|
let(:store) { Ablab::Store::Redis.new(db: 2, key_prefix: 'ablabtest') }
|
23
23
|
include_examples 'store'
|
24
|
+
|
25
|
+
describe 'spool_set!' do
|
26
|
+
it 'does not change the count' do
|
27
|
+
5.times do |i|
|
28
|
+
store.track_view!('foo', 'bar', i)
|
29
|
+
end
|
30
|
+
later = Time.at(Time.now.to_i + 60 * 60)
|
31
|
+
allow(Time).to receive(:now).and_return(later)
|
32
|
+
expect { store.send(:spool_set!, 'foo', 'bar', :sessions) }
|
33
|
+
.not_to change { store.sessions('foo', 'bar') }
|
34
|
+
end
|
35
|
+
end
|
24
36
|
end
|
25
37
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ablab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Ongaro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|