From: "byroot (Jean Boussier)" Date: 2022-09-19T08:32:29+00:00 Subject: [ruby-core:109956] [Ruby master Feature#10320] require into module Issue #10320 has been updated by byroot (Jean Boussier). @duerst / @shyouhei The main goal is to avoid accidental dependency. By not exposing some namespaces globally, you can force developers to have to declare what they depend on, which makes them realize they're about to depend on something they shouldn't. You can see https://github.com/Shopify/packwerk as prior art trying to enforce boundaries using static analysis. ---------------------------------------- Feature #10320: require into module https://bugs.ruby-lang.org/issues/10320#change-99207 * Author: sowieso (So Wieso) * Status: Open * Priority: Normal ---------------------------------------- When requiring a library, global namespace always gets polluted, at least with one module name. So when requiring a gem with many dependencies, at least one constant enters global namespace per dependency, which can easily get out of hand (especially when gems are not enclosed in a module). Would it be possible to extend require (and load, require_relative) to put all content into a custom module and not into global namespace? Syntax ideas: ~~~ruby require 'libfile', into: :Lib # keyword-argument require 'libfile' in Lib # with keyword, also defining a module Lib at current binding (unless defined? Lib) require_qualified 'libfile', :Lib ~~~ This would also make including code into libraries much easier, as it is well scoped. ~~~ruby module MyGem ����require 'needed' in Need ����def do_something ��������Need::important.process! ����end end # library user is never concerned over needed's content ~~~ Some problems to discuss: * requiring into two different modules means loading the file twice? * monkeypatching libraries should only affect the module ����� auto refinements? * maybe also allow a binding as argument, not only a module? * privately require, so that required constants and methods are not accessible from the outside of a module (seems to difficult) * what about $global constants, read them from global scope but copy-write them only to local scope? Similar issue: https://bugs.ruby-lang.org/issues/5643 -- https://bugs.ruby-lang.org/ Unsubscribe: