From: "mame (Yusuke Endoh)" Date: 2022-09-21T17:08:08+00:00 Subject: [ruby-core:109981] [Ruby master Feature#10320] require into module Issue #10320 has been updated by mame (Yusuke Endoh). byroot (Jean Boussier) wrote in #note-27: > No, we have absolutely no intention to go with microservices, quite the opposite. The goal is to modularize in process so that you can more easily enforce that certain areas are decoupled from others without having to deal with the headaches of network calls. Thank you for the explanation. So "in-process microservices" is the final goal. The concept is easy for me to understand. TBH, I am not sure if it is practically very useful (maybe because I don't have monolith experience. I am not against the proposal). We will discuss this topic tomorrow at the dev meeting. If @matz is positive about the idea, it would be good to have a separate ticket with a clear explanation of the motivation and all the core features needed to implement Im reasonably, i.e., without using fragile hacks like const_missing. shioyama (Chris Salzberg) wrote in #note-28: > To be clear, my goal is that Ruby would implement the parts of this problem which are not implementable in gem code, and lets a gem like Im do the rest (similar to Zeitwerk's relationship to `autoload`). (This is a side note.) I think this is an approach, not a goal. And TBH, I don't think this is the best approach. In my opinion, ideally, language extension-like features such as Zeitwerk and ActiveSupport::Concern should be provided in the core. We are in this situation because Ruby is so flexible to allow such language extensions to be implemented outside, and maybe because it is more lightweight to design and improve a external gem than a core feature, but it's a little disconcerting to say this as if it were an ideal situation. ---------------------------------------- Feature #10320: require into module https://bugs.ruby-lang.org/issues/10320#change-99229 * 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: