rom-core 5.1.1 → 5.2.4

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 (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
@@ -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
@@ -46,8 +46,8 @@ module ROM
46
46
  # @return [Setup]
47
47
  #
48
48
  # @api public
49
- def auto_registration(directory, options = {})
50
- auto_registration = AutoRegistration.new(directory, options)
49
+ def auto_registration(directory, **options)
50
+ auto_registration = AutoRegistration.new(directory, **options)
51
51
  auto_registration.relations.map { |r| register_relation(r) }
52
52
  auto_registration.commands.map { |r| register_command(r) }
53
53
  auto_registration.mappers.map { |r| register_mapper(r) }
@@ -43,7 +43,7 @@ module ROM
43
43
 
44
44
  # @!attribute [r] globs
45
45
  # @return [Hash] File globbing functions for each component dir
46
- option :globs, default: -> {
46
+ option :globs, default: lambda {
47
47
  Hash[
48
48
  component_dirs.map { |component, path|
49
49
  [component, directory.join("#{path}/**/*.rb")]
@@ -78,7 +78,7 @@ module ROM
78
78
  #
79
79
  # @api private
80
80
  def load_entities(entity)
81
- Dir[globs[entity]].map do |file|
81
+ Dir[globs[entity]].sort.map do |file|
82
82
  require file
83
83
  klass_name =
84
84
  case namespace
@@ -13,7 +13,7 @@ module ROM
13
13
 
14
14
  PathnameType = Types.Instance(Pathname)
15
15
 
16
- EXTENSION_REGEX = /\.rb\z/
16
+ EXTENSION_REGEX = /\.rb\z/.freeze
17
17
 
18
18
  # @!attribute [r] file
19
19
  # @return [String] Name of a component file
@@ -32,7 +32,7 @@ module ROM
32
32
  attempted = []
33
33
 
34
34
  potential.map do |path|
35
- const_fragment = path.join("::")
35
+ const_fragment = path.join('::')
36
36
 
37
37
  constant = "#{namespace}::#{const_fragment}"
38
38
 
@@ -54,8 +54,8 @@ module ROM
54
54
 
55
55
  # @api private
56
56
  def name_error_message(attempted)
57
- "required file does not define expected constant name; either " \
58
- "register your constant explicitly of try following the path" \
57
+ 'required file does not define expected constant name; either ' \
58
+ 'register your constant explicitly of try following the path' \
59
59
  "naming convention like:\n\n\t- #{attempted.join("\n\t- ")}\n"
60
60
  end
61
61
 
@@ -76,7 +76,7 @@ module ROM
76
76
 
77
77
  # @api private
78
78
  def file_path
79
- File.dirname(file).split("/") - directory.to_s.split("/")
79
+ File.dirname(file).split('/') - directory.to_s.split('/')
80
80
  end
81
81
  end
82
82
  end
@@ -25,7 +25,7 @@ module ROM
25
25
  # @api private
26
26
  def call
27
27
  Inflector.camelize(
28
- file.sub(/^#{directory}\/#{entity}\//, '').sub(EXTENSION_REGEX, '')
28
+ file.sub(%r{^#{directory}/#{entity}/}, '').sub(EXTENSION_REGEX, '')
29
29
  )
30
30
  end
31
31
  end
@@ -21,7 +21,7 @@ module ROM
21
21
  # @api private
22
22
  def call
23
23
  Inflector.camelize(
24
- file.sub(/^#{directory.dirname}\//, '').sub(EXTENSION_REGEX, '')
24
+ file.sub(%r{^#{directory.dirname}/}, '').sub(EXTENSION_REGEX, '')
25
25
  )
26
26
  end
27
27
  end
@@ -41,13 +41,16 @@ module ROM
41
41
  klass.build(relation)
42
42
  end
43
43
 
44
- registry = Registry.new({})
44
+ registry = Registry.new
45
45
  compiler = CommandCompiler.new(@gateways, @relations, registry, notifications)
46
46
 
47
47
  @relations.each do |(name, relation)|
48
- commands.
49
- select { |c| c.relation.name == relation.name }.
50
- each { |c| relation.commands.elements[c.class.register_as || c.class.default_name] = c }
48
+ rel_commands = commands.select { |c| c.relation.name == relation.name }
49
+
50
+ rel_commands.each do |command|
51
+ identifier = command.class.register_as || command.class.default_name
52
+ relation.commands.elements[identifier] = command
53
+ end
51
54
 
52
55
  relation.commands.set_compiler(compiler)
53
56
  relation.commands.set_mappers(relation.mappers)
@@ -14,10 +14,10 @@ module ROM
14
14
 
15
15
  check_duplicate_registered_mappers
16
16
 
17
- @registry_hash = [@mapper_classes.map(&:base_relation) + @mapper_objects.keys].
18
- flatten.
19
- uniq.
20
- each_with_object({}) { |n, h| h[n] = {} }
17
+ @registry_hash = [@mapper_classes.map(&:base_relation) + @mapper_objects.keys]
18
+ .flatten
19
+ .uniq
20
+ .each_with_object({}) { |n, h| h[n] = {} }
21
21
  end
22
22
 
23
23
  # @api private
@@ -40,8 +40,9 @@ module ROM
40
40
  private
41
41
 
42
42
  def check_duplicate_registered_mappers
43
- mapper_relation_register = mapper_classes.map {|mapper_class| [mapper_class.relation, mapper_class.register_as].compact }
43
+ mapper_relation_register = mapper_classes.map { |mapper_class| [mapper_class.relation, mapper_class.register_as].compact }
44
44
  return if mapper_relation_register.uniq.count == mapper_classes.count
45
+
45
46
  mapper_relation_register.select { |relation_register_as| mapper_relation_register.count(relation_register_as) > 1 }
46
47
  .uniq
47
48
  .each do |duplicated_mappers|
@@ -52,9 +53,9 @@ module ROM
52
53
  end
53
54
 
54
55
  def build_mappers(relation_name)
55
- mapper_classes.
56
- select { |klass| klass.base_relation == relation_name }.
57
- each_with_object({}) { |klass, h| h[klass.register_as || klass.relation] = klass.build }
56
+ mapper_classes
57
+ .select { |klass| klass.base_relation == relation_name }
58
+ .each_with_object({}) { |klass, h| h[klass.register_as || klass.relation] = klass.build }
58
59
  end
59
60
  end
60
61
  end
@@ -43,7 +43,7 @@ module ROM
43
43
  "Relation with name #{key.inspect} registered more than once"
44
44
  end
45
45
 
46
- klass.use(:registry_reader, relation_names)
46
+ klass.use(:registry_reader, relations: relation_names)
47
47
 
48
48
  notifications.trigger('configuration.relations.class.ready', relation: klass, adapter: klass.adapter)
49
49
 
@@ -105,7 +105,7 @@ module ROM
105
105
 
106
106
  options = { __registry__: registry, mappers: mapper_registry(rel_key, klass), schema: schema, **plugin_options }
107
107
 
108
- klass.new(dataset, options)
108
+ klass.new(dataset, **options)
109
109
  end
110
110
 
111
111
  # @api private
@@ -102,7 +102,7 @@ module ROM
102
102
  def method_missing(*)
103
103
  super
104
104
  rescue NameError => error
105
- raise MissingAttribute.new { "#{ error.message } (attribute not loaded?)" }
105
+ raise MissingAttribute.new { "#{error.message} (attribute not loaded?)" }
106
106
  end
107
107
  end
108
108
  end
@@ -20,10 +20,11 @@ module ROM
20
20
  option :cache, default: -> { Cache.new }
21
21
 
22
22
  # @api private
23
- def initialize(*args)
23
+ def initialize(*)
24
24
  super
25
25
  @cache = cache.namespaced(:structs)
26
26
  end
27
+ ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
27
28
 
28
29
  # Build a struct class based on relation header ast
29
30
  #
@@ -84,7 +85,7 @@ module ROM
84
85
 
85
86
  # @api private
86
87
  def visit_constrained(node)
87
- definition, _ = node
88
+ definition, = node
88
89
 
89
90
  visit(definition)
90
91
  end
@@ -97,14 +98,14 @@ module ROM
97
98
 
98
99
  # @api private
99
100
  def build_class(name, parent, ns, &block)
100
- Dry::Core::ClassBuilder.
101
- new(name: class_name(name), parent: parent, namespace: ns).
102
- call(&block)
101
+ Dry::Core::ClassBuilder
102
+ .new(name: class_name(name), parent: parent, namespace: ns)
103
+ .call(&block)
103
104
  end
104
105
 
105
106
  # @api private
106
107
  def class_name(name)
107
- Inflector.classify(Inflector.singularize(name))
108
+ Inflector.classify(name)
108
109
  end
109
110
  end
110
111
  end
@@ -36,12 +36,6 @@ module ROM
36
36
  settings
37
37
  end
38
38
 
39
- # @api private
40
- def freeze
41
- settings.each_value(&:freeze)
42
- super
43
- end
44
-
45
39
  # @api private
46
40
  def respond_to_missing?(_name, _include_private = false)
47
41
  true
@@ -3,7 +3,7 @@
3
3
  module ROM
4
4
  # @api private
5
5
  module Memoizable
6
- MEMOIZED_HASH = {}
6
+ MEMOIZED_HASH = {}.freeze
7
7
 
8
8
  module ClassInterface
9
9
  # @api private
@@ -16,6 +16,7 @@ module ROM
16
16
  obj.instance_variable_set(:'@__memoized__', MEMOIZED_HASH.dup)
17
17
  obj
18
18
  end
19
+ ruby2_keywords(:new) if respond_to?(:ruby2_keywords, true)
19
20
  end
20
21
 
21
22
  def self.included(klass)
@@ -44,7 +45,7 @@ module ROM
44
45
  names.each do |name|
45
46
  meth = klass.instance_method(name)
46
47
 
47
- if meth.parameters.size > 0
48
+ if !meth.parameters.empty?
48
49
  define_method(name) do |*args|
49
50
  __memoized__[:"#{name}_#{args.hash}"] ||= super(*args)
50
51
  end
@@ -7,7 +7,7 @@ module ROM
7
7
  Rollback = Class.new(StandardError)
8
8
 
9
9
  # @api private
10
- def run(opts = EMPTY_HASH)
10
+ def run(_opts = EMPTY_HASH)
11
11
  yield(self)
12
12
  rescue Rollback
13
13
  # noop
@@ -53,6 +53,7 @@ module ROM
53
53
  # @api public
54
54
  def self.relation(name = Undefined, options = EMPTY_HASH)
55
55
  return @relation if name.equal?(Undefined) && defined?(@relation)
56
+
56
57
  register_as(options.fetch(:as, name))
57
58
  @relation = name
58
59
  end
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.1.1
4
+ version: 5.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-06 00:00:00.000000000 Z
11
+ date: 2020-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -327,7 +327,7 @@ metadata:
327
327
  documentation_uri: https://api.rom-rb.org/rom/
328
328
  mailing_list_uri: https://discourse.rom-rb.org/
329
329
  bug_tracker_uri: https://github.com/rom-rb/rom/issues
330
- post_install_message:
330
+ post_install_message:
331
331
  rdoc_options: []
332
332
  require_paths:
333
333
  - lib
@@ -342,8 +342,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
342
342
  - !ruby/object:Gem::Version
343
343
  version: '0'
344
344
  requirements: []
345
- rubygems_version: 3.0.3
346
- signing_key:
345
+ rubygems_version: 3.2.3
346
+ signing_key:
347
347
  specification_version: 4
348
348
  summary: Ruby Object Mapper
349
349
  test_files: []