rom-core 5.0.2 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bccec1ca22ee806eff149f4e61c1c6cf75eed1dfb1944ee7635239fdff7d7d26
4
- data.tar.gz: 6ed39c371e2541d83e0060df63278444b852713f3c8a177242b1c41bbbeb14cb
3
+ metadata.gz: 56abc0d6388e2082f26604f39229af054e25a5a1298485f6a609a7c8c7163ebd
4
+ data.tar.gz: 6ec5cb049f5793102d5f9287b48b607fb2e9bd9c8b2f92e045aef3fd45245e4b
5
5
  SHA512:
6
- metadata.gz: 4f53fba8d16d7483f9b1779bcf461b71c4d3ed7cde17466765e022284a310c61947317340380ca8d9065ac8a4a0741d0c777b55f161d085355aa67a52d062f9e
7
- data.tar.gz: e1508e8c595774a991c7a57eaa15bff719b83a022c768cc1f7e05931001321045524975ade75295c8e6963882cfe78f03f5f7dae4111916248f3364b2780200e
6
+ metadata.gz: e197ca01ddf489798f0d4681bf5061ffaecdbcedf97a30fa909132382ce18854bccce3d90f48c6a6d5f3fc0060901a9713e5879a6b2f882e93d47bf980a59610
7
+ data.tar.gz: 23520577e017af6e42227c5c04e56f030d8b1a9b5db2554cf2d6b93e5365f5fb94bd374450e37c75cecc30b492abd22a3b8a078864e1f087ea90bfe3aaec13ce
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/core/deprecations'
4
3
  require 'dry/core/class_attributes'
5
4
 
6
5
  require 'rom/types'
@@ -33,7 +32,6 @@ module ROM
33
32
  include Commands
34
33
  include Pipeline::Operator
35
34
 
36
-
37
35
  # @!method self.adapter
38
36
  # Get or set adapter identifier
39
37
  #
@@ -181,20 +181,26 @@ module ROM
181
181
  #
182
182
  # @param [Symbol] rel_name A relation identifier from the container registry
183
183
  # @param [Symbol] type The command type
184
- # @param [Hash] meta Meta information from relation AST
184
+ # @param [Hash] rel_meta Meta information from relation AST
185
185
  # @param [Symbol] parent_relation Optional parent relation identifier
186
186
  #
187
187
  # @return [ROM::Command]
188
188
  #
189
189
  # @api private
190
- def register_command(rel_name, type, meta, parent_relation = nil)
190
+ def register_command(rel_name, type, rel_meta, parent_relation = nil)
191
191
  relation = relations[rel_name]
192
192
 
193
193
  type.create_class(rel_name, type) do |klass|
194
- klass.result(meta.fetch(:combine_type, result))
194
+ klass.result(rel_meta.fetch(:combine_type, result))
195
195
 
196
- if meta[:combine_type]
197
- setup_associates(klass, relation, meta, parent_relation)
196
+ klass.input(meta.fetch(:input, relation.input_schema))
197
+
198
+ meta.each do |name, value|
199
+ klass.public_send(name, value)
200
+ end
201
+
202
+ if rel_meta[:combine_type]
203
+ setup_associates(klass, relation, rel_meta, parent_relation)
198
204
  end
199
205
 
200
206
  plugins.each do |plugin|
@@ -211,7 +217,7 @@ module ROM
211
217
 
212
218
  klass.extend_for_relation(relation) if klass.restrictable
213
219
 
214
- registry[rel_name][type] = klass.build(relation, input: relation.input_schema)
220
+ registry[rel_name][type] = klass.build(relation)
215
221
  end
216
222
  end
217
223
 
@@ -112,7 +112,7 @@ module ROM
112
112
  #
113
113
  # @api public
114
114
  def use(plugin, options = EMPTY_HASH)
115
- ROM.plugin_registry.commands.fetch(plugin, adapter).apply_to(self, options)
115
+ ROM.plugin_registry[:command].fetch(plugin, adapter).apply_to(self, options)
116
116
  end
117
117
 
118
118
  # Extend a command class with relation view methods
@@ -54,8 +54,6 @@ module ROM
54
54
  @notifications = Notifications.event_bus(:configuration)
55
55
  @setup = Setup.new(notifications)
56
56
 
57
- use :mappers # enable mappers by default
58
-
59
57
  block.call(self) if block
60
58
  end
61
59
 
@@ -73,7 +71,7 @@ module ROM
73
71
  elsif plugin.is_a?(Hash)
74
72
  plugin.to_a.each { |p| use(*p) }
75
73
  else
76
- ROM.plugin_registry.configuration.fetch(plugin).apply_to(self, options)
74
+ ROM.plugin_registry[:configuration].fetch(plugin).apply_to(self, options)
77
75
  end
78
76
 
79
77
  self
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'rom/configuration_dsl/relation'
4
4
  require 'rom/configuration_dsl/command_dsl'
5
+ require 'rom/configuration_dsl/mapper_dsl'
5
6
 
6
7
  module ROM
7
8
  # This extends Configuration class with the DSL methods
@@ -51,6 +52,13 @@ module ROM
51
52
  register_command(*CommandDSL.new(name, default_adapter, &block).command_classes)
52
53
  end
53
54
 
55
+ # Mapper definition DSL
56
+ #
57
+ # @api public
58
+ def mappers(&block)
59
+ register_mapper(*MapperDSL.new(self, mapper_classes, block).mapper_classes)
60
+ end
61
+
54
62
  # Configures a plugin for a specific adapter to be enabled for all relations
55
63
  #
56
64
  # @example
@@ -70,7 +78,9 @@ module ROM
70
78
  # @api public
71
79
  def plugin(adapter, spec, &block)
72
80
  type, name = spec.flatten(1)
73
- plugin = plugin_registry.send(type).adapter(adapter).fetch(name) { plugin_registry.send(type).fetch(name) }
81
+ plugin = plugin_registry[type].adapter(adapter).fetch(name) do
82
+ plugin_registry[type].fetch(name)
83
+ end
74
84
 
75
85
  if block
76
86
  register_plugin(plugin.configure(&block))
@@ -3,7 +3,7 @@
3
3
  require 'rom/mapper/builder'
4
4
 
5
5
  module ROM
6
- class Mapper
6
+ module ConfigurationDSL
7
7
  # Mapper definition DSL used by Setup DSL
8
8
  #
9
9
  # @private
@@ -30,7 +30,7 @@ module ROM
30
30
  #
31
31
  # @api public
32
32
  def define(name, options = EMPTY_HASH, &block)
33
- @defined_mappers << Builder.build_class(name, (@mapper_classes + @defined_mappers), options, &block)
33
+ @defined_mappers << Mapper::Builder.build_class(name, (@mapper_classes + @defined_mappers), options, &block)
34
34
  self
35
35
  end
36
36
 
@@ -50,7 +50,7 @@ module ROM
50
50
 
51
51
  # @api private
52
52
  def set_message(key, registry)
53
- "#{key.inspect} doesn't exist in #{registry.class.name} registry"
53
+ "#{key.inspect} doesn't exist in #{registry.type} registry"
54
54
  end
55
55
  end
56
56
 
@@ -7,13 +7,11 @@ require 'rom/version'
7
7
  require 'rom/constants'
8
8
 
9
9
  # core parts
10
- require 'rom/configuration_plugin'
11
10
  require 'rom/plugin'
12
11
  require 'rom/schema_plugin'
13
12
  require 'rom/relation'
14
13
  require 'rom/mapper'
15
14
  require 'rom/processor/transproc'
16
- require 'rom/mapper/configuration_plugin'
17
15
  require 'rom/commands'
18
16
 
19
17
  # rom Global
@@ -28,6 +26,15 @@ require 'rom/container'
28
26
  # container factory
29
27
  require 'rom/create_container'
30
28
 
29
+ # register known plugin types
30
+ require 'rom/schema_plugin'
31
+
32
+ ROM::Plugins.register(:command)
33
+ ROM::Plugins.register(:mapper)
34
+ ROM::Plugins.register(:relation)
35
+ ROM::Plugins.register(:schema, plugin_type: ROM::SchemaPlugin)
36
+ ROM::Plugins.register(:configuration, adapter: false)
37
+
31
38
  # register core plugins
32
39
  require 'rom/plugins/relation/registry_reader'
33
40
  require 'rom/plugins/relation/instrumentation'
@@ -39,7 +46,6 @@ module ROM
39
46
  extend Global
40
47
 
41
48
  plugins do
42
- register :mappers, ROM::Mapper::ConfigurationPlugin, type: :configuration
43
49
  register :timestamps, ROM::Plugins::Schema::Timestamps, type: :schema
44
50
  register :registry_reader, ROM::Plugins::Relation::RegistryReader, type: :relation
45
51
  register :instrumentation, ROM::Plugins::Relation::Instrumentation, type: :relation
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ROM
4
4
  module Core
5
- VERSION = '5.0.2'
5
+ VERSION = '5.1.0'
6
6
  end
7
7
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'rom/constants'
4
4
  require 'rom/mapper/dsl'
5
- require 'rom/mapper/configuration_plugin'
6
5
 
7
6
  module ROM
8
7
  # Mapper is a simple object that uses transformers to load relations
@@ -40,7 +40,7 @@ module ROM
40
40
  def use(plugin, options = {})
41
41
  adapter = options.fetch(:adapter, :default)
42
42
 
43
- ROM.plugin_registry.mappers.fetch(plugin, adapter).apply_to(self)
43
+ ROM.plugin_registry[:mapper].fetch(plugin, adapter).apply_to(self)
44
44
  end
45
45
 
46
46
  # Return base_relation used for creating mapper registry
@@ -1,26 +1,44 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rom/initializer'
3
4
  require 'rom/constants'
4
- require 'rom/plugin_base'
5
5
  require 'rom/support/configurable'
6
6
 
7
7
  module ROM
8
8
  # Plugin is a simple object used to store plugin configurations
9
9
  #
10
10
  # @private
11
- class Plugin < PluginBase
11
+ class Plugin
12
+ extend Initializer
12
13
  include Configurable
13
14
 
14
- # Apply this plugin to the provided class
15
+ # @!attribute [r] name
16
+ # @return [Symbol] plugin name
17
+ # @api private
18
+ param :name
19
+
20
+ # @!attribute [r] mod
21
+ # @return [Module] a module representing the plugin
22
+ # @api private
23
+ param :mod
24
+
25
+ # @!attribute [r] type
26
+ # @return [Symbol] plugin type
27
+ # @api private
28
+ option :type
29
+
30
+ # Apply this plugin to the target
15
31
  #
16
- # @param [Class] klass
32
+ # @param [Class,Object] target
17
33
  #
18
34
  # @api private
19
- def apply_to(klass, options = EMPTY_HASH)
20
- if mod.respond_to?(:new)
21
- klass.send(:include, mod.new(options))
22
- else
23
- klass.send(:include, mod)
35
+ def apply_to(target, options = EMPTY_HASH)
36
+ if mod.respond_to?(:apply)
37
+ mod.apply(target, options)
38
+ elsif mod.respond_to?(:new)
39
+ target.include(mod.new(options))
40
+ elsif target.is_a?(::Module)
41
+ target.include(mod)
24
42
  end
25
43
  end
26
44
  end
@@ -1,54 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'concurrent/map'
3
4
  require 'rom/registry'
5
+ require 'rom/plugins'
4
6
 
5
7
  module ROM
6
8
  # Stores all registered plugins
7
9
  #
8
10
  # @api private
9
11
  class PluginRegistry
10
- # Internal registry for configuration plugins
11
- #
12
- # @return [ConfigurationPluginRegistry]
13
- #
14
- # @api private
15
- attr_reader :configuration
16
-
17
- # Internal registry for command plugins
18
- #
19
- # @return [InternalPluginRegistry]
20
- #
21
- # @api private
22
- attr_reader :commands
23
-
24
- # Internal registry for mapper plugins
25
- #
26
- # @return [InternalPluginRegistry]
27
- #
28
- # @api private
29
- attr_reader :mappers
30
-
31
- # Internal registry for relation plugins
32
- #
33
- # @return [InternalPluginRegistry]
34
- #
35
12
  # @api private
36
- attr_reader :relations
37
-
38
- # Internal registry for schema plugins
39
- #
40
- # @return [InternalPluginRegistry]
41
- #
42
- # @api private
43
- attr_reader :schemas
13
+ attr_reader :types
44
14
 
45
15
  # @api private
46
16
  def initialize
47
- @configuration = ConfigurationPluginRegistry.new
48
- @mappers = InternalPluginRegistry.new
49
- @commands = InternalPluginRegistry.new
50
- @relations = InternalPluginRegistry.new
51
- @schemas = InternalPluginRegistry.new(SchemaPlugin)
17
+ @types = ::Concurrent::Map.new
52
18
  end
53
19
 
54
20
  # Register a plugin for future use
@@ -61,24 +27,35 @@ module ROM
61
27
  # @option options [Symbol] :adapter (:default) which adapter this plugin
62
28
  # applies to. Leave blank for all adapters
63
29
  def register(name, mod, options = EMPTY_HASH)
64
- type = options.fetch(:type)
65
- adapter = options.fetch(:adapter, :default)
30
+ type(options.fetch(:type)).register(name, mod, options)
31
+ end
66
32
 
67
- plugins_for(type, adapter).register(name, mod, options)
33
+ # @api private
34
+ def type(type)
35
+ types.fetch_or_store(type) do
36
+ if Plugins[type][:adapter]
37
+ AdapterPluginsContainer.new(type)
38
+ else
39
+ PluginsContainer.new({}, type: type)
40
+ end
41
+ end
68
42
  end
69
43
 
70
- private
44
+ # @api private
45
+ def [](type)
46
+ types.fetch(singularize(type))
47
+ end
71
48
 
72
- # Determine which specific registry to use
49
+ # Old API compatibility
73
50
  #
74
51
  # @api private
75
- def plugins_for(type, adapter)
52
+ def singularize(type)
76
53
  case type
77
- when :configuration then configuration
78
- when :command then commands.adapter(adapter)
79
- when :mapper then mappers.adapter(adapter)
80
- when :relation then relations.adapter(adapter)
81
- when :schema then schemas.adapter(adapter)
54
+ when :relations then :relation
55
+ when :commands then :command
56
+ when :mappers then :mapper
57
+ when :schemas then :schema
58
+ else type
82
59
  end
83
60
  end
84
61
  end
@@ -86,23 +63,12 @@ module ROM
86
63
  # Abstract registry defining common behaviour
87
64
  #
88
65
  # @api private
89
- class PluginRegistryBase < Registry
90
- include Dry::Equalizer(:elements, :plugin_type)
66
+ class PluginsContainer < Registry
67
+ include Dry::Equalizer(:elements, :type)
91
68
 
92
69
  # @!attribute [r] plugin_type
93
70
  # @return [Class] Typically ROM::PluginBase or its descendant
94
- option :plugin_type
95
-
96
- # Retrieve a registered plugin
97
- #
98
- # @param [Symbol] name The plugin to retrieve
99
- #
100
- # @return [Plugin]
101
- #
102
- # @api public
103
- def [](name)
104
- elements[name]
105
- end
71
+ option :type
106
72
 
107
73
  # Assign a plugin to this environment registry
108
74
  #
@@ -112,52 +78,19 @@ module ROM
112
78
  #
113
79
  # @api private
114
80
  def register(name, mod, options)
115
- elements[name] = plugin_type.new(mod, options)
81
+ elements[name] = plugin_type.new(name, mod, options)
116
82
  end
117
83
 
118
- # Returns plugin name by instance
119
- #
120
- # @return [Symbol] Plugin name
121
- #
122
84
  # @api private
123
- def plugin_name(plugin)
124
- tuple = elements.find { |(_, p)| p.equal?(plugin) }
125
- tuple[0] if tuple
85
+ def plugin_type
86
+ Plugins[type][:plugin_type]
126
87
  end
127
88
  end
128
89
 
129
- # A registry storing environment specific plugins
130
- #
131
- # @api private
132
- class ConfigurationPluginRegistry < PluginRegistryBase
133
- # @api private
134
- def initialize(*args, **kwargs)
135
- super(*args, **kwargs, plugin_type: ConfigurationPlugin)
136
- end
137
-
138
- # Return an environment plugin
139
- #
140
- # @param [Symbol] name The name of the environment plugin
141
- #
142
- # @raise [UnknownPluginError] if no plugin is found with the given name
143
- #
144
- # @api public
145
- def fetch(name)
146
- self[name] || raise(UnknownPluginError, name)
147
- end
148
- end
149
-
150
- # A registry storing adapter specific plugins
151
- #
152
- # @api private
153
- class AdapterPluginRegistry < PluginRegistryBase
154
- option :plugin_type, default: -> { Plugin }
155
- end
156
-
157
90
  # Store a set of registries grouped by adapter
158
91
  #
159
92
  # @api private
160
- class InternalPluginRegistry
93
+ class AdapterPluginsContainer
161
94
  # Return the existing registries
162
95
  #
163
96
  # @return [Hash]
@@ -166,8 +99,12 @@ module ROM
166
99
  attr_reader :registries
167
100
 
168
101
  # @api private
169
- def initialize(plugin_type = Plugin)
170
- @registries = Hash.new { |h, v| h[v] = AdapterPluginRegistry.new({}, plugin_type: plugin_type) }
102
+ attr_reader :type
103
+
104
+ # @api private
105
+ def initialize(type)
106
+ @registries = ::Hash.new { |h, v| h[v] = PluginsContainer.new({}, type: type) }
107
+ @type = type
171
108
  end
172
109
 
173
110
  # Return the plugin registry for a specific adapter
@@ -181,6 +118,11 @@ module ROM
181
118
  registries[name]
182
119
  end
183
120
 
121
+ # @api private
122
+ def register(name, mod, options)
123
+ adapter(options.fetch(:adapter, :default)).register(name, mod, options)
124
+ end
125
+
184
126
  # Return the plugin for a given adapter
185
127
  #
186
128
  # @param [Symbol] name The name of the plugin
@@ -190,8 +132,11 @@ module ROM
190
132
  #
191
133
  # @api public
192
134
  def fetch(name, adapter_name = :default)
193
- adapter(adapter_name)[name] || adapter(:default)[name] ||
194
- raise(UnknownPluginError, name)
135
+ adapter(adapter_name).fetch(name) do
136
+ adapter(:default).fetch(name) do
137
+ raise(UnknownPluginError, name)
138
+ end
139
+ end
195
140
  end
196
141
 
197
142
  alias_method :[], :fetch
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/container'
4
+ require 'rom/plugin'
5
+
6
+ module ROM
7
+ # Registry of all known plugin types (command, relation, mapper, etc)
8
+ #
9
+ # @api private
10
+ module Plugins
11
+ extend ::Dry::Container::Mixin
12
+
13
+ class << self
14
+ # @api private
15
+ def register(entity_type, plugin_type: Plugin, adapter: true)
16
+ super(entity_type, plugin_type: plugin_type, adapter: adapter)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'dry/equalizer'
4
+ require 'dry/core/cache'
5
+ require 'dry/core/class_builder'
4
6
 
5
7
  require 'rom/initializer'
6
8
  require 'rom/cache'
@@ -10,6 +12,7 @@ module ROM
10
12
  # @api private
11
13
  class Registry
12
14
  extend Initializer
15
+ extend Dry::Core::Cache
13
16
 
14
17
  include Enumerable
15
18
  include Dry::Equalizer(:elements)
@@ -34,6 +37,15 @@ module ROM
34
37
  end
35
38
  end
36
39
 
40
+ # @api private
41
+ def self.[](identifier)
42
+ fetch_or_store(identifier) do
43
+ Dry::Core::ClassBuilder
44
+ .new(parent: self, name: "#{name}[:#{identifier}]")
45
+ .call
46
+ end
47
+ end
48
+
37
49
  # @api private
38
50
  def self.element_not_found_error
39
51
  ElementNotFoundError
@@ -80,6 +92,10 @@ module ROM
80
92
  end
81
93
  alias_method :[], :fetch
82
94
 
95
+ def type
96
+ self.class.name
97
+ end
98
+
83
99
  # @api private
84
100
  def respond_to_missing?(name, include_private = false)
85
101
  elements.key?(name) || super
@@ -249,7 +249,7 @@ module ROM
249
249
  #
250
250
  # @api public
251
251
  def use(plugin, options = EMPTY_HASH)
252
- ROM.plugin_registry.relations.fetch(plugin, adapter).apply_to(self, options)
252
+ ROM.plugin_registry[:relation].fetch(plugin, adapter).apply_to(self, options)
253
253
  end
254
254
 
255
255
  # Build default mapper registry
@@ -22,7 +22,7 @@ module ROM
22
22
  # @api public
23
23
  def self.new(relation, nodes)
24
24
  struct_ns = relation.options[:struct_namespace]
25
- new_nodes = nodes.map { |node| node.struct_namespace(struct_ns) }
25
+ new_nodes = nodes.uniq.map { |node| node.struct_namespace(struct_ns) }
26
26
 
27
27
  root =
28
28
  if relation.is_a?(self)
@@ -19,7 +19,7 @@ module ROM
19
19
  # users.command(:create, result: many)
20
20
  #
21
21
  # @example build a command which uses a specific plugin
22
- # users.command(:create, plugin: :timestamps)
22
+ # users.command(:create, use: :timestamps)
23
23
  #
24
24
  # @example build a command which sends results through a custom mapper
25
25
  # users.command(:create, mapper: :my_mapper_identifier)
@@ -178,7 +178,7 @@ module ROM
178
178
  #
179
179
  # @api private
180
180
  def call
181
- AssociationSet.new(registry)
181
+ AssociationSet[source.relation].new(registry)
182
182
  end
183
183
 
184
184
  private
@@ -165,20 +165,19 @@ module ROM
165
165
 
166
166
  # Enables for the schema
167
167
  #
168
- # @param [Symbol] plugin Plugin name
168
+ # @param [Symbol] plugin_name Plugin name
169
169
  # @param [Hash] options Plugin options
170
170
  #
171
171
  # @api public
172
- def use(plugin, options = ::ROM::EMPTY_HASH)
173
- mod = ::ROM.plugin_registry.schemas.adapter(adapter).fetch(plugin)
174
- app_plugin(mod, options)
172
+ def use(plugin_name, options = ::ROM::EMPTY_HASH)
173
+ plugin = ::ROM.plugin_registry[:schema].fetch(plugin_name, adapter)
174
+ app_plugin(plugin, options)
175
175
  end
176
176
 
177
177
  # @api private
178
178
  def app_plugin(plugin, options = ::ROM::EMPTY_HASH)
179
- plugin_name = ::ROM.plugin_registry.schemas.adapter(adapter).plugin_name(plugin)
180
179
  plugin.extend_dsl(self)
181
- @plugins[plugin_name] = [plugin, plugin.config.to_hash.merge(options)]
180
+ @plugins[plugin.name] = [plugin, plugin.config.to_hash.merge(options)]
182
181
  end
183
182
 
184
183
  # @api private
@@ -187,9 +186,9 @@ module ROM
187
186
  instance_exec(&definition) if definition
188
187
 
189
188
  schema_class.define(relation, opts) do |schema|
190
- plugins.values.each { |(plugin, options)|
189
+ plugins.values.each do |plugin, options|
191
190
  plugin.apply_to(schema, options)
192
- }
191
+ end
193
192
  end
194
193
  end
195
194
 
@@ -1,22 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rom/plugin_base'
3
+ require 'rom/plugin'
4
4
 
5
5
  module ROM
6
6
  # @api private
7
- class SchemaPlugin < PluginBase
8
- include Configurable
9
-
10
- # Apply this plugin to the provided configuration
11
- #
12
- # @param [ROM::Schema] schema A schema instance for extension
13
- # @param [Hash] options Extension options
14
- #
15
- # @api private
16
- def apply_to(schema, options = EMPTY_HASH)
17
- mod.apply(schema, options) if mod.respond_to?(:apply)
18
- end
19
-
7
+ class SchemaPlugin < Plugin
20
8
  # Extends a DSL instance with a module provided by the plugin
21
9
  #
22
10
  # @param [ROM::Schema::DSL] dsl
@@ -77,7 +77,7 @@ module ROM
77
77
  #
78
78
  # @api private
79
79
  def load_relations(mappers)
80
- global_plugins = plugins.select { |p| p.relation? || p.schema? }
80
+ global_plugins = plugins.select { |p| p.type == :relation || p.type == :schema }
81
81
 
82
82
  FinalizeRelations.new(
83
83
  gateways,
@@ -126,12 +126,12 @@ module ROM
126
126
 
127
127
  # @api private
128
128
  def relation_plugins
129
- @plugins.select(&:relation?)
129
+ @plugins.select { |p| p.type == :relation }
130
130
  end
131
131
 
132
132
  # @api private
133
133
  def schema_plugins
134
- @plugins.select(&:schema?)
134
+ @plugins.select { |p| p.type == :schema }
135
135
  end
136
136
 
137
137
  # @api private
@@ -13,7 +13,68 @@ module ROM
13
13
  class Transformer < Transproc::Transformer[ROM::Processor::Transproc::Functions]
14
14
  extend Dry::Core::ClassAttributes
15
15
 
16
- defines :relation, :register_as
16
+ # @!method self.register_as
17
+ # Get or set registration name
18
+ #
19
+ # @overload register_as
20
+ # Return the registration name
21
+ # @return [Symbol]
22
+ #
23
+ # @overload register_as(name)
24
+ # Configure registration name
25
+ #
26
+ # @example
27
+ # class MyMapper < ROM::Transformer
28
+ # relation :users
29
+ # register_as :my_mapper
30
+ # end
31
+ #
32
+ # @param name [Symbol] The registration name
33
+ defines :register_as
34
+
35
+ # Configure relation for the transformer
36
+ #
37
+ # @example with a custom name
38
+ # class UsersMapper < ROM::Transformer
39
+ # relation :users, as: :json_serializer
40
+ #
41
+ # map do
42
+ # rename_keys user_id: :id
43
+ # deep_stringify_keys
44
+ # end
45
+ # end
46
+ #
47
+ # users.map_with(:json_serializer)
48
+ #
49
+ # @param name [Symbol]
50
+ # @param options [Hash]
51
+ # @option options :as [Symbol] Mapper identifier
52
+ #
53
+ # @api public
54
+ def self.relation(name = Undefined, options = EMPTY_HASH)
55
+ return @relation if name.equal?(Undefined) && defined?(@relation)
56
+ register_as(options.fetch(:as, name))
57
+ @relation = name
58
+ end
59
+
60
+ # Define transformation pipeline
61
+ #
62
+ # @example
63
+ # class UsersMapper < ROM::Transformer
64
+ # map do
65
+ # rename_keys user_id: :id
66
+ # deep_stringify_keys
67
+ # end
68
+ # end
69
+ #
70
+ # @return [self]
71
+ #
72
+ # @api public
73
+ def self.map(&block)
74
+ define! do
75
+ map_array(&block)
76
+ end
77
+ end
17
78
 
18
79
  # This is needed to make transformers compatible with rom setup
19
80
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.2
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-01 00:00:00.000000000 Z
11
+ date: 2019-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -135,6 +135,9 @@ dependencies:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
137
  version: '1.0'
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: 1.1.0
138
141
  type: :runtime
139
142
  prerelease: false
140
143
  version_requirements: !ruby/object:Gem::Requirement
@@ -142,6 +145,9 @@ dependencies:
142
145
  - - "~>"
143
146
  - !ruby/object:Gem::Version
144
147
  version: '1.0'
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 1.1.0
145
151
  - !ruby/object:Gem::Dependency
146
152
  name: rake
147
153
  requirement: !ruby/object:Gem::Requirement
@@ -220,11 +226,12 @@ files:
220
226
  - lib/rom/configuration_dsl.rb
221
227
  - lib/rom/configuration_dsl/command.rb
222
228
  - lib/rom/configuration_dsl/command_dsl.rb
229
+ - lib/rom/configuration_dsl/mapper_dsl.rb
223
230
  - lib/rom/configuration_dsl/relation.rb
224
- - lib/rom/configuration_plugin.rb
225
231
  - lib/rom/constants.rb
226
232
  - lib/rom/container.rb
227
233
  - lib/rom/core.rb
234
+ - lib/rom/core/version.rb
228
235
  - lib/rom/create_container.rb
229
236
  - lib/rom/data_proxy.rb
230
237
  - lib/rom/enumerable_dataset.rb
@@ -243,9 +250,7 @@ files:
243
250
  - lib/rom/mapper.rb
244
251
  - lib/rom/mapper/attribute_dsl.rb
245
252
  - lib/rom/mapper/builder.rb
246
- - lib/rom/mapper/configuration_plugin.rb
247
253
  - lib/rom/mapper/dsl.rb
248
- - lib/rom/mapper/mapper_dsl.rb
249
254
  - lib/rom/mapper/model_dsl.rb
250
255
  - lib/rom/mapper_compiler.rb
251
256
  - lib/rom/mapper_registry.rb
@@ -267,8 +272,8 @@ files:
267
272
  - lib/rom/open_struct.rb
268
273
  - lib/rom/pipeline.rb
269
274
  - lib/rom/plugin.rb
270
- - lib/rom/plugin_base.rb
271
275
  - lib/rom/plugin_registry.rb
276
+ - lib/rom/plugins.rb
272
277
  - lib/rom/plugins/command/schema.rb
273
278
  - lib/rom/plugins/command/timestamps.rb
274
279
  - lib/rom/plugins/relation/instrumentation.rb
@@ -314,11 +319,14 @@ files:
314
319
  - lib/rom/transaction.rb
315
320
  - lib/rom/transformer.rb
316
321
  - lib/rom/types.rb
317
- - lib/rom/version.rb
318
322
  homepage: http://rom-rb.org
319
323
  licenses:
320
324
  - MIT
321
- metadata: {}
325
+ metadata:
326
+ source_code_uri: https://github.com/rom-rb/rom/tree/master/core
327
+ documentation_uri: https://api.rom-rb.org/rom/
328
+ mailing_list_uri: https://discourse.rom-rb.org/
329
+ bug_tracker_uri: https://github.com/rom-rb/rom/issues
322
330
  post_install_message:
323
331
  rdoc_options: []
324
332
  require_paths:
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rom/plugin_base'
4
-
5
- module ROM
6
- # ConfigurationPlugin is a simple object used to store configuration plugin configurations
7
- #
8
- # @private
9
- class ConfigurationPlugin < PluginBase
10
- # Apply this plugin to the provided configuration
11
- #
12
- # @param [ROM::Configuration] configuration
13
- #
14
- # @api private
15
- def apply_to(configuration, options = {})
16
- mod.apply(configuration, options)
17
- end
18
- end
19
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rom/mapper/mapper_dsl'
4
-
5
- module ROM
6
- class Mapper
7
- # Model DSL allows setting a model class
8
- #
9
- # @private
10
- module ConfigurationPlugin
11
- # Mapper definition DSL used by Setup DSL
12
- #
13
- # @private
14
-
15
- def self.apply(configuration, options = {})
16
- configuration.extend Methods
17
- configuration
18
- end
19
-
20
- module Methods
21
- def mappers(&block)
22
- register_mapper(*MapperDSL.new(self, mapper_classes, block).mapper_classes)
23
- end
24
- end
25
-
26
- end
27
- end
28
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ROM
4
- # Abstract plugin base
5
- #
6
- # @private
7
- class PluginBase
8
- # @return [Module] a module representing the plugin
9
- #
10
- # @api private
11
- attr_reader :mod
12
-
13
- # @return [Hash] configuration options
14
- #
15
- # @api private
16
- attr_reader :options
17
-
18
- # @api private
19
- attr_reader :type
20
-
21
- # @api private
22
- def initialize(mod, options)
23
- @mod = mod
24
- @options = options
25
- @type = options.fetch(:type)
26
- end
27
-
28
- # @api private
29
- def relation?
30
- type == :relation
31
- end
32
-
33
- # @api private
34
- def schema?
35
- type == :schema
36
- end
37
-
38
- # Apply this plugin to the provided class
39
- #
40
- # @param [Mixed] _base
41
- #
42
- # @api private
43
- def apply_to(_base)
44
- raise NotImplementedError, "#{self.class}#apply_to not implemented"
45
- end
46
- end
47
- end