Class: Object
- Inherits:
- BasicObject
- Includes:
- PP::ObjectMixin
- Defined in:
- lib/extensions/mspec/mspec/helpers/ruby_exe.rb,
lib/framework/builtinME.rb,
lib/extensions/mspec/mspec/pp.rb,
lib/extensions/rhospec/rhospec.rb,
lib/extensions/rhospec/rhospec.rb,
lib/extensions/mspec/mspec/guards/bug.rb,
lib/extensions/mspec/mspec/guards/tty.rb,
lib/extensions/mspec/mspec/helpers/fs.rb,
lib/extensions/mspec/mspec/helpers/io.rb,
lib/extensions/mspec/mspec/mocks/mock.rb,
lib/extensions/mspec/mspec/guards/user.rb,
lib/extensions/mspec/mspec/helpers/tmp.rb,
lib/extensions/mspec/mspec/helpers/argv.rb,
lib/extensions/mspec/mspec/helpers/hash.rb,
lib/extensions/mspec/mspec/matchers/eql.rb,
lib/extensions/mspec/mspec/mocks/object.rb,
lib/extensions/rexml/rexml/xpath_parser.rb,
lib/extensions/mspec/mspec/guards/endian.rb,
lib/extensions/mspec/mspec/guards/runner.rb,
lib/extensions/mspec/mspec/helpers/flunk.rb,
lib/extensions/mspec/mspec/helpers/fmode.rb,
lib/extensions/mspec/mspec/helpers/stasy.rb,
lib/extensions/mspec/mspec/runner/object.rb,
lib/extensions/mspec/mspec/runner/shared.rb,
lib/extensions/rhoxml/rexml/xpath_parser.rb,
lib/extensions/mspec/mspec/guards/feature.rb,
lib/extensions/mspec/mspec/guards/support.rb,
lib/extensions/mspec/mspec/guards/version.rb,
lib/extensions/mspec/mspec/helpers/encode.rb,
lib/extensions/mspec/mspec/matchers/equal.rb,
lib/extensions/mspec/mspec/guards/conflict.rb,
lib/extensions/mspec/mspec/guards/platform.rb,
lib/extensions/mspec/mspec/helpers/fixture.rb,
lib/extensions/mspec/mspec/helpers/numeric.rb,
lib/extensions/mspec/mspec/matchers/be_nil.rb,
lib/extensions/mspec/mspec/matchers/output.rb,
lib/extensions/mspec/mspec/guards/specified.rb,
lib/extensions/mspec/mspec/guards/superuser.rb,
lib/extensions/mspec/mspec/helpers/datetime.rb,
lib/extensions/mspec/mspec/helpers/ducktype.rb,
lib/extensions/mspec/mspec/matchers/be_true.rb,
lib/extensions/mspec/mspec/guards/background.rb,
lib/extensions/mspec/mspec/guards/compliance.rb,
lib/extensions/mspec/mspec/guards/extensions.rb,
lib/extensions/mspec/mspec/guards/quarantine.rb,
lib/extensions/mspec/mspec/matchers/be_close.rb,
lib/extensions/mspec/mspec/matchers/be_empty.rb,
lib/extensions/mspec/mspec/matchers/be_false.rb,
lib/extensions/mspec/mspec/matchers/complain.rb,
lib/extensions/mspec/mspec/matchers/have_data.rb,
lib/extensions/mspec/mspec/expectations/should.rb,
lib/extensions/mspec/mspec/helpers/environment.rb,
lib/extensions/mspec/mspec/matchers/be_kind_of.rb,
lib/extensions/mspec/mspec/matchers/match_yaml.rb,
lib/extensions/mspec/mspec/matchers/respond_to.rb,
lib/extensions/mspec/mspec/guards/noncompliance.rb,
lib/extensions/mspec/mspec/helpers/mock_to_path.rb,
lib/extensions/mspec/mspec/matchers/equal_utf16.rb,
lib/extensions/mspec/mspec/matchers/have_method.rb,
lib/extensions/mspec/mspec/matchers/raise_error.rb,
lib/extensions/mspec/mspec/matchers/output_to_fd.rb,
lib/extensions/mspec/mspec/matchers/equal_element.rb,
lib/extensions/mspec/mspec/matchers/have_constant.rb,
lib/extensions/mspec/mspec/helpers/singleton_class.rb,
lib/extensions/mspec/mspec/matchers/be_ancestor_of.rb,
lib/extensions/mspec/mspec/matchers/be_computed_by.rb,
lib/extensions/mspec/mspec/helpers/enumerator_class.rb,
lib/extensions/mspec/mspec/helpers/language_version.rb,
lib/extensions/mspec/mspec/matchers/be_an_instance_of.rb,
lib/extensions/mspec/mspec/matchers/be_valid_dns_name.rb,
lib/extensions/mspec/mspec/matchers/have_class_variable.rb,
lib/extensions/mspec/mspec/matchers/have_private_method.rb,
lib/extensions/mspec/mspec/matchers/have_instance_method.rb,
lib/extensions/mspec/mspec/matchers/have_singleton_method.rb,
lib/extensions/mspec/mspec/matchers/have_instance_variable.rb,
lib/extensions/mspec/mspec/matchers/be_computed_by_function.rb,
lib/extensions/mspec/mspec/matchers/have_public_instance_method.rb,
lib/extensions/mspec/mspec/matchers/have_private_instance_method.rb,
lib/extensions/mspec/mspec/matchers/have_protected_instance_method.rb
Overview
The ruby_exe helper provides a wrapper for invoking the same Ruby interpreter as the one running the specs and getting the output from running the code. If code
is a file that exists, it will be run. Otherwise, code
should be Ruby code that will be run with the -e command line option. For example:
ruby_exe('path/to/some/file.rb')
will be executed as
`#{RUBY_EXE} #{'path/to/some/file.rb'}`
while
ruby_exe('puts "hello, world."')
will be executed as
`#{RUBY_EXE} -e #{'puts "hello, world."'}`
The ruby_exe helper also accepts an options hash with two keys: :options and :args. For example:
ruby_exe('file.rb', :options => "-w", :args => "> file.txt")
will be executed as
`#{RUBY_EXE} -w #{'file.rb'} > file.txt`
If nil
is passed for the first argument, the command line will be built only from the options hash.
The RUBY_EXE constant can be set explicitly since the value is used each time ruby_exe is invoked. The mspec runner script will set ENV to the name of the executable used to invoke the mspec-run script. The value of RUBY_EXE will be constructed as follows:
1. the value of ENV['RUBY_EXE']
2. an explicit value based on RUBY_NAME
3. cwd/(RUBY_NAME + $(EXEEXT) || $(exeext) || '')
4. $(bindir)/$(RUBY_INSTALL_NAME)
The value will only be used if the file exists and is executable.
These 4 ways correspond to the following scenarios:
1. Using the MSpec runner scripts, the name of the
executable is explicitly passed by ENV['RUBY_EXE']
so there is no ambiguity.
Otherwise, if using RSpec (or something else)
2. Running the specs while developing an alternative
Ruby implementation. This explicitly names the
executable in the development directory based on
the value of RUBY_NAME, which is probably initialized
from the value of RUBY_ENGINE.
3. Running the specs within the source directory for
some implementation. (E.g. a local build directory.)
4. Running the specs against some installed Ruby
implementation.
Constant Summary collapse
- NO_BLOCK_PASSED =
"you must pass a block to the eventually method"
- MSPEC_DATETIME_OPTIONS =
The new_datetime helper makes writing DateTime specs more simple by providing default constructor values and accepting a Hash of only the constructor values needed for the particular spec. For example:
new_datetime :hour => 1, :minute => 20
Possible keys are:
:year, :month, :day, :hour, :minute, :second, :offset and :sg.
{ :year => -4712, :month => 1, :day => 1, :hour => 0, :minute => 0, :second => 0, :offset => 0, :sg => Date::ITALY }
- NO_MATCHER_GIVEN =
Object.new
Instance Method Summary collapse
- #after(at = :each, &block) ⇒ Object
-
#argv(args) ⇒ Object
Convenience helper for altering ARGV.
- #as_superuser ⇒ Object
- #as_user ⇒ Object
- #be_an_instance_of(expected) ⇒ Object
- #be_ancestor_of(expected) ⇒ Object
- #be_close(expected, tolerance) ⇒ Object
- #be_computed_by(sym, *args) ⇒ Object
- #be_computed_by_function(sym, *args) ⇒ Object
- #be_empty ⇒ Object
- #be_false ⇒ Object
- #be_kind_of(expected) ⇒ Object
- #be_nil ⇒ Object
- #be_true ⇒ Object
- #be_valid_DNS_name ⇒ Object
- #before(at = :each, &block) ⇒ Object
- #big_endian ⇒ Object
- #bignum_value(plus = 0) ⇒ Object
- #call_block(&block) ⇒ Object
- #complain(complaint = nil) ⇒ Object
- #compliant_on(*args) ⇒ Object
-
#conflicts_with(*modules) ⇒ Object
In some cases, libraries will modify another Ruby method’s behavior.
-
#cp(source, dest) ⇒ Object
Copies a file.
- #dclone ⇒ Object
- #describe(mod, msg = nil, options = nil, &block) ⇒ Object (also: #context)
- #dev_null ⇒ Object
- #deviates_on(*args) ⇒ Object
-
#doc(*a) ⇒ Object
For ReadRuby compatiability.
- #does_not_respond_to(sym) ⇒ Object
-
#encode(str, encoding) ⇒ Object
Helper to handle String encodings.
-
#enumerator_class ⇒ Object
Returns the Enumerator class (either Enumerator or Enumerable::Enumerator) depending of the version.
- #env ⇒ Object
- #eql(expected) ⇒ Object
- #equal(expected) ⇒ Object
- #equal_element(*args) ⇒ Object
- #equal_utf16(expected) ⇒ Object
- #eventually(options = {}, &block) ⇒ Object
- #extended_on(*args) ⇒ Object
- #fake!(sym, value = nil) ⇒ Object
-
#fixnum_max ⇒ Object
Values from jruby/test/testFixnumBignumAutoconversion.rb.
- #fixnum_min ⇒ Object
-
#fixture(dir, *args) ⇒ Object
Returns the name of a fixture file by adjoining the directory of the
dir
argument with “fixtures” and the contents of theargs
array. - #flunk(msg = "This example is a failure") ⇒ Object
-
#fmode(mode) ⇒ Object
This helper simplifies passing file access modes regardless of whether the :encoding feature is enabled.
- #hash_class ⇒ Object
- #have_class_variable(variable) ⇒ Object
- #have_constant(variable) ⇒ Object
-
#have_data(data, mode = "rb:binary") ⇒ Object
Opens a file specified by the string the matcher is called on and compares the
data
passed to the matcher with the contents of the file. - #have_instance_method(method, include_super = true) ⇒ Object
- #have_instance_variable(variable) ⇒ Object
- #have_method(method, include_super = true) ⇒ Object
- #have_private_instance_method(method, include_super = true) ⇒ Object
- #have_private_method(method, include_super = true) ⇒ Object
- #have_protected_instance_method(method, include_super = true) ⇒ Object
- #have_public_instance_method(method, include_super = true) ⇒ Object
- #have_singleton_method(method, include_super = true) ⇒ Object
- #home_directory ⇒ Object
- #infinity_value ⇒ Object
- #it(msg, &block) ⇒ Object (also: #specify)
- #it_behaves_like(desc, meth, obj = nil) ⇒ Object
- #it_should_behave_like(desc) ⇒ Object
-
#language_version(dir, name) ⇒ Object
Helper for syntax-sensitive specs.
- #little_endian ⇒ Object
- #match_yaml(expected) ⇒ Object
-
#mkdir_p(path) ⇒ Object
Creates each directory in path that does not exist.
- #mock(name, options = {}) ⇒ Object
- #mock_int(val) ⇒ Object
- #mock_numeric(name, options = {}) ⇒ Object
- #mock_to_path(path) ⇒ Object
- #nan_value ⇒ Object
- #new_datetime(opts = {}) ⇒ Object
-
#new_fd(name, mode = "w:utf-8") ⇒ Object
Creates a “bare” file descriptor (i.e. one that is not associated with any Ruby object).
-
#new_hash(*args, &block) ⇒ Object
Returns a new instance of hash_class.
-
#new_io(name, mode = "w:utf-8") ⇒ Object
Creates an IO instance for a temporary file name.
- #not_compliant_on(*args) ⇒ Object
- #not_supported_on(*args) ⇒ Object
- #output(stdout = nil, stderr = nil) ⇒ Object
- #output_to_fd(what, where = STDOUT) ⇒ Object
- #platform_is(*args) ⇒ Object
- #platform_is_not(*args) ⇒ Object
- #process_is_foreground ⇒ Object
- #quarantine! ⇒ Object
- #raise_error(exception = Exception, message = nil, &block) ⇒ Object
- #resolve_ruby_exe ⇒ Object
- #respond_to(expected) ⇒ Object
- #responds_to(sym) ⇒ Object
-
#rm_r(*paths) ⇒ Object
Recursively removes all files and directories in
path
ifpath
is a directory. - #ruby_bug(bug, version) ⇒ Object
- #ruby_exe(code, opts = {}) ⇒ Object
- #ruby_exe_options(option) ⇒ Object
- #ruby_version_is(*args) ⇒ Object
- #runner_is(*args) ⇒ Object
- #runner_is_not(*args) ⇒ Object
- #should(matcher = NO_MATCHER_GIVEN) ⇒ Object
- #should_not(matcher = NO_MATCHER_GIVEN) ⇒ Object
- #should_not_receive(sym) ⇒ Object
- #should_receive(sym) ⇒ Object
- #singleton_class ⇒ Object
-
#specified_on(*args) ⇒ Object
This guard wraps specs for one or more particular implementations.
-
#stasy(one, *rest) ⇒ Object
Accepts either a single argument or an Array of arguments.
- #stub!(sym) ⇒ Object
- #tmp(name, uniquify = true) ⇒ Object
-
#touch(name, mode = "w") ⇒ Object
Creates a file
name
. - #undefine(sym) ⇒ Object
-
#unspecified ⇒ Object
This guard wraps one or more #specified_on guards to group them and document the specs.
- #username ⇒ Object
- #windows_env_echo(var) ⇒ Object
-
#with_feature(*features) ⇒ Object
Provides better documentation in the specs by naming sets of features that work together as a whole.
- #with_tty ⇒ Object
Methods included from PP::ObjectMixin
#pretty_print, #pretty_print_cycle, #pretty_print_inspect, #pretty_print_instance_variables
Instance Method Details
#after(at = :each, &block) ⇒ Object
176 177 178 |
# File 'lib/extensions/rhospec/rhospec.rb', line 176 def after(at=:each, &block) MSpec.current.after[ at ] = block end |
#argv(args) ⇒ Object
Convenience helper for altering ARGV. Saves the value of ARGV and sets it to args
. If a block is given, yields to the block and then restores the value of ARGV. The previously saved value of ARGV can be restored by passing :restore
. The former is useful in a single spec. The latter is useful in before/after actions. For example:
describe "This" do
before do
argv ['a', 'b']
end
after do
argv :restore
end
it "does something" do
# do something
end
end
describe "That" do
it "does something" do
argv ['a', 'b'] do
# do something
end
end
end
31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/extensions/mspec/mspec/helpers/argv.rb', line 31 def argv(args) if args == :restore ARGV.replace(@__mspec_saved_argv__ || []) else @__mspec_saved_argv__ = ARGV ARGV.replace args if block_given? yield argv :restore end end end |
#as_superuser ⇒ Object
10 11 12 13 14 15 16 |
# File 'lib/extensions/mspec/mspec/guards/superuser.rb', line 10 def as_superuser g = SuperUserGuard.new g.name = :as_superuser yield if g.yield? ensure g.unregister end |
#as_user ⇒ Object
10 11 12 13 14 15 16 |
# File 'lib/extensions/mspec/mspec/guards/user.rb', line 10 def as_user g = UserGuard.new g.name = :as_user yield if g.yield? ensure g.unregister end |
#be_an_instance_of(expected) ⇒ Object
23 24 25 |
# File 'lib/extensions/mspec/mspec/matchers/be_an_instance_of.rb', line 23 def be_an_instance_of(expected) BeAnInstanceOfMatcher.new(expected) end |
#be_ancestor_of(expected) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/be_ancestor_of.rb', line 21 def be_ancestor_of(expected) BeAncestorOfMatcher.new(expected) end |
#be_close(expected, tolerance) ⇒ Object
24 25 26 |
# File 'lib/extensions/mspec/mspec/matchers/be_close.rb', line 24 def be_close(expected, tolerance) BeCloseMatcher.new(expected, tolerance) end |
#be_computed_by(sym, *args) ⇒ Object
33 34 35 |
# File 'lib/extensions/mspec/mspec/matchers/be_computed_by.rb', line 33 def be_computed_by(sym, *args) BeComputedByMatcher.new(sym, *args) end |
#be_computed_by_function(sym, *args) ⇒ Object
32 33 34 |
# File 'lib/extensions/mspec/mspec/matchers/be_computed_by_function.rb', line 32 def be_computed_by_function(sym, *args) BeComputedByFunctionMatcher.new(sym, *args) end |
#be_empty ⇒ Object
17 18 19 |
# File 'lib/extensions/mspec/mspec/matchers/be_empty.rb', line 17 def be_empty BeEmptyMatcher.new end |
#be_false ⇒ Object
480 481 482 |
# File 'lib/extensions/rhospec/rhospec.rb', line 480 def be_false BeFalseMatcher.new end |
#be_kind_of(expected) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/be_kind_of.rb', line 21 def be_kind_of(expected) BeKindOfMatcher.new(expected) end |
#be_nil ⇒ Object
472 473 474 |
# File 'lib/extensions/rhospec/rhospec.rb', line 472 def be_nil BeNilMatcher.new end |
#be_true ⇒ Object
476 477 478 |
# File 'lib/extensions/rhospec/rhospec.rb', line 476 def be_true BeTrueMatcher.new end |
#be_valid_DNS_name ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/be_valid_dns_name.rb', line 21 def be_valid_DNS_name BeValidDNSName.new end |
#before(at = :each, &block) ⇒ Object
172 173 174 |
# File 'lib/extensions/rhospec/rhospec.rb', line 172 def before(at=:each, &block) MSpec.current.before[ at ] = block end |
#big_endian ⇒ Object
26 27 28 29 30 31 32 |
# File 'lib/extensions/mspec/mspec/guards/endian.rb', line 26 def big_endian g = BigEndianGuard.new g.name = :big_endian yield if g.yield? ensure g.unregister end |
#bignum_value(plus = 0) ⇒ Object
10 11 12 |
# File 'lib/extensions/mspec/mspec/helpers/numeric.rb', line 10 def bignum_value(plus=0) 0x8000_0000_0000_0000 + plus end |
#call_block(&block) ⇒ Object
192 193 194 195 196 197 |
# File 'lib/extensions/rhospec/rhospec.rb', line 192 def call_block(&block) block.call return nil rescue Exception => e return e end |
#complain(complaint = nil) ⇒ Object
53 54 55 |
# File 'lib/extensions/mspec/mspec/matchers/complain.rb', line 53 def complain(complaint=nil) ComplainMatcher.new(complaint) end |
#compliant_on(*args) ⇒ Object
22 23 24 25 26 27 28 |
# File 'lib/extensions/mspec/mspec/guards/compliance.rb', line 22 def compliant_on(*args) g = CompliantOnGuard.new(*args) g.name = :compliant_on yield if g.yield? ensure g.unregister end |
#conflicts_with(*modules) ⇒ Object
In some cases, libraries will modify another Ruby method’s behavior. The specs for the method’s behavior will then fail if that library is loaded. This guard will not run if any of the specified constants exist in Object.constants.
16 17 18 19 20 21 22 |
# File 'lib/extensions/mspec/mspec/guards/conflict.rb', line 16 def conflicts_with(*modules) g = ConflictsGuard.new(*modules) g.name = :conflicts_with yield if g.yield? true ensure g.unregister end |
#cp(source, dest) ⇒ Object
Copies a file
3 4 5 6 7 8 9 10 11 |
# File 'lib/extensions/mspec/mspec/helpers/fs.rb', line 3 def cp(source, dest) File.open(dest, "w") do |d| File.open(source, "r") do |s| while data = s.read(1024) d.write data end end end end |
#dclone ⇒ Object
8 9 10 |
# File 'lib/extensions/rexml/rexml/xpath_parser.rb', line 8 def dclone clone end |
#describe(mod, msg = nil, options = nil, &block) ⇒ Object Also known as: context
180 181 182 |
# File 'lib/extensions/rhospec/rhospec.rb', line 180 def describe(mod, msg=nil, =nil, &block) MSpec.describe mod, msg, &block end |
#dev_null ⇒ Object
33 34 35 36 37 38 39 |
# File 'lib/extensions/mspec/mspec/helpers/environment.rb', line 33 def dev_null if PlatformGuard.windows? "NUL" else "/dev/null" end end |
#deviates_on(*args) ⇒ Object
13 14 15 16 17 18 19 |
# File 'lib/extensions/mspec/mspec/guards/noncompliance.rb', line 13 def deviates_on(*args) g = NonComplianceGuard.new(*args) g.name = :deviates_on yield if g.yield? ensure g.unregister end |
#doc(*a) ⇒ Object
For ReadRuby compatiability
23 24 |
# File 'lib/extensions/mspec/mspec/runner/object.rb', line 23 def doc(*a) end |
#does_not_respond_to(sym) ⇒ Object
10 11 12 13 14 15 16 |
# File 'lib/extensions/mspec/mspec/helpers/ducktype.rb', line 10 def does_not_respond_to(sym) singleton_class.class_eval <<-END def respond_to?(sym, include_private=false) sym.to_sym == #{sym.to_sym.inspect} ? false : super end END end |
#encode(str, encoding) ⇒ Object
Helper to handle String encodings. The str
and encoding
parameters must be Strings and an ArgumentError will be raised if not. This ensures that the encode() helper can be used regardless of whether Encoding exits. The helper is a no-op (i.e. passes through str
unmodified) if the :encoding feature is not enabled (see with_feature guard). If the :encoding feature is enabled, str
.force_encoding(encoding
) is called.
10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/extensions/mspec/mspec/helpers/encode.rb', line 10 def encode(str, encoding) unless str.is_a? String and encoding.is_a? String raise ArgumentError, "encoding name must be a String" end if FeatureGuard.enabled? :encoding str.force_encoding encoding end str end |
#enumerator_class ⇒ Object
Returns the Enumerator class (either Enumerator or Enumerable::Enumerator) depending of the version.
6 7 8 |
# File 'lib/extensions/mspec/mspec/helpers/enumerator_class.rb', line 6 def enumerator_class SpecVersion.new(RUBY_VERSION) < "1.9" ? Enumerable::Enumerator : Enumerator end |
#env ⇒ Object
4 5 6 7 8 9 10 11 12 |
# File 'lib/extensions/mspec/mspec/helpers/environment.rb', line 4 def env env = "" if PlatformGuard.windows? env = Hash[*`cmd.exe /C set`.split("\n").map { |e| e.split("=", 2) }.flatten] else env = Hash[*`env`.split("\n").map { |e| e.split("=", 2) }.flatten] end env end |
#eql(expected) ⇒ Object
23 24 25 |
# File 'lib/extensions/mspec/mspec/matchers/eql.rb', line 23 def eql(expected) EqlMatcher.new(expected) end |
#equal(expected) ⇒ Object
484 485 486 |
# File 'lib/extensions/rhospec/rhospec.rb', line 484 def equal(expected) EqualMatcher.new(expected) end |
#equal_element(*args) ⇒ Object
75 76 77 |
# File 'lib/extensions/mspec/mspec/matchers/equal_element.rb', line 75 def equal_element(*args) EqualElementMatcher.new(*args) end |
#equal_utf16(expected) ⇒ Object
29 30 31 |
# File 'lib/extensions/mspec/mspec/matchers/equal_utf16.rb', line 29 def equal_utf16(expected) EqualUtf16Matcher.new(expected) end |
#eventually(options = {}, &block) ⇒ Object
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
# File 'lib/extensions/rhospec/rhospec.rb', line 202 def eventually = {}, &block raise NO_BLOCK_PASSED if block.nil? timeout = [:timeout] || 5 delay = [:delay] || 0.25 last_error = nil begin_time = Time.now while (Time.now - begin_time) < timeout e = call_block(&block) if e then last_error = e sleep delay else return end end raise last_error end |
#extended_on(*args) ⇒ Object
13 14 15 16 17 18 19 |
# File 'lib/extensions/mspec/mspec/guards/extensions.rb', line 13 def extended_on(*args) g = ExtensionsGuard.new(*args) g.name = :extended_on yield if g.yield? ensure g.unregister end |
#fake!(sym, value = nil) ⇒ Object
24 25 26 27 28 29 30 31 32 |
# File 'lib/extensions/mspec/mspec/helpers/ducktype.rb', line 24 def fake!(sym, value=nil) responds_to sym singleton_class.class_eval <<-END def method_missing(sym, *args) return #{value.inspect} if sym.to_sym == #{sym.to_sym.inspect} end END end |
#fixnum_max ⇒ Object
Values from jruby/test/testFixnumBignumAutoconversion.rb
49 50 51 |
# File 'lib/extensions/mspec/mspec/helpers/numeric.rb', line 49 def fixnum_max() (2**30) - 1 end |
#fixnum_min ⇒ Object
27 28 29 |
# File 'lib/extensions/mspec/mspec/helpers/numeric.rb', line 27 def fixnum_min() -(2**30) end |
#fixture(dir, *args) ⇒ Object
Returns the name of a fixture file by adjoining the directory of the dir
argument with “fixtures” and the contents of the args
array. For example,
+dir+ == "some/path"
and
+args+ == ["dir", "file.txt"]
then the result is the expanded path of
"some/fixtures/dir/file.txt".
15 16 17 18 19 20 |
# File 'lib/extensions/mspec/mspec/helpers/fixture.rb', line 15 def fixture(dir, *args) path = File.dirname(dir) path = path[0..-7] if path[-7..-1] == "/shared" dir = path[-9..-1] == "/fixtures" ? "" : "fixtures" File.(File.join(path, dir, args)) end |
#flunk(msg = "This example is a failure") ⇒ Object
2 3 4 |
# File 'lib/extensions/mspec/mspec/helpers/flunk.rb', line 2 def flunk(msg="This example is a failure") SpecExpectation.fail_with "Failed:", msg end |
#fmode(mode) ⇒ Object
This helper simplifies passing file access modes regardless of whether the :encoding feature is enabled. Only the access specifier itself will be returned if :encoding is not enabled. Otherwise, the full mode string will be returned (i.e. the helper is a no-op).
8 9 10 11 12 13 14 |
# File 'lib/extensions/mspec/mspec/helpers/fmode.rb', line 8 def fmode(mode) if FeatureGuard.enabled? :encoding mode else mode.split(':').first end end |
#hash_class ⇒ Object
7 8 9 |
# File 'lib/extensions/mspec/mspec/helpers/hash.rb', line 7 def hash_class Hash end |
#have_class_variable(variable) ⇒ Object
9 10 11 |
# File 'lib/extensions/mspec/mspec/matchers/have_class_variable.rb', line 9 def have_class_variable(variable) HaveClassVariableMatcher.new(variable) end |
#have_constant(variable) ⇒ Object
9 10 11 |
# File 'lib/extensions/mspec/mspec/matchers/have_constant.rb', line 9 def have_constant(variable) HaveConstantMatcher.new(variable) end |
#have_data(data, mode = "rb:binary") ⇒ Object
Opens a file specified by the string the matcher is called on and compares the data
passed to the matcher with the contents of the file. Expects to match the first N bytes of the file with data
. For example, suppose @name is the name of a file:
@name.should have_data("123")
passes if the file @name has “123” as the first 3 bytes. The file can contain more bytes than data
. The extra bytes do not affect the result.
46 47 48 |
# File 'lib/extensions/mspec/mspec/matchers/have_data.rb', line 46 def have_data(data, mode="rb:binary") HaveDataMatcher.new(data, mode) end |
#have_instance_method(method, include_super = true) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/have_instance_method.rb', line 21 def have_instance_method(method, include_super=true) HaveInstanceMethodMatcher.new method, include_super end |
#have_instance_variable(variable) ⇒ Object
9 10 11 |
# File 'lib/extensions/mspec/mspec/matchers/have_instance_variable.rb', line 9 def have_instance_variable(variable) HaveInstanceVariableMatcher.new(variable) end |
#have_method(method, include_super = true) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/have_method.rb', line 21 def have_method(method, include_super=true) HaveMethodMatcher.new method, include_super end |
#have_private_instance_method(method, include_super = true) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/have_private_instance_method.rb', line 21 def have_private_instance_method(method, include_super=true) HavePrivateInstanceMethodMatcher.new method, include_super end |
#have_private_method(method, include_super = true) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/have_private_method.rb', line 21 def have_private_method(method, include_super=true) HavePrivateMethodMatcher.new method, include_super end |
#have_protected_instance_method(method, include_super = true) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/have_protected_instance_method.rb', line 21 def have_protected_instance_method(method, include_super=true) HaveProtectedInstanceMethodMatcher.new method, include_super end |
#have_public_instance_method(method, include_super = true) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/have_public_instance_method.rb', line 21 def have_public_instance_method(method, include_super=true) HavePublicInstanceMethodMatcher.new method, include_super end |
#have_singleton_method(method, include_super = true) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/have_singleton_method.rb', line 21 def have_singleton_method(method, include_super=true) HaveSingletonMethodMatcher.new method, include_super end |
#home_directory ⇒ Object
28 29 30 31 |
# File 'lib/extensions/mspec/mspec/helpers/environment.rb', line 28 def home_directory return ENV['HOME'] unless PlatformGuard.windows? windows_env_echo('HOMEDRIVE') + windows_env_echo('HOMEPATH') end |
#infinity_value ⇒ Object
6 7 8 |
# File 'lib/extensions/mspec/mspec/helpers/numeric.rb', line 6 def infinity_value 1/0.0 end |
#it(msg, &block) ⇒ Object Also known as: specify
184 185 186 |
# File 'lib/extensions/rhospec/rhospec.rb', line 184 def it(msg, &block) MSpec.current.tests[ msg ] = block end |
#it_behaves_like(desc, meth, obj = nil) ⇒ Object
4 5 6 7 8 9 10 11 |
# File 'lib/extensions/mspec/mspec/runner/shared.rb', line 4 def it_behaves_like(desc, meth, obj=nil) send :before, :all do @method = meth @object = obj end send :it_should_behave_like, desc.to_s end |
#it_should_behave_like(desc) ⇒ Object
188 189 190 |
# File 'lib/extensions/rhospec/rhospec.rb', line 188 def it_should_behave_like(desc) raise "it_should_behave_like not implemented" end |
#language_version(dir, name) ⇒ Object
Helper for syntax-sensitive specs. The specs should be placed in a file in the versions
subdirectory. For example, suppose language/method_spec.rb contains specs whose syntax depends on the Ruby version. In the language/method_spec.rb use the helper as follows:
language_version __FILE__, "method"
Then add a file “language/versions/method_1.8.rb” for the specs that are syntax-compatible with Ruby 1.8.x.
The most version-specific file will be loaded. If the version is 1.8.6, “method_1.8.6.rb” will be loaded if it exists, otherwise “method_1.8.rb” will be loaded if it exists.
17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/extensions/mspec/mspec/helpers/language_version.rb', line 17 def language_version(dir, name) path = File.dirname(File.(dir)) [SpecGuard.ruby_version(:tiny), SpecGuard.ruby_version].each do |version| file = File.join path, "versions", "#{name}_#{version}.rb" if File.exists? file require file break end end nil end |
#little_endian ⇒ Object
34 35 36 37 38 39 40 |
# File 'lib/extensions/mspec/mspec/guards/endian.rb', line 34 def little_endian g = LittleEndianGuard.new g.name = :little_endian yield if g.yield? ensure g.unregister end |
#match_yaml(expected) ⇒ Object
43 44 45 |
# File 'lib/extensions/mspec/mspec/matchers/match_yaml.rb', line 43 def match_yaml(expected) MatchYAMLMatcher.new(expected) end |
#mkdir_p(path) ⇒ Object
Creates each directory in path that does not exist.
14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/extensions/mspec/mspec/helpers/fs.rb', line 14 def mkdir_p(path) parts = File.(path).split %r[/|\\] name = parts.shift parts.each do |part| name = File.join name, part if File.file? name raise ArgumentError, "path component of #{path} is a file" end Dir.mkdir name unless File.directory? name end end |
#mock(name, options = {}) ⇒ Object
17 18 19 |
# File 'lib/extensions/mspec/mspec/mocks/object.rb', line 17 def mock(name, ={}) MockObject.new name, end |
#mock_int(val) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/mocks/object.rb', line 21 def mock_int(val) MockIntObject.new(val) end |
#mock_numeric(name, options = {}) ⇒ Object
25 26 27 |
# File 'lib/extensions/mspec/mspec/mocks/object.rb', line 25 def mock_numeric(name, ={}) NumericMockObject.new name, end |
#mock_to_path(path) ⇒ Object
2 3 4 5 6 |
# File 'lib/extensions/mspec/mspec/helpers/mock_to_path.rb', line 2 def mock_to_path(path) obj = mock('path') obj.should_receive(:to_path).and_return(path) obj end |
#nan_value ⇒ Object
2 3 4 |
# File 'lib/extensions/mspec/mspec/helpers/numeric.rb', line 2 def nan_value 0/0.0 end |
#new_datetime(opts = {}) ⇒ Object
24 25 26 27 28 29 |
# File 'lib/extensions/mspec/mspec/helpers/datetime.rb', line 24 def new_datetime(opts={}) value = MSPEC_DATETIME_OPTIONS.dup.merge opts DateTime.new value[:year], value[:month], value[:day], value[:hour], value[:minute], value[:second], value[:offset], value[:sg] end |
#new_fd(name, mode = "w:utf-8") ⇒ Object
Creates a “bare” file descriptor (i.e. one that is not associated with any Ruby object). The file descriptor can safely be passed to IO.new without creating a Ruby object alias to the fd.
27 28 29 |
# File 'lib/extensions/mspec/mspec/helpers/io.rb', line 27 def new_fd(name, mode="w:utf-8") IO.sysopen name, fmode(mode) end |
#new_hash(*args, &block) ⇒ Object
Returns a new instance of hash_class.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/extensions/mspec/mspec/helpers/hash.rb', line 13 def new_hash(*args, &block) if block hash_class.new(&block) elsif args.size == 1 value = args.first if value.is_a?(Hash) or value.is_a?(hash_class) hash_class[value] else hash_class.new value end else hash_class[*args] end end |
#new_io(name, mode = "w:utf-8") ⇒ Object
Creates an IO instance for a temporary file name. The file must be deleted.
33 34 35 |
# File 'lib/extensions/mspec/mspec/helpers/io.rb', line 33 def new_io(name, mode="w:utf-8") IO.new new_fd(name, fmode(mode)), fmode(mode) end |
#not_compliant_on(*args) ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/extensions/mspec/mspec/guards/compliance.rb', line 30 def not_compliant_on(*args) g = NotCompliantOnGuard.new(*args) g.name = :not_compliant_on yield if g.yield? ensure g.unregister end |
#not_supported_on(*args) ⇒ Object
13 14 15 16 17 18 19 |
# File 'lib/extensions/mspec/mspec/guards/support.rb', line 13 def not_supported_on(*args) g = SupportedGuard.new(*args) g.name = :not_supported_on yield if g.yield? ensure g.unregister end |
#output(stdout = nil, stderr = nil) ⇒ Object
64 65 66 |
# File 'lib/extensions/mspec/mspec/matchers/output.rb', line 64 def output(stdout=nil, stderr=nil) OutputMatcher.new(stdout, stderr) end |
#output_to_fd(what, where = STDOUT) ⇒ Object
68 69 70 |
# File 'lib/extensions/mspec/mspec/matchers/output_to_fd.rb', line 68 def output_to_fd(what, where = STDOUT) OutputToFDMatcher.new what, where end |
#platform_is(*args) ⇒ Object
32 33 34 35 36 37 38 |
# File 'lib/extensions/mspec/mspec/guards/platform.rb', line 32 def platform_is(*args) g = PlatformGuard.new(*args) g.name = :platform_is yield if g.yield? ensure g.unregister end |
#platform_is_not(*args) ⇒ Object
40 41 42 43 44 45 46 |
# File 'lib/extensions/mspec/mspec/guards/platform.rb', line 40 def platform_is_not(*args) g = PlatformGuard.new(*args) g.name = :platform_is_not yield if g.yield? true ensure g.unregister end |
#process_is_foreground ⇒ Object
14 15 16 17 18 19 20 |
# File 'lib/extensions/mspec/mspec/guards/background.rb', line 14 def process_is_foreground g = BackgroundGuard.new g.name = :process_is_foreground yield if g.yield? true ensure g.unregister end |
#quarantine! ⇒ Object
10 11 12 13 14 15 16 |
# File 'lib/extensions/mspec/mspec/guards/quarantine.rb', line 10 def quarantine! g = QuarantineGuard.new g.name = :quarantine! yield if g.yield? ensure g.unregister end |
#raise_error(exception = Exception, message = nil, &block) ⇒ Object
488 489 490 |
# File 'lib/extensions/rhospec/rhospec.rb', line 488 def raise_error(exception=Exception, =nil, &block) RaiseErrorMatcher.new(exception, , &block) end |
#resolve_ruby_exe ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/extensions/mspec/mspec/helpers/ruby_exe.rb', line 98 def resolve_ruby_exe [:env, :engine, :name, :install_name].each do |option| next unless cmd = (option) exe = cmd.split.first # It has been reported that File.executable is not reliable # on Windows platforms (see commit 56bc555c). So, we check the # platform. if File.exists?(exe) and (PlatformGuard.windows? or File.executable?(exe)) return cmd end end nil end |
#respond_to(expected) ⇒ Object
21 22 23 |
# File 'lib/extensions/mspec/mspec/matchers/respond_to.rb', line 21 def respond_to(expected) RespondToMatcher.new(expected) end |
#responds_to(sym) ⇒ Object
2 3 4 5 6 7 8 |
# File 'lib/extensions/mspec/mspec/helpers/ducktype.rb', line 2 def responds_to(sym) singleton_class.class_eval <<-END def respond_to?(sym, include_private=false) sym.to_sym == #{sym.to_sym.inspect} ? true : super end END end |
#rm_r(*paths) ⇒ Object
Recursively removes all files and directories in path
if path
is a directory. Removes the file if path
is a file.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/extensions/mspec/mspec/helpers/fs.rb', line 31 def rm_r(*paths) paths.each do |path| path = File. path prefix = SPEC_TEMP_DIR unless path[0, prefix.size] == prefix raise ArgumentError, "#{path} is not prefixed by #{prefix}" end if File.directory? path Dir.entries(path).each { |x| rm_r "#{path}/#{x}" unless x =~ /^\.\.?$/ } Dir.rmdir path elsif File.exists? path File.delete path end end end |
#ruby_bug(bug, version) ⇒ Object
17 18 19 20 21 22 23 |
# File 'lib/extensions/mspec/mspec/guards/bug.rb', line 17 def ruby_bug(bug, version) g = BugGuard.new bug, version g.name = :ruby_bug yield if g.yield? true ensure g.unregister end |
#ruby_exe(code, opts = {}) ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/extensions/mspec/mspec/helpers/ruby_exe.rb', line 113 def ruby_exe(code, opts = {}) body = code working_dir = opts[:dir] || "." Dir.chdir(working_dir) do if code and not File.exists?(code) if opts[:escape] code = "'#{code}'" else code = code.inspect end body = "-e #{code}" end cmd = [RUBY_EXE, ENV['RUBY_FLAGS'], opts[:options], body, opts[:args]] `#{cmd.compact.join(' ')}` end end |
#ruby_exe_options(option) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/extensions/mspec/mspec/helpers/ruby_exe.rb', line 69 def (option) case option when :env ENV['RUBY_EXE'] when :engine case RUBY_NAME when 'rbx' if SpecGuard.ruby_version < "1.9" "bin/rbx" else "bin/rbx -X19" end when 'jruby' "bin/jruby" when 'maglev' "maglev-ruby" when 'ironruby' "ir" end when :name bin = RUBY_NAME + (RbConfig::CONFIG['EXEEXT'] || RbConfig::CONFIG['exeext'] || '') File.join(".", bin) when :install_name bin = RbConfig::CONFIG["RUBY_INSTALL_NAME"] || RbConfig::CONFIG["ruby_install_name"] bin << (RbConfig::CONFIG['EXEEXT'] || RbConfig::CONFIG['exeext'] || '') File.join(RbConfig::CONFIG['bindir'], bin) end end |
#ruby_version_is(*args) ⇒ Object
492 493 494 |
# File 'lib/extensions/rhospec/rhospec.rb', line 492 def ruby_version_is(*args) yield end |
#runner_is(*args) ⇒ Object
19 20 21 22 23 24 25 |
# File 'lib/extensions/mspec/mspec/guards/runner.rb', line 19 def runner_is(*args) g = RunnerGuard.new(*args) g.name = :runner_is yield if g.yield? ensure g.unregister end |
#runner_is_not(*args) ⇒ Object
27 28 29 30 31 32 33 |
# File 'lib/extensions/mspec/mspec/guards/runner.rb', line 27 def runner_is_not(*args) g = RunnerGuard.new(*args) g.name = :runner_is_not yield if g.yield? true ensure g.unregister end |
#should(matcher = NO_MATCHER_GIVEN) ⇒ Object
448 449 450 451 452 453 454 455 456 457 458 459 |
# File 'lib/extensions/rhospec/rhospec.rb', line 448 def should(matcher=nil) if matcher unless matcher.matches?(self) Expectation.fail_with(*matcher.) end else PositiveOperatorMatcher.new(self) #raise "Expected '#{matcher.inspect.to_s}' equal to nil" if self != nil end end |
#should_not(matcher = NO_MATCHER_GIVEN) ⇒ Object
461 462 463 464 465 466 467 468 469 470 |
# File 'lib/extensions/rhospec/rhospec.rb', line 461 def should_not(matcher=nil) if matcher if matcher.matches?(self) Expectation.fail_with(*matcher.) end else #raise "Expected '#{self.inspect.to_s}' not equal to nil" if self == nil NegativeOperatorMatcher.new(self) end end |
#should_not_receive(sym) ⇒ Object
12 13 14 15 |
# File 'lib/extensions/mspec/mspec/mocks/object.rb', line 12 def should_not_receive(sym) proxy = Mock.install_method self, sym proxy.exactly(0).times end |
#should_receive(sym) ⇒ Object
8 9 10 |
# File 'lib/extensions/mspec/mspec/mocks/object.rb', line 8 def should_receive(sym) Mock.install_method self, sym end |
#singleton_class ⇒ Object
3 4 5 |
# File 'lib/extensions/mspec/mspec/helpers/singleton_class.rb', line 3 def singleton_class class << self; self; end end |
#specified_on(*args) ⇒ Object
This guard wraps specs for one or more particular implementations. See the #unspecified guard for further documentation.
59 60 61 62 63 64 65 |
# File 'lib/extensions/mspec/mspec/guards/specified.rb', line 59 def specified_on(*args) g = SpecifiedOnGuard.new(*args) g.name = :specified_on yield if g.yield? ensure g.unregister end |
#stasy(one, *rest) ⇒ Object
Accepts either a single argument or an Array of arguments. If RUBY_VERSION is less than 1.9, converts the argument(s) to Strings; otherwise, converts the argument(s) to Symbols.
If one argument is passed, the converted argument is returned. If an Array is passed, an Array is returned.
For example, if RUBY_VERSION == 1.8.7
stasy(:some) => "some"
stasy("nom") => "nom"
while if RUBY_VERSION == 1.9.0
stasy(:some) => :some
stasy("nom") => :nom
22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/extensions/mspec/mspec/helpers/stasy.rb', line 22 def stasy(one, *rest) era = SpecVersion.new(SpecGuard.ruby_version) < "1.9" convert = era ? :to_s : :to_sym one = one.send convert if rest.empty? one else [one].concat rest.map { |x| x.send convert } end end |
#stub!(sym) ⇒ Object
4 5 6 |
# File 'lib/extensions/mspec/mspec/mocks/object.rb', line 4 def stub!(sym) Mock.install_method self, sym, :stub end |
#tmp(name, uniquify = true) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/extensions/mspec/mspec/helpers/tmp.rb', line 29 def tmp(name, uniquify=true) Dir.mkdir SPEC_TEMP_DIR unless File.exists? SPEC_TEMP_DIR if uniquify and !name.empty? slash = name.rindex "/" index = slash ? slash + 1 : 0 name.insert index, "#{SPEC_TEMP_UNIQUIFIER.succ!}-" end File.join SPEC_TEMP_DIR, name end |
#touch(name, mode = "w") ⇒ Object
Creates a file name
. Creates the directory for name
if it does not exist.
51 52 53 54 55 56 57 |
# File 'lib/extensions/mspec/mspec/helpers/fs.rb', line 51 def touch(name, mode="w") mkdir_p File.dirname(name) File.open(name, mode) do |f| yield f if block_given? end end |
#undefine(sym) ⇒ Object
18 19 20 21 22 |
# File 'lib/extensions/mspec/mspec/helpers/ducktype.rb', line 18 def undefine(sym) singleton_class.class_eval <<-END undef_method #{sym.to_sym.inspect} END end |
#unspecified ⇒ Object
This guard wraps one or more #specified_on guards to group them and document the specs. The purpose of the guard is for situations where MRI either does not specify Ruby behavior or where MRI’s behavior is all but impossible to spec, for example due to relying on platform-specific behavior that is not easily testable from Ruby code. In such cases, it may be desirable for implementations to explore a specified set of behaviors that are explicitly documented in the specs.
unspecified do
specified_on :rubinius, :ironruby do
it "returns true when passed :foo" do
# ...
end
it "returns false when passed :bar" do
# ...
end
end
specified_on :jruby do
it "returns true when passed :bar" do
# ...
end
end
end
Note that these guards do not change the policy of the #compliant_on, #not_compliant_on, #deviates_on, #extended_on, and #not_supported_on guards.
49 50 51 52 53 54 55 |
# File 'lib/extensions/mspec/mspec/guards/specified.rb', line 49 def unspecified g = UnspecifiedGuard.new g.name = :unspecified yield if g.yield? ensure g.unregister end |
#username ⇒ Object
18 19 20 21 22 23 24 25 26 |
# File 'lib/extensions/mspec/mspec/helpers/environment.rb', line 18 def username user = "" if PlatformGuard.windows? user = windows_env_echo('USERNAME') else user = `whoami`.strip end user end |
#windows_env_echo(var) ⇒ Object
14 15 16 |
# File 'lib/extensions/mspec/mspec/helpers/environment.rb', line 14 def windows_env_echo(var) `cmd.exe /C ECHO %#{var}%`.strip end |
#with_feature(*features) ⇒ Object
Provides better documentation in the specs by naming sets of features that work together as a whole. Examples include :encoding, :fiber, :continuation, :fork.
Usage example:
with_feature :encoding do
# specs for a method that provides aspects
# of the encoding feature
end
Multiple features must all be enabled for the guard to run:
with_feature :one, :two do
# these specs will run if features :one AND
# :two are enabled.
end
The implementation must explicitly enable a feature by adding code like the following to the .mspec configuration file:
MSpec.enable_feature :encoding
40 41 42 43 44 45 46 |
# File 'lib/extensions/mspec/mspec/guards/feature.rb', line 40 def with_feature(*features) g = FeatureGuard.new(*features) g.name = :with_feature yield if g.yield? ensure g.unregister end |