mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
346301e232
This adds the following C-API functions that can be used to emit warnings with categories included: ```c void rb_category_warn(const char *, const char*, ...) void rb_category_warning(const char*, const char*, ...) ``` Internally in error.c, there is an rb_warn_category function that will call Warning.warn with the string and the category keyword if it doesn't have an arity of 1, and will call Warning.warn with just the string if it has an arity of 1. This refactors the rb_warn_deprecated{,_to_remove} functions to use rb_warn_category. This makes Kernel#warn accept a category keyword and pass it to Warning.warn, so that Ruby methods can more easily emit warnings with categories. rb_warn_category makes sure that the passed category is a already defined category symbol before calling Warning.warn. The only currently defined warning category is :deprecated, since that is what is already used. More categories can be added in later commits.
91 lines
2.2 KiB
Ruby
91 lines
2.2 KiB
Ruby
require_relative '../../spec_helper'
|
|
|
|
describe "Warning.warn" do
|
|
it "complains" do
|
|
-> {
|
|
Warning.warn("Chunky bacon!")
|
|
}.should complain("Chunky bacon!")
|
|
end
|
|
|
|
it "does not add a newline" do
|
|
ruby_exe("Warning.warn('test')", args: "2>&1").should == "test"
|
|
end
|
|
|
|
it "returns nil" do
|
|
ruby_exe("p Warning.warn('test')", args: "2>&1").should == "testnil\n"
|
|
end
|
|
|
|
it "extends itself" do
|
|
Warning.singleton_class.ancestors.should include(Warning)
|
|
end
|
|
|
|
it "has Warning as the method owner" do
|
|
ruby_exe("p Warning.method(:warn).owner").should == "Warning\n"
|
|
end
|
|
|
|
it "can be overridden" do
|
|
code = <<-RUBY
|
|
$stdout.sync = true
|
|
$stderr.sync = true
|
|
def Warning.warn(msg)
|
|
if msg.start_with?("A")
|
|
puts msg.upcase
|
|
else
|
|
super
|
|
end
|
|
end
|
|
Warning.warn("A warning!")
|
|
Warning.warn("warning from stderr\n")
|
|
RUBY
|
|
ruby_exe(code, args: "2>&1").should == %Q[A WARNING!\nwarning from stderr\n]
|
|
end
|
|
|
|
it "is called by parser warnings" do
|
|
Warning.should_receive(:warn)
|
|
verbose = $VERBOSE
|
|
$VERBOSE = false
|
|
begin
|
|
eval "{ key: :value, key: :value2 }"
|
|
ensure
|
|
$VERBOSE = verbose
|
|
end
|
|
end
|
|
|
|
|
|
ruby_version_is '3.0' do
|
|
it "is called by Kernel.warn with nil category keyword" do
|
|
Warning.should_receive(:warn).with("Chunky bacon!\n", category: nil)
|
|
verbose = $VERBOSE
|
|
$VERBOSE = false
|
|
begin
|
|
Kernel.warn("Chunky bacon!")
|
|
ensure
|
|
$VERBOSE = verbose
|
|
end
|
|
end
|
|
|
|
it "is called by Kernel.warn with given category keyword converted to a symbol" do
|
|
Warning.should_receive(:warn).with("Chunky bacon!\n", category: :deprecated)
|
|
verbose = $VERBOSE
|
|
$VERBOSE = false
|
|
begin
|
|
Kernel.warn("Chunky bacon!", category: 'deprecated')
|
|
ensure
|
|
$VERBOSE = verbose
|
|
end
|
|
end
|
|
end
|
|
|
|
ruby_version_is ''...'3.0' do
|
|
it "is called by Kernel.warn" do
|
|
Warning.should_receive(:warn).with("Chunky bacon!\n")
|
|
verbose = $VERBOSE
|
|
$VERBOSE = false
|
|
begin
|
|
Kernel.warn("Chunky bacon!")
|
|
ensure
|
|
$VERBOSE = verbose
|
|
end
|
|
end
|
|
end
|
|
end
|