lib/remarkable/pending.rb in remarkable-3.0.9 vs lib/remarkable/pending.rb in remarkable-3.0.10

- old
+ new

@@ -1,42 +1,62 @@ module Remarkable - module Macros - - protected + module Pending - # Adds a pending block to your specs. - # - # == Examples - # - # pending 'create manager resource' do - # should_have_one :manager - # should_validate_associated :manager - # end - # - def pending(description='TODO', &block) - PendingSandbox.new(description, self).instance_eval(&block) - end + # We cannot put the alias method in the module because it's a Ruby 1.8 bug + # http://coderrr.wordpress.com/2008/03/28/alias_methodmodule-bug-in-ruby-18/ + # + def self.extended(base) #:nodoc: + class << base + alias :it :example + alias :specify :example + end + end + + # Adds a pending block to your specs. + # + # == Examples + # + # pending 'create manager resource' do + # should_have_one :manager + # should_validate_associated :manager + # end + # + # By default, it executes the examples inside the pending block. So as soon + # as you add the has_one :manager relationship to your model, your specs + # will say that this was already fixed and there is no need to be treated + # as pending. To disable this behavior, you can give :execute => false: + # + # pending 'create manager resource', :execute => false + # + def pending(*args, &block) + options = { :execute => true }.merge(args.extract_options!) + + @_pending_group = true + @_pending_group_description = args.first || "TODO" + @_pending_group_execute = options.delete(:execute) + + self.instance_eval(&block) + + @_pending_group = false + @_pending_group_description = nil + @_pending_group_execute = nil + end - class PendingSandbox < Struct.new(:description, :spec) #:nodoc: - include Macros - - def example(mather_description=nil) - method_caller = caller.detect{ |c| c !~ /method_missing'/ } - - error = begin - ::Spec::Example::ExamplePendingError.new(description, method_caller) - rescue # For rspec <= 1.1.12 and rspec => 1.2.4 - ::Spec::Example::ExamplePendingError.new(description) - end - - spec.send(:example, mather_description){ raise error } - end - alias :it :example - alias :specify :example - - def should_or_should_not_method_missing(should_or_should_not, method, calltrace, *args, &block) - example(get_description_from_matcher(should_or_should_not, method, *args, &block)) - end - end + def example(description=nil, options={}, backtrace=nil, &implementation) #:nodoc: + if block_given? && @_pending_group + pending_caller = caller.detect{ |c| c !~ /method_missing'/ } + pending_description = @_pending_group_description + + pending_block = if @_pending_group_execute + proc{ pending(pending_description, &implementation) } + else + proc{ pending(pending_description) } + end + + super(description, options, backtrace || pending_caller, &pending_block) + else + super(description, options, backtrace || caller(0)[1], &implementation) + end + end end end