Project

General

Profile

Actions

Bug #256

closed

defined?(Gem::RubyGemsVersion) behaves strange

Added by znz (Kazuhiro NISHIYAMA) over 15 years ago. Updated almost 13 years ago.

Status:
Rejected
Assignee:
-
ruby -v:
Backport:
[ruby-core:17739]

Description

=begin
% ruby-trunk -ve 'p defined?(Gem::RubyGemsVersion)
p Gem::RubyGemsVersion
p defined?(Gem::RubyGemsVersion)'
ruby 1.9.0 (2008-07-11 revision 18024) [i686-linux]
nil
"1.2.0.1824"
"constant"
%
=end

Actions #1

Updated by ko1 (Koichi Sasada) over 15 years ago

  • Assignee set to drbrain (Eric Hodel)

=begin

=end

Actions #2

Updated by Anonymous over 15 years ago

=begin
ワナベと申します。

英語ができないので ruby-dev に引っ張ってきてしまいました。

2008/7/11 Kazuhiro NISHIYAMA :

Bug #256: defined?(Gem::RubyGemsVersion) behaves strange
(中略)
% ruby-trunk -ve 'p defined?(Gem::RubyGemsVersion)
p Gem::RubyGemsVersion
p defined?(Gem::RubyGemsVersion)'
ruby 1.9.0 (2008-07-11 revision 18024) [i686-linux]
nil
"1.2.0.1824"
"constant"

RubyGems は const_missing 等で遅延ロードされるようなので
defined? 実行時にロードされないのは正常だと思います。

チケットの例文でいえば、 defined? の代わりに実際に値を参照して
適宜 NameError を拾うといった感じの対応ではどうでしょうか。

あるいは defined? で const_missing が呼ばれない挙動自体を
変更するべきだという意見もあるかもしれません。
どちらにせよ RubyGems(及び gem_prelude) に罪はなさそうです。

--
ワナベ

=end

Actions #3

Updated by znz (Kazuhiro NISHIYAMA) over 15 years ago

=begin
西山和広です。

At Mon, 14 Jul 2008 23:14:42 +0900,
wanabe wrote:

RubyGems は const_missing 等で遅延ロードされるようなので
defined? 実行時にロードされないのは正常だと思います。

チケットの例文でいえば、 defined? の代わりに実際に値を参照して
適宜 NameError を拾うといった感じの対応ではどうでしょうか。

あるいは defined? で const_missing が呼ばれない挙動自体を
変更するべきだという意見もあるかもしれません。
どちらにせよ RubyGems(及び gem_prelude) に罪はなさそうです。

#256には書き忘れてしまったのですが、require 'rubygems'しても
同じなので、rubygemsの方が悪いのではないかと思います。

% ruby-trunk -v -rubygems -e 'p defined?(Gem::RubyGemsVersion)
p Gem::RubyGemsVersion
p defined?(Gem::RubyGemsVersion)'
ruby 1.9.0 (2008-07-11 revision 18024) [i686-linux]
nil
"1.2.0.1824"
"constant"
% ruby18 -v -rubygems -e 'p defined?(Gem::RubyGemsVersion)
p Gem::RubyGemsVersion
p defined?(Gem::RubyGemsVersion)'
ruby 1.8.7 (2008-07-09 revision 0) [i686-linux]
"constant"
"1.2.0"
"constant"
%

問題が起きたのはrailsのconfig/boot.rbで

% cd /tmp
% rails hoge
(略)
% cd hoge
% ruby-trunk -vd script/about
ruby 1.9.0 (2008-07-14 revision 18060) [i686-linux]
Exception NoMethodError' at /tmp/hoge/config/boot.rb:86 - undefined method >=' for nil:NilClass
Exception NoMethodError' at script/about:2 - undefined method >=' for nil:NilClass
/tmp/hoge/config/boot.rb:86:in load_rubygems': undefined method >=' for nil:NilClass (NoMethodError)
from /tmp/hoge/config/boot.rb:52:in load_initializer' from /tmp/hoge/config/boot.rb:38:in run'
from /tmp/hoge/config/boot.rb:11:in boot!' from /tmp/hoge/config/boot.rb:109:in <top (required)>'
from script/about:2:in require' from script/about:2:in '
%

のようになります。

load_rubygemsとrubygems_versionは以下のようになっていて、
require 'rubygems'しているのにもかかわらずlib/rubygems.rbの
require 'rubygems/rubygems_version'が実行されず、
Gem::RubyGemsVersionが定義されていないというのが原因です。

   def rubygems_version
     Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
   end

   def load_rubygems
     require 'rubygems'

     unless rubygems_version >= '0.9.4'
       $stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_v

ersion}). Please gem update --system and try again.)
exit 1
end

--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)

=end

Actions #4

Updated by Anonymous over 15 years ago

=begin
斎藤と申します。

On Mon, 14 Jul 2008 23:31:13 +0900
Kazuhiro NISHIYAMA wrote:

#256には書き忘れてしまったのですが、require 'rubygems'しても
同じなので、rubygemsの方が悪いのではないかと思います。

どこが悪いのでしょうか。

defined? の後ろの式は、評価されません。

$ ruby1.8 -e 'p super'
-e:1: super called outside of method (NoMethodError)
$ ruby1.8 -e 'p defined? super'
nil

2度目の実行で、例外は上がっていません。

このように、初めて評価されてから定義(ロード)されるのが

On Mon, 14 Jul 2008 23:14:42 +0900
wanabe wrote:

RubyGems は const_missing 等で遅延ロードされるようなので

ということではないでしょうか。

--
斎藤ただし

=end

Actions #5

Updated by Anonymous over 15 years ago

=begin
ワナベです。

2008/07/15 0:14 Tadashi Saito :

On Mon, 14 Jul 2008 23:31:13 +0900
Kazuhiro NISHIYAMA wrote:

#256には書き忘れてしまったのですが、require 'rubygems'しても
同じなので、rubygemsの方が悪いのではないかと思います。

どこが悪いのでしょうか。

明示的にロードし終えているのに定数が定義されていないということですと
私もそれはおかしいように思います。少なくとも戸惑います。
gem_prelude で $" に rubygems.rb を追加しているせいでしょうか。
なぜこうなっているんでしょう?

結局、 require 'rubygems' された時には即座にロードし
そうでないなら遅延ロード、というのが適切だろうと思い直しました。
そうするとやはり gem_prelude にも問題があると言えるかもしれません。

--
ワナベ

=end

Actions #6

Updated by znz (Kazuhiro NISHIYAMA) over 15 years ago

=begin
西山和広です。

At Tue, 15 Jul 2008 00:14:50 +0900,
Tadashi Saito wrote:

#256には書き忘れてしまったのですが、require 'rubygems'しても
同じなので、rubygemsの方が悪いのではないかと思います。

どこが悪いのでしょうか。

require 'rubygems'してもrubygems.rbが読み込まれないところです。

--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)

=end

Actions #7

Updated by Anonymous over 15 years ago

=begin
斎藤です。

On Tue, 15 Jul 2008 00:35:41 +0900
Kazuhiro NISHIYAMA wrote:

require 'rubygems'してもrubygems.rbが読み込まれないところです。

なるほど、問題を読み違えていたようです。

On Tue, 15 Jul 2008 00:34:45 +0900
wanabe wrote:

結局、 require 'rubygems' された時には即座にロードし
そうでないなら遅延ロード、というのが適切だろうと思い直しました。
そうするとやはり gem_prelude にも問題があると言えるかもしれません。

自分には適切なタイミングは分かり兼ねるので、どなたかこちらに
フォローいただけるとありがたいです。

--
斎藤ただし

=end

Actions #8

Updated by yugui (Yuki Sonoda) over 15 years ago

  • Category set to core
  • Assignee deleted (drbrain (Eric Hodel))
  • Target version set to 1.9.1 Release Candidate

=begin

=end

Actions #9

Updated by matz (Yukihiro Matsumoto) over 15 years ago

  • Status changed from Open to Rejected

=begin
As far as I understand, this issue is three fold:

(a) defined?(Const) does not call const_missing
(b) require 'rubygems' does not load 'rubygems'
(c) require 'rubygems' does not provide Gem::RubyGemsVersion

We reject (a). I think (b) is a spec. If (c) makes Rails to run correctly, re-submit a new issue.

=end

Actions #10

Updated by bitsweat (Jeremy Daer) over 15 years ago

=begin
Rails changed its code for compatibility with the new behavior.
=end

Actions #11

Updated by rogerdpack (Roger Pack) over 15 years ago

=begin
That should be fine. Perhaps document it somewhere? [if someone else disagrees feel free to mention it].
-=R
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0