rom-repository 5.2.2 → 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/repository/class_interface.rb +33 -11
- data/lib/rom/repository/relation_reader.rb +56 -24
- data/lib/rom/repository/root.rb +4 -12
- data/lib/rom/repository/session.rb +0 -2
- data/lib/rom/repository/version.rb +1 -1
- data/lib/rom/repository.rb +5 -8
- metadata +12 -54
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1945e400f70ab8fba8b203ab2a5894ff0c3af70dbe55a00bb20ccd33ed0663b8
|
|
4
|
+
data.tar.gz: 48e96bca0f06806b8cc03a390c3c11ecae6f1b4b05c3ae0c96e0b380c25e27d6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 42202fc4ee9f6680131f95e990eb8785ad23fd82aa67cedd1ce79249cd8bdb2318b081b31f6efc2f632f18a29d6dd17de7739f848906b997e46457416f3eacd8
|
|
7
|
+
data.tar.gz: 1ce9298b198da42a05070e5efdc6f426f7fdb0a9107428af9e3031c19296728df9ddb5bf369fb1fbec836740c4d14f6a827c48fa3cae9a83fc33de63be63a174
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'dry/core/cache'
|
|
4
|
-
|
|
5
3
|
require 'rom/repository/relation_reader'
|
|
6
4
|
|
|
7
5
|
module ROM
|
|
@@ -24,7 +22,14 @@ module ROM
|
|
|
24
22
|
# @api public
|
|
25
23
|
def [](name)
|
|
26
24
|
fetch_or_store(name) do
|
|
27
|
-
|
|
25
|
+
base =
|
|
26
|
+
if self < Repository::Root # rubocop:disable Style/MinMaxComparison
|
|
27
|
+
self
|
|
28
|
+
else
|
|
29
|
+
Repository::Root
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
klass = ::Class.new(base)
|
|
28
33
|
klass.root(name)
|
|
29
34
|
klass
|
|
30
35
|
end
|
|
@@ -51,12 +56,15 @@ module ROM
|
|
|
51
56
|
# @option options [Boolean] :auto_struct Enable/Disable auto-struct mapping
|
|
52
57
|
#
|
|
53
58
|
# @api public
|
|
54
|
-
def new(container = nil, **options)
|
|
59
|
+
def new(container = nil, root: Undefined, **options)
|
|
55
60
|
container ||= options.fetch(:container)
|
|
56
61
|
|
|
57
|
-
unless relation_reader
|
|
58
|
-
relation_reader
|
|
59
|
-
|
|
62
|
+
unless self < relation_reader
|
|
63
|
+
include relation_reader.new(
|
|
64
|
+
relations: container.relations.elements.keys,
|
|
65
|
+
cache: container.cache,
|
|
66
|
+
root: root
|
|
67
|
+
)
|
|
60
68
|
end
|
|
61
69
|
|
|
62
70
|
super(**options, container: container)
|
|
@@ -68,7 +76,7 @@ module ROM
|
|
|
68
76
|
def inherited(klass)
|
|
69
77
|
super
|
|
70
78
|
|
|
71
|
-
return if self === Repository
|
|
79
|
+
return if self === Repository # rubocop:disable Style/CaseEquality
|
|
72
80
|
|
|
73
81
|
klass.extend(::Dry::Core::Cache)
|
|
74
82
|
klass.commands(*commands)
|
|
@@ -98,6 +106,8 @@ module ROM
|
|
|
98
106
|
# @return [Array<Symbol>] A list of defined command names
|
|
99
107
|
#
|
|
100
108
|
# @api public
|
|
109
|
+
#
|
|
110
|
+
# rubocop:disable Metrics/MethodLength
|
|
101
111
|
def commands(*names, mapper: nil, use: nil, plugins_options: EMPTY_HASH, **opts)
|
|
102
112
|
if names.any? || opts.any?
|
|
103
113
|
@commands = names + opts.to_a
|
|
@@ -105,16 +115,28 @@ module ROM
|
|
|
105
115
|
@commands.each do |spec|
|
|
106
116
|
type, *view = Array(spec).flatten
|
|
107
117
|
|
|
108
|
-
if
|
|
109
|
-
|
|
118
|
+
if view.empty?
|
|
119
|
+
define_command_method(
|
|
120
|
+
type,
|
|
121
|
+
mapper: mapper,
|
|
122
|
+
use: use,
|
|
123
|
+
plugins_options: plugins_options
|
|
124
|
+
)
|
|
110
125
|
else
|
|
111
|
-
|
|
126
|
+
define_restricted_command_method(
|
|
127
|
+
type,
|
|
128
|
+
view,
|
|
129
|
+
mapper: mapper,
|
|
130
|
+
use: use,
|
|
131
|
+
plugins_options: plugins_options
|
|
132
|
+
)
|
|
112
133
|
end
|
|
113
134
|
end
|
|
114
135
|
else
|
|
115
136
|
@commands ||= []
|
|
116
137
|
end
|
|
117
138
|
end
|
|
139
|
+
# rubocop:enable Metrics/MethodLength
|
|
118
140
|
|
|
119
141
|
# @api public
|
|
120
142
|
def use(plugin, **options)
|
|
@@ -3,44 +3,76 @@
|
|
|
3
3
|
module ROM
|
|
4
4
|
class Repository
|
|
5
5
|
# @api private
|
|
6
|
-
class RelationReader < Module
|
|
7
|
-
# @api private
|
|
8
|
-
attr_reader :klass
|
|
9
|
-
|
|
10
|
-
# @api private
|
|
11
|
-
attr_reader :relations
|
|
12
|
-
|
|
6
|
+
class RelationReader < ::Module
|
|
13
7
|
module InstanceMethods
|
|
8
|
+
private
|
|
9
|
+
|
|
14
10
|
# @api private
|
|
15
|
-
def
|
|
11
|
+
def prepare_relation(name, **)
|
|
16
12
|
container
|
|
17
13
|
.relations[name]
|
|
18
|
-
.with(
|
|
19
|
-
|
|
14
|
+
.with(
|
|
15
|
+
auto_struct: auto_struct,
|
|
16
|
+
struct_namespace: struct_namespace
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @api private
|
|
21
|
+
def relation_reader(cache, ...)
|
|
22
|
+
cache_key = relation_cache_key(...)
|
|
23
|
+
cache.fetch_or_store(*cache_key) { prepare_relation(...) }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @api private
|
|
27
|
+
def relation_cache_key(name, **)
|
|
28
|
+
[name, auto_struct, struct_namespace]
|
|
20
29
|
end
|
|
21
30
|
end
|
|
22
31
|
|
|
23
32
|
# @api private
|
|
24
|
-
|
|
25
|
-
@
|
|
26
|
-
|
|
27
|
-
|
|
33
|
+
class Readers < ::Module
|
|
34
|
+
# @api private
|
|
35
|
+
attr_reader :cache
|
|
36
|
+
|
|
37
|
+
def initialize(relations)
|
|
38
|
+
super()
|
|
39
|
+
|
|
40
|
+
include InstanceMethods
|
|
41
|
+
|
|
42
|
+
define_readers(relations)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @api private
|
|
46
|
+
def define_readers(relations)
|
|
47
|
+
cache = Cache.new
|
|
48
|
+
relations.each do |name|
|
|
49
|
+
define_readers_for_relation(cache, name)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @api private
|
|
54
|
+
def define_readers_for_relation(cache, name)
|
|
55
|
+
define_method(name) do |**kwargs|
|
|
56
|
+
relation_reader(cache, name, **kwargs)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
28
59
|
end
|
|
29
60
|
|
|
30
61
|
# @api private
|
|
31
|
-
def
|
|
32
|
-
super
|
|
33
|
-
klass.include(InstanceMethods)
|
|
34
|
-
end
|
|
62
|
+
def initialize(relations:, cache:, root: Undefined)
|
|
63
|
+
super()
|
|
35
64
|
|
|
36
|
-
|
|
65
|
+
add_readers(relations, cache, root)
|
|
66
|
+
end
|
|
37
67
|
|
|
38
68
|
# @api private
|
|
39
|
-
def
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
69
|
+
def add_readers(relations, cache, root)
|
|
70
|
+
include cache.fetch_or_store(:relation_readers) {
|
|
71
|
+
Readers.new(relations)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
unless Undefined.equal?(root)
|
|
75
|
+
define_method(:root) { |**kwargs| public_send(root, **kwargs) }
|
|
44
76
|
end
|
|
45
77
|
end
|
|
46
78
|
end
|
data/lib/rom/repository/root.rb
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'dry/core/class_attributes'
|
|
4
|
-
|
|
5
3
|
module ROM
|
|
6
4
|
class Repository
|
|
7
5
|
# A specialized repository type dedicated to work with a root relation
|
|
@@ -45,9 +43,10 @@ module ROM
|
|
|
45
43
|
# @return [Symbol]
|
|
46
44
|
defines :root
|
|
47
45
|
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
# @api public
|
|
47
|
+
def self.new(*args, **kwargs)
|
|
48
|
+
super(*args, **kwargs, root: root)
|
|
49
|
+
end
|
|
51
50
|
|
|
52
51
|
# Sets descendant root relation
|
|
53
52
|
#
|
|
@@ -56,13 +55,6 @@ module ROM
|
|
|
56
55
|
super
|
|
57
56
|
klass.root(root)
|
|
58
57
|
end
|
|
59
|
-
|
|
60
|
-
# @see Repository#initialize
|
|
61
|
-
def initialize(*)
|
|
62
|
-
super
|
|
63
|
-
@root = set_relation(self.class.root)
|
|
64
|
-
end
|
|
65
|
-
ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
|
|
66
58
|
end
|
|
67
59
|
end
|
|
68
60
|
end
|
data/lib/rom/repository.rb
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'dry/core/cache'
|
|
4
|
-
require 'dry/core/class_attributes'
|
|
5
|
-
|
|
6
3
|
require 'rom/initializer'
|
|
7
4
|
require 'rom/struct'
|
|
8
5
|
require 'rom/container'
|
|
@@ -83,8 +80,9 @@ module ROM
|
|
|
83
80
|
|
|
84
81
|
# @!method self.relation_reader
|
|
85
82
|
# Get or set relation reader module
|
|
86
|
-
# @return [
|
|
83
|
+
# @return [Module]
|
|
87
84
|
defines :relation_reader
|
|
85
|
+
relation_reader RelationReader
|
|
88
86
|
|
|
89
87
|
struct_namespace ROM::Struct
|
|
90
88
|
|
|
@@ -107,11 +105,10 @@ module ROM
|
|
|
107
105
|
# Initializes a new repository object
|
|
108
106
|
#
|
|
109
107
|
# @api private
|
|
110
|
-
def initialize(
|
|
108
|
+
def initialize(*, **)
|
|
111
109
|
super
|
|
112
110
|
@relations = {}
|
|
113
111
|
end
|
|
114
|
-
ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
|
|
115
112
|
|
|
116
113
|
# Open a database transaction
|
|
117
114
|
#
|
|
@@ -146,8 +143,8 @@ module ROM
|
|
|
146
143
|
# # => #<ROM::Struct::User id=1 name="Jane">
|
|
147
144
|
#
|
|
148
145
|
# @api public
|
|
149
|
-
def transaction(
|
|
150
|
-
container.gateways[:default].transaction(
|
|
146
|
+
def transaction(...)
|
|
147
|
+
container.gateways[:default].transaction(...)
|
|
151
148
|
end
|
|
152
149
|
|
|
153
150
|
# Return a string representation of a repository object
|
metadata
CHANGED
|
@@ -1,97 +1,56 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rom-repository
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.
|
|
4
|
+
version: 5.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Piotr Solnica
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2025-01-08 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: dry-
|
|
13
|
+
name: dry-core
|
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
20
|
-
- - ">="
|
|
21
|
-
- !ruby/object:Gem::Version
|
|
22
|
-
version: 3.0.1
|
|
18
|
+
version: '1.0'
|
|
23
19
|
type: :runtime
|
|
24
20
|
prerelease: false
|
|
25
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
22
|
requirements:
|
|
27
23
|
- - "~>"
|
|
28
24
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: '
|
|
30
|
-
- - ">="
|
|
31
|
-
- !ruby/object:Gem::Version
|
|
32
|
-
version: 3.0.1
|
|
25
|
+
version: '1.0'
|
|
33
26
|
- !ruby/object:Gem::Dependency
|
|
34
|
-
name: dry-
|
|
27
|
+
name: dry-initializer
|
|
35
28
|
requirement: !ruby/object:Gem::Requirement
|
|
36
29
|
requirements:
|
|
37
30
|
- - "~>"
|
|
38
31
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
32
|
+
version: '3.2'
|
|
40
33
|
type: :runtime
|
|
41
34
|
prerelease: false
|
|
42
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
43
36
|
requirements:
|
|
44
37
|
- - "~>"
|
|
45
38
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
39
|
+
version: '3.2'
|
|
47
40
|
- !ruby/object:Gem::Dependency
|
|
48
41
|
name: rom-core
|
|
49
42
|
requirement: !ruby/object:Gem::Requirement
|
|
50
43
|
requirements:
|
|
51
44
|
- - "~>"
|
|
52
45
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '5.
|
|
54
|
-
- - ">="
|
|
55
|
-
- !ruby/object:Gem::Version
|
|
56
|
-
version: 5.2.2
|
|
46
|
+
version: '5.4'
|
|
57
47
|
type: :runtime
|
|
58
48
|
prerelease: false
|
|
59
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
60
50
|
requirements:
|
|
61
51
|
- - "~>"
|
|
62
52
|
- !ruby/object:Gem::Version
|
|
63
|
-
version: '5.
|
|
64
|
-
- - ">="
|
|
65
|
-
- !ruby/object:Gem::Version
|
|
66
|
-
version: 5.2.2
|
|
67
|
-
- !ruby/object:Gem::Dependency
|
|
68
|
-
name: rake
|
|
69
|
-
requirement: !ruby/object:Gem::Requirement
|
|
70
|
-
requirements:
|
|
71
|
-
- - "~>"
|
|
72
|
-
- !ruby/object:Gem::Version
|
|
73
|
-
version: '11.2'
|
|
74
|
-
type: :development
|
|
75
|
-
prerelease: false
|
|
76
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
77
|
-
requirements:
|
|
78
|
-
- - "~>"
|
|
79
|
-
- !ruby/object:Gem::Version
|
|
80
|
-
version: '11.2'
|
|
81
|
-
- !ruby/object:Gem::Dependency
|
|
82
|
-
name: rspec
|
|
83
|
-
requirement: !ruby/object:Gem::Requirement
|
|
84
|
-
requirements:
|
|
85
|
-
- - "~>"
|
|
86
|
-
- !ruby/object:Gem::Version
|
|
87
|
-
version: '3.5'
|
|
88
|
-
type: :development
|
|
89
|
-
prerelease: false
|
|
90
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
91
|
-
requirements:
|
|
92
|
-
- - "~>"
|
|
93
|
-
- !ruby/object:Gem::Version
|
|
94
|
-
version: '3.5'
|
|
53
|
+
version: '5.4'
|
|
95
54
|
description: Repository abstraction for rom-rb
|
|
96
55
|
email: piotr.solnica+oss@gmail.com
|
|
97
56
|
executables: []
|
|
@@ -116,7 +75,7 @@ metadata:
|
|
|
116
75
|
documentation_uri: https://api.rom-rb.org/rom/
|
|
117
76
|
mailing_list_uri: https://discourse.rom-rb.org/
|
|
118
77
|
bug_tracker_uri: https://github.com/rom-rb/rom/issues
|
|
119
|
-
|
|
78
|
+
rubygems_mfa_required: 'true'
|
|
120
79
|
rdoc_options: []
|
|
121
80
|
require_paths:
|
|
122
81
|
- lib
|
|
@@ -131,8 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
131
90
|
- !ruby/object:Gem::Version
|
|
132
91
|
version: '0'
|
|
133
92
|
requirements: []
|
|
134
|
-
rubygems_version: 3.
|
|
135
|
-
signing_key:
|
|
93
|
+
rubygems_version: 3.6.2
|
|
136
94
|
specification_version: 4
|
|
137
95
|
summary: Repository abstraction for rom-rb
|
|
138
96
|
test_files: []
|