rom-core 5.3.1 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rom/array_dataset.rb +5 -5
- data/lib/rom/association_set.rb +1 -2
- data/lib/rom/associations/definitions/abstract.rb +5 -3
- data/lib/rom/associations/many_to_many.rb +1 -2
- data/lib/rom/attribute.rb +15 -37
- data/lib/rom/auto_curry.rb +34 -23
- data/lib/rom/cache.rb +9 -21
- data/lib/rom/command.rb +19 -37
- data/lib/rom/command_compiler.rb +12 -14
- data/lib/rom/command_proxy.rb +6 -10
- data/lib/rom/command_registry.rb +4 -8
- data/lib/rom/commands/class_interface.rb +20 -20
- data/lib/rom/commands/composite.rb +3 -0
- data/lib/rom/commands/graph/class_interface.rb +3 -1
- data/lib/rom/commands/graph/input_evaluator.rb +3 -1
- data/lib/rom/commands/graph.rb +3 -0
- data/lib/rom/commands/lazy/create.rb +2 -0
- data/lib/rom/commands/lazy/update.rb +2 -0
- data/lib/rom/commands/lazy.rb +2 -3
- data/lib/rom/configuration.rb +14 -16
- data/lib/rom/configuration_dsl/command.rb +2 -2
- data/lib/rom/configuration_dsl/command_dsl.rb +9 -5
- data/lib/rom/configuration_dsl/mapper_dsl.rb +12 -3
- data/lib/rom/configuration_dsl/relation.rb +4 -2
- data/lib/rom/configuration_dsl.rb +8 -10
- data/lib/rom/constants.rb +26 -26
- data/lib/rom/container.rb +15 -15
- data/lib/rom/core/version.rb +1 -1
- data/lib/rom/core.rb +0 -1
- data/lib/rom/create_container.rb +3 -5
- data/lib/rom/data_proxy.rb +13 -15
- data/lib/rom/enumerable_dataset.rb +6 -6
- data/lib/rom/environment.rb +5 -5
- data/lib/rom/gateway.rb +4 -12
- data/lib/rom/global/plugin_dsl.rb +4 -4
- data/lib/rom/global.rb +2 -2
- data/lib/rom/header/attribute.rb +1 -1
- data/lib/rom/header.rb +13 -35
- data/lib/rom/initializer.rb +11 -15
- data/lib/rom/lint/enumerable_dataset.rb +2 -1
- data/lib/rom/lint/gateway.rb +3 -1
- data/lib/rom/lint/linter.rb +2 -2
- data/lib/rom/lint/test.rb +4 -6
- data/lib/rom/mapper/attribute_dsl.rb +39 -27
- data/lib/rom/mapper/builder.rb +2 -2
- data/lib/rom/mapper/dsl.rb +2 -3
- data/lib/rom/mapper/model_dsl.rb +5 -1
- data/lib/rom/mapper.rb +2 -4
- data/lib/rom/mapper_compiler.rb +3 -2
- data/lib/rom/mapper_registry.rb +2 -4
- data/lib/rom/memory/commands.rb +1 -1
- data/lib/rom/memory/dataset.rb +7 -5
- data/lib/rom/memory/gateway.rb +1 -0
- data/lib/rom/model_builder.rb +14 -14
- data/lib/rom/open_struct.rb +1 -1
- data/lib/rom/pipeline.rb +17 -20
- data/lib/rom/plugin_registry.rb +4 -10
- data/lib/rom/plugins/command/timestamps.rb +9 -5
- data/lib/rom/plugins/relation/instrumentation.rb +7 -2
- data/lib/rom/plugins/relation/registry_reader.rb +3 -15
- data/lib/rom/plugins.rb +1 -3
- data/lib/rom/processor/transproc.rb +14 -4
- data/lib/rom/processor.rb +1 -0
- data/lib/rom/registry.rb +20 -29
- data/lib/rom/relation/class_interface.rb +18 -16
- data/lib/rom/relation/combined.rb +7 -4
- data/lib/rom/relation/composite.rb +2 -6
- data/lib/rom/relation/curried.rb +12 -11
- data/lib/rom/relation/graph.rb +4 -12
- data/lib/rom/relation/loaded.rb +8 -16
- data/lib/rom/relation/materializable.rb +6 -14
- data/lib/rom/relation/name.rb +5 -14
- data/lib/rom/relation/view_dsl.rb +7 -9
- data/lib/rom/relation/wrap.rb +3 -9
- data/lib/rom/relation.rb +39 -81
- data/lib/rom/schema/associations_dsl.rb +4 -8
- data/lib/rom/schema/dsl.rb +14 -13
- data/lib/rom/schema/inferrer.rb +5 -3
- data/lib/rom/schema.rb +27 -41
- data/lib/rom/setup/auto_registration.rb +4 -6
- data/lib/rom/setup/auto_registration_strategies/base.rb +1 -1
- data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +4 -8
- data/lib/rom/setup/finalize/finalize_commands.rb +3 -0
- data/lib/rom/setup/finalize/finalize_mappers.rb +16 -14
- data/lib/rom/setup/finalize/finalize_relations.rb +30 -4
- data/lib/rom/setup/finalize.rb +17 -3
- data/lib/rom/setup.rb +5 -4
- data/lib/rom/struct.rb +20 -18
- data/lib/rom/struct_compiler.rb +4 -7
- data/lib/rom/support/configurable.rb +10 -20
- data/lib/rom/support/memoizable.rb +10 -9
- data/lib/rom/support/notifications.rb +4 -8
- data/lib/rom/transaction.rb +2 -4
- data/lib/rom/transformer.rb +6 -10
- data/lib/rom/types.rb +3 -6
- metadata +15 -57
data/lib/rom/relation.rb
CHANGED
@@ -144,7 +144,9 @@ module ROM
|
|
144
144
|
# @!attribute [r] name
|
145
145
|
# @return [Object] The relation name
|
146
146
|
# @api public
|
147
|
-
option :name, default:
|
147
|
+
option :name, default: lambda {
|
148
|
+
self.class.schema ? self.class.schema.name : self.class.default_name
|
149
|
+
}
|
148
150
|
|
149
151
|
# @!attribute [r] input_schema
|
150
152
|
# @return [Object#[]] tuple processing function, uses schema or defaults to Hash[]
|
@@ -159,12 +161,13 @@ module ROM
|
|
159
161
|
}
|
160
162
|
|
161
163
|
# @!attribute [r] auto_map
|
162
|
-
# @return [
|
164
|
+
# @return [true, false] Whether or not a relation and its
|
165
|
+
# compositions should be auto-mapped
|
163
166
|
# @api private
|
164
167
|
option :auto_map, default: -> { self.class.auto_map }
|
165
168
|
|
166
169
|
# @!attribute [r] auto_struct
|
167
|
-
# @return [
|
170
|
+
# @return [true, false] Whether or not tuples should be auto-mapped to structs
|
168
171
|
# @api private
|
169
172
|
option :auto_struct, default: -> { self.class.auto_struct }
|
170
173
|
|
@@ -191,19 +194,19 @@ module ROM
|
|
191
194
|
#
|
192
195
|
# @example accessing canonical attribute
|
193
196
|
# users[:id]
|
194
|
-
# # => #<ROM::SQL::Attribute[Integer] primary_key=true
|
197
|
+
# # => #<ROM::SQL::Attribute[Integer] primary_key=true
|
198
|
+
# # name=:id source=ROM::Relation::Name(users)>
|
195
199
|
#
|
196
200
|
# @example accessing joined attribute
|
197
201
|
# tasks_with_users = tasks.join(users).select_append(tasks[:title])
|
198
202
|
# tasks_with_users[:title, :tasks]
|
199
|
-
# # => #<ROM::SQL::Attribute[String] primary_key=false
|
203
|
+
# # => #<ROM::SQL::Attribute[String] primary_key=false
|
204
|
+
# # name=:title source=ROM::Relation::Name(tasks)>
|
200
205
|
#
|
201
206
|
# @return [Attribute]
|
202
207
|
#
|
203
208
|
# @api public
|
204
|
-
def [](name)
|
205
|
-
schema[name]
|
206
|
-
end
|
209
|
+
def [](name) = schema[name]
|
207
210
|
|
208
211
|
# Yields relation tuples
|
209
212
|
#
|
@@ -214,11 +217,11 @@ module ROM
|
|
214
217
|
# @return [Enumerator] if block is not provided
|
215
218
|
#
|
216
219
|
# @api public
|
217
|
-
def each
|
220
|
+
def each(&)
|
218
221
|
return to_enum unless block_given?
|
219
222
|
|
220
223
|
if auto_map?
|
221
|
-
mapper.(dataset.map { |tuple| output_schema[tuple] }).each
|
224
|
+
mapper.(dataset.map { |tuple| output_schema[tuple] }).each(&)
|
222
225
|
else
|
223
226
|
dataset.each { |tuple| yield(output_schema[tuple]) }
|
224
227
|
end
|
@@ -248,9 +251,7 @@ module ROM
|
|
248
251
|
# @return [Relation]
|
249
252
|
#
|
250
253
|
# @api public
|
251
|
-
def combine(*args)
|
252
|
-
combine_with(*nodes(*args))
|
253
|
-
end
|
254
|
+
def combine(*args) = combine_with(*nodes(*args))
|
254
255
|
|
255
256
|
# Composes with other relations
|
256
257
|
#
|
@@ -259,9 +260,7 @@ module ROM
|
|
259
260
|
# @return [Relation::Graph]
|
260
261
|
#
|
261
262
|
# @api public
|
262
|
-
def combine_with(*others)
|
263
|
-
Combined.new(self, others)
|
264
|
-
end
|
263
|
+
def combine_with(*others) = Combined.new(self, others)
|
265
264
|
|
266
265
|
# @api private
|
267
266
|
def nodes(*args)
|
@@ -314,9 +313,7 @@ module ROM
|
|
314
313
|
# @return [Relation::Curried]
|
315
314
|
#
|
316
315
|
# @api private
|
317
|
-
def preload_assoc(assoc, other)
|
318
|
-
assoc.preload(self, other)
|
319
|
-
end
|
316
|
+
def preload_assoc(assoc, other) = assoc.preload(self, other)
|
320
317
|
|
321
318
|
# Wrap other relations using association names
|
322
319
|
#
|
@@ -339,63 +336,49 @@ module ROM
|
|
339
336
|
# @return [Relation::Wrap]
|
340
337
|
#
|
341
338
|
# @api public
|
342
|
-
def wrap_around(*others)
|
343
|
-
wrap_class.new(self, others)
|
344
|
-
end
|
339
|
+
def wrap_around(*others) = wrap_class.new(self, others)
|
345
340
|
|
346
341
|
# Loads a relation
|
347
342
|
#
|
348
343
|
# @return [Relation::Loaded]
|
349
344
|
#
|
350
345
|
# @api public
|
351
|
-
def call
|
352
|
-
Loaded.new(self)
|
353
|
-
end
|
346
|
+
def call = Loaded.new(self)
|
354
347
|
|
355
348
|
# Materializes a relation into an array
|
356
349
|
#
|
357
350
|
# @return [Array<Hash>]
|
358
351
|
#
|
359
352
|
# @api public
|
360
|
-
def to_a
|
361
|
-
to_enum.to_a
|
362
|
-
end
|
353
|
+
def to_a = to_enum.to_a
|
363
354
|
|
364
355
|
# Returns if this relation is curried
|
365
356
|
#
|
366
357
|
# @return [false]
|
367
358
|
#
|
368
359
|
# @api private
|
369
|
-
def curried?
|
370
|
-
false
|
371
|
-
end
|
360
|
+
def curried? = false
|
372
361
|
|
373
362
|
# Returns if this relation is a graph
|
374
363
|
#
|
375
364
|
# @return [false]
|
376
365
|
#
|
377
366
|
# @api private
|
378
|
-
def graph?
|
379
|
-
false
|
380
|
-
end
|
367
|
+
def graph? = false
|
381
368
|
|
382
369
|
# Return if this is a wrap relation
|
383
370
|
#
|
384
371
|
# @return [false]
|
385
372
|
#
|
386
373
|
# @api private
|
387
|
-
def wrap?
|
388
|
-
false
|
389
|
-
end
|
374
|
+
def wrap? = false
|
390
375
|
|
391
376
|
# Returns true if a relation has schema defined
|
392
377
|
#
|
393
378
|
# @return [TrueClass, FalseClass]
|
394
379
|
#
|
395
380
|
# @api private
|
396
|
-
def schema?
|
397
|
-
!schema.empty?
|
398
|
-
end
|
381
|
+
def schema? = !schema.empty?
|
399
382
|
|
400
383
|
# Return a new relation with provided dataset and additional options
|
401
384
|
#
|
@@ -420,7 +403,7 @@ module ROM
|
|
420
403
|
if new_opts.empty?
|
421
404
|
options
|
422
405
|
elsif new_opts.key?(:schema)
|
423
|
-
options.merge(new_opts).
|
406
|
+
options.merge(new_opts).except(:input_schema, :output_schema)
|
424
407
|
else
|
425
408
|
options.merge(new_opts)
|
426
409
|
end
|
@@ -456,45 +439,34 @@ module ROM
|
|
456
439
|
# @return [AssociationSet] Schema's association set (empty by default)
|
457
440
|
#
|
458
441
|
# @api public
|
459
|
-
def associations
|
460
|
-
schema.associations
|
461
|
-
end
|
442
|
+
def associations = schema.associations
|
462
443
|
|
463
444
|
# Returns AST for the wrapped relation
|
464
445
|
#
|
465
446
|
# @return [Array]
|
466
447
|
#
|
467
448
|
# @api public
|
468
|
-
def to_ast
|
469
|
-
[:relation, [name.relation, attr_ast, meta_ast]]
|
470
|
-
end
|
449
|
+
def to_ast = [:relation, [name.relation, attr_ast, meta_ast]]
|
471
450
|
|
472
451
|
# @api private
|
473
|
-
def attr_ast
|
474
|
-
schema.map(&:to_read_ast)
|
475
|
-
end
|
452
|
+
def attr_ast = schema.map(&:to_read_ast)
|
476
453
|
|
477
454
|
# @api private
|
478
455
|
def meta_ast
|
479
|
-
meta = self.meta.merge(dataset: name.dataset, alias: name.aliaz,
|
456
|
+
meta = self.meta.merge(dataset: name.dataset, alias: name.aliaz,
|
457
|
+
struct_namespace: options[:struct_namespace])
|
480
458
|
meta[:model] = false unless auto_struct? || meta[:model]
|
481
459
|
meta
|
482
460
|
end
|
483
461
|
|
484
462
|
# @api private
|
485
|
-
def auto_map?
|
486
|
-
(auto_map || auto_struct) && !meta[:combine_type]
|
487
|
-
end
|
463
|
+
def auto_map? = (auto_map || auto_struct) && !meta[:combine_type]
|
488
464
|
|
489
465
|
# @api private
|
490
|
-
def auto_struct?
|
491
|
-
auto_struct && !meta[:combine_type]
|
492
|
-
end
|
466
|
+
def auto_struct? = auto_struct && !meta[:combine_type]
|
493
467
|
|
494
468
|
# @api private
|
495
|
-
def mapper
|
496
|
-
mappers[to_ast]
|
497
|
-
end
|
469
|
+
def mapper = mappers[to_ast]
|
498
470
|
|
499
471
|
# Maps relation with custom mappers available in the registry
|
500
472
|
#
|
@@ -522,9 +494,7 @@ module ROM
|
|
522
494
|
# @return [Relation::Composite] Mapped relation
|
523
495
|
#
|
524
496
|
# @api public
|
525
|
-
def map_with(*names, **opts)
|
526
|
-
super(*names).with(opts)
|
527
|
-
end
|
497
|
+
def map_with(*names, **opts) = super(*names).with(opts)
|
528
498
|
|
529
499
|
# Return a new relation that will map its tuples to instances of the provided class
|
530
500
|
#
|
@@ -550,25 +520,19 @@ module ROM
|
|
550
520
|
# @return [Relation]
|
551
521
|
#
|
552
522
|
# @api public
|
553
|
-
def as(aliaz)
|
554
|
-
with(name: name.as(aliaz))
|
555
|
-
end
|
523
|
+
def as(aliaz) = with(name: name.as(aliaz))
|
556
524
|
|
557
525
|
# @return [Symbol] The wrapped relation's adapter identifier ie :sql or :http
|
558
526
|
#
|
559
527
|
# @api private
|
560
|
-
def adapter
|
561
|
-
self.class.adapter
|
562
|
-
end
|
528
|
+
def adapter = self.class.adapter
|
563
529
|
|
564
530
|
# Return name of the source gateway of this relation
|
565
531
|
#
|
566
532
|
# @return [Symbol]
|
567
533
|
#
|
568
534
|
# @api private
|
569
|
-
def gateway
|
570
|
-
self.class.gateway
|
571
|
-
end
|
535
|
+
def gateway = self.class.gateway
|
572
536
|
|
573
537
|
# Return all registered relation schemas
|
574
538
|
#
|
@@ -577,9 +541,7 @@ module ROM
|
|
577
541
|
# @return [Hash<Symbol=>Schema>]
|
578
542
|
#
|
579
543
|
# @api public
|
580
|
-
def schemas
|
581
|
-
self.class.schemas
|
582
|
-
end
|
544
|
+
def schemas = self.class.schemas
|
583
545
|
|
584
546
|
# Return a foreign key name for the provided relation name
|
585
547
|
#
|
@@ -624,17 +586,13 @@ module ROM
|
|
624
586
|
# @return [Class]
|
625
587
|
#
|
626
588
|
# @api private
|
627
|
-
def composite_class
|
628
|
-
Relation::Composite
|
629
|
-
end
|
589
|
+
def composite_class = Relation::Composite
|
630
590
|
|
631
591
|
# Return configured "wrap" relation class used in Relation#wrap
|
632
592
|
#
|
633
593
|
# @return [Class]
|
634
594
|
#
|
635
595
|
# @api private
|
636
|
-
def wrap_class
|
637
|
-
self.class.wrap_class
|
638
|
-
end
|
596
|
+
def wrap_class = self.class.wrap_class
|
639
597
|
end
|
640
598
|
end
|
@@ -21,10 +21,10 @@ module ROM
|
|
21
21
|
attr_reader :registry
|
22
22
|
|
23
23
|
# @api private
|
24
|
-
def initialize(source, &
|
24
|
+
def initialize(source, &)
|
25
25
|
@source = source
|
26
26
|
@registry = {}
|
27
|
-
instance_exec(&
|
27
|
+
instance_exec(&)
|
28
28
|
end
|
29
29
|
|
30
30
|
# Establish a one-to-many association
|
@@ -177,9 +177,7 @@ module ROM
|
|
177
177
|
# @return [AssociationSet]
|
178
178
|
#
|
179
179
|
# @api private
|
180
|
-
def call
|
181
|
-
AssociationSet[source.relation].build(registry)
|
182
|
-
end
|
180
|
+
def call = AssociationSet[source.relation].build(registry)
|
183
181
|
|
184
182
|
private
|
185
183
|
|
@@ -198,9 +196,7 @@ module ROM
|
|
198
196
|
end
|
199
197
|
|
200
198
|
# @api private
|
201
|
-
def dataset_name(name)
|
202
|
-
Inflector.pluralize(name).to_sym
|
203
|
-
end
|
199
|
+
def dataset_name(name) = Inflector.pluralize(name).to_sym
|
204
200
|
end
|
205
201
|
end
|
206
202
|
end
|
data/lib/rom/schema/dsl.rb
CHANGED
@@ -9,8 +9,8 @@ module ROM
|
|
9
9
|
# Schema DSL exposed as `schema { .. }` in relation classes
|
10
10
|
#
|
11
11
|
# @api public
|
12
|
-
class DSL < BasicObject
|
13
|
-
KERNEL_METHODS = %i[extend method].freeze
|
12
|
+
class DSL < ::BasicObject
|
13
|
+
KERNEL_METHODS = %i[extend method block_given?].freeze
|
14
14
|
KERNEL_METHODS.each { |m| define_method(m, ::Kernel.instance_method(m)) }
|
15
15
|
|
16
16
|
extend Initializer
|
@@ -55,7 +55,7 @@ module ROM
|
|
55
55
|
attr_reader :associations_dsl
|
56
56
|
|
57
57
|
# @api private
|
58
|
-
def initialize(*, &block)
|
58
|
+
def initialize(*, **, &block)
|
59
59
|
super
|
60
60
|
|
61
61
|
@attributes = {}
|
@@ -63,7 +63,6 @@ module ROM
|
|
63
63
|
|
64
64
|
@definition = block
|
65
65
|
end
|
66
|
-
ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
|
67
66
|
|
68
67
|
# Defines a relation attribute with its type and options.
|
69
68
|
#
|
@@ -112,8 +111,8 @@ module ROM
|
|
112
111
|
# @return [AssociationDSL]
|
113
112
|
#
|
114
113
|
# @api public
|
115
|
-
def associations(&
|
116
|
-
@associations_dsl = AssociationsDSL.new(relation, &
|
114
|
+
def associations(&)
|
115
|
+
@associations_dsl = AssociationsDSL.new(relation, &)
|
117
116
|
end
|
118
117
|
|
119
118
|
# Builds a representation of the information needed to create an
|
@@ -140,6 +139,7 @@ module ROM
|
|
140
139
|
# @return [Dry::Types::Type] Type instance
|
141
140
|
#
|
142
141
|
# @api private
|
142
|
+
# rubocop:disable Metrics/AbcSize
|
143
143
|
def build_type(type, options = EMPTY_HASH)
|
144
144
|
if options[:read]
|
145
145
|
type.meta(source: relation, read: options[:read])
|
@@ -147,8 +147,11 @@ module ROM
|
|
147
147
|
type.meta(source: relation, read: type.meta[:read].optional)
|
148
148
|
else
|
149
149
|
type.meta(source: relation)
|
150
|
-
end.meta(Attribute::META_OPTIONS.map { |opt|
|
150
|
+
end.meta(Attribute::META_OPTIONS.map { |opt|
|
151
|
+
[opt, options[opt]] if options.key?(opt)
|
152
|
+
}.compact.to_h)
|
151
153
|
end
|
154
|
+
# rubocop:enable Metrics/AbcSize
|
152
155
|
|
153
156
|
# Specify which key(s) should be the primary key
|
154
157
|
#
|
@@ -179,21 +182,19 @@ module ROM
|
|
179
182
|
end
|
180
183
|
|
181
184
|
# @api private
|
182
|
-
def call(&
|
183
|
-
instance_exec(&
|
185
|
+
def call(&)
|
186
|
+
instance_exec(&) if block_given?
|
184
187
|
instance_exec(&definition) if definition
|
185
188
|
|
186
189
|
schema_class.define(relation, **opts) do |schema|
|
187
|
-
plugins.
|
190
|
+
plugins.each_value do |plugin, options|
|
188
191
|
plugin.apply_to(schema, **options)
|
189
192
|
end
|
190
193
|
end
|
191
194
|
end
|
192
195
|
|
193
196
|
# @api private
|
194
|
-
def plugin_options(plugin)
|
195
|
-
@plugins[plugin][1]
|
196
|
-
end
|
197
|
+
def plugin_options(plugin) = @plugins[plugin][1]
|
197
198
|
|
198
199
|
private
|
199
200
|
|
data/lib/rom/schema/inferrer.rb
CHANGED
@@ -24,10 +24,10 @@ module ROM
|
|
24
24
|
# @return [Class(ROM::Attribute)]
|
25
25
|
defines :attributes_inferrer, :attr_class
|
26
26
|
|
27
|
-
MissingAttributesError = Class.new(StandardError) do
|
27
|
+
MissingAttributesError = ::Class.new(::StandardError) do
|
28
28
|
def initialize(name, attributes)
|
29
29
|
super(
|
30
|
-
"Following attributes in #{Relation::Name[name].relation.inspect} schema cannot "\
|
30
|
+
"Following attributes in #{Relation::Name[name].relation.inspect} schema cannot " \
|
31
31
|
"be inferred and have to be defined explicitly: #{attributes.map(&:inspect).join(', ')}"
|
32
32
|
)
|
33
33
|
end
|
@@ -39,7 +39,7 @@ module ROM
|
|
39
39
|
|
40
40
|
attr_class Attribute
|
41
41
|
|
42
|
-
include Dry::Equalizer(:options)
|
42
|
+
include ::Dry::Equalizer(:options)
|
43
43
|
|
44
44
|
# @!attribute [r] attr_class
|
45
45
|
# @return [Class(ROM::Attribute)]
|
@@ -78,6 +78,7 @@ module ROM
|
|
78
78
|
end
|
79
79
|
|
80
80
|
# @api private
|
81
|
+
# rubocop:disable Metrics/AbcSize
|
81
82
|
def merge_attributes(defined, inferred)
|
82
83
|
type_lookup = lambda do |attrs, name|
|
83
84
|
attrs.find { |a| a.name == name }.type
|
@@ -99,6 +100,7 @@ module ROM
|
|
99
100
|
defined_names.include?(attr.name)
|
100
101
|
end
|
101
102
|
end
|
103
|
+
# rubocop:enable Metrics/AbcSize
|
102
104
|
end
|
103
105
|
end
|
104
106
|
end
|
data/lib/rom/schema.rb
CHANGED
@@ -31,6 +31,7 @@ module ROM
|
|
31
31
|
# schemas are merged, and we know which attributes belong to which relation.
|
32
32
|
#
|
33
33
|
# @api public
|
34
|
+
# rubocop:disable Metrics/ClassLength
|
34
35
|
class Schema
|
35
36
|
include Memoizable
|
36
37
|
|
@@ -39,7 +40,7 @@ module ROM
|
|
39
40
|
subscribe('configuration.relations.registry.created') do |event|
|
40
41
|
registry = event[:registry]
|
41
42
|
|
42
|
-
registry.
|
43
|
+
registry.each_value do |relation|
|
43
44
|
unless relation.schema.frozen?
|
44
45
|
relation.schema.finalize_associations!(relations: registry)
|
45
46
|
relation.schema.finalize!
|
@@ -160,12 +161,11 @@ module ROM
|
|
160
161
|
end
|
161
162
|
|
162
163
|
# @api private
|
163
|
-
def initialize(
|
164
|
+
def initialize(*, **)
|
164
165
|
super
|
165
166
|
|
166
167
|
yield(self) if block_given?
|
167
168
|
end
|
168
|
-
ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
|
169
169
|
|
170
170
|
# Abstract method for creating a new relation based on schema definition
|
171
171
|
#
|
@@ -180,27 +180,21 @@ module ROM
|
|
180
180
|
# @return [Relation]
|
181
181
|
#
|
182
182
|
# @api public
|
183
|
-
def call(relation)
|
184
|
-
relation
|
185
|
-
end
|
183
|
+
def call(relation) = relation
|
186
184
|
|
187
185
|
# Iterate over schema's attributes
|
188
186
|
#
|
189
187
|
# @yield [Attribute]
|
190
188
|
#
|
191
189
|
# @api public
|
192
|
-
def each(&
|
193
|
-
attributes.each(&block)
|
194
|
-
end
|
190
|
+
def each(&) = attributes.each(&)
|
195
191
|
|
196
192
|
# Check if schema has any attributes
|
197
193
|
#
|
198
194
|
# @return [TrueClass, FalseClass]
|
199
195
|
#
|
200
196
|
# @api public
|
201
|
-
def empty?
|
202
|
-
attributes.empty?
|
203
|
-
end
|
197
|
+
def empty? = attributes.empty?
|
204
198
|
|
205
199
|
# Coerce schema into a <AttributeName=>Attribute> Hash
|
206
200
|
#
|
@@ -208,7 +202,11 @@ module ROM
|
|
208
202
|
#
|
209
203
|
# @api public
|
210
204
|
def to_h
|
211
|
-
|
205
|
+
if block_given?
|
206
|
+
super
|
207
|
+
else
|
208
|
+
super { [_1.name, _1] }
|
209
|
+
end
|
212
210
|
end
|
213
211
|
|
214
212
|
# Return attribute
|
@@ -250,9 +248,7 @@ module ROM
|
|
250
248
|
# @return [Schema]
|
251
249
|
#
|
252
250
|
# @api public
|
253
|
-
def exclude(*names)
|
254
|
-
project(*(map(&:name) - names))
|
255
|
-
end
|
251
|
+
def exclude(*names) = project(*(map(&:name) - names))
|
256
252
|
|
257
253
|
# Project a schema with renamed attributes
|
258
254
|
#
|
@@ -309,9 +305,7 @@ module ROM
|
|
309
305
|
# @return [Array<Attribute>]
|
310
306
|
#
|
311
307
|
# @api public
|
312
|
-
def primary_key
|
313
|
-
select(&:primary_key?)
|
314
|
-
end
|
308
|
+
def primary_key = select(&:primary_key?)
|
315
309
|
|
316
310
|
# Merge with another schema
|
317
311
|
#
|
@@ -320,9 +314,7 @@ module ROM
|
|
320
314
|
# @return [Schema]
|
321
315
|
#
|
322
316
|
# @api public
|
323
|
-
def merge(other)
|
324
|
-
append(*other)
|
325
|
-
end
|
317
|
+
def merge(other) = append(*other)
|
326
318
|
alias_method :+, :merge
|
327
319
|
|
328
320
|
# Append more attributes to the schema
|
@@ -343,9 +335,9 @@ module ROM
|
|
343
335
|
# @return [Schema]
|
344
336
|
#
|
345
337
|
# @api public
|
346
|
-
def uniq(&
|
347
|
-
if
|
348
|
-
new(attributes.uniq(&
|
338
|
+
def uniq(&)
|
339
|
+
if block_given?
|
340
|
+
new(attributes.uniq(&))
|
349
341
|
else
|
350
342
|
new(attributes.uniq(&:name))
|
351
343
|
end
|
@@ -367,9 +359,7 @@ module ROM
|
|
367
359
|
# @return [Boolean]
|
368
360
|
#
|
369
361
|
# @api public
|
370
|
-
def canonical?
|
371
|
-
equal?(canonical)
|
372
|
-
end
|
362
|
+
def canonical? = equal?(canonical)
|
373
363
|
|
374
364
|
# Finalize a schema
|
375
365
|
#
|
@@ -390,7 +380,7 @@ module ROM
|
|
390
380
|
# @return [self]
|
391
381
|
#
|
392
382
|
# @api private
|
393
|
-
def finalize_attributes!(gateway: nil,
|
383
|
+
def finalize_attributes!(gateway: nil, **)
|
394
384
|
inferrer.(self, gateway).each { |key, value| set!(key, value) }
|
395
385
|
|
396
386
|
yield if block_given?
|
@@ -407,7 +397,7 @@ module ROM
|
|
407
397
|
# @return [self]
|
408
398
|
#
|
409
399
|
# @api private
|
410
|
-
def finalize_associations!(
|
400
|
+
def finalize_associations!(**)
|
411
401
|
set!(:associations, yield) if associations.any?
|
412
402
|
self
|
413
403
|
end
|
@@ -421,7 +411,7 @@ module ROM
|
|
421
411
|
# @api private
|
422
412
|
def to_output_hash
|
423
413
|
HASH_SCHEMA.schema(
|
424
|
-
|
414
|
+
to_h { |attr| [attr.key, attr.to_read_type] }
|
425
415
|
)
|
426
416
|
end
|
427
417
|
|
@@ -435,7 +425,7 @@ module ROM
|
|
435
425
|
# @api private
|
436
426
|
def to_input_hash
|
437
427
|
HASH_SCHEMA.schema(
|
438
|
-
|
428
|
+
to_h { |attr| [attr.name, attr.to_write_type] }
|
439
429
|
)
|
440
430
|
end
|
441
431
|
|
@@ -444,9 +434,7 @@ module ROM
|
|
444
434
|
# @return [Array]
|
445
435
|
#
|
446
436
|
# @api public
|
447
|
-
def to_ast
|
448
|
-
[:schema, [name, attributes.map(&:to_ast)]]
|
449
|
-
end
|
437
|
+
def to_ast = [:schema, [name, attributes.map(&:to_ast)]]
|
450
438
|
|
451
439
|
# @api private
|
452
440
|
def set!(key, value)
|
@@ -458,20 +446,17 @@ module ROM
|
|
458
446
|
|
459
447
|
# @api private
|
460
448
|
def count_index
|
461
|
-
|
449
|
+
to_h { |attr| [attr.name, count { |a| a.name.eql?(attr.name) }] }
|
462
450
|
end
|
463
451
|
|
464
452
|
# @api private
|
465
|
-
def name_index
|
466
|
-
map { |attr| [attr.name, attr] }.to_h
|
467
|
-
end
|
453
|
+
def name_index = to_h { |attr| [attr.name, attr] }
|
468
454
|
|
469
455
|
# @api private
|
470
456
|
def source_index
|
471
457
|
select(&:source)
|
472
458
|
.group_by(&:source)
|
473
|
-
.
|
474
|
-
.to_h
|
459
|
+
.to_h { |src, grp| [src.to_sym, grp.to_h { |attr| [attr.name, attr] }] }
|
475
460
|
end
|
476
461
|
|
477
462
|
# @api private
|
@@ -489,4 +474,5 @@ module ROM
|
|
489
474
|
|
490
475
|
memoize :count_index, :name_index, :source_index, :to_ast, :to_input_hash, :to_output_hash
|
491
476
|
end
|
477
|
+
# rubocop:enable Metrics/ClassLength
|
492
478
|
end
|
@@ -44,11 +44,9 @@ module ROM
|
|
44
44
|
# @!attribute [r] globs
|
45
45
|
# @return [Hash] File globbing functions for each component dir
|
46
46
|
option :globs, default: lambda {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
}
|
51
|
-
]
|
47
|
+
component_dirs.transform_values { |path|
|
48
|
+
directory.join("#{path}/**/*.rb")
|
49
|
+
}
|
52
50
|
}
|
53
51
|
|
54
52
|
# Load relation files
|
@@ -78,7 +76,7 @@ module ROM
|
|
78
76
|
#
|
79
77
|
# @api private
|
80
78
|
def load_entities(entity)
|
81
|
-
Dir[globs[entity]].
|
79
|
+
Dir[globs[entity]].map do |file|
|
82
80
|
require file
|
83
81
|
klass_name =
|
84
82
|
case namespace
|