[#46930] [ruby-trunk - Bug #6825][Open] forking and pthread_cond_timedwait: Invalid argument (EINVAL) on OS X / 1.9.3-p194 — "xentronium (Mark A)" <markizko@...>

29 messages 2012/08/02

[#46974] [ruby-trunk - Bug #6830][Assigned] test failure test_constants(OpenSSL::TestConfig) [/ruby/test/openssl/test_config.rb:27] on Mac + homebrew — "kosaki (Motohiro KOSAKI)" <kosaki.motohiro@...>

17 messages 2012/08/04

[#46975] [ruby-trunk - Bug #6831][Assigned] test_getpwuid() on Mountain Lion — "kosaki (Motohiro KOSAKI)" <kosaki.motohiro@...>

12 messages 2012/08/04

[#46996] [ruby-trunk - Bug #6836][Assigned] Improve File.expand_path performance in Windows — "luislavena (Luis Lavena)" <luislavena@...>

15 messages 2012/08/04

[#47036] [ruby-trunk - Feature #6841][Open] Shorthand for Assigning Return Value of Method to Self — "wardrop (Tom Wardrop)" <tom@...>

18 messages 2012/08/07

[#47108] [ruby-trunk - Feature #6852][Open] [].transpose should behave specially — "boris_stitnicky (Boris Stitnicky)" <boris@...>

13 messages 2012/08/10

[#47138] [ruby-trunk - Bug #6861][Open] ERB::Util.escape_html is not escaping single quotes — "spastorino (Santiago Pastorino)" <santiago@...>

14 messages 2012/08/12

[#47163] [ruby-trunk - Bug #6865][Open] GC::Profiler.report might create a huge String and invoke a few GC cycles — "Eregon (Benoit Daloze)" <redmine@...>

9 messages 2012/08/13

[#47189] [ruby-trunk - Feature #6868][Open] Make `do` in block syntax optional when the block is the last argument of a method and is not an optional argument — "alexeymuranov (Alexey Muranov)" <redmine@...>

8 messages 2012/08/14

[#47243] [ruby-trunk - Feature #6895][Open] TracePoint API — "ko1 (Koichi Sasada)" <redmine@...>

27 messages 2012/08/20

[#47267] [ruby-trunk - Bug #6903][Open] [[Ruby 1.9:]] --enable-load-relative broken on systems with /lib64 — "mpapis (Michal Papis)" <mpapis@...>

11 messages 2012/08/22

[#47309] [ruby-trunk - Bug #6929][Open] Documentation for Ripper — "zzak (Zachary Scott)" <zachary@...>

16 messages 2012/08/25

[#47345] [ruby-trunk - Feature #6946][Open] FIPS support? — "vo.x (Vit Ondruch)" <v.ondruch@...>

35 messages 2012/08/28

[ruby-core:46904] Re: (Half-baked DRAFT) new `require' framework

From: Eric Hodel <[email protected]>
Date: 2012-08-01 00:38:48 UTC
List: ruby-core #46904
On Jul 31, 2012, at 14:02, Clifford Heath <[email protected]> =
wrote:
> My "polyglot" gem is already a very widely-used solution to this =
problem
> as well, with over 8 million downloads - the 11th most-downloaded gem.
> It's used by Treetop, which is pulled in by Cucumber and Rails' =
mailer.
> Far from being complicated and big, it's just 60 lines of Ruby. No C
> extension is needed.

RubyGems is even more widely used and downloaded than polyglot.  After =
my years of experience with altering ruby's ability to load features I =
can only conclude that the current API is highly inadequate.

Here's the entire API we have:

https://github.com/cjheath/polyglot/blob/1197a108/lib/polyglot.rb#L60

Sure, this works, but it's difficult to define a #require override that =
occurs at a specific point relative to other overrides.  Polyglot wants =
to defer to $LOAD_PATH and $LOADED_FEATURES and only invoke its custom =
loader after everyone else.  This is the easiest way to implement a =
require override, but it's also only one, narrow use case.

Unlike polyglot, RubyGems needs to decide whether to load from the =
existing $LOAD_PATH or to activate a gem.  Unlike polyglot, RubyGems =
needs to check $LOADED_FEATURES to decide whether to activate a gem or =
not.  The current API does not make this easy or simple to do.

There are also common pitfalls with the current API, and polyglot is a =
victim of one of the most common pitfall.

With polyglot, the behavior of a program may change depending upon =
whether files are missing or not.  Koichi's proposals can help eliminate =
this through a proper API.

Consider:

a.rb:
require 'b'

b.rb:
require 'missing'

$ ruby -d -I. -rpolyglot -ra -e0 2>&1 | grep Polyglot
Exception `Polyglot::PolyglotLoadError' at =
/Users/drbrain/tmp/gems/gems/polyglot-0.3.3/lib/polyglot.rb:53 - Failed =
to load missing using extensions rb
Exception `Polyglot::PolyglotLoadError' at =
/Users/drbrain/tmp/gems/gems/polyglot-0.3.3/lib/polyglot.rb:53 - Failed =
to load b using extensions rb
Exception `Polyglot::PolyglotLoadError' at =
/Users/drbrain/tmp/gems/gems/polyglot-0.3.3/lib/polyglot.rb:53 - Failed =
to load a using extensions rb

Why is polyglot trying to load features that were already loaded?

$ touch missing.rb
$ ruby -d -I. -rpolyglot -ra -e0 2>&1 | grep Polyglot
$

Why doesn't polyglot attempt to load b.rb or a.rb in this case?

One of these behaviors is wrong, likely the first.  Polyglot should =
check load_error on line 65 to see if it matches the feature the user =
was trying to require like RubyGems does:

=
https://github.com/rubygems/rubygems/blob/c1fd10db/lib/rubygems/custom_req=
uire.rb#L102-103

Polyglot is not the only require override that has fallen victim to this =
problem.  I hope a better API than an alias will eliminate the =
possibility.=

In This Thread