Comment by IshKebab
> load all the code into a running Ruby REPL
That counts as running it if you ask me. And I don't see how just loading the code would help you find the callers of a function?
> Anywhere from half to 1/10th of the size of codebases in statically typed languages is my experience, including with direct translations.
That sounds highly implausible.
> That counts as running it if you ask me. And I don't see how just loading the code would help you find the callers of a function?
Loading it lets you introspect the code for calls. It's not necessarily always trivial to know what the type of the target object will be unless you're prepared to execute candidate methods, but it's rare for this to be an actual issue in practice. The more typical way of doing this would be to call piece of the code but without the elaborate setup you argue you'd need.
You can also use Ripper or Parser to analyse the code if you insist on not loading the code, but you're then making things harder for yourself for no good reason.
And that's really what it boils down to: If you insist on doing things the way you would for a static language, then yes, you will have a bad time.
That's a you issue, not a tooling issue.
> That sounds highly implausible.
It's nevertheless true. I've translated multiple projects feature for feature from C, C++ and other languages to Ruby over the years. It's only implausible to people inexperienced with Ruby.