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 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