6.0.0.alpha1 2022-04-15

This is a major release but it's backward compatible. Please see the upgrade guide as there are a couple of extra steps required for the upgrade.


  • New settings API for components using dry-configurable (via #651) (@solnic)
  • ROM(...) shortcut method for setting up rom, ie ROM(:sql, "sqlite::memory") (@solnic)
  • You can now configure a custom inflector via configuration (PR #591) (@flash-gordon)
  • New component API that replaces internal implementation of the finalization code and makes it possible to extend ROM with arbitrary component types (see #637) (@solnic)
  • Generic Component API which allows you to turn any class or object into a DSL that can define rom components (via #650) (@solnic)
  • Support for defining abstract components via config.component.abstract in which case they won't be initialized for runtime usage (via #651) (@solnic)
  • Ability to provide top-level component configuration ie default gateway, adapter, inflector etc. (via #653) (@solnic)
  • Ability to configure gateways using configuration DSL (via #653) (@solnic)
  • Ability to define schemas without relations (via #653) (@solnic)
  • Relation view schemas that are defined via Relation.view DSL are now registered too, which makes them more accessible/reusable (via #653) (@solnic)
  • Global configuration that can provide default settings for all your components. ie a default adapter, gateway etc. (via #654) (@solnic)
  • Support for custom namespaces under which commands and mappers can be registered (via #654) (@solnic)
  • Top-level associations DSL (via #656) (@solnic)
  • Support for configuring plugins on a per-component instance basis, which means that implementing plugins is now simpler and more powerful (via #656) (@solnic)
  • New relation setting: component.infer_id_from_class (via #661) (@solnic)
  • [experimental] New ROM.components API for registering custom component types (via #654) (@solnic)
  • .transaction methods now accept keyword arguments. Repository#transaction accepts gateway to use. Repository::Root#transaction uses a gateway of the root relation by default (#620 closed by #621) (@flash-gordon)
  • Backward-compatibility extension that you can load via require "rom/compat" (via #634 refs #607) (@solnic)


  • Setup works under MRI 3.0.0 (issue #622 fixed via #623) (@v-kolesnikov)


  • [BREAKING] rom-core, rom-changeset and rom-repository have been merged into rom gem (@solnic)
  • [BREAKING] Setup#auto_registration was renamed to Setup#auto_register. You can restore the original method via rom/compat extension (via #634 refs #607) (@solnic)
  • [BREAKING] Configuration#method_missing no longer resolves gateways by default. This functionality was moved to rom/compat (@solnic)
  • [BREAKING] ROM::Configuration is deprecated and it was replaced by ROM::Setup. It can be restored via rom/compat (via #653) (@solnic)
  • ROM.container is deprecated and it was replaced by ROM.runtime (via #653) (@solnic)
  • Schema#[] and Relation#[] now raise an error if a given attribute is not unique (issue #529 fixed via #543) (@waiting-for-dev)
  • Configuration values are no longer being frozen during setup process (issue #616 fixed via #617) (@v-kolesnikov)
  • Custom commands are now lazily-resolved at runtime, which simplifies and speeds up setup and finalization (via #641) (@solnic)
  • Mappers are now lazy-resolved at runtime which speeds up setup and finalization (via #642) (@solnic)
  • Schemas are now 1st class components accessible via runtime container and decoupled from relations (via #644) (@solnic)
  • Relation.dataset receives canonical schema object now, rather than relation class (via #644) (@solnic)
  • Relation classes no holder hold their schemas as class variables (via #644) (@solnic)
  • Gateways are now lazy-loadable (via #645) (@solnic)
  • Associations are now decoupled from schemas and lazy-loaded (via #646) (@solnic)
  • Plugin API is now internally simplified which resulted in faster runtime. It's also no longer required to register plugin types upfront (via #648) (@solnic)
  • Configuring auto_register stores its config under config.auto_register (via #650) (@solnic)
  • [internal] auto registration is now powered by Zeitwerk (via #634 refs #607) (@solnic)
  • Plugin event listeners are no longer global which makes it possible to have plugin with different configs in a single process (via #639) (@solnic)
  • [internal] Command compiler is no longer coupled to gateway and notifications (via #640) (@solnic)
  • Plugin configurations are no longer global which means that you can configure the same plugin with different default settings for different component groups or different runtimes in the same Ruby process (via #654) (@solnic)
  • Schema::DSL is now deprecated. Adapters that need customized schema DSL behavior can provide plugins instead (via #656) (@solnic)
  • ROM.plugins returns global plugin registry when called without a block (via #660) (@solnic)
  • [internal] ROM::Container is deprecated and it was replaced by ROM::Registries::Root. It can be restored via rom/compat (via #653) (@solnic)
  • [internal] Commands that are compiled at runtime are now cached in the runtime registry (via #653) (@solnic)
  • [internal] ROM.plugin_registry is deprecated, use ROM.plugins instead (via #660) (@solnic)
  • [REVISIT] configuring custom gateway for a relation via DSL requires passing it as an option rather than specifying it within the block. It kinda-worked previously because the adapter was defaulting to the first one found. I'm quite sure this was more like a bug than a feature. This behavior could be restored in rom/compat though - it's a matter of defaulting to the first adapter found when gateway was not explicitly specified, meaning the new default should be set to Undefined rather than :default so that we can detect when it was not specified and act accordingly. This will only make sense when there's just one adapter available (via bedb330f0ec195d9acacf4481dad3a705e8a36af) (@solnic)

Compare v5.2.4...v6.0.0.alpha1

5.2.4 2020-05-08


  • [rom] Bumped rom-changeset version (@flash-gordon)

Compare v5.2.3...v5.2.4

5.2.3 2020-05-07


  • [rom-core] Constructor types were fired twice when updating data (@flash-gordon)
  • [rom-changeset] fixed a regression where a map function in Update changesets was not evaluated in the context of a changeset object (fixed via #592) (@timriley + @solnic)

Compare v5.2.2...v5.2.3

5.2.2 2020-02-03


  • [rom-repository] Repository#transaction accepts transaction options now (@ianks)


  • [rom-core] Constructor types were fired twice when writing data (@flash-gordon)

Compare v5.2.1...v5.2.2

5.2.1 2020-01-11

This release contains keyword fixes reported by Ruby 2.7.

Compare v5.2.0...v5.2.1

5.2.0 2020-01-11

Yanked and republished as 5.2.1

Compare v5.1.2...v5.2.0

5.1.2 2019-08-17


  • [rom-core] Filtering out duplicated combine nodes works correctly with aliased nodes (@solnic)
  • [rom-core] Filtering out duplicated combine nodes should no longer cause performance issues (@solnic)
  • [rom-core] Relation names are properly equalized now (@solnic)
  • [rom-core] Inferring class name for auto-structs works correctly with :statuses and :aliases relation names (@solnic)


  • [rom] Dependency on rom-core was bumped to >= 5.1.2 (@solnic)
  • [rom-changeset] Dependency on rom-core was bumped to >= 5.1.2 (@solnic)
  • [rom-repository] Dependency on rom-core was bumped to >= 5.1.2 (@solnic)

Compare v5.1.1...v5.1.2

5.1.1 2019-08-06


  • [rom-core] Loading the gem no longer crashes in the absence of rom gem (issue #560) (@solnic)
  • [rom] Dependency on rom-core was bumped to >= 5.1.1 (@solnic)
  • [rom-changeset] Dependency on rom-core was bumped to >= 5.1.1 (@solnic)
  • [rom-repository] Dependency on rom-core was bumped to >= 5.1.1 (@solnic)

Compare v5.1.0...v5.1.1

5.1.0 2019-07-30


  • [rom-core] ROM::Transformer.map shortcut for defining transformations (@solnic)
  • [rom-core] ROM::Transformer supports instance methods as mapping functions now (@solnic)
  • [rom-core] ROM::Transformer configuration can be now inlined ie relation :users, as: :json_serializer (@solnic)
  • [rom-changeset] Plugin API :tada: (@solnic)
  • [rom-changeset] Support for command_options in changesets for providing any additional command options (@solnic)
  • [rom-changeset] Support for command_plugins in changesets for enabling command plugins and configuring them (@solnic)
  • [rom-repository] Plugin API :tada: (@flash-gordon)


  • [rom-core] Combining same relation multiple times no longer crashes auto-mapping (fixes #547) (@solnic)
  • [rom-core] ROM::Transformer works correctly with inheritance (@solnic)
  • [rom-core] CommandCompiler supports command options correctly now (@solnic)


  • [rom-core] Plugin API has been generalized to enable arbitrary component plugins (@flash-gordon)

Compare v5.0.2...v5.1.0

5.0.2 2019-05-01


  • [rom-core] Forwarding to root in Relation::Combined behaves as expected when another combined relation was returned from the root (issue #525) (solnic)
  • [rom-core] Specifying attribute options as the third argument in attribute DSL works again (issue #540) (solnic)


  • [rom] Dependency on rom-core was bumped to ~> 5.0, >= 5.0.2 (solnic)
  • [rom] Dependency on rom-changeset was bumped to ~> 5.0, >= 5.0.1 (solnic)
  • [rom-changeset] Relation::Combined#changeset will raise a meaningful NotImplementedError now (solnic)
  • [rom-changeset] Passing an array to Changeset#associate will raise a meaningful NotImplementedError now (solnic)

Compare v5.0.1...v5.0.2

5.0.1 2019-04-24


  • [rom-core] Missing dependency on transproc was added (solnic)


  • [rom] Dependency on rom-core was bumped to ~> 5.0, >= 5.0.1 (solnic)

Compare v5.0.0...v5.0.1

5.0.0 2019-04-24


  • rom-core bumped to 5.0.0 (solnic)
  • rom-changeset bumped to 5.0.0 (solnic)
  • rom-repository bumped to 5.0.0 (solnic)
  • rom-mapper was moved to core under rom/mapper so it's no longer a runtime dependency (solnic)
  • [rom-core] [BREAKING] Types::Int is now Types::Integer (flash-gordon)
  • [rom-core] [BREAKING] Attribute aliases are no longer stored in attribute's type meta (waiting-for-dev)
  • [rom-core] Updated to work with dry-types 1.0.0 (flash-gordon)
  • [rom-core] Updated to work with dry-struct 1.0.0 (flash-gordon)
  • [rom-core] Updated to work with dry-initializer 3.0.0 (solnic)
  • [rom-repository] [BREAKING] Support for ruby <= 2.4 was dropped (flash-gordon)
  • [rom-repository] [BREAKING] Repository::Root#aggregate was removed in favor of Relation#combine (v-kolesnikov)

Compare v4.2.1...v5.0.0

4.2.1 2018-05-03


  • rom-core updated to ['~> 4.2', '>= 4.2.1']

Compare v4.2.0...v4.2.1

4.2.0 2018-03-29


  • [rom] rom-core updated to ['~> 4.2', '>= 4.2.0']
  • [rom] rom-changeset updated to ['~> 1.0', '>= 1.0.2']

Compare v4.1.3...v4.2.0

4.1.3 2018-02-03


  • [rom] rom-core updated to ['~> 4.1', '>= 4.1.3']

Compare v4.1.2...v4.1.3

4.1.2 2018-01-15


  • [rom] rom-core updated to ['~> 4.1', '>= 4.1.1']

Compare v4.1.1...v4.1.2

4.1.1 2017-12-01


  • [rom] rom-repository updated to ['~> 2.0', '>= 2.0.2']

Compare v4.1.0...v4.1.1

4.1.0 2017-11-17


  • [rom] rom-core updated to ['~> 4.1']
  • [rom] rom-mapper updated to '~> 1.1'

Compare v4.0.3...v4.1.0

4.0.3 2017-11-14


  • [rom] rom-core updated to ['~> 4.0', '>= 4.0.3']

Compare v4.0.2...v4.0.3

4.0.2 2017-11-02


  • [rom] rom-core updated to ['~> 4.0', '>= 4.0.2']
  • [rom] rom-mapper updated to ['~> 1.0', '>= 1.0.2']
  • [rom] rom-changeset updated to ['~> 1.0', '>= 1.0.1']
  • [rom] rom-repository updated to ['~> 2.0', '>= 2.0.1']

Compare v4.0.1...v4.0.2

4.0.1 2017-10-22


  • [rom] rom-core updated to ['~> 4.0', '>= 4.0.1']
  • [rom] rom-mapper updated to ['~> 1.0', '>= 1.0.1']

Compare v4.0.0...v4.0.1

4.0.0 2017-10-18

This release turns rom gem into a meta gem which depends on rom-core, rom-mapper, rom-repository and rom-changeset'. See CHANGELOG in core for more information.