nanoc 4.6.4 → 4.7.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +12 -4
  4. data/NEWS.md +7 -0
  5. data/README.md +1 -1
  6. data/lib/nanoc/base/feature.rb +1 -1
  7. data/lib/nanoc/base/services/compiler.rb +18 -11
  8. data/lib/nanoc/base/services/compiler/phases.rb +2 -0
  9. data/lib/nanoc/base/services/compiler/phases/abstract.rb +34 -0
  10. data/lib/nanoc/base/services/compiler/phases/cache.rb +8 -5
  11. data/lib/nanoc/base/services/compiler/phases/mark_done.rb +8 -5
  12. data/lib/nanoc/base/services/compiler/phases/recalculate.rb +6 -2
  13. data/lib/nanoc/base/services/compiler/phases/resume.rb +9 -7
  14. data/lib/nanoc/base/services/compiler/phases/write.rb +8 -5
  15. data/lib/nanoc/base/services/compiler/stages/compile_reps.rb +1 -1
  16. data/lib/nanoc/cli.rb +8 -0
  17. data/lib/nanoc/cli/commands/compile.rb +81 -27
  18. data/lib/nanoc/cli/commands/nanoc.rb +2 -1
  19. data/lib/nanoc/cli/error_handler.rb +1 -0
  20. data/lib/nanoc/filters.rb +1 -0
  21. data/lib/nanoc/filters/erubi.rb +27 -0
  22. data/lib/nanoc/rule_dsl/rule_context.rb +16 -2
  23. data/lib/nanoc/telemetry/labelled_counter.rb +9 -9
  24. data/lib/nanoc/telemetry/labelled_summary.rb +15 -11
  25. data/lib/nanoc/version.rb +1 -1
  26. data/spec/nanoc/base/compiler_spec.rb +2 -0
  27. data/spec/nanoc/base/services/compiler/phases/abstract_spec.rb +49 -0
  28. data/spec/nanoc/base/services/compiler/phases/cache_spec.rb +13 -9
  29. data/spec/nanoc/cli/commands/compile/timing_recorder_spec.rb +101 -5
  30. data/spec/nanoc/rule_dsl/rule_context_spec.rb +63 -13
  31. data/spec/nanoc/telemetry/labelled_counter_spec.rb +10 -10
  32. data/spec/nanoc/telemetry/labelled_summary_spec.rb +36 -23
  33. data/spec/nanoc/telemetry/stopwatch_spec.rb +2 -0
  34. data/spec/nanoc/telemetry_spec.rb +14 -14
  35. data/spec/spec_helper.rb +3 -0
  36. data/test/base/test_compiler.rb +0 -38
  37. data/test/checking/checks/test_html.rb +0 -4
  38. data/test/filters/test_erubi.rb +73 -0
  39. data/test/fixtures/vcr_cassettes/html_run_ok.yml +27 -98
  40. data/test/helper.rb +3 -0
  41. metadata +6 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45e73cb6f9f73af2a760146464d15b5537744e16
4
- data.tar.gz: e5c219a107840118bb1fa45ba1396d302dbc5049
3
+ metadata.gz: a139ed28840cdd9e8d815959a6ce67a2a3d64629
4
+ data.tar.gz: 443fad3be7c31740a6b0378e37b358355f4cf451
5
5
  SHA512:
6
- metadata.gz: 88453d81285519f1ee03821c835f9744096623f07a887f012dc66404bd68342429b211202cc9ec686b430da2d56ffbe2e6c23ec166fded484674512ab1c4c611
7
- data.tar.gz: 39bb9372f9c71984af7726da2a1a2290dc85a89af3c7006073265d19620a4fb58f66616badd98ed97651a5006c71be82b0c9a00822727b91c94855cf368e3342
6
+ metadata.gz: 54e42408687a77e4775218127f65e92780702969c3f18e8d4dbd723b7428d6f0a8eec603545ab092f69de699af67af0861ae690b142b5e9314ac4c893ef8830b
7
+ data.tar.gz: 66dc4eb54985f21f9a6614b366fbcd4b0dc4b8e3dc3cd4fe0e7b6f5c3497432f91e0221e3868cf8c2a2bb60df04dd18d8a0909508e3ef6aad2a15e45ef2cf8f2
data/Gemfile CHANGED
@@ -3,6 +3,7 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  group :devel do
6
+ gem 'codecov', require: false
6
7
  gem 'contracts', '~> 0.14'
7
8
  gem 'coveralls', require: false
8
9
  gem 'fuubar'
@@ -34,6 +35,7 @@ group :plugins do
34
35
  gem 'coderay'
35
36
  gem 'coffee-script'
36
37
  gem 'compass'
38
+ gem 'erubi'
37
39
  gem 'erubis'
38
40
  gem 'fog'
39
41
  gem 'haml'
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: https://github.com/bbatsov/rubocop.git
3
- revision: 70f6d9191e2cc1d9726d4a4107f5efc5a797e310
3
+ revision: 7623afc89d97b6149067428e1cb8d69a1786d0b3
4
4
  specs:
5
5
  rubocop (0.47.1)
6
6
  parser (>= 2.3.3.1, < 3.0)
@@ -27,7 +27,7 @@ GIT
27
27
  PATH
28
28
  remote: .
29
29
  specs:
30
- nanoc (4.6.4)
30
+ nanoc (4.7.0)
31
31
  cri (~> 2.3)
32
32
  ddplugin (~> 1.0)
33
33
  hamster (~> 3.0)
@@ -50,6 +50,10 @@ GEM
50
50
  bluecloth (2.2.0)
51
51
  builder (3.2.3)
52
52
  chunky_png (1.3.8)
53
+ codecov (0.1.10)
54
+ json
55
+ simplecov
56
+ url
53
57
  coderay (1.1.1)
54
58
  coffee-script (2.4.1)
55
59
  coffee-script-source
@@ -84,6 +88,7 @@ GEM
84
88
  ddplugin (1.0.1)
85
89
  diff-lcs (1.3)
86
90
  docile (1.1.5)
91
+ erubi (1.6.0)
87
92
  erubis (2.7.0)
88
93
  excon (0.55.0)
89
94
  execjs (2.7.0)
@@ -291,7 +296,7 @@ GEM
291
296
  rb-fsevent (0.9.8)
292
297
  rb-inotify (0.9.8)
293
298
  ffi (>= 0.5.0)
294
- rbvmomi (1.9.5)
299
+ rbvmomi (1.10.0)
295
300
  builder (~> 3.0)
296
301
  json (>= 1.8)
297
302
  nokogiri (~> 1.5)
@@ -342,9 +347,10 @@ GEM
342
347
  trollop (2.1.2)
343
348
  typogruby (1.0.18)
344
349
  rubypants
345
- uglifier (3.1.5)
350
+ uglifier (3.1.7)
346
351
  execjs (>= 0.3.0, < 3)
347
352
  unicode-display_width (1.1.3)
353
+ url (0.3.2)
348
354
  vcr (3.0.3)
349
355
  w3c_validators (1.3.2)
350
356
  json (>= 1.8)
@@ -370,11 +376,13 @@ DEPENDENCIES
370
376
  bluecloth
371
377
  builder
372
378
  bundler (>= 1.7.10, < 2.0)
379
+ codecov
373
380
  coderay
374
381
  coffee-script
375
382
  compass
376
383
  contracts (~> 0.14)
377
384
  coveralls
385
+ erubi
378
386
  erubis
379
387
  fog
380
388
  fuubar
data/NEWS.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Nanoc news
2
2
 
3
+ ## 4.7 (2017-03-15)
4
+
5
+ Features:
6
+
7
+ * Added `:erubi` filter (#1103)
8
+ * Added `write ext: 'something'` shortcut (#1079)
9
+
3
10
  ## 4.6.4 (2017-03-10)
4
11
 
5
12
  Fixes:
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  [![Gem version](http://img.shields.io/gem/v/nanoc.svg)](http://rubygems.org/gems/nanoc)
2
2
  [![Build status](http://img.shields.io/travis/nanoc/nanoc.svg)](https://travis-ci.org/nanoc/nanoc)
3
3
  [![Code Climate](http://img.shields.io/codeclimate/github/nanoc/nanoc.svg)](https://codeclimate.com/github/nanoc/nanoc)
4
- [![Code Coverage](http://img.shields.io/coveralls/nanoc/nanoc.svg)](https://coveralls.io/r/nanoc/nanoc)
4
+ [![Code Coverage](https://img.shields.io/codecov/c/github/nanoc/nanoc.svg)](https://codecov.io/gh/nanoc/nanoc)
5
5
 
6
6
  ![Nanoc logo](https://avatars1.githubusercontent.com/u/3260163?s=140)
7
7
 
@@ -89,4 +89,4 @@ module Nanoc
89
89
  end
90
90
  end
91
91
 
92
- Nanoc::Feature.define('profiler', version: '4.6')
92
+ Nanoc::Feature.define('profiler', version: '4.7')
@@ -121,18 +121,18 @@ module Nanoc::Int
121
121
  end
122
122
 
123
123
  def run_all
124
- preprocess_stage.run
125
- build_reps
126
- prune_stage.run
127
- load_stores
128
- determine_outdatedness
129
- forget_dependencies_if_needed
130
- store
131
- compile_reps_stage.run
132
- store_output_state
133
- @action_provider.postprocess(@site, @reps)
124
+ time_stage(:preprocess) { preprocess_stage.run }
125
+ time_stage(:build_reps) { build_reps }
126
+ time_stage(:prune) { prune_stage.run }
127
+ time_stage(:load_stores) { load_stores }
128
+ time_stage(:determine_outdatedness) { determine_outdatedness }
129
+ time_stage(:forget_dependencies_if_needed) { forget_dependencies_if_needed }
130
+ time_stage(:store) { store }
131
+ time_stage(:compile_reps) { compile_reps_stage.run }
132
+ time_stage(:store_output_state) { store_output_state }
133
+ time_stage(:postprocess) { @action_provider.postprocess(@site, @reps) }
134
134
  ensure
135
- cleanup_stage.run
135
+ time_stage(:cleanup) { cleanup_stage.run }
136
136
  end
137
137
 
138
138
  def load_stores
@@ -179,6 +179,13 @@ module Nanoc::Int
179
179
 
180
180
  private
181
181
 
182
+ def time_stage(name)
183
+ Nanoc::Int::NotificationCenter.post(:stage_started, name)
184
+ yield
185
+ ensure
186
+ Nanoc::Int::NotificationCenter.post(:stage_ended, name)
187
+ end
188
+
182
189
  def preprocess_stage
183
190
  @_preprocess_stage ||= Stages::Preprocess.new(
184
191
  action_provider: action_provider,
@@ -1,6 +1,8 @@
1
1
  module Nanoc::Int::Compiler::Phases
2
2
  end
3
3
 
4
+ require_relative 'phases/abstract'
5
+
4
6
  require_relative 'phases/recalculate'
5
7
  require_relative 'phases/cache'
6
8
  require_relative 'phases/resume'
@@ -0,0 +1,34 @@
1
+ module Nanoc::Int::Compiler::Phases
2
+ class Abstract
3
+ include Nanoc::Int::ContractsSupport
4
+
5
+ def initialize(wrapped:, name:)
6
+ @name = name
7
+ @wrapped = wrapped
8
+ end
9
+
10
+ def call(rep, is_outdated:)
11
+ notify(:phase_started, rep)
12
+ run(rep, is_outdated: is_outdated) do
13
+ notify(:phase_yielded, rep)
14
+ @wrapped.call(rep, is_outdated: is_outdated)
15
+ notify(:phase_resumed, rep)
16
+ end
17
+ notify(:phase_ended, rep)
18
+ rescue
19
+ notify(:phase_aborted, rep)
20
+ raise
21
+ end
22
+
23
+ contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => C::Any
24
+ def run(_rep, is_outdated:) # rubocop:disable Lint/UnusedMethodArgument
25
+ raise NotImplementedError
26
+ end
27
+
28
+ private
29
+
30
+ def notify(sym, rep)
31
+ Nanoc::Int::NotificationCenter.post(sym, @name, rep)
32
+ end
33
+ end
34
+ end
@@ -1,23 +1,26 @@
1
1
  module Nanoc::Int::Compiler::Phases
2
2
  # Provides functionality for (re)calculating the content of an item rep, with caching or
3
3
  # outdatedness checking. Delegates to s::Recalculate if outdated or no cache available.
4
- class Cache
4
+ class Cache < Abstract
5
5
  include Nanoc::Int::ContractsSupport
6
6
 
7
- def initialize(compiled_content_cache:, snapshot_repo:, wrapped:)
7
+ NAME = 'cache'.freeze
8
+
9
+ def initialize(wrapped:, compiled_content_cache:, snapshot_repo:)
10
+ super(wrapped: wrapped, name: NAME)
11
+
8
12
  @compiled_content_cache = compiled_content_cache
9
13
  @snapshot_repo = snapshot_repo
10
- @wrapped = wrapped
11
14
  end
12
15
 
13
- contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool] => C::Any
16
+ contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => C::Any
14
17
  def run(rep, is_outdated:)
15
18
  if can_reuse_content_for_rep?(rep, is_outdated: is_outdated)
16
19
  Nanoc::Int::NotificationCenter.post(:cached_content_used, rep)
17
20
 
18
21
  @snapshot_repo.set_all(rep, @compiled_content_cache[rep])
19
22
  else
20
- @wrapped.run(rep, is_outdated: is_outdated)
23
+ yield
21
24
  end
22
25
 
23
26
  rep.compiled = true
@@ -1,15 +1,18 @@
1
1
  module Nanoc::Int::Compiler::Phases
2
- class MarkDone
2
+ class MarkDone < Abstract
3
3
  include Nanoc::Int::ContractsSupport
4
4
 
5
+ NAME = 'mark_done'.freeze
6
+
5
7
  def initialize(wrapped:, outdatedness_store:)
6
- @wrapped = wrapped
8
+ super(wrapped: wrapped, name: NAME)
9
+
7
10
  @outdatedness_store = outdatedness_store
8
11
  end
9
12
 
10
- contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool] => C::Any
11
- def run(rep, is_outdated:)
12
- @wrapped.run(rep, is_outdated: is_outdated)
13
+ contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => C::Any
14
+ def run(rep, is_outdated:) # rubocop:disable Lint/UnusedMethodArgument
15
+ yield
13
16
  @outdatedness_store.remove(rep)
14
17
  end
15
18
  end
@@ -1,16 +1,20 @@
1
1
  module Nanoc::Int::Compiler::Phases
2
2
  # Provides functionality for (re)calculating the content of an item rep, without caching or
3
3
  # outdatedness checking.
4
- class Recalculate
4
+ class Recalculate < Abstract
5
5
  include Nanoc::Int::ContractsSupport
6
6
 
7
+ NAME = 'recalculate'.freeze
8
+
7
9
  def initialize(action_provider:, dependency_store:, compilation_context:)
10
+ super(wrapped: nil, name: NAME)
11
+
8
12
  @action_provider = action_provider
9
13
  @dependency_store = dependency_store
10
14
  @compilation_context = compilation_context
11
15
  end
12
16
 
13
- contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool] => C::Any
17
+ contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => C::Any
14
18
  def run(rep, is_outdated:) # rubocop:disable Lint/UnusedMethodArgument
15
19
  dependency_tracker = Nanoc::Int::DependencyTracker.new(@dependency_store)
16
20
  dependency_tracker.enter(rep.item)
@@ -1,15 +1,17 @@
1
1
  module Nanoc::Int::Compiler::Phases
2
2
  # Provides functionality for suspending and resuming item rep compilation (using fibers).
3
- class Resume
3
+ class Resume < Abstract
4
4
  include Nanoc::Int::ContractsSupport
5
5
 
6
+ NAME = 'resume'.freeze
7
+
6
8
  def initialize(wrapped:)
7
- @wrapped = wrapped
9
+ super(wrapped: wrapped, name: NAME)
8
10
  end
9
11
 
10
- contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool] => C::Any
12
+ contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => C::Any
11
13
  def run(rep, is_outdated:)
12
- fiber = fiber_for(rep, is_outdated: is_outdated)
14
+ fiber = fiber_for(rep, is_outdated: is_outdated) { yield }
13
15
  while fiber.alive?
14
16
  Nanoc::Int::NotificationCenter.post(:compilation_started, rep)
15
17
  res = fiber.resume
@@ -30,13 +32,13 @@ module Nanoc::Int::Compiler::Phases
30
32
 
31
33
  private
32
34
 
33
- contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool] => Fiber
34
- def fiber_for(rep, is_outdated:)
35
+ contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => Fiber
36
+ def fiber_for(rep, is_outdated:) # rubocop:disable Lint/UnusedMethodArgument
35
37
  @fibers ||= {}
36
38
 
37
39
  @fibers[rep] ||=
38
40
  Fiber.new do
39
- @wrapped.run(rep, is_outdated: is_outdated)
41
+ yield
40
42
  @fibers.delete(rep)
41
43
  end
42
44
 
@@ -1,15 +1,18 @@
1
1
  module Nanoc::Int::Compiler::Phases
2
- class Write
2
+ class Write < Abstract
3
3
  include Nanoc::Int::ContractsSupport
4
4
 
5
+ NAME = 'write'.freeze
6
+
5
7
  def initialize(snapshot_repo:, wrapped:)
8
+ super(wrapped: wrapped, name: NAME)
9
+
6
10
  @snapshot_repo = snapshot_repo
7
- @wrapped = wrapped
8
11
  end
9
12
 
10
- contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool] => C::Any
11
- def run(rep, is_outdated:)
12
- @wrapped.run(rep, is_outdated: is_outdated)
13
+ contract Nanoc::Int::ItemRep, C::KeywordArgs[is_outdated: C::Bool], C::Func[C::None => C::Any] => C::Any
14
+ def run(rep, is_outdated:) # rubocop:disable Lint/UnusedMethodArgument
15
+ yield
13
16
 
14
17
  Nanoc::Int::ItemRepWriter.new.write_all(rep, @snapshot_repo)
15
18
  end
@@ -27,7 +27,7 @@ module Nanoc::Int::Compiler::Stages
27
27
  end
28
28
 
29
29
  def compile_rep(rep, is_outdated:)
30
- item_rep_compiler.run(rep, is_outdated: is_outdated)
30
+ item_rep_compiler.call(rep, is_outdated: is_outdated)
31
31
  end
32
32
 
33
33
  def item_rep_compiler
@@ -34,6 +34,14 @@ module Nanoc::CLI
34
34
  @debug = boolean
35
35
  end
36
36
 
37
+ def self.verbosity
38
+ @verbosity || 0
39
+ end
40
+
41
+ def self.verbosity=(val)
42
+ @verbosity = val
43
+ end
44
+
37
45
  # Invokes the Nanoc command-line tool with the given arguments.
38
46
  #
39
47
  # @param [Array<String>] args An array of command-line arguments
@@ -158,29 +158,70 @@ module Nanoc::CLI::Commands
158
158
  def start
159
159
  @telemetry = Nanoc::Telemetry.new
160
160
 
161
- stopwatches = {}
161
+ stage_stopwatch = Nanoc::Telemetry::Stopwatch.new
162
+
163
+ Nanoc::Int::NotificationCenter.on(:stage_started) do |_stage_name|
164
+ stage_stopwatch.start
165
+ end
166
+
167
+ Nanoc::Int::NotificationCenter.on(:stage_ended) do |stage_name|
168
+ stage_stopwatch.stop
169
+ @telemetry.summary(:stages).observe(stage_stopwatch.duration, stage_name.to_s)
170
+ stage_stopwatch = Nanoc::Telemetry::Stopwatch.new
171
+ end
172
+
173
+ filter_stopwatches = {}
162
174
 
163
175
  Nanoc::Int::NotificationCenter.on(:filtering_started) do |rep, _filter_name|
164
- stopwatch_stack = stopwatches.fetch(rep) { stopwatches[rep] = [] }
176
+ stopwatch_stack = filter_stopwatches.fetch(rep) { filter_stopwatches[rep] = [] }
165
177
  stopwatch_stack << Nanoc::Telemetry::Stopwatch.new
166
178
  stopwatch_stack.last.start
167
179
  end
168
180
 
169
181
  Nanoc::Int::NotificationCenter.on(:filtering_ended) do |rep, filter_name|
170
- stopwatch = stopwatches.fetch(rep).pop
182
+ stopwatch = filter_stopwatches.fetch(rep).pop
171
183
  stopwatch.stop
172
184
 
173
- @telemetry.summary(:filter_total).observe(stopwatch.duration, filter_name: filter_name)
185
+ @telemetry.summary(:filters).observe(stopwatch.duration, filter_name.to_s)
174
186
  end
175
187
 
176
188
  Nanoc::Int::NotificationCenter.on(:compilation_suspended) do |rep, _exception|
177
- stopwatch = stopwatches.fetch(rep).last
178
- stopwatch.stop if stopwatch && stopwatch.running?
189
+ filter_stopwatches.fetch(rep).each(&:stop)
179
190
  end
180
191
 
181
192
  Nanoc::Int::NotificationCenter.on(:compilation_started) do |rep|
182
- stopwatch = stopwatches.fetch(rep, []).last
183
- stopwatch.start if stopwatch
193
+ filter_stopwatches.fetch(rep, []).each(&:start)
194
+ end
195
+
196
+ phase_stopwatches = {}
197
+
198
+ Nanoc::Int::NotificationCenter.on(:phase_started) do |phase_name, rep|
199
+ stopwatches = phase_stopwatches.fetch(rep) { phase_stopwatches[rep] = {} }
200
+ stopwatches[phase_name] = Nanoc::Telemetry::Stopwatch.new.tap(&:start)
201
+ end
202
+
203
+ Nanoc::Int::NotificationCenter.on(:phase_ended) do |phase_name, rep|
204
+ stopwatch = phase_stopwatches.fetch(rep).fetch(phase_name)
205
+ stopwatch.stop
206
+
207
+ @telemetry.summary(:phases).observe(stopwatch.duration, phase_name)
208
+ end
209
+
210
+ Nanoc::Int::NotificationCenter.on(:phase_yielded) do |phase_name, rep|
211
+ stopwatch = phase_stopwatches.fetch(rep).fetch(phase_name)
212
+ stopwatch.stop
213
+ end
214
+
215
+ Nanoc::Int::NotificationCenter.on(:phase_resumed) do |phase_name, rep|
216
+ stopwatch = phase_stopwatches.fetch(rep).fetch(phase_name)
217
+ stopwatch.start if stopwatch.stopped?
218
+ end
219
+
220
+ Nanoc::Int::NotificationCenter.on(:phase_aborted) do |phase_name, rep|
221
+ stopwatch = phase_stopwatches.fetch(rep).fetch(phase_name)
222
+ stopwatch.stop if stopwatch.running?
223
+
224
+ @telemetry.summary(:phases).observe(stopwatch.duration, phase_name)
184
225
  end
185
226
  end
186
227
 
@@ -192,19 +233,15 @@ module Nanoc::CLI::Commands
192
233
 
193
234
  protected
194
235
 
195
- def profiling_table
196
- headers = ['', 'count', 'min', 'avg', 'max', 'tot']
197
-
198
- metric_set = @telemetry.summary(:filter_total)
199
- rows = metric_set.labels.map do |label|
200
- metric = metric_set.get(label)
201
- filter_name = label[:filter_name].to_s
236
+ def table_for_summary(name)
237
+ headers = [name.to_s, 'count', 'min', 'avg', 'max', 'tot']
202
238
 
203
- count = metric.count
204
- min = metric.min
205
- avg = metric.avg
206
- tot = metric.sum
207
- max = metric.max
239
+ rows = @telemetry.summary(name).map do |filter_name, summary|
240
+ count = summary.count
241
+ min = summary.min
242
+ avg = summary.avg
243
+ tot = summary.sum
244
+ max = summary.max
208
245
 
209
246
  [filter_name, count.to_s] + [min, avg, max, tot].map { |r| "#{format('%4.2f', r)}s" }
210
247
  end
@@ -212,17 +249,34 @@ module Nanoc::CLI::Commands
212
249
  [headers] + rows
213
250
  end
214
251
 
215
- def print_profiling_feedback
216
- return if @telemetry.summary(:filter_total).labels.empty?
252
+ def table_for_summary_durations(name)
253
+ headers = [name.to_s, 'tot']
217
254
 
218
- if @reps.any? { |r| !r.compiled? }
219
- $stderr.puts
220
- $stderr.puts 'Warning: profiling information may not be accurate because ' \
221
- 'some items were not compiled.'
255
+ rows = @telemetry.summary(:stages).map do |stage_name, summary|
256
+ [stage_name, "#{format('%4.2f', summary.sum)}s"]
222
257
  end
223
258
 
259
+ [headers] + rows
260
+ end
261
+
262
+ def print_profiling_feedback
263
+ print_table_for_summary(:filters)
264
+ print_table_for_summary(:phases) if Nanoc::CLI.verbosity >= 2
265
+ print_table_for_summary_duration(:stages) if Nanoc::CLI.verbosity >= 2
266
+ end
267
+
268
+ def print_table_for_summary(name)
269
+ return if @telemetry.summary(name).empty?
270
+
271
+ puts
272
+ print_table(table_for_summary(name))
273
+ end
274
+
275
+ def print_table_for_summary_duration(name)
276
+ return if @telemetry.summary(name).empty?
277
+
224
278
  puts
225
- print_table profiling_table
279
+ print_table(table_for_summary_durations(name))
226
280
  end
227
281
 
228
282
  def print_table(table)