Add uplevel keyword to Kernel#warn and use it

If uplevel keyword is given, the warning message is prepended
with caller file and line information and the string "warning: ".
The use of the uplevel keyword makes Kernel#warn format output
similar to how rb_warn formats output.

This patch modifies net/ftp and net/imap to use Kernel#warn
instead of $stderr.puts or $stderr.printf, since they are used
for printing warnings.

This makes lib/cgi/core and tempfile use $stderr.puts instead of
warn for debug logging, since they are used for debug printing
and not for warning.

This does not modify bundler, rubygems, or rdoc, as those are
maintained outside of ruby and probably wish to remain backwards
compatible with older ruby versions.

rb_warn_m code is originally from nobu, but I've changed it
so that it only includes the path and lineno from uplevel
(not the method), and also prepends the string "warning: ",
to make it more similar to rb_warn.

From: Jeremy Evans code@jeremyevans.net
Signed-off-by: Urabe Shyouhei shyouhei@ruby-lang.org


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61155 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2017-12-12 11:56:25 +00:00
parent 0d7718896c
commit f2a91397fd
32 changed files with 92 additions and 63 deletions

35
error.c
View File

@ -327,10 +327,39 @@ warning_write(int argc, VALUE *argv, VALUE buf)
static VALUE static VALUE
rb_warn_m(int argc, VALUE *argv, VALUE exc) rb_warn_m(int argc, VALUE *argv, VALUE exc)
{ {
if (!NIL_P(ruby_verbose) && argc > 0) { VALUE opts, uplevel = Qnil;
if (!NIL_P(ruby_verbose) && argc > 0 &&
(argc = rb_scan_args(argc, argv, "*:", NULL, &opts)) > 0) {
VALUE str = argv[0]; VALUE str = argv[0];
if (argc > 1 || !end_with_asciichar(str, '\n')) { if (!NIL_P(opts)) {
str = rb_str_tmp_new(0); static ID kwds[1];
if (!kwds[0]) {
CONST_ID(kwds[0], "uplevel");
}
rb_get_kwargs(opts, kwds, 0, 1, &uplevel);
if (uplevel == Qundef) {
uplevel = Qnil;
}
else if (!NIL_P(uplevel)) {
uplevel = LONG2NUM((long)NUM2ULONG(uplevel) + 1);
uplevel = rb_vm_thread_backtrace_locations(1, &uplevel, GET_THREAD()->self);
if (!NIL_P(uplevel)) {
uplevel = rb_ary_entry(uplevel, 0);
}
}
}
if (argc > 1 || !NIL_P(uplevel) || !end_with_asciichar(str, '\n')) {
if (NIL_P(uplevel)) {
str = rb_str_tmp_new(0);
}
else {
VALUE path;
path = rb_funcall(uplevel, rb_intern("path"), 0);
str = rb_sprintf("%s:%li: warning: ",
rb_string_value_ptr(&path),
NUM2LONG(rb_funcall(uplevel, rb_intern("lineno"), 0)));
}
RBASIC_SET_CLASS(str, rb_cWarningBuffer); RBASIC_SET_CLASS(str, rb_cWarningBuffer);
rb_io_puts(argc, argv, str); rb_io_puts(argc, argv, str);
RBASIC_SET_CLASS(str, rb_cString); RBASIC_SET_CLASS(str, rb_cString);

View File

@ -267,7 +267,7 @@ class CGI
def _header_for_modruby(buf) #:nodoc: def _header_for_modruby(buf) #:nodoc:
request = Apache::request request = Apache::request
buf.scan(/([^:]+): (.+)#{EOL}/o) do |name, value| buf.scan(/([^:]+): (.+)#{EOL}/o) do |name, value|
warn sprintf("name:%s value:%s\n", name, value) if $DEBUG $stderr.puts sprintf("name:%s value:%s\n", name, value) if $DEBUG
case name case name
when 'Set-Cookie' when 'Set-Cookie'
request.headers_out.add(name, value) request.headers_out.add(name, value)

View File

@ -50,7 +50,7 @@ module CMath
atanh atanh
].each do |meth| ].each do |meth|
define_method(meth + '!') do |*args, &block| define_method(meth + '!') do |*args, &block|
warn("CMath##{meth}! is deprecated; use CMath##{meth} or Math##{meth}") if $VERBOSE warn("CMath##{meth}! is deprecated; use CMath##{meth} or Math##{meth}", uplevel: 1) if $VERBOSE
RealMath.send(meth, *args, &block) RealMath.send(meth, *args, &block)
end end
end end

View File

@ -97,7 +97,7 @@ class Delegator < BasicObject
target = self.__getobj__ {r = false} target = self.__getobj__ {r = false}
r &&= target.respond_to?(m, include_private) r &&= target.respond_to?(m, include_private)
if r && include_private && !target.respond_to?(m, false) if r && include_private && !target.respond_to?(m, false)
warn "#{caller(3, 1)[0]}: delegator does not forward private method \##{m}" warn "delegator does not forward private method \##{m}", uplevel: 3
return false return false
end end
r r

View File

@ -336,7 +336,7 @@ module DRb
end end
self.class.new(uri, ssl, @config, true) self.class.new(uri, ssl, @config, true)
rescue OpenSSL::SSL::SSLError rescue OpenSSL::SSL::SSLError
warn("#{__FILE__}:#{__LINE__}: warning: #{$!.message} (#{$!.class})") if @config[:verbose] warn("#{$!.message} (#{$!.class})", uplevel: 0) if @config[:verbose]
retry retry
end end
end end

View File

@ -206,7 +206,7 @@ module Forwardable
method_call = "#{<<-"begin;"}\n#{<<-"end;".chomp}" method_call = "#{<<-"begin;"}\n#{<<-"end;".chomp}"
begin; begin;
unless defined? _.#{method} unless defined? _.#{method}
::Kernel.warn "\#{caller_locations(1)[0]}: "#{mesg.dump}"\#{_.class}"'##{method}' ::Kernel.warn #{mesg.dump}"\#{_.class}"'##{method}', uplevel: 1
_#{method_call} _#{method_call}
else else
_.#{method}(*args, &block) _.#{method}(*args, &block)

View File

@ -310,7 +310,7 @@ class IPAddr
# Returns true if the ipaddr is an IPv4-compatible IPv6 address. # Returns true if the ipaddr is an IPv4-compatible IPv6 address.
def ipv4_compat? def ipv4_compat?
warn "#{caller(1, 1)[0]}: warning: IPAddr\##{__callee__} is obsolete" if $VERBOSE warn "IPAddr\##{__callee__} is obsolete", uplevel: 1 if $VERBOSE
_ipv4_compat? _ipv4_compat?
end end
@ -336,7 +336,7 @@ class IPAddr
# Returns a new ipaddr built by converting the native IPv4 address # Returns a new ipaddr built by converting the native IPv4 address
# into an IPv4-compatible IPv6 address. # into an IPv4-compatible IPv6 address.
def ipv4_compat def ipv4_compat
warn "#{caller(1, 1)[0]}: warning: IPAddr\##{__callee__} is obsolete" if $VERBOSE warn "IPAddr\##{__callee__} is obsolete", uplevel: 1 if $VERBOSE
if !ipv4? if !ipv4?
raise InvalidAddressError, "not an IPv4 address" raise InvalidAddressError, "not an IPv4 address"
end end

View File

@ -277,7 +277,7 @@ module IRB # :nodoc:
begin begin
require m require m
rescue LoadError => err rescue LoadError => err
warn err.backtrace[0] << ":#{err.class}: #{err}" warn ":#{err.class}: #{err}", uplevel: 0
end end
end end
end end

View File

@ -31,7 +31,7 @@ module IRB # :nodoc:
if @encoding_name if @encoding_name
begin load 'irb/encoding_aliases.rb'; rescue LoadError; end begin load 'irb/encoding_aliases.rb'; rescue LoadError; end
if @encoding = @@legacy_encoding_alias_map[@encoding_name] if @encoding = @@legacy_encoding_alias_map[@encoding_name]
warn "%s is obsolete. use %s" % ["#{@lang}_#{@territory}.#{@encoding_name}", "#{@lang}_#{@territory}.#{@encoding.name}"] warn(("%s is obsolete. use %s" % ["#{@lang}_#{@territory}.#{@encoding_name}", "#{@lang}_#{@territory}.#{@encoding.name}"]), uplevel: 1)
end end
@encoding = Encoding.find(@encoding_name) rescue nil @encoding = Encoding.find(@encoding_name) rescue nil
end end

View File

@ -1184,7 +1184,7 @@ class Matrix
# deprecated; use Matrix#determinant # deprecated; use Matrix#determinant
# #
def determinant_e def determinant_e
warn "#{caller(1, 1)[0]}: warning: Matrix#determinant_e is deprecated; use #determinant" warn "Matrix#determinant_e is deprecated; use #determinant", uplevel: 1
determinant determinant
end end
alias det_e determinant_e alias det_e determinant_e
@ -1242,7 +1242,7 @@ class Matrix
# deprecated; use Matrix#rank # deprecated; use Matrix#rank
# #
def rank_e def rank_e
warn "#{caller(1, 1)[0]}: warning: Matrix#rank_e is deprecated; use #rank" warn "Matrix#rank_e is deprecated; use #rank", uplevel: 1
rank rank
end end
@ -1435,17 +1435,17 @@ class Matrix
end end
def elements_to_f def elements_to_f
warn "#{caller(1, 1)[0]}: warning: Matrix#elements_to_f is deprecated, use map(&:to_f)" warn "Matrix#elements_to_f is deprecated, use map(&:to_f)", uplevel: 1
map(&:to_f) map(&:to_f)
end end
def elements_to_i def elements_to_i
warn "#{caller(1, 1)[0]}: warning: Matrix#elements_to_i is deprecated, use map(&:to_i)" warn "Matrix#elements_to_i is deprecated, use map(&:to_i)", uplevel: 1
map(&:to_i) map(&:to_i)
end end
def elements_to_r def elements_to_r
warn "#{caller(1, 1)[0]}: warning: Matrix#elements_to_r is deprecated, use map(&:to_r)" warn "Matrix#elements_to_r is deprecated, use map(&:to_r)", uplevel: 1
map(&:to_r) map(&:to_r)
end end
@ -2098,17 +2098,17 @@ class Vector
end end
def elements_to_f def elements_to_f
warn "#{caller(1, 1)[0]}: warning: Vector#elements_to_f is deprecated" warn "Vector#elements_to_f is deprecated", uplevel: 1
map(&:to_f) map(&:to_f)
end end
def elements_to_i def elements_to_i
warn "#{caller(1, 1)[0]}: warning: Vector#elements_to_i is deprecated" warn "Vector#elements_to_i is deprecated", uplevel: 1
map(&:to_i) map(&:to_i)
end end
def elements_to_r def elements_to_r
warn "#{caller(1, 1)[0]}: warning: Vector#elements_to_r is deprecated" warn "Vector#elements_to_r is deprecated", uplevel: 1
map(&:to_r) map(&:to_r)
end end

View File

@ -310,13 +310,13 @@ module Net
# Obsolete # Obsolete
def return_code # :nodoc: def return_code # :nodoc:
$stderr.puts("warning: Net::FTP#return_code is obsolete and do nothing") warn("Net::FTP#return_code is obsolete and do nothing", uplevel: 1)
return "\n" return "\n"
end end
# Obsolete # Obsolete
def return_code=(s) # :nodoc: def return_code=(s) # :nodoc:
$stderr.puts("warning: Net::FTP#return_code= is obsolete and do nothing") warn("Net::FTP#return_code= is obsolete and do nothing", uplevel: 1)
end end
# Constructs a socket with +host+ and +port+. # Constructs a socket with +host+ and +port+.

View File

@ -708,7 +708,7 @@ module Net #:nodoc:
# http.start { .... } # http.start { .... }
# #
def set_debug_output(output) def set_debug_output(output)
warn 'Net::HTTP#set_debug_output called after HTTP started' if started? warn 'Net::HTTP#set_debug_output called after HTTP started', uplevel: 1 if started?
@debug_output = output @debug_output = output
end end

View File

@ -82,7 +82,7 @@ class Net::HTTPGenericRequest
end end
def body_exist? def body_exist?
warn "Net::HTTPRequest#body_exist? is obsolete; use response_body_permitted?" if $VERBOSE warn "Net::HTTPRequest#body_exist? is obsolete; use response_body_permitted?", uplevel: 1 if $VERBOSE
response_body_permitted? response_body_permitted?
end end
@ -299,7 +299,7 @@ class Net::HTTPGenericRequest
def supply_default_content_type def supply_default_content_type
return if content_type() return if content_type()
warn 'net/http: warning: Content-Type did not set; using application/x-www-form-urlencoded' if $VERBOSE warn 'net/http: Content-Type did not set; using application/x-www-form-urlencoded', uplevel: 1 if $VERBOSE
set_content_type 'application/x-www-form-urlencoded' set_content_type 'application/x-www-form-urlencoded'
end end

View File

@ -14,9 +14,9 @@ module Net::HTTPHeader
@header = {} @header = {}
return unless initheader return unless initheader
initheader.each do |key, value| initheader.each do |key, value|
warn "net/http: warning: duplicated HTTP header: #{key}" if key?(key) and $VERBOSE warn "net/http: duplicated HTTP header: #{key}", uplevel: 1 if key?(key) and $VERBOSE
if value.nil? if value.nil?
warn "net/http: warning: nil HTTP header: #{key}" if $VERBOSE warn "net/http: nil HTTP header: #{key}", uplevel: 1 if $VERBOSE
else else
@header[key.downcase] = [value.strip] @header[key.downcase] = [value.strip]
end end

View File

@ -140,17 +140,17 @@ class Net::HTTPResponse
# #
def response #:nodoc: def response #:nodoc:
warn "#{caller(1, 1)[0]}: warning: Net::HTTPResponse#response is obsolete" if $VERBOSE warn "Net::HTTPResponse#response is obsolete", uplevel: 1 if $VERBOSE
self self
end end
def header #:nodoc: def header #:nodoc:
warn "#{caller(1, 1)[0]}: warning: Net::HTTPResponse#header is obsolete" if $VERBOSE warn "Net::HTTPResponse#header is obsolete", uplevel: 1 if $VERBOSE
self self
end end
def read_header #:nodoc: def read_header #:nodoc:
warn "#{caller(1, 1)[0]}: warning: Net::HTTPResponse#read_header is obsolete" if $VERBOSE warn "Net::HTTPResponse#read_header is obsolete", uplevel: 1 if $VERBOSE
self self
end end

View File

@ -2032,8 +2032,7 @@ module Net
# generate a warning message to +stderr+, then return # generate a warning message to +stderr+, then return
# the value of +subtype+. # the value of +subtype+.
def media_subtype def media_subtype
$stderr.printf("warning: media_subtype is obsolete.\n") warn("media_subtype is obsolete, use subtype instead.\n", uplevel: 1)
$stderr.printf(" use subtype instead.\n")
return subtype return subtype
end end
end end
@ -2060,8 +2059,7 @@ module Net
# generate a warning message to +stderr+, then return # generate a warning message to +stderr+, then return
# the value of +subtype+. # the value of +subtype+.
def media_subtype def media_subtype
$stderr.printf("warning: media_subtype is obsolete.\n") warn("media_subtype is obsolete, use subtype instead.\n", uplevel: 1)
$stderr.printf(" use subtype instead.\n")
return subtype return subtype
end end
end end
@ -2090,8 +2088,7 @@ module Net
# generate a warning message to +stderr+, then return # generate a warning message to +stderr+, then return
# the value of +subtype+. # the value of +subtype+.
def media_subtype def media_subtype
$stderr.printf("warning: media_subtype is obsolete.\n") warn("media_subtype is obsolete, use subtype instead.\n", uplevel: 1)
$stderr.printf(" use subtype instead.\n")
return subtype return subtype
end end
end end
@ -2151,8 +2148,7 @@ module Net
# generate a warning message to +stderr+, then return # generate a warning message to +stderr+, then return
# the value of +subtype+. # the value of +subtype+.
def media_subtype def media_subtype
$stderr.printf("warning: media_subtype is obsolete.\n") warn("media_subtype is obsolete, use subtype instead.\n", uplevel: 1)
$stderr.printf(" use subtype instead.\n")
return subtype return subtype
end end
end end

View File

@ -162,7 +162,7 @@ class OpenStruct
end end
private :modifiable? private :modifiable?
# ::Kernel.warn("#{caller(1, 1)[0]}: do not use OpenStruct#modifiable") # ::Kernel.warn("do not use OpenStruct#modifiable", uplevel: 1)
alias modifiable modifiable? # :nodoc: alias modifiable modifiable? # :nodoc:
protected :modifiable protected :modifiable
@ -181,7 +181,7 @@ class OpenStruct
end end
private :new_ostruct_member! private :new_ostruct_member!
# ::Kernel.warn("#{caller(1, 1)[0]}: do not use OpenStruct#new_ostruct_member") # ::Kernel.warn("do not use OpenStruct#new_ostruct_member", uplevel: 1)
alias new_ostruct_member new_ostruct_member! # :nodoc: alias new_ostruct_member new_ostruct_member! # :nodoc:
protected :new_ostruct_member protected :new_ostruct_member

View File

@ -58,7 +58,7 @@ module REXML
# c = CData.new( " Some text " ) # c = CData.new( " Some text " )
# c.write( $stdout ) #-> <![CDATA[ Some text ]]> # c.write( $stdout ) #-> <![CDATA[ Some text ]]>
def write( output=$stdout, indent=-1, transitive=false, ie_hack=false ) def write( output=$stdout, indent=-1, transitive=false, ie_hack=false )
Kernel.warn( "#{self.class.name}.write is deprecated" ) Kernel.warn( "#{self.class.name}.write is deprecated", uplevel: 1)
indent( output, indent ) indent( output, indent )
output << START output << START
output << @string output << @string

View File

@ -48,7 +48,7 @@ module REXML
# ie_hack:: # ie_hack::
# Needed for conformity to the child API, but not used by this class. # Needed for conformity to the child API, but not used by this class.
def write( output, indent=-1, transitive=false, ie_hack=false ) def write( output, indent=-1, transitive=false, ie_hack=false )
Kernel.warn("Comment.write is deprecated. See REXML::Formatters") Kernel.warn("Comment.write is deprecated. See REXML::Formatters", uplevel: 1)
indent( output, indent ) indent( output, indent )
output << START output << START
output << @string output << @string

View File

@ -710,7 +710,7 @@ module REXML
# doc.write( out ) #-> doc is written to the string 'out' # doc.write( out ) #-> doc is written to the string 'out'
# doc.write( $stdout ) #-> doc written to the console # doc.write( $stdout ) #-> doc written to the console
def write(output=$stdout, indent=-1, transitive=false, ie_hack=false) def write(output=$stdout, indent=-1, transitive=false, ie_hack=false)
Kernel.warn("#{self.class.name}.write is deprecated. See REXML::Formatters") Kernel.warn("#{self.class.name}.write is deprecated. See REXML::Formatters", uplevel: 1)
formatter = if indent > -1 formatter = if indent > -1
if transitive if transitive
require "rexml/formatters/transitive" require "rexml/formatters/transitive"

View File

@ -43,7 +43,7 @@ module REXML
# See the rexml/formatters package # See the rexml/formatters package
# #
def write writer, indent=-1, transitive=false, ie_hack=false def write writer, indent=-1, transitive=false, ie_hack=false
Kernel.warn( "#{self.class.name}.write is deprecated" ) Kernel.warn( "#{self.class.name}.write is deprecated", uplevel: 1)
indent(writer, indent) indent(writer, indent)
writer << START.sub(/\\/u, '') writer << START.sub(/\\/u, '')
writer << @target writer << @target

View File

@ -26,7 +26,7 @@ module REXML
# REXML::Formatters package for changing the output style. # REXML::Formatters package for changing the output style.
def to_s indent=nil def to_s indent=nil
unless indent.nil? unless indent.nil?
Kernel.warn( "#{self.class.name}.to_s(indent) parameter is deprecated" ) Kernel.warn( "#{self.class.name}.to_s(indent) parameter is deprecated", uplevel: 1)
f = REXML::Formatters::Pretty.new( indent ) f = REXML::Formatters::Pretty.new( indent )
f.write( self, rv = "" ) f.write( self, rv = "" )
else else

View File

@ -293,7 +293,7 @@ module REXML
# See REXML::Formatters # See REXML::Formatters
# #
def write( writer, indent=-1, transitive=false, ie_hack=false ) def write( writer, indent=-1, transitive=false, ie_hack=false )
Kernel.warn("#{self.class.name}.write is deprecated. See REXML::Formatters") Kernel.warn("#{self.class.name}.write is deprecated. See REXML::Formatters", uplevel: 1)
formatter = if indent > -1 formatter = if indent > -1
REXML::Formatters::Pretty.new( indent ) REXML::Formatters::Pretty.new( indent )
else else

View File

@ -596,11 +596,10 @@ EOC
def #{accessor_name}=(*args) def #{accessor_name}=(*args)
receiver = self.class.name receiver = self.class.name
warn("Warning:\#{caller.first.sub(/:in `.*'\z/, '')}: " \ warn("Don't use `\#{receiver}\##{accessor_name} = XXX'/" \
"Don't use `\#{receiver}\##{accessor_name} = XXX'/" \
"`\#{receiver}\#set_#{accessor_name}(XXX)'. " \ "`\#{receiver}\#set_#{accessor_name}(XXX)'. " \
"Those APIs are not sense of Ruby. " \ "Those APIs are not sense of Ruby. " \
"Use `\#{receiver}\##{plural_name} << XXX' instead of them.") "Use `\#{receiver}\##{plural_name} << XXX' instead of them.", uplevel: 1)
if args.size == 1 if args.size == 1
@#{accessor_name}.push(args[0]) @#{accessor_name}.push(args[0])
else else

View File

@ -124,7 +124,7 @@ class Tempfile < DelegateClass(File)
# If Tempfile.new cannot find a unique filename within a limited # If Tempfile.new cannot find a unique filename within a limited
# number of tries, then it will raise an exception. # number of tries, then it will raise an exception.
def initialize(basename="", tmpdir=nil, mode: 0, **options) def initialize(basename="", tmpdir=nil, mode: 0, **options)
warn "Tempfile.new doesn't call the given block." if block_given? warn "Tempfile.new doesn't call the given block.", uplevel: 1 if block_given?
@unlinked = false @unlinked = false
@mode = mode|File::RDWR|File::CREAT|File::EXCL @mode = mode|File::RDWR|File::CREAT|File::EXCL
@ -250,7 +250,7 @@ class Tempfile < DelegateClass(File)
def call(*args) def call(*args)
return if @pid != Process.pid return if @pid != Process.pid
warn "removing #{@tmpfile.path}..." if $DEBUG $stderr.puts "removing #{@tmpfile.path}..." if $DEBUG
@tmpfile.close @tmpfile.close
begin begin
@ -258,7 +258,7 @@ class Tempfile < DelegateClass(File)
rescue Errno::ENOENT rescue Errno::ENOENT
end end
warn "done" if $DEBUG $stderr.puts "done" if $DEBUG
end end
end end

View File

@ -118,7 +118,7 @@ module Timeout
end end
def timeout(*args, &block) def timeout(*args, &block)
warn "#{caller_locations(1, 1)[0]}: Object##{__method__} is deprecated, use Timeout.timeout instead." warn "Object##{__method__} is deprecated, use Timeout.timeout instead.", uplevel: 1
Timeout.timeout(*args, &block) Timeout.timeout(*args, &block)
end end

View File

@ -100,7 +100,7 @@ module URI
# # => "@%3F@%21" # # => "@%3F@%21"
# #
def escape(*arg) def escape(*arg)
warn "#{caller(1, 1)[0]}: warning: URI.escape is obsolete" if $VERBOSE warn "URI.escape is obsolete", uplevel: 1 if $VERBOSE
DEFAULT_PARSER.escape(*arg) DEFAULT_PARSER.escape(*arg)
end end
alias encode escape alias encode escape
@ -132,7 +132,7 @@ module URI
# # => "http://example.com/?a=\t\r" # # => "http://example.com/?a=\t\r"
# #
def unescape(*arg) def unescape(*arg)
warn "#{caller(1, 1)[0]}: warning: URI.unescape is obsolete" if $VERBOSE warn "URI.unescape is obsolete", uplevel: 1 if $VERBOSE
DEFAULT_PARSER.unescape(*arg) DEFAULT_PARSER.unescape(*arg)
end end
alias decode unescape alias decode unescape
@ -300,7 +300,7 @@ module URI
# # => ["http://foo.example.com/bla", "mailto:test@example.com"] # # => ["http://foo.example.com/bla", "mailto:test@example.com"]
# #
def self.extract(str, schemes = nil, &block) def self.extract(str, schemes = nil, &block)
warn "#{caller(1, 1)[0]}: warning: URI.extract is obsolete" if $VERBOSE warn "URI.extract is obsolete", uplevel: 1 if $VERBOSE
DEFAULT_PARSER.extract(str, schemes, &block) DEFAULT_PARSER.extract(str, schemes, &block)
end end
@ -336,7 +336,7 @@ module URI
# end # end
# #
def self.regexp(schemes = nil) def self.regexp(schemes = nil)
warn "#{caller(1, 1)[0]}: warning: URI.regexp is obsolete" if $VERBOSE warn "URI.regexp is obsolete", uplevel: 1 if $VERBOSE
DEFAULT_PARSER.make_regexp(schemes) DEFAULT_PARSER.make_regexp(schemes)
end end

View File

@ -1517,7 +1517,7 @@ module URI
elsif name == 'http_proxy' elsif name == 'http_proxy'
unless proxy_uri = env[name] unless proxy_uri = env[name]
if proxy_uri = env[name.upcase] if proxy_uri = env[name.upcase]
warn 'The environment variable HTTP_PROXY is discouraged. Use http_proxy.' warn 'The environment variable HTTP_PROXY is discouraged. Use http_proxy.', uplevel: 1
end end
end end
else else

View File

@ -103,7 +103,7 @@ module WEBrick
@shutdown_pipe = nil @shutdown_pipe = nil
unless @config[:DoNotListen] unless @config[:DoNotListen]
if @config[:Listen] if @config[:Listen]
warn(":Listen option is deprecated; use GenericServer#listen") warn(":Listen option is deprecated; use GenericServer#listen", uplevel: 1)
end end
listen(@config[:BindAddress], @config[:Port]) listen(@config[:BindAddress], @config[:Port])
if @config[:Port] == 0 if @config[:Port] == 0

View File

@ -37,7 +37,7 @@ module WEBrick
Process::Sys::setgid(pw.gid) Process::Sys::setgid(pw.gid)
Process::Sys::setuid(pw.uid) Process::Sys::setuid(pw.uid)
else else
warn("WEBrick::Utils::su doesn't work on this platform") warn("WEBrick::Utils::su doesn't work on this platform", uplevel: 1)
end end
end end
module_function :su module_function :su

View File

@ -5,9 +5,9 @@
begin begin
require 'psych' require 'psych'
rescue LoadError rescue LoadError
warn "#{caller[0]}:" warn "It seems your ruby installation is missing psych (for YAML output).\n" \
warn "It seems your ruby installation is missing psych (for YAML output)." "To eliminate this warning, please install libyaml and reinstall your ruby.\n",
warn "To eliminate this warning, please install libyaml and reinstall your ruby." uplevel: 1
raise raise
end end

View File

@ -1003,6 +1003,11 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status|
assert_equal(["\n"], capture_warning_warn {warn ""}) assert_equal(["\n"], capture_warning_warn {warn ""})
end end
def test_kernel_warn_uplevel
warning = capture_warning_warn {warn("test warning", uplevel: 0)}
assert_equal("#{__FILE__}:#{__LINE__-1}: warning: test warning\n", warning[0])
end
def test_warning_warn_invalid_argument def test_warning_warn_invalid_argument
assert_raise(TypeError) do assert_raise(TypeError) do
::Warning.warn nil ::Warning.warn nil