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