nanoc 4.6.3 → 4.6.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ describe Nanoc::Telemetry::Counter do
2
+ subject(:counter) { described_class.new }
3
+
4
+ it 'starts at 0' do
5
+ expect(counter.value).to eq(0)
6
+ end
7
+
8
+ describe '#increment' do
9
+ subject { counter.increment }
10
+
11
+ it 'increments' do
12
+ expect { subject }
13
+ .to change { counter.value }
14
+ .from(0)
15
+ .to(1)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,56 @@
1
+ describe Nanoc::Telemetry::LabelledCounter do
2
+ subject(:counter) { described_class.new }
3
+
4
+ describe 'new counter' do
5
+ it 'starts at 0' do
6
+ expect(subject.value(filter: :erb)).to eq(0)
7
+ expect(subject.value(filter: :haml)).to eq(0)
8
+ end
9
+
10
+ it 'has no values' do
11
+ expect(subject.values).to eq({})
12
+ end
13
+ end
14
+
15
+ describe '#increment' do
16
+ subject { counter.increment(filter: :erb) }
17
+
18
+ it 'increments the matching value' do
19
+ expect { subject }
20
+ .to change { counter.value(filter: :erb) }
21
+ .from(0)
22
+ .to(1)
23
+ end
24
+
25
+ it 'does not increment any other value' do
26
+ expect(counter.value(filter: :haml)).to eq(0)
27
+ expect { subject }
28
+ .not_to change { counter.value(filter: :haml) }
29
+ end
30
+
31
+ it 'correctly changes #values' do
32
+ expect { subject }
33
+ .to change { counter.values }
34
+ .from({})
35
+ .to({ filter: :erb } => 1)
36
+ end
37
+ end
38
+
39
+ describe '#get' do
40
+ subject { counter.get(filter: :erb) }
41
+
42
+ context 'not incremented' do
43
+ its(:value) { is_expected.to eq(0) }
44
+ end
45
+
46
+ context 'incremented' do
47
+ before { counter.increment(filter: :erb) }
48
+ its(:value) { is_expected.to eq(1) }
49
+ end
50
+
51
+ context 'other incremented' do
52
+ before { counter.increment(filter: :haml) }
53
+ its(:value) { is_expected.to eq(0) }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,63 @@
1
+ describe Nanoc::Telemetry::LabelledSummary do
2
+ subject(:summary) { described_class.new }
3
+
4
+ describe '#labels' do
5
+ subject { summary.labels }
6
+
7
+ context 'empty summary' do
8
+ it { is_expected.to eq([]) }
9
+ end
10
+
11
+ context 'some observations' do
12
+ before do
13
+ summary.observe(7.2, filter: :erb)
14
+ summary.observe(5.3, filter: :erb)
15
+ summary.observe(3.0, filter: :haml)
16
+ end
17
+
18
+ it { is_expected.to eq([{ filter: :erb }, { filter: :haml }]) }
19
+ end
20
+ end
21
+
22
+ describe '#get' do
23
+ subject { summary.get(filter: :erb) }
24
+
25
+ context 'empty summary' do
26
+ its(:count) { is_expected.to eq(0) }
27
+ end
28
+
29
+ context 'one observation with that label' do
30
+ before { summary.observe(0.1, filter: :erb) }
31
+ its(:count) { is_expected.to eq(1) }
32
+ end
33
+
34
+ context 'one observation with a different label' do
35
+ before { summary.observe(0.1, filter: :haml) }
36
+ its(:count) { is_expected.to eq(0) }
37
+ end
38
+ end
39
+
40
+ describe '#quantile' do
41
+ before do
42
+ subject.observe(2.1, filter: :erb)
43
+ subject.observe(4.1, filter: :erb)
44
+ subject.observe(5.3, filter: :haml)
45
+ end
46
+
47
+ it 'has proper quantiles for :erb' do
48
+ expect(subject.quantile(0.00, filter: :erb)).to be_within(0.000001).of(2.1)
49
+ expect(subject.quantile(0.25, filter: :erb)).to be_within(0.000001).of(2.6)
50
+ expect(subject.quantile(0.50, filter: :erb)).to be_within(0.000001).of(3.1)
51
+ expect(subject.quantile(0.90, filter: :erb)).to be_within(0.000001).of(3.9)
52
+ expect(subject.quantile(0.99, filter: :erb)).to be_within(0.000001).of(4.08)
53
+ end
54
+
55
+ it 'has proper quantiles for :erb' do
56
+ expect(subject.quantile(0.00, filter: :haml)).to be_within(0.000001).of(5.3)
57
+ expect(subject.quantile(0.25, filter: :haml)).to be_within(0.000001).of(5.3)
58
+ expect(subject.quantile(0.50, filter: :haml)).to be_within(0.000001).of(5.3)
59
+ expect(subject.quantile(0.90, filter: :haml)).to be_within(0.000001).of(5.3)
60
+ expect(subject.quantile(0.99, filter: :haml)).to be_within(0.000001).of(5.3)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,59 @@
1
+ describe Nanoc::Telemetry::Stopwatch do
2
+ subject(:stopwatch) { described_class.new }
3
+
4
+ it 'is zero by default' do
5
+ expect(stopwatch.duration).to eq(0.0)
6
+ end
7
+
8
+ # TODO: if running, raise error when asking for #duration
9
+
10
+ it 'records correct duration after start+stop' do
11
+ Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 0))
12
+ stopwatch.start
13
+
14
+ Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 1))
15
+ stopwatch.stop
16
+
17
+ expect(stopwatch.duration).to eq(1.0)
18
+ end
19
+
20
+ it 'records correct duration after start+stop+start+stop' do
21
+ Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 0))
22
+ stopwatch.start
23
+
24
+ Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 1))
25
+ stopwatch.stop
26
+
27
+ Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 3))
28
+ stopwatch.start
29
+
30
+ Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 6))
31
+ stopwatch.stop
32
+
33
+ expect(stopwatch.duration).to eq(1.0 + 3.0)
34
+ end
35
+
36
+ it 'errors when stopping when not started' do
37
+ expect { stopwatch.stop }.to raise_error(Nanoc::Telemetry::Stopwatch::NotRunningError)
38
+ end
39
+
40
+ it 'errors when starting when already started' do
41
+ stopwatch.start
42
+ expect { stopwatch.start }.to raise_error(Nanoc::Telemetry::Stopwatch::AlreadyRunningError)
43
+ end
44
+
45
+ it 'reports running status' do
46
+ expect(stopwatch).not_to be_running
47
+ expect(stopwatch).to be_stopped
48
+
49
+ stopwatch.start
50
+
51
+ expect(stopwatch).to be_running
52
+ expect(stopwatch).not_to be_stopped
53
+
54
+ stopwatch.stop
55
+
56
+ expect(stopwatch).not_to be_running
57
+ expect(stopwatch).to be_stopped
58
+ end
59
+ end
@@ -0,0 +1,66 @@
1
+ describe Nanoc::Telemetry::Summary do
2
+ subject(:summary) { described_class.new }
3
+
4
+ context 'no observations' do
5
+ it 'errors on #min' do
6
+ expect { subject.min }
7
+ .to raise_error(Nanoc::Telemetry::Summary::EmptySummaryError)
8
+ end
9
+
10
+ it 'errors on #max' do
11
+ expect { subject.max }
12
+ .to raise_error(Nanoc::Telemetry::Summary::EmptySummaryError)
13
+ end
14
+
15
+ it 'errors on #avg' do
16
+ expect { subject.avg }
17
+ .to raise_error(Nanoc::Telemetry::Summary::EmptySummaryError)
18
+ end
19
+
20
+ it 'errors on #sum' do
21
+ expect { subject.sum }
22
+ .to raise_error(Nanoc::Telemetry::Summary::EmptySummaryError)
23
+ end
24
+
25
+ its(:count) { is_expected.to eq(0) }
26
+ end
27
+
28
+ context 'one observation' do
29
+ before { subject.observe(2.1) }
30
+
31
+ its(:count) { is_expected.to eq(1) }
32
+ its(:sum) { is_expected.to eq(2.1) }
33
+ its(:avg) { is_expected.to eq(2.1) }
34
+ its(:min) { is_expected.to eq(2.1) }
35
+ its(:max) { is_expected.to eq(2.1) }
36
+
37
+ it 'has proper quantiles' do
38
+ expect(subject.quantile(0.00)).to eq(2.1)
39
+ expect(subject.quantile(0.25)).to eq(2.1)
40
+ expect(subject.quantile(0.50)).to eq(2.1)
41
+ expect(subject.quantile(0.90)).to eq(2.1)
42
+ expect(subject.quantile(0.99)).to eq(2.1)
43
+ end
44
+ end
45
+
46
+ context 'two observations' do
47
+ before do
48
+ subject.observe(2.1)
49
+ subject.observe(4.1)
50
+ end
51
+
52
+ its(:count) { is_expected.to be_within(0.000001).of(2) }
53
+ its(:sum) { is_expected.to be_within(0.000001).of(6.2) }
54
+ its(:avg) { is_expected.to be_within(0.000001).of(3.1) }
55
+ its(:min) { is_expected.to be_within(0.000001).of(2.1) }
56
+ its(:max) { is_expected.to be_within(0.000001).of(4.1) }
57
+
58
+ it 'has proper quantiles' do
59
+ expect(subject.quantile(0.00)).to be_within(0.000001).of(2.1)
60
+ expect(subject.quantile(0.25)).to be_within(0.000001).of(2.6)
61
+ expect(subject.quantile(0.50)).to be_within(0.000001).of(3.1)
62
+ expect(subject.quantile(0.90)).to be_within(0.000001).of(3.9)
63
+ expect(subject.quantile(0.99)).to be_within(0.000001).of(4.08)
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,26 @@
1
+ describe Nanoc::Telemetry do
2
+ subject { described_class.new }
3
+
4
+ example do
5
+ expect(subject.counter(:filters).values).to eq({})
6
+ expect(subject.counter(:filters).get(identifier: :erb).value).to eq(0)
7
+ expect(subject.counter(:filters).value(identifier: :erb)).to eq(0)
8
+
9
+ subject.counter(:filters).increment(identifier: :erb)
10
+ expect(subject.counter(:filters).values).to eq({ identifier: :erb } => 1)
11
+ expect(subject.counter(:filters).get(identifier: :erb).value).to eq(1)
12
+ expect(subject.counter(:filters).value(identifier: :erb)).to eq(1)
13
+ end
14
+
15
+ example do
16
+ subject.summary(:filters).observe(0.1, identifier: :erb)
17
+ expect(subject.summary(:filters).quantile(0.0, identifier: :erb)).to be_within(0.00001).of(0.1)
18
+ expect(subject.summary(:filters).quantile(0.5, identifier: :erb)).to be_within(0.00001).of(0.1)
19
+ expect(subject.summary(:filters).quantile(1.0, identifier: :erb)).to be_within(0.00001).of(0.1)
20
+
21
+ subject.summary(:filters).observe(1.1, identifier: :erb)
22
+ expect(subject.summary(:filters).quantile(0.0, identifier: :erb)).to be_within(0.00001).of(0.1)
23
+ expect(subject.summary(:filters).quantile(0.5, identifier: :erb)).to be_within(0.00001).of(0.6)
24
+ expect(subject.summary(:filters).quantile(1.0, identifier: :erb)).to be_within(0.00001).of(1.1)
25
+ end
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.6.3
4
+ version: 4.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Defreyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-05 00:00:00.000000000 Z
11
+ date: 2017-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cri
@@ -334,6 +334,13 @@ files:
334
334
  - lib/nanoc/rule_dsl/rules_collection.rb
335
335
  - lib/nanoc/rule_dsl/rules_loader.rb
336
336
  - lib/nanoc/spec.rb
337
+ - lib/nanoc/telemetry.rb
338
+ - lib/nanoc/telemetry/counter.rb
339
+ - lib/nanoc/telemetry/labelled_counter.rb
340
+ - lib/nanoc/telemetry/labelled_summary.rb
341
+ - lib/nanoc/telemetry/registry.rb
342
+ - lib/nanoc/telemetry/stopwatch.rb
343
+ - lib/nanoc/telemetry/summary.rb
337
344
  - lib/nanoc/version.rb
338
345
  - nanoc.gemspec
339
346
  - spec/contributors_spec.rb
@@ -408,6 +415,7 @@ files:
408
415
  - spec/nanoc/cli/commands/show_plugins_spec.rb
409
416
  - spec/nanoc/cli/commands/show_rules_spec.rb
410
417
  - spec/nanoc/cli/commands/view_spec.rb
418
+ - spec/nanoc/cli/stream_cleaners/utf8_spec.rb
411
419
  - spec/nanoc/data_sources/filesystem_spec.rb
412
420
  - spec/nanoc/deploying/fog_spec.rb
413
421
  - spec/nanoc/deploying/git_spec.rb
@@ -481,6 +489,13 @@ files:
481
489
  - spec/nanoc/rule_dsl/rule_context_spec.rb
482
490
  - spec/nanoc/rule_dsl/rule_memory_calculator_spec.rb
483
491
  - spec/nanoc/rule_dsl/rules_collection_spec.rb
492
+ - spec/nanoc/spec_spec.rb
493
+ - spec/nanoc/telemetry/counter_spec.rb
494
+ - spec/nanoc/telemetry/labelled_counter_spec.rb
495
+ - spec/nanoc/telemetry/labelled_summary_spec.rb
496
+ - spec/nanoc/telemetry/stopwatch_spec.rb
497
+ - spec/nanoc/telemetry/summary_spec.rb
498
+ - spec/nanoc/telemetry_spec.rb
484
499
  - spec/regression_filenames_spec.rb
485
500
  - spec/spec_helper.rb
486
501
  - test/base/core_ext/array_spec.rb