blackbeard 0.0.1.4 → 0.0.2.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/README.md +31 -3
- data/lib/blackbeard/context.rb +10 -7
- data/lib/blackbeard/errors.rb +4 -0
- data/lib/blackbeard/pirate.rb +15 -0
- data/lib/blackbeard/version.rb +1 -1
- data/spec/context_spec.rb +26 -0
- data/spec/pirate_spec.rb +32 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 613ebf477638192eb2ab160882e277bb3b6d0f1a
|
4
|
+
data.tar.gz: 55fea491870b73d48e81ff393a7ae2ba22f337d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05a94bcd373c3c302a64179489a6b1efc3bd58980684f7afcd8200a690663fb9e7daed6ab01c9d5d4f3fae946d11e03326298d938ac94e24057a6da8e08d38dc
|
7
|
+
data.tar.gz: 49f3612b4a6c53f0a5c8b6910ee585e17473e30071ec778318aa6a4715ea3a756ef025f8fb091f4a522a490cae6b87f0686828f72f7e1788f0202e7f79e30b7d
|
data/README.md
CHANGED
@@ -56,11 +56,39 @@ $pirate.context(:user_id => user_id, :cookies => cookies).add_unique(:logged_in_
|
|
56
56
|
Non-unique counts are for metrics wherein a user may trigger the same metric multiple times and the amounts are summed up.
|
57
57
|
|
58
58
|
```ruby
|
59
|
-
$pirate.context(...).
|
60
|
-
$pirate.context(...).
|
61
|
-
$pirate.context(...).
|
59
|
+
$pirate.context(...).add_total(:like, +1) # increment a like
|
60
|
+
$pirate.context(...).add_total(:like, -1) # de-increment a like
|
61
|
+
$pirate.context(...).add_total(:revenue, +119.95) # can also accept floats
|
62
62
|
```
|
63
63
|
|
64
|
+
### Setting Context
|
65
|
+
|
66
|
+
Most of Blackbeard's calls are done via a context.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
$pirate.context(:user_id => current_user.id, :bot => false, :cookies => app_cookie_jar)
|
70
|
+
```
|
71
|
+
|
72
|
+
To establish identity, a context must have a user_id or a cookie_jar where blackbeard will cookie a visitor with it's own uid. As cookie_jar is optional, you can collect metrics outside a web request. You can also increment metrics for users other than the one currently logged in. For example, if user A refers visitor B and vistor B joins, then you can increment User A's referrals.
|
73
|
+
|
74
|
+
It gets pretty tedious for a web app to constantly set the context. To make that more paletable you can use a before filter in Rails (or your framework's equivalent) and the $pirate.set_context method.
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
before_action do |controller|
|
78
|
+
$pirate.set_context(
|
79
|
+
:user_id => controller.current_user.id,
|
80
|
+
:bot => controller.bot?,
|
81
|
+
:cookies => controller.cookies)
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
If you `set_context` you can now make calls directly on $pirate and they will be delegate to that context.
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
$pirate.add_total(:like, +1)
|
89
|
+
```
|
90
|
+
|
91
|
+
|
64
92
|
## Contributing
|
65
93
|
|
66
94
|
1. Fork it
|
data/lib/blackbeard/context.rb
CHANGED
@@ -5,15 +5,18 @@ module Blackbeard
|
|
5
5
|
@pirate = pirate
|
6
6
|
@user_id = options[:user_id]
|
7
7
|
@bot = options[:bot] || false
|
8
|
-
@
|
8
|
+
@cookies = options[:cookies] || {}
|
9
|
+
raise NonIdentifyingContextError unless @cookies || @user_id
|
9
10
|
end
|
10
11
|
|
11
12
|
def add_total(name, amount = 1)
|
12
|
-
@pirate.total_metric(name.to_s).add(amount) unless bot?
|
13
|
+
@pirate.total_metric(name.to_s).add(unique_identifier, amount) unless bot?
|
14
|
+
self
|
13
15
|
end
|
14
16
|
|
15
17
|
def add_unique(name)
|
16
18
|
@pirate.unique_metric(name.to_s).add(unique_identifier) unless bot?
|
19
|
+
self
|
17
20
|
end
|
18
21
|
|
19
22
|
def feature(name, options = {})
|
@@ -22,23 +25,23 @@ module Blackbeard
|
|
22
25
|
options[:variation_to_show]
|
23
26
|
end
|
24
27
|
|
25
|
-
private
|
26
|
-
|
27
28
|
def bot?
|
28
29
|
@bot
|
29
30
|
end
|
30
31
|
|
31
32
|
def unique_identifier
|
32
|
-
@user_id.
|
33
|
+
@user_id.nil? ? "b#{blackbeard_visitor_id}" : "a#{@user_id}"
|
33
34
|
end
|
34
35
|
|
36
|
+
private
|
37
|
+
|
35
38
|
def blackbeard_visitor_id(cookies)
|
36
|
-
cookies[:bbd] ||= generate_blackbeard_visitor_id(cookies)
|
39
|
+
@cookies[:bbd] ||= generate_blackbeard_visitor_id(cookies)
|
37
40
|
end
|
38
41
|
|
39
42
|
def generate_blackbeard_visitor_id(cookies)
|
40
43
|
id = Blackbeard.db.increment("visitor_id")
|
41
|
-
cookies[:bbd] = { :value => id, :expires => Time.now + 31536000 }
|
44
|
+
@cookies[:bbd] = { :value => id, :expires => Time.now + 31536000 }
|
42
45
|
id
|
43
46
|
end
|
44
47
|
|
data/lib/blackbeard/pirate.rb
CHANGED
@@ -3,6 +3,7 @@ require "blackbeard/metric"
|
|
3
3
|
require "blackbeard/metric/unique"
|
4
4
|
require "blackbeard/metric/total"
|
5
5
|
require "blackbeard/feature"
|
6
|
+
require "blackbeard/errors"
|
6
7
|
|
7
8
|
module Blackbeard
|
8
9
|
class Pirate
|
@@ -28,5 +29,19 @@ module Blackbeard
|
|
28
29
|
Context.new(self, options)
|
29
30
|
end
|
30
31
|
|
32
|
+
def set_context(options = {})
|
33
|
+
@set_context = Context.new(self, options)
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_unique(name)
|
37
|
+
raise MissingContextError unless @set_context
|
38
|
+
@set_context.add_unique(name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_total(name, amount)
|
42
|
+
raise MissingContextError unless @set_context
|
43
|
+
@set_context.add_total(name, amount)
|
44
|
+
end
|
45
|
+
|
31
46
|
end
|
32
47
|
end
|
data/lib/blackbeard/version.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Blackbeard::Context do
|
4
|
+
let(:pirate) { Blackbeard::Pirate.new }
|
5
|
+
let(:context) { Blackbeard::Context.new(pirate, :user_id => 9) }
|
6
|
+
let(:uid) { context.unique_identifier }
|
7
|
+
let(:total_metric) { Blackbeard::Metric::Total.new(:total_things) }
|
8
|
+
let(:unique_metric) { Blackbeard::Metric::Unique.new(:unique_things) }
|
9
|
+
|
10
|
+
describe "#add_total" do
|
11
|
+
it "should call add on the total metric" do
|
12
|
+
pirate.should_receive(:total_metric).with(total_metric.name){ total_metric }
|
13
|
+
total_metric.should_receive(:add).with(uid, 3)
|
14
|
+
context.add_total( total_metric.name, 3 )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#add_unique" do
|
19
|
+
it "should call add on the unique metric" do
|
20
|
+
pirate.should_receive(:unique_metric).with(unique_metric.name){ unique_metric }
|
21
|
+
unique_metric.should_receive(:add).with(uid)
|
22
|
+
context.add_unique( unique_metric.name )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/spec/pirate_spec.rb
CHANGED
@@ -23,4 +23,36 @@ describe Blackbeard::Pirate do
|
|
23
23
|
|
24
24
|
end
|
25
25
|
|
26
|
+
describe "#context" do
|
27
|
+
it "should return a brand new context" do
|
28
|
+
new_context = double
|
29
|
+
Blackbeard::Context.should_receive(:new).and_return(new_context)
|
30
|
+
pirate.context.should == new_context
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "set context delegations" do
|
35
|
+
context "with no set context" do
|
36
|
+
it "should raise Blackbeard::MissingContextError" do
|
37
|
+
expect{ pirate.add_unique(:exmaple) }.to raise_error( Blackbeard::MissingContextError )
|
38
|
+
end
|
39
|
+
it "should raise Blackbeard::MissingContextError" do
|
40
|
+
expect{ pirate.add_total(:exmaple, 1) }.to raise_error( Blackbeard::MissingContextError )
|
41
|
+
end
|
42
|
+
end
|
43
|
+
context "with context set" do
|
44
|
+
let!(:set_context){ pirate.set_context(:user_id => 1) }
|
45
|
+
|
46
|
+
it "should delegate #add_unique" do
|
47
|
+
set_context.should_receive(:add_unique).with(:example_metric).and_return(set_context)
|
48
|
+
pirate.add_unique(:example_metric)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should delegate #add_total" do
|
52
|
+
set_context.should_receive(:add_total).with(:example_metric, 1).and_return(set_context)
|
53
|
+
pirate.add_total(:example_metric, 1)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
26
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blackbeard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Graff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- lib/blackbeard/dashboard/views/layout.erb
|
158
158
|
- lib/blackbeard/dashboard/views/metrics/index.erb
|
159
159
|
- lib/blackbeard/dashboard/views/metrics/show.erb
|
160
|
+
- lib/blackbeard/errors.rb
|
160
161
|
- lib/blackbeard/feature.rb
|
161
162
|
- lib/blackbeard/metric.rb
|
162
163
|
- lib/blackbeard/metric/total.rb
|
@@ -166,6 +167,7 @@ files:
|
|
166
167
|
- lib/blackbeard/storable.rb
|
167
168
|
- lib/blackbeard/version.rb
|
168
169
|
- spec/blackbeard_spec.rb
|
170
|
+
- spec/context_spec.rb
|
169
171
|
- spec/dashboard_spec.rb
|
170
172
|
- spec/metric_spec.rb
|
171
173
|
- spec/pirate_spec.rb
|
@@ -198,6 +200,7 @@ specification_version: 4
|
|
198
200
|
summary: Blackbeard is a Redis backed metrics collection system with a Rack dashboard
|
199
201
|
test_files:
|
200
202
|
- spec/blackbeard_spec.rb
|
203
|
+
- spec/context_spec.rb
|
201
204
|
- spec/dashboard_spec.rb
|
202
205
|
- spec/metric_spec.rb
|
203
206
|
- spec/pirate_spec.rb
|