blackbeard 0.0.1 → 0.0.1.1

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: 40ecb485cbf20c68fb3c9eb801b3a4190a159d5a
4
- data.tar.gz: ef929019e6ca00b2eb177700d661d21fc18c832c
3
+ metadata.gz: cab0360eada0f7c58e88eb30642cc1a31f23128a
4
+ data.tar.gz: 2171034dbbf18c5352c029603b812df6f6280b38
5
5
  SHA512:
6
- metadata.gz: ca6c0cd39a9846cb23dbc157900d89e0164b50d5b4ccaec5f81e96349f30931f95193d5045310d6bc7ee0e4b666e50abca65cdc399f9ce9ab298a0701d64cfbd
7
- data.tar.gz: 566519a8926091851afb1f4c7ba679a9ab71ffd750a7d0519daef8ce22476e0ff53dd4051817e542092fd6aaf2419744c22af4b62e7d967e4c39973ad7718813
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 it's development.}
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", "~> 0"
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", "~> 1"
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
@@ -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?
@@ -0,0 +1,13 @@
1
+ require 'blackbeard/storable'
2
+
3
+ module Blackbeard
4
+ class Feature < Storable
5
+
6
+ private
7
+
8
+ def self.master_key
9
+ "features"
10
+ end
11
+
12
+ end
13
+ end
@@ -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
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Blackbeard
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.1.1"
3
3
  end
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-16 00:00:00.000000000 Z
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: '0'
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: '0'
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: '1'
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: '1'
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 it's development.
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