Bug #256

defined?(Gem::RubyGemsVersion) behaves strange

Added by znz (Kazuhiro NISHIYAMA) almost 4 years ago. Updated about 1 year ago.

[ruby-core:17739]
Status:Rejected Start date:07/11/2008
Priority:Normal Due date:
Assignee:- % Done:

0%

Category:core
Target version:1.9.1 Release Candidate
ruby -v:

Description

% 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"
%

History

Updated by ko1 (Koichi Sasada) almost 4 years ago

  • Assignee set to drbrain (Eric Hodel)

Updated by Anonymous almost 4 years ago

ワナベと申します。
# 英語ができないので ruby-dev に引っ張ってきてしまいました。

2008/7/11 Kazuhiro NISHIYAMA <redmine@ruby-lang.org>:
> 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) に罪はなさそうです。

-- 
ワナベ

Updated by znz (Kazuhiro NISHIYAMA) almost 4 years ago

西山和広です。

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 `<main>'
%

のようになります。

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)

Updated by Anonymous almost 4 years ago

斎藤と申します。

On Mon, 14 Jul 2008 23:31:13 +0900
Kazuhiro NISHIYAMA <zn@mbf.nifty.com> 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 <s.wanabe@gmail.com> wrote:

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

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

--
斎藤ただし

Updated by Anonymous almost 4 years ago

ワナベです。

2008/07/15 0:14 Tadashi Saito <shiba@mail2.accsnet.ne.jp>:
> On Mon, 14 Jul 2008 23:31:13 +0900
> Kazuhiro NISHIYAMA <zn@mbf.nifty.com> wrote:
>
>> #256には書き忘れてしまったのですが、require 'rubygems'しても
>> 同じなので、rubygemsの方が悪いのではないかと思います。
>
> どこが悪いのでしょうか。

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

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

-- 
ワナベ

Updated by znz (Kazuhiro NISHIYAMA) almost 4 years ago

西山和広です。

At Tue, 15 Jul 2008 00:14:50 +0900,
Tadashi Saito wrote:
> 
> > #256には書き忘れてしまったのですが、require 'rubygems'しても
> > 同じなので、rubygemsの方が悪いのではないかと思います。
> 
> どこが悪いのでしょうか。

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


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

Updated by Anonymous almost 4 years ago

斎藤です。

On Tue, 15 Jul 2008 00:35:41 +0900
Kazuhiro NISHIYAMA <zn@mbf.nifty.com> wrote:

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

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

On Tue, 15 Jul 2008 00:34:45 +0900
wanabe <s.wanabe@gmail.com> wrote:

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

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

--
斎藤ただし

Updated by yugui (Yuki Sonoda) over 3 years ago

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

Updated by matz (Yukihiro Matsumoto) over 3 years ago

  • Status changed from Open to Rejected
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.

Updated by bitsweat (Jeremy Kemper) over 3 years ago

Rails changed its code for compatibility with the new behavior.

Updated by rogerdpack (Roger Pack) over 3 years ago

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

Also available in: Atom PDF