tabs 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +3 -0
  5. data/README.md +85 -5
  6. data/lib/tabs/config.rb +37 -2
  7. data/lib/tabs/metrics/counter.rb +14 -5
  8. data/lib/tabs/metrics/task.rb +8 -6
  9. data/lib/tabs/metrics/task/token.rb +25 -10
  10. data/lib/tabs/metrics/value.rb +35 -27
  11. data/lib/tabs/resolution.rb +26 -10
  12. data/lib/tabs/resolutionable.rb +36 -13
  13. data/lib/tabs/resolutions/day.rb +9 -1
  14. data/lib/tabs/resolutions/hour.rb +9 -1
  15. data/lib/tabs/resolutions/minute.rb +9 -1
  16. data/lib/tabs/resolutions/month.rb +9 -1
  17. data/lib/tabs/resolutions/week.rb +13 -7
  18. data/lib/tabs/resolutions/year.rb +9 -1
  19. data/lib/tabs/storage.rb +39 -17
  20. data/lib/tabs/tabs.rb +12 -4
  21. data/lib/tabs/version.rb +1 -1
  22. data/spec/lib/tabs/config_spec.rb +60 -0
  23. data/spec/lib/tabs/metrics/counter_spec.rb +44 -1
  24. data/spec/lib/tabs/{task_spec.rb → metrics/task_spec.rb} +31 -3
  25. data/spec/lib/tabs/metrics/value_spec.rb +36 -0
  26. data/spec/lib/tabs/resolution_spec.rb +26 -3
  27. data/spec/lib/tabs/resolutionable_spec.rb +53 -0
  28. data/spec/lib/tabs/resolutions/day_spec.rb +23 -0
  29. data/spec/lib/tabs/resolutions/hour_spec.rb +23 -0
  30. data/spec/lib/tabs/resolutions/minute_spec.rb +23 -0
  31. data/spec/lib/tabs/resolutions/month_spec.rb +23 -0
  32. data/spec/lib/tabs/resolutions/week_spec.rb +24 -0
  33. data/spec/lib/tabs/resolutions/year_spec.rb +23 -0
  34. data/spec/lib/tabs/storage_spec.rb +138 -0
  35. data/spec/lib/tabs_spec.rb +28 -1
  36. data/spec/spec_helper.rb +9 -1
  37. data/spec/support/custom_resolutions.rb +10 -2
  38. data/tabs.gemspec +6 -21
  39. metadata +48 -81
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe Tabs::Resolutions::Week do
4
+ let(:timestamp){ Time.utc(2000, 1, 1) }
5
+ let(:beginning_of_week_timestamp){ Time.utc(1999, 12, 27) }
6
+
7
+ context "#normalize" do
8
+ it "should roll to the beginning of the week" do
9
+ expect(subject.normalize(timestamp)).to eq(beginning_of_week_timestamp)
10
+ end
11
+ end
12
+
13
+ context "#serialize" do
14
+ it "should return YYYY-MM-DD based on beginning of the week" do
15
+ expect(subject.serialize(timestamp)).to eq("1999-12-27")
16
+ end
17
+ end
18
+
19
+ context "#deserialize" do
20
+ it "should convert beginning of week string into date" do
21
+ expect(subject.deserialize("1999-12-27")).to eq(beginning_of_week_timestamp)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe Tabs::Resolutions::Year do
4
+ let(:timestamp){ Time.utc(2000, 2) }
5
+
6
+ context "#normalize" do
7
+ it "should normalize the date to year, month" do
8
+ expect(subject.normalize(timestamp)).to eq(timestamp.change(month: 1))
9
+ end
10
+ end
11
+
12
+ context "#serialize" do
13
+ it "should return YYYY" do
14
+ expect(subject.serialize(timestamp)).to eq("2000")
15
+ end
16
+ end
17
+
18
+ context "#deserialize" do
19
+ it "should convert string into date" do
20
+ expect(subject.deserialize("2000")).to eq(timestamp.change(month: 1))
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,138 @@
1
+ require "spec_helper"
2
+
3
+ describe Tabs::Storage do
4
+ context "#redis" do
5
+ it "should return the configured Redis" do
6
+ expect(subject.redis).to eq(Tabs::Config.redis)
7
+ end
8
+ end
9
+
10
+ context "#tabs_key" do
11
+ after do
12
+ Tabs::Config.prefix = nil
13
+ end
14
+
15
+ it "should add prefix if configued" do
16
+ Tabs::Config.prefix = "myapp"
17
+ expect(subject.tabs_key("key")).to eq("tabs:myapp:key")
18
+ end
19
+
20
+ it "should not add prefix if not there" do
21
+ expect(subject.tabs_key("key")).to eq("tabs:key")
22
+ end
23
+ end
24
+
25
+ context "with stubbed redis" do
26
+
27
+ let(:stubbed_redis) { double("redis").as_null_object }
28
+
29
+ before do
30
+ subject.stub(redis: stubbed_redis)
31
+ subject.should_receive(:tabs_key).at_least(:once).and_call_original
32
+ end
33
+
34
+ it "#exists calls exists with the expected key" do
35
+ subject.exists("foo")
36
+ expect(stubbed_redis).to have_received(:exists).with("tabs:foo")
37
+ end
38
+
39
+ it "#expireat calls expireat with expected key and timestamp" do
40
+ subject.expireat("foo", 1234)
41
+ expect(stubbed_redis).to have_received(:expireat).with("tabs:foo", 1234)
42
+ end
43
+
44
+ it "#ttl calls ttl with expected key" do
45
+ subject.ttl("foo")
46
+ expect(stubbed_redis).to have_received(:ttl).with("tabs:foo")
47
+ end
48
+
49
+ it "#get calls get with expected key" do
50
+ subject.get("foo")
51
+ expect(stubbed_redis).to have_received(:get).with("tabs:foo")
52
+ end
53
+
54
+ it "#mget receives prefixed keys" do
55
+ subject.mget("foo", "bar")
56
+ expect(stubbed_redis).to have_received(:mget).with("tabs:foo", "tabs:bar")
57
+ end
58
+
59
+ it "#set calls set with the expected key and arg" do
60
+ subject.set("foo", "bar")
61
+ expect(stubbed_redis).to have_received(:set).with("tabs:foo", "bar")
62
+ end
63
+
64
+ it "#del" do
65
+ subject.del("foo")
66
+ expect(stubbed_redis).to have_received(:del).with("tabs:foo")
67
+ end
68
+
69
+ it "#del_by_prefix" do
70
+ stubbed_redis.stub(keys: ["foo:a", "foo:b"])
71
+ subject.del_by_prefix("foo")
72
+ expect(stubbed_redis).to have_received(:del).with("foo:a", "foo:b")
73
+ end
74
+
75
+ it "#incr" do
76
+ subject.incr("foo")
77
+ expect(stubbed_redis).to have_received(:incr).with("tabs:foo")
78
+ end
79
+
80
+ it "#rpush" do
81
+ subject.rpush("foo", "bar")
82
+ expect(stubbed_redis).to have_received(:rpush).with("tabs:foo", "bar")
83
+ end
84
+
85
+ it "#sadd" do
86
+ subject.sadd("foo", "bar", "baz")
87
+ expect(stubbed_redis).to have_received(:sadd).with("tabs:foo", "bar", "baz")
88
+ end
89
+
90
+ it "#smembers" do
91
+ subject.smembers("foo")
92
+ expect(stubbed_redis).to have_received(:smembers).with("tabs:foo")
93
+ end
94
+
95
+ it "#smembers_all" do
96
+ stubbed_redis.should_receive(:pipelined).and_yield
97
+ subject.smembers_all("foo", "bar")
98
+ expect(stubbed_redis).to have_received(:smembers).with("tabs:foo")
99
+ expect(stubbed_redis).to have_received(:smembers).with("tabs:bar")
100
+ end
101
+
102
+ it "#sismember" do
103
+ subject.sismember("foo", "bar")
104
+ expect(stubbed_redis).to have_received(:sismember).with("tabs:foo", "bar")
105
+ end
106
+
107
+ it "#hget" do
108
+ subject.hget("foo", "bar")
109
+ expect(stubbed_redis).to have_received(:hget).with("tabs:foo", "bar")
110
+ end
111
+
112
+ it "#hset" do
113
+ subject.hset("foo", "bar", "baz")
114
+ expect(stubbed_redis).to have_received(:hset).with("tabs:foo", "bar", "baz")
115
+ end
116
+
117
+ it "#hdel" do
118
+ subject.hdel("foo", "bar")
119
+ expect(stubbed_redis).to have_received(:hdel).with("tabs:foo", "bar")
120
+ end
121
+
122
+ it "#hkeys" do
123
+ subject.hkeys("foo")
124
+ expect(stubbed_redis).to have_received(:hkeys).with("tabs:foo")
125
+ end
126
+
127
+ it "#hincrby" do
128
+ subject.hincrby("foo", "bar", 42)
129
+ expect(stubbed_redis).to have_received(:hincrby).with("tabs:foo", "bar", 42)
130
+ end
131
+
132
+ it "#hgetall" do
133
+ subject.hgetall("foo")
134
+ expect(stubbed_redis).to have_received(:hgetall).with("tabs:foo")
135
+ end
136
+
137
+ end
138
+ end
@@ -82,7 +82,7 @@ describe Tabs do
82
82
  end
83
83
 
84
84
  it "calls drop! on the metric" do
85
- metric = stub(:metric)
85
+ metric = double(:metric)
86
86
  Tabs.stub(get_metric: metric)
87
87
  metric.should_receive(:drop!)
88
88
  Tabs.drop_metric!("foo")
@@ -138,6 +138,7 @@ describe Tabs do
138
138
  end
139
139
 
140
140
  it "calls record on the metric" do
141
+ Timecop.freeze(Time.now.utc)
141
142
  metric = Tabs.create_metric("foo", "value")
142
143
  Tabs.stub(get_metric: metric)
143
144
  metric.should_receive(:record).with(42, Time.now.utc)
@@ -176,4 +177,30 @@ describe Tabs do
176
177
 
177
178
  end
178
179
 
180
+ describe ".drop_resolution_for_metric!" do
181
+ it "raises unknown metric error if metric does not exist" do
182
+ expect{ Tabs.drop_resolution_for_metric!(:invalid, :minute) }.to raise_error(Tabs::UnknownMetricError)
183
+ end
184
+
185
+ it "raises resolution missing error if resolution not registered" do
186
+ Tabs.create_metric("baz", "value")
187
+ expect{ Tabs.drop_resolution_for_metric!("baz", :invalid) }.to raise_error(Tabs::ResolutionMissingError)
188
+ end
189
+
190
+ it "does not allow you to call drop_by_resolution if task metric" do
191
+ metric = Tabs.create_metric("baz", "task")
192
+ metric.should_not_receive(:drop_by_resolution!)
193
+ Tabs.drop_resolution_for_metric!("baz", :minute)
194
+ end
195
+
196
+ it "drops the metric by resolution" do
197
+ now = Time.utc(2000,1,1)
198
+ metric = Tabs.create_metric("baz", "value")
199
+ metric.record(42, now)
200
+ Tabs.drop_resolution_for_metric!("baz", :minute)
201
+ minute_key = Tabs::Metrics::Value.new("baz").storage_key(:minute, now)
202
+ expect(Tabs::Storage.exists(minute_key)).to be_false
203
+ end
204
+ end
205
+
179
206
  end
@@ -1,9 +1,17 @@
1
1
  require "rubygems"
2
2
  require "tabs"
3
- require "fakeredis/rspec"
4
3
  require "pry"
5
4
  require "timecop"
6
5
 
7
6
  RSpec.configure do |config|
8
7
  config.mock_with :rspec
8
+
9
+ config.before(:each) do
10
+ Tabs::Resolution.reset_default_resolutions
11
+ Tabs::Storage.del_by_prefix("")
12
+ end
13
+
14
+ config.after(:each) do
15
+ Timecop.return
16
+ end
9
17
  end
@@ -1,14 +1,18 @@
1
1
  module BadlyFormedResolution
2
- extend Tabs::Resolutionable
2
+ include Tabs::Resolutionable
3
3
  extend self
4
4
  end
5
5
 
6
6
  module WellFormedResolution
7
- extend Tabs::Resolutionable
7
+ include Tabs::Resolutionable
8
8
  extend self
9
9
 
10
10
  PATTERN = "%Y-%m-%d-%H-%M-%S"
11
11
 
12
+ def name
13
+ :seconds
14
+ end
15
+
12
16
  def serialize(timestamp)
13
17
  timestamp.strftime(PATTERN)
14
18
  end
@@ -22,6 +26,10 @@ module WellFormedResolution
22
26
  s / 1
23
27
  end
24
28
 
29
+ def to_seconds
30
+ 1
31
+ end
32
+
25
33
  def add(ts, num)
26
34
  ts + num.seconds
27
35
  end
@@ -12,6 +12,7 @@ Gem::Specification.new do |gem|
12
12
  gem.description = %q{A redis-backed metrics tracker for keeping tabs on pretty much anything ;)}
13
13
  gem.summary = %q{A redis-backed metrics tracker for keeping tabs on pretty much anything ;)}
14
14
  gem.homepage = "https://github.com/devmynd/tabs"
15
+ gem.license = "MIT"
15
16
 
16
17
  gem.files = `git ls-files`.split($/)
17
18
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -19,33 +20,17 @@ Gem::Specification.new do |gem|
19
20
  gem.require_paths = ["lib"]
20
21
 
21
22
  gem.post_install_message = <<EOS
22
- Tabs v0.8.0 - BREAKING CHANGES:
23
- In version 0.8.0 and higher the get_stats method returns a more robust
24
- object instead of just an array of hashes. These stats objects are
25
- enumerable and most existing code utilizing tabs should continue to
26
- function. However, please review the docs for more information if you
27
- encounter issues when upgrading. Please review the README if installing
28
- v0.8.0 or higher.
29
-
30
- Tabs v0.8.2 - BREAKING CHANGES:
31
- In version 0.8.2 and higher the storage keys for value metrics have been
32
- changed. Originally the various pieces (avg, sum, count, etc) were
33
- stored in a JSON serialized string in a single key. The intent was that
34
- this would comprise a poor-mans transaction of sorts. The downside
35
- however was a major hit on performance when doing a lot of writes or
36
- reading stats for a large date range. In v0.8.2 these component values
37
- are stored in a real Redis hash and updated atomically when a value is
38
- recorded. In future versions this will be changed to use a MULTI
39
- statement to simulate a transaction. Value data that was recorded prior
40
- to v0.8.2 will not be accessible in this or future versions so please
41
- continue to use v0.8.1 or lower if that is an issue.
23
+ Tabs v1.0.0 - BREAKING CHANGES:
24
+ Please review the 'Change Log & Breaking Changes' section of the README. Now that we have
25
+ achieved 1.0.0 we will follow semantic versioning and will not break backwards compatibility
26
+ within major point releases.
42
27
  EOS
43
28
 
44
29
  gem.add_dependency "activesupport", ">= 3.2"
45
30
  gem.add_dependency "redis", "~> 3.0.0"
46
31
 
47
- gem.add_development_dependency "fakeredis"
48
32
  gem.add_development_dependency "pry"
33
+ gem.add_development_dependency "pry-nav"
49
34
  gem.add_development_dependency "rake"
50
35
  gem.add_development_dependency "rspec"
51
36
  gem.add_development_dependency "timecop"
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tabs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - JC Grubbs
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-08-27 00:00:00.000000000 Z
11
+ date: 2013-11-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '3.2'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '3.2'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: redis
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,89 +34,78 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
45
40
  version: 3.0.0
46
41
  - !ruby/object:Gem::Dependency
47
- name: fakeredis
42
+ name: pry
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
- name: pry
56
+ name: pry-nav
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: rspec
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: timecop
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  description: A redis-backed metrics tracker for keeping tabs on pretty much anything
@@ -158,89 +143,71 @@ files:
158
143
  - lib/tabs/storage.rb
159
144
  - lib/tabs/tabs.rb
160
145
  - lib/tabs/version.rb
146
+ - spec/lib/tabs/config_spec.rb
161
147
  - spec/lib/tabs/metrics/counter/stats_spec.rb
162
148
  - spec/lib/tabs/metrics/counter_spec.rb
163
149
  - spec/lib/tabs/metrics/task/token_spec.rb
150
+ - spec/lib/tabs/metrics/task_spec.rb
164
151
  - spec/lib/tabs/metrics/value/stats_spec.rb
165
152
  - spec/lib/tabs/metrics/value_spec.rb
166
153
  - spec/lib/tabs/resolution_spec.rb
167
- - spec/lib/tabs/task_spec.rb
154
+ - spec/lib/tabs/resolutionable_spec.rb
155
+ - spec/lib/tabs/resolutions/day_spec.rb
156
+ - spec/lib/tabs/resolutions/hour_spec.rb
157
+ - spec/lib/tabs/resolutions/minute_spec.rb
158
+ - spec/lib/tabs/resolutions/month_spec.rb
159
+ - spec/lib/tabs/resolutions/week_spec.rb
160
+ - spec/lib/tabs/resolutions/year_spec.rb
161
+ - spec/lib/tabs/storage_spec.rb
168
162
  - spec/lib/tabs_spec.rb
169
163
  - spec/spec_helper.rb
170
164
  - spec/support/custom_resolutions.rb
171
165
  - tabs.gemspec
172
166
  homepage: https://github.com/devmynd/tabs
173
- licenses: []
174
- post_install_message: ! 'Tabs v0.8.0 - BREAKING CHANGES:
175
-
176
- In version 0.8.0 and higher the get_stats method returns a more robust
177
-
178
- object instead of just an array of hashes. These stats objects are
179
-
180
- enumerable and most existing code utilizing tabs should continue to
181
-
182
- function. However, please review the docs for more information if you
183
-
184
- encounter issues when upgrading. Please review the README if installing
185
-
186
- v0.8.0 or higher.
187
-
188
-
189
- Tabs v0.8.2 - BREAKING CHANGES:
190
-
191
- In version 0.8.2 and higher the storage keys for value metrics have been
192
-
193
- changed. Originally the various pieces (avg, sum, count, etc) were
194
-
195
- stored in a JSON serialized string in a single key. The intent was that
196
-
197
- this would comprise a poor-mans transaction of sorts. The downside
198
-
199
- however was a major hit on performance when doing a lot of writes or
200
-
201
- reading stats for a large date range. In v0.8.2 these component values
202
-
203
- are stored in a real Redis hash and updated atomically when a value is
204
-
205
- recorded. In future versions this will be changed to use a MULTI
206
-
207
- statement to simulate a transaction. Value data that was recorded prior
208
-
209
- to v0.8.2 will not be accessible in this or future versions so please
210
-
211
- continue to use v0.8.1 or lower if that is an issue.
212
-
213
- '
167
+ licenses:
168
+ - MIT
169
+ metadata: {}
170
+ post_install_message: |
171
+ Tabs v1.0.0 - BREAKING CHANGES:
172
+ Please review the 'Change Log & Breaking Changes' section of the README. Now that we have
173
+ achieved 1.0.0 we will follow semantic versioning and will not break backwards compatibility
174
+ within major point releases.
214
175
  rdoc_options: []
215
176
  require_paths:
216
177
  - lib
217
178
  required_ruby_version: !ruby/object:Gem::Requirement
218
- none: false
219
179
  requirements:
220
- - - ! '>='
180
+ - - '>='
221
181
  - !ruby/object:Gem::Version
222
182
  version: '0'
223
183
  required_rubygems_version: !ruby/object:Gem::Requirement
224
- none: false
225
184
  requirements:
226
- - - ! '>='
185
+ - - '>='
227
186
  - !ruby/object:Gem::Version
228
187
  version: '0'
229
188
  requirements: []
230
189
  rubyforge_project:
231
- rubygems_version: 1.8.23
190
+ rubygems_version: 2.0.3
232
191
  signing_key:
233
- specification_version: 3
192
+ specification_version: 4
234
193
  summary: A redis-backed metrics tracker for keeping tabs on pretty much anything ;)
235
194
  test_files:
195
+ - spec/lib/tabs/config_spec.rb
236
196
  - spec/lib/tabs/metrics/counter/stats_spec.rb
237
197
  - spec/lib/tabs/metrics/counter_spec.rb
238
198
  - spec/lib/tabs/metrics/task/token_spec.rb
199
+ - spec/lib/tabs/metrics/task_spec.rb
239
200
  - spec/lib/tabs/metrics/value/stats_spec.rb
240
201
  - spec/lib/tabs/metrics/value_spec.rb
241
202
  - spec/lib/tabs/resolution_spec.rb
242
- - spec/lib/tabs/task_spec.rb
203
+ - spec/lib/tabs/resolutionable_spec.rb
204
+ - spec/lib/tabs/resolutions/day_spec.rb
205
+ - spec/lib/tabs/resolutions/hour_spec.rb
206
+ - spec/lib/tabs/resolutions/minute_spec.rb
207
+ - spec/lib/tabs/resolutions/month_spec.rb
208
+ - spec/lib/tabs/resolutions/week_spec.rb
209
+ - spec/lib/tabs/resolutions/year_spec.rb
210
+ - spec/lib/tabs/storage_spec.rb
243
211
  - spec/lib/tabs_spec.rb
244
212
  - spec/spec_helper.rb
245
213
  - spec/support/custom_resolutions.rb
246
- has_rdoc: