Kev Jackson
3/30/2006 8:46:00 AM
>
> There is binding_of_caller which might or might not help you -
> depending on what you want to do.
>
I'll look into it thanks
> Another option is to use set_trace_func to set up something that keeps
> track of method invocations.
>
>> No biggy, just interested if anyone else has ever wanted/needed to
>> get this info in a running program, and what they did to do it
>
>
> Certainly, from time to time. What do *you* need it for?
I currently have a yaml file
pg_401:
corp_nm_kn: 'JP text...' <= corprate name (kana)
etc
and a ruby script that uses watir to execute a set of web app page
transitions whilst filling in the data read from the yaml file.
in standard watir
ie.text_field(:id, 'some id value for text field').set(v)
as I'm reading the data from a yaml file I get a hash of hashes (ok I
could get an object or anything else, but at the moment I get back a
hash of hashes)
so my calls to watir look like
ie.text_field(:id,
test_data['pg_401']['corp_name_field']).set(test_data['pg_401']['corp_name']
I've managed to reduce this to
text :id, :pg_401, :corp_name which is expanded to the correct call
using method_missing, I'd like to reduce this further to
text :corp_name
I can remove the :pg_401 by knowing the currently executing method, I
can remove the :id by simply trying all options :id, :name, :matches (I
think) and rescuing the Exception raised.
Ultimately, I'd rather have all these field_type, :field_name pairs
defined in yaml and then create a script on the fly and execute it. At
the moment, the qc team will have to edit two files (data in yaml
format, and script in ruby).
Why would I want to reduce the amount of text typed by the qc team (who
will be writing these scripts)?:
1 - because it's possible to reduce the workload
2 - because some of the screens (pg_XXX) have more than 400 fields that
must be entered (not my fault, I had no hand in designing the UI, for
that you can blaim HP japan)
3 - because I'm starting to get why people think that DSLs and lisp
macros are a good thing (I think I reached the tipping point of
understanding, when I saw loads of my first calls to the watir library
and thought, "That's irritatingly repetitive, surely the computer can do
that kind of work for me").
Currently I have
caller[0][/in: `.+(pg_\d{3})/,1]
which adequately returns the current method (given the current
convention of naming the methods something with the page number in them)
I tried
class Object
def current_method
caller[0][/in: `.+(pg_\d{3})/,1]
end
end
but calls to this inside a method_missing method produce nil - not sure
why, but obviously I need to study more ruby to understand why that
doesn't work. Including current_method (as defined above) in module
Kernel also doesn't do the trick, but having the caller[0][/in:
`.+(pg_\d{3})/,1] inside the method_missing method works.
Thanks for pointing me in the direction of a couple of new things
Kev