[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Getting argument names and default values: doable (if hackish

Mauricio Fernández

9/11/2006 6:10:00 PM

I've written some code to get the argument names and their default values (if
any) as methods are defined; it can be found at
http://eige.../hiki.rb?method+arguments+via+int...

It uses some tricky introspection to do it at runtime. That is, it does *not*
operate like e.g. rdoc, by parsing the source code. Instead, it actually
#require()s the code, so it will not be confused by your meta-programming,
normally.

I've made a simple script that uses that to list the public methods that will
be defined when you require a given .rb file. Its output looks like this:

$ method_args benchmark
Benchmark#benchmark (caption = "", label_width = nil, fmtstr = nil, *labels)
Benchmark#bm (label_width = 0, *labels)
Benchmark#bmbm (width = 0)
Benchmark#measure (label = "")
Benchmark#realtime ()
[...]

$ method_args rational
Rational.reduce (num, den = 1)
Rational.new! (num, den = 1)
Rational#initialize (num, den)
Rational#+ (a)
[...]

$ method_args parsedate
[...]
Date#strftime (fmt = "%F")
Date#asctime ()
Date#ctime ()
DateTime._strptime (str, fmt = "%FT%T%Z")
DateTime#strftime (fmt = "%FT%T%Z")
ParseDate#parsedate (str, comp = false)
[...]


Something to play with.

--
Mauricio Fernandez - http://eige... - singular Ruby

4 Answers

Ezra Zygmuntowicz

9/11/2006 9:53:00 PM

0


On Sep 11, 2006, at 11:10 AM, Mauricio Fernandez wrote:

> I've written some code to get the argument names and their default
> values (if
> any) as methods are defined; it can be found at
> http://eigenclass.org/hiki.rb?method+arguments+via+int...
>
> It uses some tricky introspection to do it at runtime. That is, it
> does *not*
> operate like e.g. rdoc, by parsing the source code. Instead, it
> actually
> #require()s the code, so it will not be confused by your meta-
> programming,
> normally.
>
> I've made a simple script that uses that to list the public methods
> that will
> be defined when you require a given .rb file. Its output looks like
> this:
>
> $ method_args benchmark
> Benchmark#benchmark (caption = "", label_width = nil, fmtstr = nil,
> *labels)
> Benchmark#bm (label_width = 0, *labels)
> Benchmark#bmbm (width = 0)
> Benchmark#measure (label = "")
> Benchmark#realtime ()
> [...]

Hey Mauricio-

This is super cool stuff. I'm playing with it now using the version
from your site with the patch applied and it spits out all the method
names but just puts ... instead of the arguments. It does this for
anything i give it from the stdlib or my own code.


ez engine_yard $ method_args.rb benchmark
#<TypeError: allocator undefined for Binding>
Benchmark#benchmark (...)
Benchmark#bm (...)
Benchmark#bmbm (...)
Benchmark#measure (...)
Benchmark#realtime (...)
Benchmark::Job#initialize (...)
Benchmark::Job#item (...)
Benchmark::Job#report (...)

I'm on OSX Tiger latest with my own compiled ruby1.8.4. Does this
require 1.8.5 or am I doing something stupid?

Cheers-
-Ezra


Mauricio Fernández

9/11/2006 10:43:00 PM

0

On Tue, Sep 12, 2006 at 06:53:26AM +0900, Ezra Zygmuntowicz wrote:
> This is super cool stuff. I'm playing with it now using the version
> from your site with the patch applied and it spits out all the method
> names but just puts ... instead of the arguments. It does this for
> anything i give it from the stdlib or my own code.
>
> ez engine_yard $ method_args.rb benchmark
> #<TypeError: allocator undefined for Binding>
> Benchmark#benchmark (...)
> Benchmark#bm (...)
[...]
>
> I'm on OSX Tiger latest with my own compiled ruby1.8.4. Does this
> require 1.8.5 or am I doing something stupid?

The semantics of set_trace_func have changed somewhat in 1.8.5 [1], so it
actually requires 1.8.5. I'll try to 'backport' it to 1.8.4 tomorrow.

method_args will also print (...) for methods defined in C extensions, but
I'll probably change this to at least show the arity.

[1] it was actually a bug fix; IIRC the binding passed to the trace_func for a
(c-)return event was the caller's instead of that of the method returned from.
This is what broke Binding.of_caller/ruby-breakpoint/Rails' breakpointer.
call_stack 0.1.0, which I released last week, can overcome that.

--
Mauricio Fernandez - http://eige... - singular Ruby

Mauricio Fernández

9/11/2006 11:07:00 PM

0

On Tue, Sep 12, 2006 at 06:53:26AM +0900, Ezra Zygmuntowicz wrote:
>
> ez engine_yard $ method_args.rb benchmark
> #<TypeError: allocator undefined for Binding>
> Benchmark#benchmark (...)
> Benchmark#bm (...)
[...]
> I'm on OSX Tiger latest with my own compiled ruby1.8.4. Does this
> require 1.8.5 or am I doing something stupid?

Alright, it took only 1 line to make it work on both 1.8.5 and previous
versions:

$ ruby183 -v method_args-pre185.rb benchmark
ruby 1.8.3 (2005-09-21) [i686-linux]
Benchmark#benchmark (caption = "", label_width = nil, fmtstr = nil, *labels)
Benchmark#bm (label_width = 0, *labels)
Benchmark#bmbm (width = 0)
Benchmark#measure (label = "")
[...]

I've updated the code on eigenclass.org; could you give it a try?
(btw. no need to apply the patch in the comments, I had already done so)

--
Mauricio Fernandez - http://eige... - singular Ruby

Ezra Zygmuntowicz

9/12/2006 4:26:00 AM

0


On Sep 11, 2006, at 4:07 PM, Mauricio Fernandez wrote:

> On Tue, Sep 12, 2006 at 06:53:26AM +0900, Ezra Zygmuntowicz wrote:
>>
>> ez engine_yard $ method_args.rb benchmark
>> #<TypeError: allocator undefined for Binding>
>> Benchmark#benchmark (...)
>> Benchmark#bm (...)
> [...]
>> I'm on OSX Tiger latest with my own compiled ruby1.8.4. Does this
>> require 1.8.5 or am I doing something stupid?
>
> Alright, it took only 1 line to make it work on both 1.8.5 and
> previous
> versions:
>
> $ ruby183 -v method_args-pre185.rb benchmark
> ruby 1.8.3 (2005-09-21) [i686-linux]
> Benchmark#benchmark (caption = "", label_width = nil, fmtstr = nil,
> *labels)
> Benchmark#bm (label_width = 0, *labels)
> Benchmark#bmbm (width = 0)
> Benchmark#measure (label = "")
> [...]
>
> I've updated the code on eigenclass.org; could you give it a try?
> (btw. no need to apply the patch in the comments, I had already
> done so)
>
> --
> Mauricio Fernandez - http://eige... - singular Ruby
>


Sweet! It works great now. Thanks Mauricio.

ez romper_room # ruby -v
ruby 1.8.4 (2005-12-24) [i686-darwin8.5.1]
ez romper_room # method_args.rb benchmark
#<TypeError: allocator undefined for Binding>
Benchmark#benchmark (caption = "", label_width = nil, fmtstr = nil,
*labels)
Benchmark#bm (label_width = 0, *labels)
Benchmark#bmbm (width = 0)
Benchmark#measure (label = "")
Benchmark#realtime ()
Benchmark::Job#initialize (width)
Benchmark::Job#item (label = "")
Benchmark::Job#report (label = "")


Cheers-
-Ezra