lib/rake/funnel/tasks/timing.rb in rake-funnel-0.3.2.pre vs lib/rake/funnel/tasks/timing.rb in rake-funnel-0.4.0.pre

- old
+ new

@@ -1,104 +1,108 @@ -require 'rake/tasklib' - -module Rake::Funnel::Tasks - class Timing < Rake::TaskLib - include Rake::Funnel::Support::Timing - - attr_accessor :name - attr_reader :stats - - def initialize(*args, &task_block) - setup_ivars(args) - - define(args, &task_block) - end - - def reset! - patches.each { |p| p.revert! } - end - - private - def setup_ivars(args) - @name = args.shift || :timing - - @stats = Statistics.new - end - - def define(args, &task_block) - patches.each { |p| p.apply! } - - desc 'Output task timing information' unless Rake.application.last_description - - task name, :failed do |_, task_args| - task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block - - Report.new(@stats, task_args).render - end - - timing_task = Rake.application.current_scope.path_with_task_name(@name) - Rake.application.top_level_tasks.push(timing_task) - - self - end - - def patches - @patches ||= [report, benchmark] - end - - def report - Rake::Funnel::Support::Patch.new do |p| - report_invoker = -> (opts) { Report.new(@stats, opts).render } - - p.setup do - Rake::Application.class_eval do - orig_display_error_message = instance_method(:display_error_message) - - define_method(:display_error_message) do |ex| - orig_display_error_message.bind(self).call(ex) - - report_invoker.call(failed: true) - end - - orig_display_error_message - end - end - - p.reset do |memo| - Rake::Application.class_eval do - define_method(:display_error_message) do |ex| - memo.bind(self).call(ex) - end - end - end - end - end - - def benchmark - Rake::Funnel::Support::Patch.new do |p| - benchmark_invoker = -> (task, &block) { @stats.benchmark(task, &block) } - - p.setup do - Rake::Task.class_eval do - orig_execute = instance_method(:execute) - - define_method(:execute) do |args| - benchmark_invoker.call(self) do - orig_execute.bind(self).call(args) - end - end - - orig_execute - end - end - - p.reset do |memo| - Rake::Task.class_eval do - define_method(:execute) do |ex| - memo.bind(self).call(ex) - end - end - end - end - end - end -end +require 'rake/tasklib' + +module Rake + module Funnel + module Tasks + class Timing < Rake::TaskLib + include Rake::Funnel::Support::Timing + + attr_accessor :name + attr_reader :stats + + def initialize(*args, &task_block) + setup_ivars(args) + + define(args, &task_block) + end + + def reset! + patches.each(&:revert!) + end + + private + def setup_ivars(args) + @name = args.shift || :timing + + @stats = Statistics.new + end + + def define(_args, &task_block) + patches.each(&:apply!) + + desc 'Output task timing information' unless Rake.application.last_description + + task name, :failed do |_, task_args| + task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block + + Report.new(@stats, task_args).render + end + + timing_task = Rake.application.current_scope.path_with_task_name(@name) + Rake.application.top_level_tasks.push(timing_task) + + self + end + + def patches + @patches ||= [report, benchmark] + end + + def report + Rake::Funnel::Support::Patch.new do |p| + report_invoker = -> (opts) { Report.new(@stats, opts).render } + + p.setup do + Rake::Application.class_eval do + orig_display_error_message = instance_method(:display_error_message) + + define_method(:display_error_message) do |ex| + orig_display_error_message.bind(self).call(ex) + + report_invoker.call(failed: true) + end + + orig_display_error_message + end + end + + p.reset do |memo| + Rake::Application.class_eval do + define_method(:display_error_message) do |ex| + memo.bind(self).call(ex) + end + end + end + end + end + + def benchmark + Rake::Funnel::Support::Patch.new do |p| + benchmark_invoker = -> (task, &block) { @stats.benchmark(task, &block) } + + p.setup do + Rake::Task.class_eval do + orig_execute = instance_method(:execute) + + define_method(:execute) do |args| + benchmark_invoker.call(self) do + orig_execute.bind(self).call(args) + end + end + + orig_execute + end + end + + p.reset do |memo| + Rake::Task.class_eval do + define_method(:execute) do |ex| + memo.bind(self).call(ex) + end + end + end + end + end + end + end + end +end