rom-core 5.1.2 → 5.2.1

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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rom/array_dataset.rb +4 -4
  3. data/lib/rom/association_set.rb +2 -3
  4. data/lib/rom/associations/definitions/abstract.rb +2 -2
  5. data/lib/rom/associations/many_to_many.rb +1 -0
  6. data/lib/rom/attribute.rb +5 -4
  7. data/lib/rom/auto_curry.rb +2 -0
  8. data/lib/rom/command.rb +6 -6
  9. data/lib/rom/command_compiler.rb +5 -7
  10. data/lib/rom/commands/class_interface.rb +7 -7
  11. data/lib/rom/commands/composite.rb +1 -1
  12. data/lib/rom/commands/graph/input_evaluator.rb +1 -1
  13. data/lib/rom/commands/lazy.rb +2 -1
  14. data/lib/rom/commands/lazy/create.rb +1 -1
  15. data/lib/rom/commands/lazy/update.rb +3 -3
  16. data/lib/rom/configuration.rb +5 -5
  17. data/lib/rom/configuration_dsl/relation.rb +1 -1
  18. data/lib/rom/constants.rb +1 -1
  19. data/lib/rom/core/version.rb +1 -1
  20. data/lib/rom/data_proxy.rb +3 -2
  21. data/lib/rom/enumerable_dataset.rb +4 -4
  22. data/lib/rom/environment.rb +0 -1
  23. data/lib/rom/header/attribute.rb +2 -4
  24. data/lib/rom/initializer.rb +9 -7
  25. data/lib/rom/lint/gateway.rb +1 -3
  26. data/lib/rom/lint/linter.rb +3 -4
  27. data/lib/rom/lint/spec.rb +2 -2
  28. data/lib/rom/mapper.rb +4 -3
  29. data/lib/rom/mapper/attribute_dsl.rb +5 -5
  30. data/lib/rom/mapper/dsl.rb +2 -5
  31. data/lib/rom/mapper/model_dsl.rb +2 -1
  32. data/lib/rom/mapper_compiler.rb +2 -1
  33. data/lib/rom/mapper_registry.rb +3 -3
  34. data/lib/rom/memory/dataset.rb +4 -3
  35. data/lib/rom/pipeline.rb +3 -1
  36. data/lib/rom/plugin.rb +3 -3
  37. data/lib/rom/plugin_registry.rb +1 -1
  38. data/lib/rom/plugins/command/schema.rb +2 -2
  39. data/lib/rom/plugins/relation/instrumentation.rb +1 -1
  40. data/lib/rom/plugins/relation/registry_reader.rb +4 -3
  41. data/lib/rom/plugins/schema/timestamps.rb +4 -6
  42. data/lib/rom/processor.rb +1 -1
  43. data/lib/rom/processor/transproc.rb +16 -19
  44. data/lib/rom/registry.rb +17 -12
  45. data/lib/rom/relation.rb +6 -6
  46. data/lib/rom/relation/class_interface.rb +9 -8
  47. data/lib/rom/relation/curried.rb +3 -2
  48. data/lib/rom/relation/loaded.rb +1 -0
  49. data/lib/rom/relation/materializable.rb +1 -0
  50. data/lib/rom/relation/name.rb +1 -1
  51. data/lib/rom/relation_registry.rb +1 -1
  52. data/lib/rom/schema.rb +22 -22
  53. data/lib/rom/schema/associations_dsl.rb +17 -17
  54. data/lib/rom/schema/dsl.rb +6 -6
  55. data/lib/rom/schema/inferrer.rb +2 -4
  56. data/lib/rom/setup.rb +2 -2
  57. data/lib/rom/setup/auto_registration.rb +1 -1
  58. data/lib/rom/setup/auto_registration_strategies/base.rb +1 -1
  59. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +4 -4
  60. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +1 -1
  61. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +1 -1
  62. data/lib/rom/setup/finalize/finalize_commands.rb +7 -4
  63. data/lib/rom/setup/finalize/finalize_mappers.rb +9 -8
  64. data/lib/rom/setup/finalize/finalize_relations.rb +2 -2
  65. data/lib/rom/struct.rb +1 -1
  66. data/lib/rom/struct_compiler.rb +6 -5
  67. data/lib/rom/support/memoizable.rb +3 -2
  68. data/lib/rom/transaction.rb +1 -1
  69. data/lib/rom/transformer.rb +1 -0
  70. metadata +3 -3
@@ -156,7 +156,7 @@ module ROM
156
156
  # @!attribute [r] output_schema
157
157
  # @return [Object#[]] tuple processing function, uses schema or defaults to NOOP_OUTPUT_SCHEMA
158
158
  # @api private
159
- option :output_schema, default: -> {
159
+ option :output_schema, default: lambda {
160
160
  schema.any?(&:read?) ? schema.to_output_hash : NOOP_OUTPUT_SCHEMA
161
161
  }
162
162
 
@@ -396,7 +396,7 @@ module ROM
396
396
  #
397
397
  # @api private
398
398
  def schema?
399
- ! schema.empty?
399
+ !schema.empty?
400
400
  end
401
401
 
402
402
  # Return a new relation with provided dataset and additional options
@@ -417,7 +417,7 @@ module ROM
417
417
  # @param [Hash] new_opts Additional options
418
418
  #
419
419
  # @api public
420
- def new(dataset, new_opts = EMPTY_HASH)
420
+ def new(dataset, **new_opts)
421
421
  opts =
422
422
  if new_opts.empty?
423
423
  options
@@ -427,7 +427,7 @@ module ROM
427
427
  options.merge(new_opts)
428
428
  end
429
429
 
430
- self.class.new(dataset, opts)
430
+ self.class.new(dataset, **opts)
431
431
  end
432
432
 
433
433
  undef_method :with
@@ -450,7 +450,7 @@ module ROM
450
450
  opts
451
451
  end
452
452
 
453
- new(dataset, options.merge(new_options))
453
+ new(dataset, **options, **new_options)
454
454
  end
455
455
 
456
456
  # Return schema's association set (empty by default)
@@ -473,7 +473,7 @@ module ROM
473
473
 
474
474
  # @api private
475
475
  def attr_ast
476
- schema.map { |t| t.to_read_ast }
476
+ schema.map(&:to_read_ast)
477
477
  end
478
478
 
479
479
  # @api private
@@ -95,12 +95,12 @@ module ROM
95
95
  if defined?(@schema) && !block && !infer
96
96
  @schema
97
97
  elsif block || infer
98
- raise MissingSchemaClassError.new(self) unless schema_class
98
+ raise MissingSchemaClassError, self unless schema_class
99
99
 
100
100
  ds_name = dataset || schema_opts.fetch(:dataset, default_name.dataset)
101
101
  relation = as || schema_opts.fetch(:relation, ds_name)
102
102
 
103
- raise InvalidRelationName.new(relation) if invalid_relation_name?(relation)
103
+ raise InvalidRelationName, relation if invalid_relation_name?(relation)
104
104
 
105
105
  @relation_name = Name[relation, ds_name]
106
106
 
@@ -133,7 +133,8 @@ module ROM
133
133
  # @!attribute [r] relation_name
134
134
  # @return [Name] Qualified relation name
135
135
  def relation_name
136
- raise MissingSchemaError.new(self) unless defined?(@relation_name)
136
+ raise MissingSchemaError, self unless defined?(@relation_name)
137
+
137
138
  @relation_name
138
139
  end
139
140
 
@@ -188,7 +189,7 @@ module ROM
188
189
  # @api public
189
190
  def view(*args, &block)
190
191
  if args.size == 1 && block.arity > 0
191
- raise ArgumentError, "schema attribute names must be provided as the second argument"
192
+ raise ArgumentError, 'schema attribute names must be provided as the second argument'
192
193
  end
193
194
 
194
195
  name, new_schema_fn, relation_block =
@@ -248,8 +249,8 @@ module ROM
248
249
  # @option options [Symbol] :adapter (:default) first adapter to check for plugin
249
250
  #
250
251
  # @api public
251
- def use(plugin, options = EMPTY_HASH)
252
- ROM.plugin_registry[:relation].fetch(plugin, adapter).apply_to(self, options)
252
+ def use(plugin, **options)
253
+ ROM.plugin_registry[:relation].fetch(plugin, adapter).apply_to(self, **options)
253
254
  end
254
255
 
255
256
  # Build default mapper registry
@@ -261,13 +262,13 @@ module ROM
261
262
  adapter_ns = ROM.adapters[adapter]
262
263
 
263
264
  compiler =
264
- if adapter_ns && adapter_ns.const_defined?(:MapperCompiler)
265
+ if adapter_ns&.const_defined?(:MapperCompiler)
265
266
  adapter_ns.const_get(:MapperCompiler)
266
267
  else
267
268
  MapperCompiler
268
269
  end
269
270
 
270
- MapperRegistry.new({}, { compiler: compiler.new(opts) }.merge(opts))
271
+ MapperRegistry.new({}, compiler: compiler.new(**opts), **opts)
271
272
  end
272
273
 
273
274
  # @api private
@@ -97,8 +97,8 @@ module ROM
97
97
  private
98
98
 
99
99
  # @api private
100
- def __new__(relation, new_opts = EMPTY_HASH)
101
- self.class.new(relation, new_opts.empty? ? options : options.merge(new_opts))
100
+ def __new__(relation, **new_opts)
101
+ self.class.new(relation, **options, **new_opts)
102
102
  end
103
103
 
104
104
  # @api private
@@ -122,6 +122,7 @@ module ROM
122
122
  super
123
123
  end
124
124
  end
125
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
125
126
  end
126
127
  end
127
128
  end
@@ -47,6 +47,7 @@ module ROM
47
47
  # @api public
48
48
  def each
49
49
  return to_enum unless block_given?
50
+
50
51
  collection.each { |tuple| yield(tuple) }
51
52
  end
52
53
 
@@ -23,6 +23,7 @@ module ROM
23
23
  # @api public
24
24
  def each
25
25
  return to_enum unless block_given?
26
+
26
27
  to_a.each { |tuple| yield(tuple) }
27
28
  end
28
29
 
@@ -106,7 +106,7 @@ module ROM
106
106
  #
107
107
  # @api private
108
108
  def inspect
109
- "#{self.class.name}(#{to_s})"
109
+ "#{self.class.name}(#{self})"
110
110
  end
111
111
  end
112
112
  end
@@ -6,7 +6,7 @@ module ROM
6
6
  # @api private
7
7
  class RelationRegistry < Registry
8
8
  # @api private
9
- def initialize(elements = {}, options = {})
9
+ def initialize(elements = {}, **options)
10
10
  super
11
11
  yield(self, elements) if block_given?
12
12
  end
@@ -60,7 +60,7 @@ module ROM
60
60
  end
61
61
  end
62
62
 
63
- EMPTY_ASSOCIATION_SET = AssociationSet.new(EMPTY_HASH).freeze
63
+ EMPTY_ASSOCIATION_SET = AssociationSet.build(EMPTY_HASH).freeze
64
64
 
65
65
  DEFAULT_INFERRER = Inferrer.new(enabled: false).freeze
66
66
 
@@ -73,9 +73,9 @@ module ROM
73
73
  k.required(false)
74
74
  end
75
75
 
76
- HASH_SCHEMA = Types::Coercible::Hash.
77
- schema(EMPTY_HASH).
78
- with_type_transform(type_transformation)
76
+ HASH_SCHEMA = Types::Coercible::Hash
77
+ .schema(EMPTY_HASH)
78
+ .with_type_transform(type_transformation)
79
79
 
80
80
  extend Initializer
81
81
 
@@ -147,7 +147,7 @@ module ROM
147
147
  # @return [Hash] A hash with `:type` and `:options` keys.
148
148
  #
149
149
  # @api private
150
- def self.build_attribute_info(type, options)
150
+ def self.build_attribute_info(type, **options)
151
151
  {
152
152
  type: type,
153
153
  options: options
@@ -157,7 +157,7 @@ module ROM
157
157
  # @api private
158
158
  def self.attributes(attributes, attr_class)
159
159
  attributes.map do |attr|
160
- attr_class.new(attr[:type], attr.fetch(:options))
160
+ attr_class.new(attr[:type], **attr.fetch(:options))
161
161
  end
162
162
  end
163
163
 
@@ -167,6 +167,7 @@ module ROM
167
167
 
168
168
  yield(self) if block_given?
169
169
  end
170
+ ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
170
171
 
171
172
  # Abstract method for creating a new relation based on schema definition
172
173
  #
@@ -200,7 +201,7 @@ module ROM
200
201
  #
201
202
  # @api public
202
203
  def empty?
203
- attributes.size == 0
204
+ attributes.empty?
204
205
  end
205
206
 
206
207
  # Coerce schema into a <AttributeName=>Attribute> Hash
@@ -228,9 +229,7 @@ module ROM
228
229
  source_index[src][key]
229
230
  end
230
231
 
231
- unless attr
232
- raise(KeyError, "#{key.inspect} attribute doesn't exist in #{src} schema")
233
- end
232
+ raise(KeyError, "#{key.inspect} attribute doesn't exist in #{src} schema") unless attr
234
233
 
235
234
  attr
236
235
  end
@@ -362,7 +361,7 @@ module ROM
362
361
  #
363
362
  # @api public
364
363
  def key?(name)
365
- ! attributes.detect { |attr| attr.name == name }.nil?
364
+ !attributes.detect { |attr| attr.name == name }.nil?
366
365
  end
367
366
 
368
367
  # Return if a schema is canonical
@@ -371,7 +370,7 @@ module ROM
371
370
  #
372
371
  # @api public
373
372
  def canonical?
374
- self.equal?(canonical)
373
+ equal?(canonical)
375
374
  end
376
375
 
377
376
  # Finalize a schema
@@ -379,8 +378,9 @@ module ROM
379
378
  # @return [self]
380
379
  #
381
380
  # @api private
382
- def finalize!(**opts)
381
+ def finalize!(**_opts)
383
382
  return self if frozen?
383
+
384
384
  freeze
385
385
  end
386
386
 
@@ -452,7 +452,7 @@ module ROM
452
452
 
453
453
  # @api private
454
454
  def set!(key, value)
455
- instance_variable_set("@#{ key }", value)
455
+ instance_variable_set("@#{key}", value)
456
456
  options[key] = value
457
457
  end
458
458
 
@@ -470,10 +470,10 @@ module ROM
470
470
 
471
471
  # @api private
472
472
  def source_index
473
- select(&:source).
474
- group_by(&:source).
475
- map { |src, grp| [src.to_sym, grp.map { |attr| [attr.name, attr] }.to_h] }.
476
- to_h
473
+ select(&:source)
474
+ .group_by(&:source)
475
+ .map { |src, grp| [src.to_sym, grp.map { |attr| [attr.name, attr] }.to_h] }
476
+ .to_h
477
477
  end
478
478
 
479
479
  # @api private
@@ -483,10 +483,10 @@ module ROM
483
483
 
484
484
  # @api private
485
485
  def initialize_primary_key_names
486
- if primary_key.size > 0
487
- set!(:primary_key_name, primary_key[0].name)
488
- set!(:primary_key_names, primary_key.map(&:name))
489
- end
486
+ return if primary_key.empty?
487
+
488
+ set!(:primary_key_name, primary_key[0].name)
489
+ set!(:primary_key_names, primary_key.map(&:name))
490
490
  end
491
491
 
492
492
  memoize :count_index, :name_index, :source_index, :to_ast, :to_input_hash, :to_output_hash
@@ -59,11 +59,11 @@ module ROM
59
59
  # @see #many_to_many
60
60
  #
61
61
  # @api public
62
- def one_to_many(target, options = {})
62
+ def one_to_many(target, **options)
63
63
  if options[:through]
64
- many_to_many(target, options)
64
+ many_to_many(target, **options)
65
65
  else
66
- add(::ROM::Associations::Definitions::OneToMany.new(source, target, options))
66
+ add(::ROM::Associations::Definitions::OneToMany.new(source, target, **options))
67
67
  end
68
68
  end
69
69
  alias_method :has_many, :one_to_many
@@ -84,11 +84,11 @@ module ROM
84
84
  # @see #belongs_to
85
85
  #
86
86
  # @api public
87
- def one_to_one(target, options = {})
87
+ def one_to_one(target, **options)
88
88
  if options[:through]
89
- one_to_one_through(target, options)
89
+ one_to_one_through(target, **options)
90
90
  else
91
- add(::ROM::Associations::Definitions::OneToOne.new(source, target, options))
91
+ add(::ROM::Associations::Definitions::OneToOne.new(source, target, **options))
92
92
  end
93
93
  end
94
94
 
@@ -100,8 +100,8 @@ module ROM
100
100
  # @return [Associations::OneToOneThrough]
101
101
  #
102
102
  # @api public
103
- def one_to_one_through(target, options = {})
104
- add(::ROM::Associations::Definitions::OneToOneThrough.new(source, target, options))
103
+ def one_to_one_through(target, **options)
104
+ add(::ROM::Associations::Definitions::OneToOneThrough.new(source, target, **options))
105
105
  end
106
106
 
107
107
  # Establish a many-to-many association
@@ -117,8 +117,8 @@ module ROM
117
117
  # @see #one_to_many
118
118
  #
119
119
  # @api public
120
- def many_to_many(target, options = {})
121
- add(::ROM::Associations::Definitions::ManyToMany.new(source, target, options))
120
+ def many_to_many(target, **options)
121
+ add(::ROM::Associations::Definitions::ManyToMany.new(source, target, **options))
122
122
  end
123
123
 
124
124
  # Establish a many-to-one association
@@ -134,8 +134,8 @@ module ROM
134
134
  # @see #one_to_many
135
135
  #
136
136
  # @api public
137
- def many_to_one(target, options = {})
138
- add(::ROM::Associations::Definitions::ManyToOne.new(source, target, options))
137
+ def many_to_one(target, **options)
138
+ add(::ROM::Associations::Definitions::ManyToOne.new(source, target, **options))
139
139
  end
140
140
 
141
141
  # Shortcut for many_to_one which sets alias automatically
@@ -151,8 +151,8 @@ module ROM
151
151
  # @return [Associations::ManyToOne]
152
152
  #
153
153
  # @api public
154
- def belongs_to(target, options = {})
155
- many_to_one(dataset_name(target), { as: target }.merge(options))
154
+ def belongs_to(target, **options)
155
+ many_to_one(dataset_name(target), as: target, **options)
156
156
  end
157
157
 
158
158
  # Shortcut for one_to_one which sets alias automatically
@@ -168,8 +168,8 @@ module ROM
168
168
  # @return [Associations::OneToOne]
169
169
  #
170
170
  # @api public
171
- def has_one(target, options = {})
172
- one_to_one(dataset_name(target), { as: target }.merge(options))
171
+ def has_one(target, **options)
172
+ one_to_one(dataset_name(target), as: target, **options)
173
173
  end
174
174
 
175
175
  # Return an association set for a schema
@@ -178,7 +178,7 @@ module ROM
178
178
  #
179
179
  # @api private
180
180
  def call
181
- AssociationSet[source.relation].new(registry)
181
+ AssociationSet[source.relation].build(registry)
182
182
  end
183
183
 
184
184
  private
@@ -12,7 +12,7 @@ module ROM
12
12
  #
13
13
  # @api public
14
14
  class DSL < BasicObject
15
- KERNEL_METHODS = %i(extend method).freeze
15
+ KERNEL_METHODS = %i[extend method].freeze
16
16
  KERNEL_METHODS.each { |m| define_method(m, ::Kernel.instance_method(m)) }
17
17
 
18
18
  extend Initializer
@@ -65,6 +65,7 @@ module ROM
65
65
 
66
66
  @definition = block
67
67
  end
68
+ ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
68
69
 
69
70
  # Defines a relation attribute with its type and options.
70
71
  #
@@ -78,7 +79,7 @@ module ROM
78
79
  def attribute(name, type_or_options, options = EMPTY_HASH)
79
80
  if attributes.key?(name)
80
81
  ::Kernel.raise ::ROM::AttributeAlreadyDefinedError,
81
- "Attribute #{ name.inspect } already defined"
82
+ "Attribute #{name.inspect} already defined"
82
83
  end
83
84
 
84
85
  attributes[name] = build_attribute_info(name, type_or_options, options)
@@ -132,8 +133,7 @@ module ROM
132
133
  [build_type(type_or_options, options), options]
133
134
  end
134
135
  Schema.build_attribute_info(
135
- type,
136
- options.merge(name: name)
136
+ type, **options, name: name
137
137
  )
138
138
  end
139
139
 
@@ -185,9 +185,9 @@ module ROM
185
185
  instance_exec(&block) if block
186
186
  instance_exec(&definition) if definition
187
187
 
188
- schema_class.define(relation, opts) do |schema|
188
+ schema_class.define(relation, **opts) do |schema|
189
189
  plugins.values.each do |plugin, options|
190
- plugin.apply_to(schema, options)
190
+ plugin.apply_to(schema, **options)
191
191
  end
192
192
  end
193
193
  end
@@ -76,9 +76,7 @@ module ROM
76
76
  def check_all_attributes_defined(schema, all_known, not_inferred)
77
77
  not_defined = not_inferred - all_known.map(&:name)
78
78
 
79
- if not_defined.size > 0
80
- raise MissingAttributesError.new(schema.name, not_defined)
81
- end
79
+ raise MissingAttributesError.new(schema.name, not_defined) unless not_defined.empty?
82
80
  end
83
81
 
84
82
  # @api private
@@ -91,7 +89,7 @@ module ROM
91
89
  attrs << if attr.type.nil?
92
90
  attr.class.new(
93
91
  type_lookup.(inferred, attr.name),
94
- attr.options
92
+ **attr.options
95
93
  )
96
94
  else
97
95
  attr