Created
May 24, 2009 10:28
-
-
Save josevalim/117058 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Remarkable | |
module Pending | |
# 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_method_chain :example, :pending | |
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 | |
def example_with_pending(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){ self.instance_eval(&implementation) } } | |
else | |
proc{ pending(pending_description) } | |
end | |
example_without_pending(description, options, backtrace || pending_caller, &pending_block) | |
else | |
example_without_pending(description, options, backtrace || caller(0)[1], &implementation) | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment