redistat 0.4.0 → 0.5.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.
data/README.md CHANGED
@@ -149,7 +149,12 @@ is the label that you're storing to, or fetching from.
149
149
  Labels support multiple grouping levels by splitting the label string with `/`
150
150
  and storing the same stats for each level. For example, when storing data to a
151
151
  label called `views/product/44`, the data is stored for the label you specify,
152
- and also for `views/product` and `views`.
152
+ and also for `views/product` and `views`. You may also configure a different
153
+ group separator using the `Redistat.group_separator=` method. For example:
154
+
155
+ ```ruby
156
+ Redistat.group_separator = '|'
157
+ ```
153
158
 
154
159
  A word of caution: Don't use a crazy number of group levels. As two levels
155
160
  causes twice as many `hincrby` calls to Redis as not using the grouping
@@ -91,6 +91,11 @@ module Redistat
91
91
  connection.flushdb
92
92
  end
93
93
 
94
+ def group_separator
95
+ @group_separator ||= GROUP_SEPARATOR
96
+ end
97
+ attr_writer :group_separator
98
+
94
99
  end
95
100
  end
96
101
 
@@ -56,7 +56,7 @@ module Redistat
56
56
  members = db.smembers("#{scope}#{LABEL_INDEX}#{@label}") || [] # older versions of Redis returns nil
57
57
  members.map { |member|
58
58
  child_label = [@label, member].reject { |i| i.nil? }
59
- self.class.new(self.scope, child_label.join(GROUP_SEPARATOR), self.date, @options)
59
+ self.class.new(self.scope, child_label.join(Redistat.group_separator), self.date, @options)
60
60
  }
61
61
  end
62
62
 
@@ -13,7 +13,7 @@ module Redistat
13
13
 
14
14
  def self.join(*args)
15
15
  args = args.map {|i| i.to_s}
16
- self.new(args.reject {|i| i.blank? }.join(GROUP_SEPARATOR))
16
+ self.new(args.reject {|i| i.blank? }.join(Redistat.group_separator))
17
17
  end
18
18
 
19
19
  def initialize(str, opts = {})
@@ -48,16 +48,16 @@ module Redistat
48
48
  end
49
49
 
50
50
  def me
51
- self.to_s.split(GROUP_SEPARATOR).last
51
+ self.to_s.split(Redistat.group_separator).last
52
52
  end
53
53
 
54
54
  def groups
55
55
  return @groups unless @groups.nil?
56
56
  @groups = []
57
57
  parent = ""
58
- self.to_s.split(GROUP_SEPARATOR).each do |part|
58
+ self.to_s.split(Redistat.group_separator).each do |part|
59
59
  if !part.blank?
60
- group = ((parent.blank?) ? "" : "#{parent}#{GROUP_SEPARATOR}") + part
60
+ group = ((parent.blank?) ? "" : "#{parent}#{Redistat.group_separator}") + part
61
61
  @groups << Label.new(group)
62
62
  parent = group
63
63
  end
@@ -66,13 +66,13 @@ module Redistat
66
66
  def inject_group_summaries!(stats)
67
67
  summaries = {}
68
68
  stats.each do |key, value|
69
- parts = key.to_s.split(GROUP_SEPARATOR)
69
+ parts = key.to_s.split(Redistat.group_separator)
70
70
  parts.pop
71
71
  if parts.size > 0
72
72
  sum_parts = []
73
73
  parts.each do |part|
74
74
  sum_parts << part
75
- sum_key = sum_parts.join(GROUP_SEPARATOR)
75
+ sum_key = sum_parts.join(Redistat.group_separator)
76
76
  (summaries.has_key?(sum_key)) ? summaries[sum_key] += value : summaries[sum_key] = value
77
77
  end
78
78
  end
@@ -1,3 +1,3 @@
1
1
  module Redistat
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -38,6 +38,21 @@ describe Redistat::Label do
38
38
  label.to_s.should == 'email/message/public'
39
39
  end
40
40
 
41
+ it "should allow you to use a different group separator" do
42
+ include Redistat
43
+ Redistat.group_separator = '|'
44
+ label = Label.join('email', 'message', 'public')
45
+ label.should be_a(Label)
46
+ label.to_s.should == 'email|message|public'
47
+ label = Label.join(Label.new('email'), Label.new('message'), Label.new('public'))
48
+ label.should be_a(Label)
49
+ label.to_s.should == 'email|message|public'
50
+ label = Label.join('email', '', 'message', nil, 'public')
51
+ label.should be_a(Label)
52
+ label.to_s.should == 'email|message|public'
53
+ Redistat.group_separator = Redistat::GROUP_SEPARATOR
54
+ end
55
+
41
56
  describe "Grouping" do
42
57
  before(:each) do
43
58
  @name = "message/public/offensive"
@@ -136,4 +136,41 @@ describe Redistat::Summary do
136
136
  summary["visitors/us"].should == "8"
137
137
  end
138
138
 
139
+ it "should store label-based grouping enabled stats using a different group separator" do
140
+ Redistat.group_separator = '|'
141
+ stats = {"views" => 3, "visitors|eu" => 2, "visitors|us" => 4}
142
+ label = "views|about_us"
143
+ key = Redistat::Key.new(@scope, label, @date)
144
+ Redistat::Summary.update_all(key, stats, :hour)
145
+
146
+ key.groups[0].label.to_s.should == "views|about_us"
147
+ key.groups[1].label.to_s.should == "views"
148
+ child1 = key.groups[0]
149
+ parent = key.groups[1]
150
+
151
+ label = "views|contact"
152
+ key = Redistat::Key.new(@scope, label, @date)
153
+ Redistat::Summary.update_all(key, stats, :hour)
154
+
155
+ key.groups[0].label.to_s.should == "views|contact"
156
+ key.groups[1].label.to_s.should == "views"
157
+ child2 = key.groups[0]
158
+
159
+ summary = db.hgetall(child1.to_s(:hour))
160
+ summary["views"].should == "3"
161
+ summary["visitors|eu"].should == "2"
162
+ summary["visitors|us"].should == "4"
163
+
164
+ summary = db.hgetall(child2.to_s(:hour))
165
+ summary["views"].should == "3"
166
+ summary["visitors|eu"].should == "2"
167
+ summary["visitors|us"].should == "4"
168
+
169
+ summary = db.hgetall(parent.to_s(:hour))
170
+ summary["views"].should == "6"
171
+ summary["visitors|eu"].should == "4"
172
+ summary["visitors|us"].should == "8"
173
+ Redistat.group_separator = Redistat::GROUP_SEPARATOR
174
+ end
175
+
139
176
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redistat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-04-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70232949458720 !ruby/object:Gem::Requirement
16
+ requirement: &70366274446400 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.3.6
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70232949458720
24
+ version_requirements: *70366274446400
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70232949458100 !ruby/object:Gem::Requirement
27
+ requirement: &70366274445720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.4.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70232949458100
35
+ version_requirements: *70366274445720
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: redis
38
- requirement: &70232945650900 !ruby/object:Gem::Requirement
38
+ requirement: &70366278074380 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.1.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70232945650900
46
+ version_requirements: *70366278074380
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: time_ext
49
- requirement: &70232945650180 !ruby/object:Gem::Requirement
49
+ requirement: &70366278073860 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.2.9
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70232945650180
57
+ version_requirements: *70366278073860
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &70232945648940 !ruby/object:Gem::Requirement
60
+ requirement: &70366278072640 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.8.7
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70232945648940
68
+ version_requirements: *70366278072640
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &70232945648180 !ruby/object:Gem::Requirement
71
+ requirement: &70366278071440 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 2.1.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70232945648180
79
+ version_requirements: *70366278071440
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: yard
82
- requirement: &70232945647340 !ruby/object:Gem::Requirement
82
+ requirement: &70366278070880 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.6.3
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70232945647340
90
+ version_requirements: *70366278070880
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: simplecov
93
- requirement: &70232945646220 !ruby/object:Gem::Requirement
93
+ requirement: &70366278069180 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: 0.6.1
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70232945646220
101
+ version_requirements: *70366278069180
102
102
  description: A Redis-backed statistics storage and querying library written in Ruby.
103
103
  email:
104
104
  - contact@jimeh.me
@@ -176,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
176
176
  version: '0'
177
177
  segments:
178
178
  - 0
179
- hash: -370997425525069806
179
+ hash: -3999776337293596550
180
180
  required_rubygems_version: !ruby/object:Gem::Requirement
181
181
  none: false
182
182
  requirements:
@@ -185,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
185
  version: '0'
186
186
  segments:
187
187
  - 0
188
- hash: -370997425525069806
188
+ hash: -3999776337293596550
189
189
  requirements: []
190
190
  rubyforge_project: redistat
191
191
  rubygems_version: 1.8.11