rom-rb / rom

Data mapping and persistence toolkit for Ruby
https://rom-rb.org
MIT License
2.07k stars 161 forks source link

Improve gateway setup #638

Closed solnic closed 3 years ago

solnic commented 3 years ago

This cleans up how gateways are configured and set up and clearly separates loading adapter files via require vs actually loading gateway objects.

The practical outcome is that gateways are now initialized with the actual config that was used to set them up. This makes it possible to easily access configuration from within a gateway and it also simplifies how gateway plugins can access their configurations. This will make it much simpler to implement default configurations, like default struct namespace etc.

> configuration = ROM::Configuration(:sql, "postgres://postgres@db/rom")

> configuration.config.gateways
#<ROM::Configurable::Config:0x00007ff930bbf1d0 @settings={:default=>#<ROM::Configurable::Config:0x00007ff930bbc390 @settings={:adapter=>:sql, :args=>["postgres://postgres@db/rom"], :name=>:default}>}>

> configuration.gateways.default.config
#<ROM::Configurable::Config:0x00007ff930bbc390 @settings={:adapter=>:sql, :args=>["postgres://postgres@db/rom"], :name=>:default}>

> configuration.gateways.default.name
:default

The configuration.config part is yuck so I'm inclined to rename it somehow later on. This and previous refactors also reminded me that plugins and notifications are still global which I completely forgot (that's why we have flaky specs now). I'll finally address this in another PR. This is super important because we need to have configs and plugins on a per-container basis, rather than global. One example of this is auto_restrictions which are now enabled globally, so if you connect to two databases, both setups will have the plugin enabled.