tabs 0.9.1 → 1.0.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.
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: