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
@@ -55,14 +55,12 @@ module ROM
|
|
55
55
|
# @api private
|
56
56
|
def name_error_message(attempted)
|
57
57
|
'required file does not define expected constant name; either ' \
|
58
|
-
|
59
|
-
|
58
|
+
'register your constant explicitly of try following the path' \
|
59
|
+
"naming convention like:\n\n\t- #{attempted.join("\n\t- ")}\n"
|
60
60
|
end
|
61
61
|
|
62
62
|
# @api private
|
63
|
-
def filename
|
64
|
-
Pathname(file).basename('.rb')
|
65
|
-
end
|
63
|
+
def filename = Pathname(file).basename('.rb')
|
66
64
|
|
67
65
|
# @api private
|
68
66
|
def ns_const
|
@@ -70,9 +68,7 @@ module ROM
|
|
70
68
|
end
|
71
69
|
|
72
70
|
# @api private
|
73
|
-
def path_arr
|
74
|
-
file_path << filename
|
75
|
-
end
|
71
|
+
def path_arr = file_path << filename
|
76
72
|
|
77
73
|
# @api private
|
78
74
|
def file_path
|
@@ -26,6 +26,8 @@ module ROM
|
|
26
26
|
# @return [Hash]
|
27
27
|
#
|
28
28
|
# @api private
|
29
|
+
#
|
30
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
29
31
|
def run!
|
30
32
|
commands = @command_classes.map do |klass|
|
31
33
|
relation = @relations[klass.relation]
|
@@ -60,6 +62,7 @@ module ROM
|
|
60
62
|
|
61
63
|
registry
|
62
64
|
end
|
65
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
63
66
|
end
|
64
67
|
end
|
65
68
|
end
|
@@ -5,7 +5,9 @@ require 'rom/registry'
|
|
5
5
|
module ROM
|
6
6
|
class Finalize
|
7
7
|
class FinalizeMappers
|
8
|
-
attr_reader :mapper_classes
|
8
|
+
attr_reader :mapper_classes
|
9
|
+
attr_reader :mapper_objects
|
10
|
+
attr_reader :registry_hash
|
9
11
|
|
10
12
|
# @api private
|
11
13
|
def initialize(mapper_classes, mapper_objects)
|
@@ -17,21 +19,21 @@ module ROM
|
|
17
19
|
@registry_hash = [@mapper_classes.map(&:base_relation) + @mapper_objects.keys]
|
18
20
|
.flatten
|
19
21
|
.uniq
|
20
|
-
.
|
22
|
+
.to_h { [_1, {}] }
|
21
23
|
end
|
22
24
|
|
23
25
|
# @api private
|
24
26
|
def run!
|
25
27
|
cache = Cache.new
|
26
28
|
|
27
|
-
mappers = registry_hash.
|
29
|
+
mappers = registry_hash.to_h do |relation_name, relation_mappers|
|
28
30
|
relation_mappers.update(build_mappers(relation_name))
|
29
31
|
|
30
32
|
if mapper_objects.key?(relation_name)
|
31
33
|
relation_mappers.update(mapper_objects[relation_name])
|
32
34
|
end
|
33
35
|
|
34
|
-
|
36
|
+
[relation_name, MapperRegistry.new(relation_mappers, cache: cache)]
|
35
37
|
end
|
36
38
|
|
37
39
|
Registry.new(mappers, cache: cache)
|
@@ -40,22 +42,22 @@ module ROM
|
|
40
42
|
private
|
41
43
|
|
42
44
|
def check_duplicate_registered_mappers
|
43
|
-
|
44
|
-
return if mapper_relation_register.uniq.count == mapper_classes.count
|
45
|
+
duplicates = mapper_classes.map { [_1.relation, _1.register_as] }.tally.select { _2 > 1 }
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
case duplicates.first
|
48
|
+
in [rel, as], _
|
49
|
+
raise MapperAlreadyDefinedError,
|
50
|
+
"Mapper with `register_as #{as.inspect}` registered more " \
|
51
|
+
"than once for relation #{rel.inspect}"
|
52
|
+
else
|
53
|
+
nil
|
54
|
+
end
|
53
55
|
end
|
54
56
|
|
55
57
|
def build_mappers(relation_name)
|
56
58
|
mapper_classes
|
57
59
|
.select { |klass| klass.base_relation == relation_name }
|
58
|
-
.
|
60
|
+
.to_h { |k| [k.register_as || k.relation, k.build] }
|
59
61
|
end
|
60
62
|
end
|
61
63
|
end
|
@@ -9,6 +9,16 @@ module ROM
|
|
9
9
|
class FinalizeRelations
|
10
10
|
attr_reader :notifications
|
11
11
|
|
12
|
+
class RegistryReaders < ::Module
|
13
|
+
def initialize(relations)
|
14
|
+
super()
|
15
|
+
|
16
|
+
relations.each do |name|
|
17
|
+
define_method(name) { __registry__[name] }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
12
22
|
# Build relation registry of specified descendant classes
|
13
23
|
#
|
14
24
|
# This is used by the setup
|
@@ -28,8 +38,11 @@ module ROM
|
|
28
38
|
# @return [Hash]
|
29
39
|
#
|
30
40
|
# @api private
|
41
|
+
#
|
42
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
31
43
|
def run!
|
32
44
|
relation_registry = RelationRegistry.new do |registry, relations|
|
45
|
+
registry_readers = RegistryReaders.new(relation_names)
|
33
46
|
@relation_classes.each do |klass|
|
34
47
|
unless klass.adapter
|
35
48
|
raise MissingAdapterIdentifierError,
|
@@ -43,14 +56,18 @@ module ROM
|
|
43
56
|
"Relation with name #{key.inspect} registered more than once"
|
44
57
|
end
|
45
58
|
|
46
|
-
klass.use(:registry_reader,
|
59
|
+
klass.use(:registry_reader, readers: registry_readers)
|
47
60
|
|
48
|
-
notifications.trigger(
|
61
|
+
notifications.trigger(
|
62
|
+
'configuration.relations.class.ready',
|
63
|
+
relation: klass,
|
64
|
+
adapter: klass.adapter
|
65
|
+
)
|
49
66
|
|
50
67
|
relations[key] = build_relation(klass, registry)
|
51
68
|
end
|
52
69
|
|
53
|
-
registry.
|
70
|
+
registry.each_value do |relation|
|
54
71
|
notifications.trigger(
|
55
72
|
'configuration.relations.object.registered',
|
56
73
|
relation: relation, registry: registry
|
@@ -64,10 +81,13 @@ module ROM
|
|
64
81
|
|
65
82
|
relation_registry
|
66
83
|
end
|
84
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
67
85
|
|
68
86
|
# @return [ROM::Relation]
|
69
87
|
#
|
70
88
|
# @api private
|
89
|
+
#
|
90
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
71
91
|
def build_relation(klass, registry)
|
72
92
|
# TODO: raise a meaningful error here and add spec covering the case
|
73
93
|
# where klass' gateway points to non-existant repo
|
@@ -103,10 +123,16 @@ module ROM
|
|
103
123
|
dataset: dataset, relation: klass, adapter: klass.adapter
|
104
124
|
)
|
105
125
|
|
106
|
-
options = {
|
126
|
+
options = {
|
127
|
+
__registry__: registry,
|
128
|
+
mappers: mapper_registry(rel_key, klass),
|
129
|
+
schema: schema,
|
130
|
+
**plugin_options
|
131
|
+
}
|
107
132
|
|
108
133
|
klass.new(dataset, **options)
|
109
134
|
end
|
135
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
110
136
|
|
111
137
|
# @api private
|
112
138
|
def mapper_registry(rel_key, rel_class)
|
data/lib/rom/setup/finalize.rb
CHANGED
@@ -22,9 +22,23 @@ module ROM
|
|
22
22
|
#
|
23
23
|
# @private
|
24
24
|
class Finalize
|
25
|
-
attr_reader :gateways
|
26
|
-
|
27
|
-
|
25
|
+
attr_reader :gateways
|
26
|
+
|
27
|
+
attr_reader :repo_adapter
|
28
|
+
|
29
|
+
attr_reader :relation_classes
|
30
|
+
|
31
|
+
attr_reader :mapper_classes
|
32
|
+
|
33
|
+
attr_reader :mapper_objects
|
34
|
+
|
35
|
+
attr_reader :command_classes
|
36
|
+
|
37
|
+
attr_reader :plugins
|
38
|
+
|
39
|
+
attr_reader :config
|
40
|
+
|
41
|
+
attr_reader :notifications
|
28
42
|
|
29
43
|
# @api private
|
30
44
|
def initialize(options)
|
data/lib/rom/setup.rb
CHANGED
@@ -41,16 +41,17 @@ module ROM
|
|
41
41
|
#
|
42
42
|
# @param [String, Pathname] directory The root path to components
|
43
43
|
# @param [Hash] options
|
44
|
-
# @option options [Boolean, String] :namespace Enable/disable
|
44
|
+
# @option options [Boolean, String] :namespace Enable/disable
|
45
|
+
# namespace or provide a custom namespace name
|
45
46
|
#
|
46
47
|
# @return [Setup]
|
47
48
|
#
|
48
49
|
# @api public
|
49
50
|
def auto_registration(directory, **options)
|
50
51
|
auto_registration = AutoRegistration.new(directory, **options)
|
51
|
-
auto_registration.relations.
|
52
|
-
auto_registration.commands.
|
53
|
-
auto_registration.mappers.
|
52
|
+
auto_registration.relations.each { |r| register_relation(r) }
|
53
|
+
auto_registration.commands.each { |r| register_command(r) }
|
54
|
+
auto_registration.mappers.each { |r| register_mapper(r) }
|
54
55
|
self
|
55
56
|
end
|
56
57
|
|
data/lib/rom/struct.rb
CHANGED
@@ -15,9 +15,10 @@ module ROM
|
|
15
15
|
# about attribute types returned from relations, thus can be introspected to build
|
16
16
|
# additional functionality when desired.
|
17
17
|
#
|
18
|
-
# There is a caveat you should know about when working with structs.
|
19
|
-
# have names but at the same time they're anonymous,
|
20
|
-
#
|
18
|
+
# *NOTE*: There is a caveat you should know about when working with ROM structs.
|
19
|
+
# Struct classes have names but at the same time they're anonymous,
|
20
|
+
# i.e. you can't get the User struct class with ROM::Struct::User.
|
21
|
+
# ROM will create as many struct classes for User as needed,
|
21
22
|
# they all will have the same name and ROM::Struct::User will be the common parent class for
|
22
23
|
# them. Combined with the ability to provide your own namespace for structs this enables to
|
23
24
|
# pre-define the parent class.
|
@@ -28,6 +29,11 @@ module ROM
|
|
28
29
|
# primary_key :id
|
29
30
|
# column :name, String
|
30
31
|
# end
|
32
|
+
#
|
33
|
+
# conf.relation(:users) do
|
34
|
+
# schema(infer: true)
|
35
|
+
# auto_struct true
|
36
|
+
# end
|
31
37
|
# end
|
32
38
|
#
|
33
39
|
# class UserRepo < ROM::Repository[:users]
|
@@ -41,11 +47,12 @@ module ROM
|
|
41
47
|
#
|
42
48
|
# # see struct's schema attributes
|
43
49
|
#
|
44
|
-
#
|
50
|
+
# model.schema.key(:id)
|
45
51
|
# # => #<Dry::Types[id: Nominal<Integer meta={primary_key: true, source: :users}>]>
|
46
52
|
#
|
47
53
|
# model.schema[:name]
|
48
|
-
# # => #<Dry::Types[name: Sum<Nominal<NilClass> |
|
54
|
+
# # => #<Dry::Types[name: Sum<Nominal<NilClass> |
|
55
|
+
# # Nominal<String meta={source: :users}> meta={source: :users}>]>
|
49
56
|
#
|
50
57
|
# @example passing a namespace with an existing parent class
|
51
58
|
# module Entities
|
@@ -61,6 +68,7 @@ module ROM
|
|
61
68
|
# end
|
62
69
|
#
|
63
70
|
# user_repo = UserRepo.new(rom)
|
71
|
+
# user_repo.users.insert(name: "Jane")
|
64
72
|
# user = user_repo.users.by_pk(1).one!
|
65
73
|
# user.name # => "Jane"
|
66
74
|
# user.upcased_name # => "JANE"
|
@@ -69,16 +77,14 @@ module ROM
|
|
69
77
|
# @see http://dry-rb.org/gems/dry-types dry-types
|
70
78
|
#
|
71
79
|
# @api public
|
72
|
-
class Struct < Dry::Struct
|
73
|
-
MissingAttribute = Class.new(NameError) do
|
80
|
+
class Struct < ::Dry::Struct
|
81
|
+
MissingAttribute = ::Class.new(::NameError) do
|
74
82
|
def initialize(&block)
|
75
83
|
super
|
76
84
|
@message_proc = block
|
77
85
|
end
|
78
86
|
|
79
|
-
def message
|
80
|
-
@message_proc.call
|
81
|
-
end
|
87
|
+
def message = @message_proc.call
|
82
88
|
end
|
83
89
|
|
84
90
|
# Return attribute value
|
@@ -86,21 +92,17 @@ module ROM
|
|
86
92
|
# @param [Symbol] name The attribute name
|
87
93
|
#
|
88
94
|
# @api public
|
89
|
-
def fetch(name)
|
90
|
-
__send__(name)
|
91
|
-
end
|
95
|
+
def fetch(name) = __send__(name)
|
92
96
|
|
93
97
|
# @api private
|
94
|
-
def respond_to_missing?(*)
|
95
|
-
super
|
96
|
-
end
|
98
|
+
def respond_to_missing?(*) = super
|
97
99
|
|
98
100
|
private
|
99
101
|
|
100
102
|
def method_missing(*)
|
101
103
|
super
|
102
|
-
rescue NameError =>
|
103
|
-
raise
|
104
|
+
rescue ::NameError => e
|
105
|
+
raise(MissingAttribute.new { "#{e.message} (attribute not loaded?)" })
|
104
106
|
end
|
105
107
|
end
|
106
108
|
end
|
data/lib/rom/struct_compiler.rb
CHANGED
@@ -18,11 +18,10 @@ module ROM
|
|
18
18
|
option :cache, default: -> { Cache.new }
|
19
19
|
|
20
20
|
# @api private
|
21
|
-
def initialize(
|
21
|
+
def initialize(*, **)
|
22
22
|
super
|
23
23
|
@cache = cache.namespaced(:structs)
|
24
24
|
end
|
25
|
-
ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
|
26
25
|
|
27
26
|
# Build a struct class based on relation header ast
|
28
27
|
#
|
@@ -95,15 +94,13 @@ module ROM
|
|
95
94
|
end
|
96
95
|
|
97
96
|
# @api private
|
98
|
-
def build_class(name, parent, ns, &
|
97
|
+
def build_class(name, parent, ns, &)
|
99
98
|
Dry::Core::ClassBuilder
|
100
99
|
.new(name: class_name(name), parent: parent, namespace: ns)
|
101
|
-
.call(&
|
100
|
+
.call(&)
|
102
101
|
end
|
103
102
|
|
104
103
|
# @api private
|
105
|
-
def class_name(name)
|
106
|
-
Inflector.classify(name)
|
107
|
-
end
|
104
|
+
def class_name(name) = Inflector.classify(name)
|
108
105
|
end
|
109
106
|
end
|
@@ -7,7 +7,7 @@ module ROM
|
|
7
7
|
# @api private
|
8
8
|
module Configurable
|
9
9
|
class Config
|
10
|
-
WRITER_REGEXP =
|
10
|
+
WRITER_REGEXP = /=$/
|
11
11
|
|
12
12
|
# @!attribute [r] settings
|
13
13
|
# @return [Hash] A hash with defined settings
|
@@ -23,43 +23,33 @@ module ROM
|
|
23
23
|
# @return [Mixed]
|
24
24
|
#
|
25
25
|
# @api public
|
26
|
-
def [](name)
|
27
|
-
public_send(name)
|
28
|
-
end
|
26
|
+
def [](name) = public_send(name)
|
29
27
|
|
30
28
|
# @api private
|
31
|
-
def key?(name)
|
32
|
-
settings.key?(name)
|
33
|
-
end
|
29
|
+
def key?(name) = settings.key?(name)
|
34
30
|
|
35
|
-
def to_hash
|
36
|
-
settings
|
37
|
-
end
|
31
|
+
def to_hash = settings
|
38
32
|
|
39
33
|
# @api private
|
40
|
-
def respond_to_missing?(_name, _include_private = false)
|
41
|
-
true
|
42
|
-
end
|
34
|
+
def respond_to_missing?(_name, _include_private = false) = true
|
43
35
|
|
44
36
|
# @api private
|
45
|
-
def dup
|
46
|
-
self.class.new(dup_settings(settings))
|
47
|
-
end
|
37
|
+
def dup = self.class.new(dup_settings(settings))
|
48
38
|
|
49
39
|
private
|
50
40
|
|
51
41
|
def dup_settings(settings)
|
52
|
-
settings.
|
42
|
+
settings.to_h do |key, value|
|
53
43
|
if value.is_a?(self.class)
|
54
|
-
|
44
|
+
[key, value.dup]
|
55
45
|
else
|
56
|
-
|
46
|
+
[key, value]
|
57
47
|
end
|
58
48
|
end
|
59
49
|
end
|
60
50
|
|
61
51
|
# @api private
|
62
|
-
def method_missing(meth, *args, &
|
52
|
+
def method_missing(meth, *args, &)
|
63
53
|
return settings.fetch(meth, nil) if frozen?
|
64
54
|
|
65
55
|
name = meth.to_s
|
@@ -11,12 +11,11 @@ module ROM
|
|
11
11
|
prepend(Memoizer.new(self, names))
|
12
12
|
end
|
13
13
|
|
14
|
-
def new(
|
14
|
+
def new(*, **, &)
|
15
15
|
obj = super
|
16
|
-
obj.instance_variable_set(
|
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)
|
20
19
|
end
|
21
20
|
|
22
21
|
def self.included(klass)
|
@@ -27,12 +26,14 @@ module ROM
|
|
27
26
|
attr_reader :__memoized__
|
28
27
|
|
29
28
|
# @api private
|
30
|
-
class Memoizer < Module
|
29
|
+
class Memoizer < ::Module
|
31
30
|
attr_reader :klass
|
31
|
+
|
32
32
|
attr_reader :names
|
33
33
|
|
34
34
|
# @api private
|
35
35
|
def initialize(klass, names)
|
36
|
+
super()
|
36
37
|
@names = names
|
37
38
|
@klass = klass
|
38
39
|
define_memoizable_names!
|
@@ -45,14 +46,14 @@ module ROM
|
|
45
46
|
names.each do |name|
|
46
47
|
meth = klass.instance_method(name)
|
47
48
|
|
48
|
-
if
|
49
|
-
define_method(name) do |*args|
|
50
|
-
__memoized__[:"#{name}_#{args.hash}"] ||= super(*args)
|
51
|
-
end
|
52
|
-
else
|
49
|
+
if meth.parameters.empty?
|
53
50
|
define_method(name) do
|
54
51
|
__memoized__[name] ||= super()
|
55
52
|
end
|
53
|
+
else
|
54
|
+
define_method(name) do |*args|
|
55
|
+
__memoized__[:"#{name}_#{args.hash}"] ||= super(*args)
|
56
|
+
end
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
@@ -36,7 +36,7 @@ module ROM
|
|
36
36
|
# end
|
37
37
|
#
|
38
38
|
module Notifications
|
39
|
-
LISTENERS_HASH = Hash.new { |h, k| h[k] = [] }
|
39
|
+
LISTENERS_HASH = ::Hash.new { |h, k| h[k] = [] }
|
40
40
|
|
41
41
|
# Extension used for classes that can trigger events
|
42
42
|
#
|
@@ -75,7 +75,7 @@ module ROM
|
|
75
75
|
#
|
76
76
|
# @api public
|
77
77
|
class Event
|
78
|
-
include Dry::Equalizer(:id, :payload)
|
78
|
+
include ::Dry::Equalizer(:id, :payload)
|
79
79
|
|
80
80
|
# @!attribute [r] id
|
81
81
|
# @return [Symbol] The event identifier
|
@@ -99,18 +99,14 @@ module ROM
|
|
99
99
|
# @param [String,Symbol] name
|
100
100
|
#
|
101
101
|
# @api public
|
102
|
-
def [](name)
|
103
|
-
@payload.fetch(name)
|
104
|
-
end
|
102
|
+
def [](name) = @payload.fetch(name)
|
105
103
|
|
106
104
|
# Coerce an event to a hash
|
107
105
|
#
|
108
106
|
# @return [Hash]
|
109
107
|
#
|
110
108
|
# @api public
|
111
|
-
def to_h
|
112
|
-
@payload
|
113
|
-
end
|
109
|
+
def to_h = @payload
|
114
110
|
alias_method :to_hash, :to_h
|
115
111
|
|
116
112
|
# Get or set a payload
|
data/lib/rom/transaction.rb
CHANGED
@@ -4,7 +4,7 @@ module ROM
|
|
4
4
|
# @api private
|
5
5
|
class Transaction
|
6
6
|
# @api private
|
7
|
-
Rollback = Class.new(StandardError)
|
7
|
+
Rollback = ::Class.new(::StandardError)
|
8
8
|
|
9
9
|
# @api private
|
10
10
|
def run(_opts = EMPTY_HASH)
|
@@ -16,9 +16,7 @@ module ROM
|
|
16
16
|
# Unconditionally roll back the current transaction
|
17
17
|
#
|
18
18
|
# @api public
|
19
|
-
def rollback!
|
20
|
-
raise Rollback
|
21
|
-
end
|
19
|
+
def rollback! = raise(Rollback)
|
22
20
|
|
23
21
|
# @api private
|
24
22
|
NoOp = Transaction.new.freeze
|
data/lib/rom/transformer.rb
CHANGED
@@ -9,8 +9,8 @@ module ROM
|
|
9
9
|
# transformations.
|
10
10
|
#
|
11
11
|
# @api public
|
12
|
-
class Transformer < Transproc::Transformer[ROM::Processor::Transproc::Functions]
|
13
|
-
extend Dry::Core::ClassAttributes
|
12
|
+
class Transformer < Transproc::Transformer[::ROM::Processor::Transproc::Functions]
|
13
|
+
extend ::Dry::Core::ClassAttributes
|
14
14
|
|
15
15
|
# @!method self.register_as
|
16
16
|
# Get or set registration name
|
@@ -70,26 +70,22 @@ module ROM
|
|
70
70
|
# @return [self]
|
71
71
|
#
|
72
72
|
# @api public
|
73
|
-
def self.map(&
|
73
|
+
def self.map(&)
|
74
74
|
define! do
|
75
|
-
map_array(&
|
75
|
+
map_array(&)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
# This is needed to make transformers compatible with rom setup
|
80
80
|
#
|
81
81
|
# @api private
|
82
|
-
def self.base_relation
|
83
|
-
relation
|
84
|
-
end
|
82
|
+
def self.base_relation = relation
|
85
83
|
|
86
84
|
# Build a mapper instance
|
87
85
|
#
|
88
86
|
# @return [Transformer]
|
89
87
|
#
|
90
88
|
# @api public
|
91
|
-
def self.build
|
92
|
-
new
|
93
|
-
end
|
89
|
+
def self.build = new
|
94
90
|
end
|
95
91
|
end
|
data/lib/rom/types.rb
CHANGED
@@ -8,7 +8,6 @@ module ROM
|
|
8
8
|
#
|
9
9
|
# @api public
|
10
10
|
#
|
11
|
-
# rubocop:disable Naming/MethodName
|
12
11
|
module Types
|
13
12
|
include Dry::Types(default: :nominal)
|
14
13
|
|
@@ -44,11 +43,9 @@ module ROM
|
|
44
43
|
# @api public
|
45
44
|
def Coercible.JSONHash(symbol_keys: false, type: Types::Hash)
|
46
45
|
Types.Constructor(type) do |value|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
value
|
51
|
-
end
|
46
|
+
::JSON.parse(value.to_s, symbolize_names: symbol_keys)
|
47
|
+
rescue ::JSON::ParserError
|
48
|
+
value
|
52
49
|
end
|
53
50
|
end
|
54
51
|
|