rom-core 5.1.1 → 5.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) 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 -9
  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 +11 -10
  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/combined.rb +1 -1
  48. data/lib/rom/relation/curried.rb +3 -2
  49. data/lib/rom/relation/loaded.rb +1 -0
  50. data/lib/rom/relation/materializable.rb +1 -0
  51. data/lib/rom/relation/name.rb +2 -2
  52. data/lib/rom/relation_registry.rb +1 -1
  53. data/lib/rom/schema.rb +22 -22
  54. data/lib/rom/schema/associations_dsl.rb +17 -17
  55. data/lib/rom/schema/dsl.rb +6 -6
  56. data/lib/rom/schema/inferrer.rb +2 -4
  57. data/lib/rom/setup.rb +2 -2
  58. data/lib/rom/setup/auto_registration.rb +2 -2
  59. data/lib/rom/setup/auto_registration_strategies/base.rb +1 -1
  60. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +4 -4
  61. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +1 -1
  62. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +1 -1
  63. data/lib/rom/setup/finalize/finalize_commands.rb +7 -4
  64. data/lib/rom/setup/finalize/finalize_mappers.rb +9 -8
  65. data/lib/rom/setup/finalize/finalize_relations.rb +2 -2
  66. data/lib/rom/struct.rb +1 -1
  67. data/lib/rom/struct_compiler.rb +7 -6
  68. data/lib/rom/support/configurable.rb +0 -6
  69. data/lib/rom/support/memoizable.rb +3 -2
  70. data/lib/rom/transaction.rb +1 -1
  71. data/lib/rom/transformer.rb +1 -0
  72. metadata +6 -6
@@ -26,21 +26,25 @@ module ROM
26
26
  option :cache, default: -> { Cache.new }
27
27
 
28
28
  # @api private
29
- def self.new(*args)
30
- case args.size
31
- when 0
32
- super({}, {})
33
- when 1
34
- super(*args, {})
29
+ def self.new(*args, **kwargs)
30
+ if args.empty? && kwargs.empty?
31
+ super({}, **{})
35
32
  else
36
- super(*args)
33
+ super
37
34
  end
38
35
  end
39
36
 
37
+ # Create a registry without options
38
+ #
39
+ # @api private
40
+ def self.build(elements = {})
41
+ new(elements, **{})
42
+ end
43
+
40
44
  # @api private
41
45
  def self.[](identifier)
42
46
  fetch_or_store(identifier) do
43
- Dry::Core::ClassBuilder
47
+ ::Dry::Core::ClassBuilder
44
48
  .new(parent: self, name: "#{name}[:#{identifier}]")
45
49
  .call
46
50
  end
@@ -53,7 +57,7 @@ module ROM
53
57
 
54
58
  # @api private
55
59
  def merge(other)
56
- self.class.new(Hash(other), options)
60
+ self.class.new(Hash(other), **options)
57
61
  end
58
62
 
59
63
  # @api private
@@ -62,16 +66,17 @@ module ROM
62
66
  end
63
67
 
64
68
  # @api private
65
- def map(&block)
69
+ def map
66
70
  new_elements = elements.each_with_object({}) do |(name, element), h|
67
71
  h[name] = yield(element)
68
72
  end
69
- self.class.new(new_elements, options)
73
+ self.class.new(new_elements, **options)
70
74
  end
71
75
 
72
76
  # @api private
73
77
  def each
74
78
  return to_enum unless block_given?
79
+
75
80
  elements.each { |element| yield(element) }
76
81
  end
77
82
 
@@ -82,7 +87,7 @@ module ROM
82
87
 
83
88
  # @api private
84
89
  def fetch(key)
85
- raise ArgumentError.new('key cannot be nil') if key.nil?
90
+ raise ArgumentError, 'key cannot be nil' if key.nil?
86
91
 
87
92
  elements.fetch(key.to_sym) do
88
93
  return yield if block_given?
@@ -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
@@ -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.uniq.map { |node| node.struct_namespace(struct_ns) }
25
+ new_nodes = nodes.uniq(&:name).map { |node| node.struct_namespace(struct_ns) }
26
26
 
27
27
  root =
28
28
  if relation.is_a?(self)
@@ -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
 
@@ -16,7 +16,7 @@ module ROM
16
16
  #
17
17
  # @api private
18
18
  class Name
19
- include Dry::Equalizer(:relation, :dataset)
19
+ include Dry::Equalizer(:relation, :dataset, :key)
20
20
 
21
21
  # Coerce an object to a Name instance
22
22
  #
@@ -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