Issue #17156 has been reported by Dan0042 (Daniel DeLorme).

----------------------------------------
Feature #17156: Refinements per directory tree
https://bugs.ruby-lang.org/issues/17156

* Author: Dan0042 (Daniel DeLorme)
* Status: Open
* Priority: Normal
----------------------------------------
One of the main use-case for refinements is to enable extensions to core classes for a given codebase (app or gem) without impacting the other codebases. Let's call it sandboxed monkey-patching. Note that you usually want this for an entire codebase, not specific files.

But refinements can only be enabled on a per-module or per-file basis. So if you want refinements in your entire project, you need to add the "using" boilerplate to every single file. I find this too bothersome. I have some core extensions that I would love to convert into refinements, but adding a "using" statement to every file is too much of a pain; I find it not worth the trouble, especially considering that the risk of conflicts due to monkey-patching is very low to start with.

So I would like the ability to enable refinements for all the files in a project, that is, on a whole directory tree.

I'd like to keep it simple. So my idea is to have something like `using M, subdirs: true` that would be equivalent to `using M` at the top of every file loaded _after that point_ within the directory tree of the file with the `using` statement. So the typical case would be, for gem "foobar" which is loaded via `require "foobar"`, you'd put the `using` statement at the top of the gem's main `foobar.rb` file, and then every file loaded within the gem's directory would benefit from those refinements. Similarly, if you want to use certain refinements throughout your app, put them in a file in the root dir of the app and load it early in the initialization process.

Note: With this design I wanted to avoid the possibility that someone could apply refinements globally by writing `using M, subdirs: "/"`



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>