rom 5.4.2 → 6.0.0.alpha1

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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -71
  3. data/LICENSE +1 -1
  4. data/README.md +7 -6
  5. data/lib/rom/array_dataset.rb +46 -0
  6. data/lib/rom/associations/abstract.rb +217 -0
  7. data/lib/rom/associations/definitions/abstract.rb +150 -0
  8. data/lib/rom/associations/definitions/many_to_many.rb +29 -0
  9. data/lib/rom/associations/definitions/many_to_one.rb +14 -0
  10. data/lib/rom/associations/definitions/one_to_many.rb +14 -0
  11. data/lib/rom/associations/definitions/one_to_one.rb +14 -0
  12. data/lib/rom/associations/definitions/one_to_one_through.rb +14 -0
  13. data/lib/rom/associations/definitions.rb +7 -0
  14. data/lib/rom/associations/many_to_many.rb +128 -0
  15. data/lib/rom/associations/many_to_one.rb +65 -0
  16. data/lib/rom/associations/one_to_many.rb +65 -0
  17. data/lib/rom/associations/one_to_one.rb +13 -0
  18. data/lib/rom/associations/one_to_one_through.rb +13 -0
  19. data/lib/rom/associations/through_identifier.rb +41 -0
  20. data/lib/rom/attribute.rb +425 -0
  21. data/lib/rom/auto_curry.rb +70 -0
  22. data/lib/rom/cache.rb +87 -0
  23. data/lib/rom/changeset/associated.rb +110 -0
  24. data/lib/rom/changeset/create.rb +18 -0
  25. data/lib/rom/changeset/delete.rb +15 -0
  26. data/lib/rom/changeset/extensions/relation.rb +26 -0
  27. data/lib/rom/changeset/pipe.rb +81 -0
  28. data/lib/rom/changeset/pipe_registry.rb +27 -0
  29. data/lib/rom/changeset/stateful.rb +285 -0
  30. data/lib/rom/changeset/update.rb +81 -0
  31. data/lib/rom/changeset.rb +185 -0
  32. data/lib/rom/command.rb +351 -0
  33. data/lib/rom/command_compiler.rb +201 -0
  34. data/lib/rom/command_proxy.rb +36 -0
  35. data/lib/rom/commands/class_interface.rb +236 -0
  36. data/lib/rom/commands/composite.rb +55 -0
  37. data/lib/rom/commands/create.rb +15 -0
  38. data/lib/rom/commands/delete.rb +16 -0
  39. data/lib/rom/commands/graph/class_interface.rb +64 -0
  40. data/lib/rom/commands/graph/input_evaluator.rb +94 -0
  41. data/lib/rom/commands/graph.rb +88 -0
  42. data/lib/rom/commands/lazy/create.rb +35 -0
  43. data/lib/rom/commands/lazy/delete.rb +39 -0
  44. data/lib/rom/commands/lazy/update.rb +46 -0
  45. data/lib/rom/commands/lazy.rb +106 -0
  46. data/lib/rom/commands/update.rb +16 -0
  47. data/lib/rom/commands.rb +5 -0
  48. data/lib/rom/compat/auto_registration.rb +115 -0
  49. data/lib/rom/compat/auto_registration_strategies/base.rb +29 -0
  50. data/lib/rom/compat/auto_registration_strategies/custom_namespace.rb +84 -0
  51. data/lib/rom/compat/auto_registration_strategies/no_namespace.rb +33 -0
  52. data/lib/rom/compat/auto_registration_strategies/with_namespace.rb +29 -0
  53. data/lib/rom/compat/command.rb +74 -0
  54. data/lib/rom/compat/components/dsl/schema.rb +130 -0
  55. data/lib/rom/compat/components.rb +91 -0
  56. data/lib/rom/compat/global.rb +17 -0
  57. data/lib/rom/compat/mapper.rb +22 -0
  58. data/lib/rom/compat/registries.rb +47 -0
  59. data/lib/rom/compat/relation.rb +40 -0
  60. data/lib/rom/compat/schema/dsl.rb +260 -0
  61. data/lib/rom/compat/setting_proxy.rb +44 -0
  62. data/lib/rom/compat/setup.rb +151 -0
  63. data/lib/rom/compat/transformer.rb +49 -0
  64. data/lib/rom/compat.rb +22 -0
  65. data/lib/rom/components/association.rb +26 -0
  66. data/lib/rom/components/command.rb +24 -0
  67. data/lib/rom/components/core.rb +148 -0
  68. data/lib/rom/components/dataset.rb +60 -0
  69. data/lib/rom/components/dsl/association.rb +47 -0
  70. data/lib/rom/components/dsl/command.rb +60 -0
  71. data/lib/rom/components/dsl/core.rb +126 -0
  72. data/lib/rom/components/dsl/dataset.rb +33 -0
  73. data/lib/rom/components/dsl/gateway.rb +14 -0
  74. data/lib/rom/components/dsl/mapper.rb +70 -0
  75. data/lib/rom/components/dsl/relation.rb +49 -0
  76. data/lib/rom/components/dsl/schema.rb +150 -0
  77. data/lib/rom/components/dsl/view.rb +82 -0
  78. data/lib/rom/components/dsl.rb +255 -0
  79. data/lib/rom/components/gateway.rb +50 -0
  80. data/lib/rom/components/mapper.rb +29 -0
  81. data/lib/rom/components/provider.rb +160 -0
  82. data/lib/rom/components/registry.rb +154 -0
  83. data/lib/rom/components/relation.rb +41 -0
  84. data/lib/rom/components/schema.rb +61 -0
  85. data/lib/rom/components/view.rb +55 -0
  86. data/lib/rom/components.rb +55 -0
  87. data/lib/rom/configuration_dsl.rb +4 -0
  88. data/lib/rom/constants.rb +135 -0
  89. data/lib/rom/container.rb +182 -0
  90. data/lib/rom/core.rb +125 -0
  91. data/lib/rom/data_proxy.rb +97 -0
  92. data/lib/rom/enumerable_dataset.rb +70 -0
  93. data/lib/rom/gateway.rb +232 -0
  94. data/lib/rom/global.rb +56 -0
  95. data/lib/rom/header/attribute.rb +190 -0
  96. data/lib/rom/header.rb +198 -0
  97. data/lib/rom/inferrer.rb +55 -0
  98. data/lib/rom/initializer.rb +80 -0
  99. data/lib/rom/lint/enumerable_dataset.rb +56 -0
  100. data/lib/rom/lint/gateway.rb +120 -0
  101. data/lib/rom/lint/linter.rb +79 -0
  102. data/lib/rom/lint/spec.rb +22 -0
  103. data/lib/rom/lint/test.rb +98 -0
  104. data/lib/rom/loader.rb +161 -0
  105. data/lib/rom/mapper/attribute_dsl.rb +480 -0
  106. data/lib/rom/mapper/dsl.rb +107 -0
  107. data/lib/rom/mapper/model_dsl.rb +61 -0
  108. data/lib/rom/mapper.rb +99 -0
  109. data/lib/rom/mapper_compiler.rb +84 -0
  110. data/lib/rom/memory/associations/many_to_many.rb +12 -0
  111. data/lib/rom/memory/associations/many_to_one.rb +12 -0
  112. data/lib/rom/memory/associations/one_to_many.rb +12 -0
  113. data/lib/rom/memory/associations/one_to_one.rb +12 -0
  114. data/lib/rom/memory/associations.rb +6 -0
  115. data/lib/rom/memory/commands.rb +60 -0
  116. data/lib/rom/memory/dataset.rb +127 -0
  117. data/lib/rom/memory/gateway.rb +66 -0
  118. data/lib/rom/memory/mapper_compiler.rb +10 -0
  119. data/lib/rom/memory/relation.rb +91 -0
  120. data/lib/rom/memory/schema.rb +32 -0
  121. data/lib/rom/memory/storage.rb +61 -0
  122. data/lib/rom/memory/types.rb +11 -0
  123. data/lib/rom/memory.rb +7 -0
  124. data/lib/rom/model_builder.rb +103 -0
  125. data/lib/rom/open_struct.rb +112 -0
  126. data/lib/rom/pipeline.rb +111 -0
  127. data/lib/rom/plugin.rb +130 -0
  128. data/lib/rom/plugins/class_methods.rb +37 -0
  129. data/lib/rom/plugins/command/schema.rb +45 -0
  130. data/lib/rom/plugins/command/timestamps.rb +149 -0
  131. data/lib/rom/plugins/dsl.rb +53 -0
  132. data/lib/rom/plugins/relation/changeset.rb +97 -0
  133. data/lib/rom/plugins/relation/instrumentation.rb +66 -0
  134. data/lib/rom/plugins/relation/registry_reader.rb +36 -0
  135. data/lib/rom/plugins/schema/timestamps.rb +59 -0
  136. data/lib/rom/plugins.rb +100 -0
  137. data/lib/rom/processor/composer.rb +37 -0
  138. data/lib/rom/processor/transformer.rb +415 -0
  139. data/lib/rom/processor.rb +30 -0
  140. data/lib/rom/registries/associations.rb +26 -0
  141. data/lib/rom/registries/commands.rb +11 -0
  142. data/lib/rom/registries/container.rb +12 -0
  143. data/lib/rom/registries/datasets.rb +21 -0
  144. data/lib/rom/registries/gateways.rb +8 -0
  145. data/lib/rom/registries/mappers.rb +21 -0
  146. data/lib/rom/registries/nestable.rb +32 -0
  147. data/lib/rom/registries/relations.rb +8 -0
  148. data/lib/rom/registries/root.rb +203 -0
  149. data/lib/rom/registries/schemas.rb +44 -0
  150. data/lib/rom/registries/views.rb +11 -0
  151. data/lib/rom/relation/class_interface.rb +61 -0
  152. data/lib/rom/relation/combined.rb +160 -0
  153. data/lib/rom/relation/commands.rb +65 -0
  154. data/lib/rom/relation/composite.rb +53 -0
  155. data/lib/rom/relation/curried.rb +129 -0
  156. data/lib/rom/relation/graph.rb +107 -0
  157. data/lib/rom/relation/loaded.rb +136 -0
  158. data/lib/rom/relation/materializable.rb +62 -0
  159. data/lib/rom/relation/name.rb +122 -0
  160. data/lib/rom/relation/wrap.rb +64 -0
  161. data/lib/rom/relation.rb +625 -0
  162. data/lib/rom/repository/class_interface.rb +162 -0
  163. data/lib/rom/repository/relation_reader.rb +48 -0
  164. data/lib/rom/repository/root.rb +75 -0
  165. data/lib/rom/repository/session.rb +60 -0
  166. data/lib/rom/repository.rb +179 -0
  167. data/lib/rom/schema/associations_dsl.rb +222 -0
  168. data/lib/rom/schema/inferrer.rb +106 -0
  169. data/lib/rom/schema.rb +471 -0
  170. data/lib/rom/settings.rb +141 -0
  171. data/lib/rom/setup.rb +297 -0
  172. data/lib/rom/struct.rb +99 -0
  173. data/lib/rom/struct_compiler.rb +114 -0
  174. data/lib/rom/support/configurable.rb +213 -0
  175. data/lib/rom/support/inflector.rb +31 -0
  176. data/lib/rom/support/memoizable.rb +61 -0
  177. data/lib/rom/support/notifications.rb +238 -0
  178. data/lib/rom/transaction.rb +26 -0
  179. data/lib/rom/transformer.rb +46 -0
  180. data/lib/rom/types.rb +74 -0
  181. data/lib/rom/version.rb +1 -1
  182. data/lib/rom-changeset.rb +4 -0
  183. data/lib/rom-core.rb +3 -0
  184. data/lib/rom-repository.rb +4 -0
  185. data/lib/rom.rb +3 -3
  186. metadata +302 -23
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/definitions/abstract"
4
+
5
+ module ROM
6
+ module Associations
7
+ module Definitions
8
+ # @api private
9
+ class OneToMany < Abstract
10
+ result :many
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/definitions/abstract"
4
+
5
+ module ROM
6
+ module Associations
7
+ module Definitions
8
+ # @api private
9
+ class OneToOne < Abstract
10
+ result :one
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/definitions/abstract"
4
+
5
+ module ROM
6
+ module Associations
7
+ module Definitions
8
+ # @api private
9
+ class OneToOneThrough < ManyToMany
10
+ result :one
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/definitions/many_to_many"
4
+ require "rom/associations/definitions/many_to_one"
5
+ require "rom/associations/definitions/one_to_many"
6
+ require "rom/associations/definitions/one_to_one"
7
+ require "rom/associations/definitions/one_to_one_through"
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/types"
4
+ require "rom/associations/abstract"
5
+
6
+ module ROM
7
+ module Associations
8
+ # Abstract many-to-many association type
9
+ #
10
+ # @api public
11
+ class ManyToMany < Abstract
12
+ # @!attribute [r] join_relation
13
+ # @return [Relation] Intermediate join relation
14
+ attr_reader :join_relation
15
+
16
+ # @api private
17
+ def initialize(*)
18
+ super
19
+ @join_relation = relations[through]
20
+ end
21
+ ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
22
+
23
+ # Adapters should implement this method
24
+ #
25
+ # @abstract
26
+ #
27
+ # @api public
28
+ def call(*)
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # Return configured or inferred FK name
33
+ #
34
+ # @return [Symbol]
35
+ #
36
+ # @api public
37
+ def foreign_key
38
+ definition.foreign_key || join_relation.foreign_key(source.name)
39
+ end
40
+
41
+ # Return join-relation name
42
+ #
43
+ # @return [Symbol]
44
+ #
45
+ # @api public
46
+ def through
47
+ definition.through
48
+ end
49
+
50
+ # Return parent's relation combine keys
51
+ #
52
+ # @return [Hash<Symbol=>Symbol>]
53
+ #
54
+ # @api private
55
+ def parent_combine_keys
56
+ target.associations[source.name].combine_keys.to_a.flatten(1)
57
+ end
58
+
59
+ # Associate child tuples with the provided parent
60
+ #
61
+ # @param [Array<Hash>] children An array with child tuples
62
+ # @param [Array,Hash] parent An array with parent tuples or a single tuple
63
+ #
64
+ # @return [Array<Hash>]
65
+ #
66
+ # @api private
67
+ def associate(children, parent)
68
+ ((spk, sfk), (tfk, tpk)) = join_key_map
69
+
70
+ case parent
71
+ when Array
72
+ parent.map { |p| associate(children, p) }.flatten(1)
73
+ else
74
+ children.map { |tuple|
75
+ {sfk => tuple.fetch(spk), tfk => parent.fetch(tpk)}
76
+ }
77
+ end
78
+ end
79
+
80
+ protected
81
+
82
+ # Primary key name on the source side
83
+ #
84
+ # @return [Symbol]
85
+ #
86
+ # @api protected
87
+ def source_key
88
+ source.primary_key
89
+ end
90
+
91
+ # Foreign key name on the target side
92
+ #
93
+ # @return [Symbol]
94
+ #
95
+ # @api protected
96
+ def target_key
97
+ foreign_key
98
+ end
99
+
100
+ # Return association for many-to-many-through
101
+ #
102
+ # @return [Association]
103
+ #
104
+ # @api protected
105
+ def join_assoc
106
+ if join_relation.associations.key?(through.assoc_name)
107
+ join_relation.associations[through.assoc_name]
108
+ else
109
+ join_relation.associations[through.target]
110
+ end
111
+ end
112
+
113
+ # Return a [pk, fk] mapping for source/target relations
114
+ #
115
+ # @return [Array<Symbol>]
116
+ #
117
+ # @api protected
118
+ def join_key_map
119
+ left = super
120
+ right = join_assoc.join_key_map
121
+
122
+ [left, right]
123
+ end
124
+
125
+ memoize :foreign_key, :join_assoc, :join_key_map
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/abstract"
4
+
5
+ module ROM
6
+ module Associations
7
+ # Abstract many-to-one association type
8
+ #
9
+ # @api public
10
+ class ManyToOne < Abstract
11
+ # Adapters must implement this method
12
+ #
13
+ # @abstract
14
+ #
15
+ # @api public
16
+ def call(*)
17
+ raise NotImplementedError
18
+ end
19
+
20
+ # Return configured or inferred FK name
21
+ #
22
+ # @return [Symbol]
23
+ #
24
+ # @api public
25
+ def foreign_key
26
+ definition.foreign_key || source.foreign_key(target.name)
27
+ end
28
+
29
+ # Associate child with a parent
30
+ #
31
+ # @param [Hash] child The child tuple
32
+ # @param [Hash] parent The parent tuple
33
+ #
34
+ # @return [Hash]
35
+ #
36
+ # @api private
37
+ def associate(child, parent)
38
+ fk, pk = join_key_map
39
+ child.merge(fk => parent.fetch(pk))
40
+ end
41
+
42
+ protected
43
+
44
+ # Return foreign key on the source side
45
+ #
46
+ # @return [Symbol]
47
+ #
48
+ # @api protected
49
+ def source_key
50
+ foreign_key
51
+ end
52
+
53
+ # Return primary key on the target side
54
+ #
55
+ # @return [Symbol]
56
+ #
57
+ # @api protected
58
+ def target_key
59
+ target.schema.primary_key_name
60
+ end
61
+
62
+ memoize :foreign_key
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/abstract"
4
+
5
+ module ROM
6
+ module Associations
7
+ # Abstract one-to-many association
8
+ #
9
+ # @api public
10
+ class OneToMany < Abstract
11
+ # Adapters must implement this method
12
+ #
13
+ # @abstract
14
+ #
15
+ # @api public
16
+ def call(*)
17
+ raise NotImplementedError
18
+ end
19
+
20
+ # Return configured or inferred FK name
21
+ #
22
+ # @return [Symbol]
23
+ #
24
+ # @api public
25
+ def foreign_key
26
+ definition.foreign_key || target.foreign_key(source.name)
27
+ end
28
+
29
+ # Associate child tuple with a parent
30
+ #
31
+ # @param [Hash] child The child tuple
32
+ # @param [Hash] parent The parent tuple
33
+ #
34
+ # @return [Hash]
35
+ #
36
+ # @api private
37
+ def associate(child, parent)
38
+ pk, fk = join_key_map
39
+ child.merge(fk => parent.fetch(pk))
40
+ end
41
+
42
+ protected
43
+
44
+ # Return primary key on the source side
45
+ #
46
+ # @return [Symbol]
47
+ #
48
+ # @api protected
49
+ def source_key
50
+ source.schema.primary_key_name
51
+ end
52
+
53
+ # Return foreign key name on the target side
54
+ #
55
+ # @return [Symbol]
56
+ #
57
+ # @api protected
58
+ def target_key
59
+ foreign_key
60
+ end
61
+
62
+ memoize :foreign_key
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/one_to_many"
4
+
5
+ module ROM
6
+ module Associations
7
+ # Abstract one-to-one association type
8
+ #
9
+ # @api public
10
+ class OneToOne < OneToMany
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/associations/many_to_many"
4
+
5
+ module ROM
6
+ module Associations
7
+ # Abstract one-to-one-through association type
8
+ #
9
+ # @api public
10
+ class OneToOneThrough < ManyToMany
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rom/support/inflector"
4
+
5
+ module ROM
6
+ module Associations
7
+ # @api private
8
+ class ThroughIdentifier
9
+ # @api private
10
+ attr_reader :source
11
+
12
+ # @api private
13
+ attr_reader :target
14
+
15
+ # @api private
16
+ attr_reader :assoc_name
17
+
18
+ # @api private
19
+ def self.[](source, target, assoc_name = nil, inflector: Inflector)
20
+ new(source, target, assoc_name || default_assoc_name(target, inflector: inflector))
21
+ end
22
+
23
+ # @api private
24
+ def self.default_assoc_name(relation, inflector:)
25
+ inflector.singularize(relation).to_sym
26
+ end
27
+
28
+ # @api private
29
+ def initialize(source, target, assoc_name)
30
+ @source = source
31
+ @target = target
32
+ @assoc_name = assoc_name
33
+ end
34
+
35
+ # @api private
36
+ def to_sym
37
+ source
38
+ end
39
+ end
40
+ end
41
+ end