blackbeard 0.0.1 → 0.0.1.1
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/blackbeard.gemspec +4 -4
- data/lib/blackbeard/context.rb +6 -0
- data/lib/blackbeard/feature.rb +13 -0
- data/lib/blackbeard/metric.rb +8 -30
- data/lib/blackbeard/pirate.rb +6 -2
- data/lib/blackbeard/storable.rb +38 -0
- data/lib/blackbeard/version.rb +1 -1
- data/spec/pirate_spec.rb +21 -0
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cab0360eada0f7c58e88eb30642cc1a31f23128a
|
4
|
+
data.tar.gz: 2171034dbbf18c5352c029603b812df6f6280b38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bd829d92bfaeee1a39e1c077d8d020e0b67f5ca3ae442987d28d7978297980bfcca53bea255f9c70da70256bf2a4edb43c906e615b51df6b8e6dc4069b6af64
|
7
|
+
data.tar.gz: 0e352a8c9dc8220c4e75eb860cda59200453b073c88a9869e5fae75add9f44243846c661cec6ecd4d80f984bcef50c1d66f35c50494c49bee4cf5ce0d8849be6
|
data/blackbeard.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Blackbeard::VERSION
|
9
9
|
spec.authors = ["Robert Graff"]
|
10
10
|
spec.email = ["robert_graff@yahoo.com"]
|
11
|
-
spec.description = %q{Blackbeard is a Redis backed metrics collection system with a Rack dashboard. It dreams of being a replacement for rollout and split, but is early in
|
11
|
+
spec.description = %q{Blackbeard is a Redis backed metrics collection system with a Rack dashboard. It dreams of being a replacement for rollout and split, but is early in its development.}
|
12
12
|
spec.summary = %q{Blackbeard is a Redis backed metrics collection system with a Rack dashboard}
|
13
13
|
spec.homepage = "https://github.com/goldstar/blackbeard"
|
14
14
|
spec.license = "MIT"
|
@@ -18,13 +18,13 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler", "~>
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
-
spec.add_development_dependency "rspec", "~> 2"
|
23
|
+
spec.add_development_dependency "rspec", "~> 2.6"
|
24
24
|
spec.add_development_dependency 'rack-test', '~> 0.6'
|
25
25
|
|
26
26
|
spec.add_runtime_dependency "sinatra-base", "~> 1.4"
|
27
|
-
spec.add_runtime_dependency "tzinfo", "~>
|
27
|
+
spec.add_runtime_dependency "tzinfo", "~> 0.3"
|
28
28
|
spec.add_runtime_dependency 'redis', '~> 3.0', '>= 3.0.4'
|
29
29
|
spec.add_runtime_dependency 'redis-namespace', '~> 1.4', '>= 1.4.1'
|
30
30
|
end
|
data/lib/blackbeard/context.rb
CHANGED
@@ -16,6 +16,12 @@ module Blackbeard
|
|
16
16
|
@pirate.unique_metric(name.to_s).add(unique_identifier) unless bot?
|
17
17
|
end
|
18
18
|
|
19
|
+
def feature(name, options = {})
|
20
|
+
variations = options.keys
|
21
|
+
variation_to_show = @pirate.feature(name.to_s).select_variation(variations, unique_identifier)
|
22
|
+
options[:variation_to_show]
|
23
|
+
end
|
24
|
+
|
19
25
|
private
|
20
26
|
|
21
27
|
def bot?
|
data/lib/blackbeard/metric.rb
CHANGED
@@ -2,17 +2,19 @@ require "blackbeard/storable"
|
|
2
2
|
|
3
3
|
module Blackbeard
|
4
4
|
class Metric < Storable
|
5
|
-
attr_reader :name
|
6
|
-
|
7
|
-
def initialize(name)
|
8
|
-
@name = name.to_s.downcase
|
9
|
-
db.hash_key_set_if_not_exists(metrics_key, key, tz.now.to_date)
|
10
|
-
end
|
11
5
|
|
12
6
|
def self.new_from_type_name(type, name)
|
13
7
|
self.const_get(type.capitalize).new(name)
|
14
8
|
end
|
15
9
|
|
10
|
+
def type
|
11
|
+
self.class.name.split("::").last.downcase
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.master_key
|
15
|
+
"metrics"
|
16
|
+
end
|
17
|
+
|
16
18
|
def self.new_from_key(key)
|
17
19
|
if key =~ /^metrics::(.+)::(.+)$/
|
18
20
|
new_from_type_name($1, $2)
|
@@ -21,26 +23,6 @@ module Blackbeard
|
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
|
-
def self.all
|
25
|
-
all_keys.map{ |key| new_from_key(key) }
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.all_keys
|
29
|
-
db.hash_keys(metrics_key)
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.count
|
33
|
-
db.hash_length(metrics_key)
|
34
|
-
end
|
35
|
-
|
36
|
-
def type
|
37
|
-
self.class.name.split("::").last.downcase
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.metrics_key
|
41
|
-
"metrics"
|
42
|
-
end
|
43
|
-
|
44
26
|
def key
|
45
27
|
"metrics::#{ type }::#{ name }"
|
46
28
|
end
|
@@ -65,10 +47,6 @@ private
|
|
65
47
|
db.hash_keys(hours_set_key)
|
66
48
|
end
|
67
49
|
|
68
|
-
def metrics_key
|
69
|
-
self.class.metrics_key
|
70
|
-
end
|
71
|
-
|
72
50
|
def hours_set_key
|
73
51
|
"#{key}::hours"
|
74
52
|
end
|
data/lib/blackbeard/pirate.rb
CHANGED
@@ -2,14 +2,14 @@ require "blackbeard/context"
|
|
2
2
|
require "blackbeard/metric"
|
3
3
|
require "blackbeard/metric/unique"
|
4
4
|
require "blackbeard/metric/total"
|
5
|
+
require "blackbeard/feature"
|
5
6
|
|
6
7
|
module Blackbeard
|
7
8
|
class Pirate
|
8
|
-
attr_accessor :total_metrics, :unique_metrics
|
9
|
-
|
10
9
|
def initialize
|
11
10
|
@total_metrics = {}
|
12
11
|
@unique_metrics = {}
|
12
|
+
@features = {}
|
13
13
|
end
|
14
14
|
|
15
15
|
def total_metric(name)
|
@@ -20,6 +20,10 @@ module Blackbeard
|
|
20
20
|
@unique_metrics[name] ||= Metric::Unique.new(name)
|
21
21
|
end
|
22
22
|
|
23
|
+
def feature(name)
|
24
|
+
@features[name] ||= Feature.new(name)
|
25
|
+
end
|
26
|
+
|
23
27
|
def context(options = {})
|
24
28
|
Context.new(self, options)
|
25
29
|
end
|
data/lib/blackbeard/storable.rb
CHANGED
@@ -1,5 +1,43 @@
|
|
1
1
|
module Blackbeard
|
2
2
|
class Storable
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name.to_s.downcase
|
7
|
+
db.hash_key_set_if_not_exists(master_key, key, tz.now.to_date)
|
8
|
+
end
|
9
|
+
|
10
|
+
def master_key
|
11
|
+
raise "define master key in the class that inherits from storable"
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.new_from_key(key)
|
15
|
+
name = key.split('::').last
|
16
|
+
self.new(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.all_keys
|
20
|
+
db.hash_keys(master_key)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.count
|
24
|
+
db.hash_length(master_key)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.all
|
28
|
+
all_keys.map{ |key| new_from_key(key) }
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def key
|
34
|
+
"#{master_key}::#{ name }"
|
35
|
+
end
|
36
|
+
|
37
|
+
def master_key
|
38
|
+
self.class.master_key
|
39
|
+
end
|
40
|
+
|
3
41
|
def db
|
4
42
|
self.class.db
|
5
43
|
end
|
data/lib/blackbeard/version.rb
CHANGED
data/spec/pirate_spec.rb
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe Blackbeard::Pirate do
|
4
|
+
let(:pirate) { Blackbeard::Pirate.new }
|
5
|
+
|
6
|
+
describe "memoization" do
|
7
|
+
let(:name){ "bond" }
|
8
|
+
|
9
|
+
it "should get features once" do
|
10
|
+
Blackbeard::Feature.should_receive(:new).with(name).once.and_return(true)
|
11
|
+
4.times{ pirate.feature(name) }
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should get unique metrics once" do
|
15
|
+
Blackbeard::Metric::Unique.should_receive(:new).with(name).once.and_return(true)
|
16
|
+
4.times{ pirate.unique_metric(name) }
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should get total metrics once" do
|
20
|
+
Blackbeard::Metric::Total.should_receive(:new).with(name).once.and_return(true)
|
21
|
+
4.times{ pirate.total_metric(name) }
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
4
25
|
|
5
26
|
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.1
|
4
|
+
version: 0.0.1.1
|
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-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '2'
|
47
|
+
version: '2.6'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '2'
|
54
|
+
version: '2.6'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rack-test
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '0.3'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '0.3'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: redis
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,7 +135,7 @@ dependencies:
|
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: 1.4.1
|
137
137
|
description: Blackbeard is a Redis backed metrics collection system with a Rack dashboard.
|
138
|
-
It dreams of being a replacement for rollout and split, but is early in
|
138
|
+
It dreams of being a replacement for rollout and split, but is early in its development.
|
139
139
|
email:
|
140
140
|
- robert_graff@yahoo.com
|
141
141
|
executables: []
|
@@ -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/feature.rb
|
160
161
|
- lib/blackbeard/metric.rb
|
161
162
|
- lib/blackbeard/metric/total.rb
|
162
163
|
- lib/blackbeard/metric/unique.rb
|