factory_bot icon indicating copy to clipboard operation
factory_bot copied to clipboard

singleton_method_added is being forwarded by FactoryBot::Evaluator

Open eregon opened this issue 3 years ago • 1 comments

Due to https://github.com/thoughtbot/factory_bot/blob/b223c275191985f776ff294825660fce98b3c0cc/lib/factory_bot/evaluator.rb#L10 methods like singleton_method_added (coming from BasicObject) are undefined.

And then https://github.com/thoughtbot/factory_bot/blob/b223c275191985f776ff294825660fce98b3c0cc/lib/factory_bot/evaluator.rb#L81 will actually call singleton_method_added, and since the method is not there, will end up in method_missing: https://github.com/thoughtbot/factory_bot/blob/b223c275191985f776ff294825660fce98b3c0cc/lib/factory_bot/evaluator.rb#L47-L51 which will forward it to SyntaxRunner.new.

singleton_method_added does nothing by default so that's probably why this was never noticed.

It's not necessarily a problem, but it also seems surprising.

Maybe FactoryBot::Evaluator should inherit from BasicObject, rather than undefine many methods, some of them which might have quite subtle effects like this?

I noticed this while investigating https://github.com/oracle/truffleruby/issues/2258.

eregon avatar Feb 13 '21 11:02 eregon

Thanks! Definitely worth exploring if we can inherit from BasicObject. I went down that path once with the DefinitionProxy (https://github.com/thoughtbot/factory_bot/pull/1144) and ended up turning back because it was going to break other things. Not sure what the situation is with the Evaluator.

composerinteralia avatar Feb 20 '21 02:02 composerinteralia