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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +3 -0
- data/README.md +85 -5
- data/lib/tabs/config.rb +37 -2
- data/lib/tabs/metrics/counter.rb +14 -5
- data/lib/tabs/metrics/task.rb +8 -6
- data/lib/tabs/metrics/task/token.rb +25 -10
- data/lib/tabs/metrics/value.rb +35 -27
- data/lib/tabs/resolution.rb +26 -10
- data/lib/tabs/resolutionable.rb +36 -13
- data/lib/tabs/resolutions/day.rb +9 -1
- data/lib/tabs/resolutions/hour.rb +9 -1
- data/lib/tabs/resolutions/minute.rb +9 -1
- data/lib/tabs/resolutions/month.rb +9 -1
- data/lib/tabs/resolutions/week.rb +13 -7
- data/lib/tabs/resolutions/year.rb +9 -1
- data/lib/tabs/storage.rb +39 -17
- data/lib/tabs/tabs.rb +12 -4
- data/lib/tabs/version.rb +1 -1
- data/spec/lib/tabs/config_spec.rb +60 -0
- data/spec/lib/tabs/metrics/counter_spec.rb +44 -1
- data/spec/lib/tabs/{task_spec.rb → metrics/task_spec.rb} +31 -3
- data/spec/lib/tabs/metrics/value_spec.rb +36 -0
- data/spec/lib/tabs/resolution_spec.rb +26 -3
- data/spec/lib/tabs/resolutionable_spec.rb +53 -0
- data/spec/lib/tabs/resolutions/day_spec.rb +23 -0
- data/spec/lib/tabs/resolutions/hour_spec.rb +23 -0
- data/spec/lib/tabs/resolutions/minute_spec.rb +23 -0
- data/spec/lib/tabs/resolutions/month_spec.rb +23 -0
- data/spec/lib/tabs/resolutions/week_spec.rb +24 -0
- data/spec/lib/tabs/resolutions/year_spec.rb +23 -0
- data/spec/lib/tabs/storage_spec.rb +138 -0
- data/spec/lib/tabs_spec.rb +28 -1
- data/spec/spec_helper.rb +9 -1
- data/spec/support/custom_resolutions.rb +10 -2
- data/tabs.gemspec +6 -21
- 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
|
data/spec/lib/tabs_spec.rb
CHANGED
@@ -82,7 +82,7 @@ describe Tabs do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
it "calls drop! on the metric" do
|
85
|
-
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
|
data/spec/spec_helper.rb
CHANGED
@@ -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
|
-
|
2
|
+
include Tabs::Resolutionable
|
3
3
|
extend self
|
4
4
|
end
|
5
5
|
|
6
6
|
module WellFormedResolution
|
7
|
-
|
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
|
data/tabs.gemspec
CHANGED
@@ -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
|
23
|
-
|
24
|
-
|
25
|
-
|
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.
|
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-
|
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:
|
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/
|
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
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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:
|
190
|
+
rubygems_version: 2.0.3
|
232
191
|
signing_key:
|
233
|
-
specification_version:
|
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/
|
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:
|