rom 3.3.3 → 4.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (241) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -599
  3. data/lib/rom/version.rb +1 -1
  4. data/lib/rom.rb +3 -44
  5. metadata +19 -295
  6. data/.gitignore +0 -24
  7. data/.rspec +0 -3
  8. data/.rubocop.yml +0 -87
  9. data/.rubocop_todo.yml +0 -46
  10. data/.travis.yml +0 -24
  11. data/.yardopts +0 -2
  12. data/CODE_OF_CONDUCT.md +0 -13
  13. data/CONTRIBUTING.md +0 -1
  14. data/Gemfile +0 -54
  15. data/Guardfile +0 -24
  16. data/Rakefile +0 -28
  17. data/lib/rom/array_dataset.rb +0 -44
  18. data/lib/rom/association_set.rb +0 -49
  19. data/lib/rom/auto_curry.rb +0 -55
  20. data/lib/rom/command.rb +0 -494
  21. data/lib/rom/command_registry.rb +0 -148
  22. data/lib/rom/commands/class_interface.rb +0 -270
  23. data/lib/rom/commands/composite.rb +0 -53
  24. data/lib/rom/commands/create.rb +0 -13
  25. data/lib/rom/commands/delete.rb +0 -14
  26. data/lib/rom/commands/graph/builder.rb +0 -176
  27. data/lib/rom/commands/graph/class_interface.rb +0 -62
  28. data/lib/rom/commands/graph/input_evaluator.rb +0 -62
  29. data/lib/rom/commands/graph.rb +0 -95
  30. data/lib/rom/commands/lazy/create.rb +0 -23
  31. data/lib/rom/commands/lazy/delete.rb +0 -27
  32. data/lib/rom/commands/lazy/update.rb +0 -34
  33. data/lib/rom/commands/lazy.rb +0 -99
  34. data/lib/rom/commands/result.rb +0 -96
  35. data/lib/rom/commands/update.rb +0 -14
  36. data/lib/rom/commands.rb +0 -3
  37. data/lib/rom/configuration.rb +0 -90
  38. data/lib/rom/configuration_dsl/command.rb +0 -41
  39. data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
  40. data/lib/rom/configuration_dsl/mapper.rb +0 -36
  41. data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -43
  42. data/lib/rom/configuration_dsl/relation.rb +0 -26
  43. data/lib/rom/configuration_dsl.rb +0 -107
  44. data/lib/rom/configuration_plugin.rb +0 -17
  45. data/lib/rom/constants.rb +0 -36
  46. data/lib/rom/container.rb +0 -233
  47. data/lib/rom/create_container.rb +0 -60
  48. data/lib/rom/data_proxy.rb +0 -94
  49. data/lib/rom/enumerable_dataset.rb +0 -68
  50. data/lib/rom/environment.rb +0 -70
  51. data/lib/rom/gateway.rb +0 -196
  52. data/lib/rom/global/plugin_dsl.rb +0 -47
  53. data/lib/rom/global.rb +0 -58
  54. data/lib/rom/initializer.rb +0 -26
  55. data/lib/rom/lint/enumerable_dataset.rb +0 -54
  56. data/lib/rom/lint/gateway.rb +0 -120
  57. data/lib/rom/lint/linter.rb +0 -78
  58. data/lib/rom/lint/spec.rb +0 -20
  59. data/lib/rom/lint/test.rb +0 -98
  60. data/lib/rom/mapper_registry.rb +0 -35
  61. data/lib/rom/memory/commands.rb +0 -56
  62. data/lib/rom/memory/dataset.rb +0 -97
  63. data/lib/rom/memory/gateway.rb +0 -64
  64. data/lib/rom/memory/relation.rb +0 -62
  65. data/lib/rom/memory/schema.rb +0 -13
  66. data/lib/rom/memory/storage.rb +0 -59
  67. data/lib/rom/memory/types.rb +0 -9
  68. data/lib/rom/memory.rb +0 -4
  69. data/lib/rom/pipeline.rb +0 -122
  70. data/lib/rom/plugin.rb +0 -20
  71. data/lib/rom/plugin_base.rb +0 -40
  72. data/lib/rom/plugin_registry.rb +0 -173
  73. data/lib/rom/plugins/command/schema.rb +0 -37
  74. data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -21
  75. data/lib/rom/plugins/relation/instrumentation.rb +0 -51
  76. data/lib/rom/plugins/relation/key_inference.rb +0 -48
  77. data/lib/rom/plugins/relation/registry_reader.rb +0 -33
  78. data/lib/rom/registry.rb +0 -50
  79. data/lib/rom/relation/class_interface.rb +0 -356
  80. data/lib/rom/relation/composite.rb +0 -46
  81. data/lib/rom/relation/curried.rb +0 -109
  82. data/lib/rom/relation/graph.rb +0 -125
  83. data/lib/rom/relation/loaded.rb +0 -127
  84. data/lib/rom/relation/materializable.rb +0 -66
  85. data/lib/rom/relation/name.rb +0 -102
  86. data/lib/rom/relation/view_dsl.rb +0 -64
  87. data/lib/rom/relation.rb +0 -250
  88. data/lib/rom/relation_registry.rb +0 -9
  89. data/lib/rom/schema/attribute.rb +0 -390
  90. data/lib/rom/schema/dsl.rb +0 -67
  91. data/lib/rom/schema.rb +0 -407
  92. data/lib/rom/setup/auto_registration.rb +0 -74
  93. data/lib/rom/setup/auto_registration_strategies/base.rb +0 -16
  94. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -63
  95. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -20
  96. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
  97. data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
  98. data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
  99. data/lib/rom/setup/finalize/finalize_relations.rb +0 -83
  100. data/lib/rom/setup/finalize.rb +0 -152
  101. data/lib/rom/setup.rb +0 -65
  102. data/lib/rom/support/configurable.rb +0 -85
  103. data/lib/rom/transaction.rb +0 -24
  104. data/lib/rom/types.rb +0 -49
  105. data/log/.gitkeep +0 -0
  106. data/rakelib/benchmark.rake +0 -15
  107. data/rakelib/mutant.rake +0 -19
  108. data/rakelib/rubocop.rake +0 -18
  109. data/rom.gemspec +0 -25
  110. data/spec/fixtures/app/commands/create_user.rb +0 -2
  111. data/spec/fixtures/app/mappers/user_list.rb +0 -2
  112. data/spec/fixtures/app/my_commands/create_user.rb +0 -2
  113. data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
  114. data/spec/fixtures/app/my_relations/users.rb +0 -2
  115. data/spec/fixtures/app/relations/users.rb +0 -2
  116. data/spec/fixtures/custom/commands/create_user.rb +0 -6
  117. data/spec/fixtures/custom/mappers/user_list.rb +0 -6
  118. data/spec/fixtures/custom/relations/users.rb +0 -6
  119. data/spec/fixtures/custom_namespace/commands/create_customer.rb +0 -8
  120. data/spec/fixtures/custom_namespace/mappers/customer_list.rb +0 -8
  121. data/spec/fixtures/custom_namespace/relations/customers.rb +0 -8
  122. data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
  123. data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
  124. data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
  125. data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
  126. data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
  127. data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
  128. data/spec/fixtures/wrong/commands/create_customer.rb +0 -8
  129. data/spec/fixtures/wrong/mappers/customer_list.rb +0 -8
  130. data/spec/fixtures/wrong/relations/customers.rb +0 -8
  131. data/spec/integration/command_registry_spec.rb +0 -47
  132. data/spec/integration/commands/create_spec.rb +0 -157
  133. data/spec/integration/commands/delete_spec.rb +0 -67
  134. data/spec/integration/commands/error_handling_spec.rb +0 -25
  135. data/spec/integration/commands/graph_builder_spec.rb +0 -213
  136. data/spec/integration/commands/graph_spec.rb +0 -294
  137. data/spec/integration/commands/update_spec.rb +0 -86
  138. data/spec/integration/commands_spec.rb +0 -67
  139. data/spec/integration/gateways/extending_relations_spec.rb +0 -58
  140. data/spec/integration/gateways/setting_logger_spec.rb +0 -34
  141. data/spec/integration/mappers/combine_spec.rb +0 -117
  142. data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
  143. data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
  144. data/spec/integration/mappers/embedded_spec.rb +0 -62
  145. data/spec/integration/mappers/exclude_spec.rb +0 -27
  146. data/spec/integration/mappers/fold_spec.rb +0 -71
  147. data/spec/integration/mappers/group_spec.rb +0 -163
  148. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
  149. data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
  150. data/spec/integration/mappers/prefix_spec.rb +0 -48
  151. data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
  152. data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
  153. data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
  154. data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
  155. data/spec/integration/mappers/step_spec.rb +0 -119
  156. data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
  157. data/spec/integration/mappers/unfold_spec.rb +0 -92
  158. data/spec/integration/mappers/ungroup_spec.rb +0 -126
  159. data/spec/integration/mappers/unwrap_spec.rb +0 -93
  160. data/spec/integration/mappers/wrap_spec.rb +0 -155
  161. data/spec/integration/memory/commands/create_spec.rb +0 -23
  162. data/spec/integration/memory/commands/delete_spec.rb +0 -23
  163. data/spec/integration/memory/commands/update_spec.rb +0 -23
  164. data/spec/integration/multi_env_spec.rb +0 -69
  165. data/spec/integration/multi_repo_spec.rb +0 -46
  166. data/spec/integration/relations/default_dataset_spec.rb +0 -38
  167. data/spec/integration/relations/inheritance_spec.rb +0 -37
  168. data/spec/integration/relations/reading_spec.rb +0 -169
  169. data/spec/integration/relations/registry_dsl_spec.rb +0 -45
  170. data/spec/integration/setup_spec.rb +0 -193
  171. data/spec/shared/command_behavior.rb +0 -28
  172. data/spec/shared/command_graph.rb +0 -54
  173. data/spec/shared/container.rb +0 -9
  174. data/spec/shared/enumerable_dataset.rb +0 -52
  175. data/spec/shared/gateway_only.rb +0 -6
  176. data/spec/shared/materializable.rb +0 -36
  177. data/spec/shared/no_container.rb +0 -16
  178. data/spec/shared/one_behavior.rb +0 -26
  179. data/spec/shared/proxy.rb +0 -0
  180. data/spec/shared/users_and_tasks.rb +0 -10
  181. data/spec/spec_helper.rb +0 -59
  182. data/spec/support/constant_leak_finder.rb +0 -14
  183. data/spec/support/mutant.rb +0 -10
  184. data/spec/support/schema.rb +0 -14
  185. data/spec/support/types.rb +0 -5
  186. data/spec/test/memory_repository_lint_test.rb +0 -27
  187. data/spec/unit/rom/array_dataset_spec.rb +0 -59
  188. data/spec/unit/rom/association_set_spec.rb +0 -48
  189. data/spec/unit/rom/auto_curry_spec.rb +0 -71
  190. data/spec/unit/rom/commands/graph_spec.rb +0 -192
  191. data/spec/unit/rom/commands/lazy_spec.rb +0 -310
  192. data/spec/unit/rom/commands/pre_and_post_processors_spec.rb +0 -343
  193. data/spec/unit/rom/commands/result_spec.rb +0 -70
  194. data/spec/unit/rom/commands_spec.rb +0 -188
  195. data/spec/unit/rom/configurable_spec.rb +0 -49
  196. data/spec/unit/rom/configuration_spec.rb +0 -61
  197. data/spec/unit/rom/container_spec.rb +0 -109
  198. data/spec/unit/rom/create_container_spec.rb +0 -151
  199. data/spec/unit/rom/enumerable_dataset_spec.rb +0 -15
  200. data/spec/unit/rom/environment_spec.rb +0 -123
  201. data/spec/unit/rom/gateway_spec.rb +0 -146
  202. data/spec/unit/rom/mapper_registry_spec.rb +0 -25
  203. data/spec/unit/rom/memory/commands_spec.rb +0 -43
  204. data/spec/unit/rom/memory/dataset_spec.rb +0 -31
  205. data/spec/unit/rom/memory/gateway_spec.rb +0 -12
  206. data/spec/unit/rom/memory/inheritance_spec.rb +0 -32
  207. data/spec/unit/rom/memory/relation_spec.rb +0 -121
  208. data/spec/unit/rom/memory/storage_spec.rb +0 -45
  209. data/spec/unit/rom/plugin_spec.rb +0 -150
  210. data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
  211. data/spec/unit/rom/plugins/relation/instrumentation_spec.rb +0 -44
  212. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
  213. data/spec/unit/rom/registry_spec.rb +0 -86
  214. data/spec/unit/rom/relation/attribute_reader_spec.rb +0 -17
  215. data/spec/unit/rom/relation/call_spec.rb +0 -51
  216. data/spec/unit/rom/relation/composite_spec.rb +0 -106
  217. data/spec/unit/rom/relation/curried_spec.rb +0 -67
  218. data/spec/unit/rom/relation/graph_spec.rb +0 -106
  219. data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
  220. data/spec/unit/rom/relation/lazy/graph_spec.rb +0 -165
  221. data/spec/unit/rom/relation/lazy_spec.rb +0 -214
  222. data/spec/unit/rom/relation/loaded_spec.rb +0 -53
  223. data/spec/unit/rom/relation/name_spec.rb +0 -58
  224. data/spec/unit/rom/relation/output_schema_spec.rb +0 -28
  225. data/spec/unit/rom/relation/schema_spec.rb +0 -259
  226. data/spec/unit/rom/relation/view_spec.rb +0 -158
  227. data/spec/unit/rom/relation_spec.rb +0 -252
  228. data/spec/unit/rom/schema/accessing_attributes_spec.rb +0 -52
  229. data/spec/unit/rom/schema/append_spec.rb +0 -17
  230. data/spec/unit/rom/schema/exclude_spec.rb +0 -15
  231. data/spec/unit/rom/schema/finalize_spec.rb +0 -59
  232. data/spec/unit/rom/schema/key_predicate_spec.rb +0 -15
  233. data/spec/unit/rom/schema/merge_spec.rb +0 -17
  234. data/spec/unit/rom/schema/prefix_spec.rb +0 -16
  235. data/spec/unit/rom/schema/project_spec.rb +0 -15
  236. data/spec/unit/rom/schema/rename_spec.rb +0 -22
  237. data/spec/unit/rom/schema/type_spec.rb +0 -49
  238. data/spec/unit/rom/schema/uniq_spec.rb +0 -21
  239. data/spec/unit/rom/schema/wrap_spec.rb +0 -18
  240. data/spec/unit/rom/schema_spec.rb +0 -10
  241. data/spec/unit/rom/setup/auto_registration_spec.rb +0 -214
@@ -1,127 +0,0 @@
1
- module ROM
2
- class Relation
3
- # Materializes a relation and exposes interface to access the data
4
- #
5
- # @api public
6
- class Loaded
7
- include Enumerable
8
-
9
- # Coerce loaded relation to an array
10
- #
11
- # @return [Array]
12
- #
13
- # @api public
14
- alias_method :to_ary, :to_a
15
-
16
- # Source relation
17
- #
18
- # @return [Relation]
19
- #
20
- # @api private
21
- attr_reader :source
22
-
23
- # Materialized relation
24
- #
25
- # @return [Object]
26
- #
27
- # @api private
28
- attr_reader :collection
29
-
30
- # @api private
31
- def initialize(source, collection = source.to_a)
32
- @source = source
33
- @collection = collection
34
- end
35
-
36
- # Yield relation tuples
37
- #
38
- # @yield [Hash]
39
- #
40
- # @api public
41
- def each(&block)
42
- return to_enum unless block
43
- collection.each { |tuple| yield(tuple) }
44
- end
45
-
46
- # Returns a single tuple from the relation if there is one.
47
- #
48
- # @raise [ROM::TupleCountMismatchError] if the relation contains more than
49
- # one tuple
50
- #
51
- # @api public
52
- def one
53
- if collection.count > 1
54
- raise(
55
- TupleCountMismatchError,
56
- 'The relation consists of more than one tuple'
57
- )
58
- else
59
- collection.first
60
- end
61
- end
62
-
63
- # Like [one], but additionally raises an error if the relation is empty.
64
- #
65
- # @raise [ROM::TupleCountMismatchError] if the relation does not contain
66
- # exactly one tuple
67
- #
68
- # @api public
69
- def one!
70
- one || raise(
71
- TupleCountMismatchError,
72
- 'The relation does not contain any tuples'
73
- )
74
- end
75
-
76
- # Return a list of values under provided key
77
- #
78
- # @example
79
- # all_users = rom.relations[:users].call
80
- # all_users.pluck(:name)
81
- # # ["Jane", "Joe"]
82
- #
83
- # @param [Symbol] key The key name
84
- #
85
- # @return [Array]
86
- # @raises KeyError when provided key doesn't exist in any of the tuples
87
- #
88
- # @api public
89
- def pluck(key)
90
- map { |tuple| tuple.fetch(key) }
91
- end
92
-
93
- # Pluck primary key values
94
- #
95
- # This method *may not work* with adapters that don't provide relations
96
- # that have primary key configured
97
- #
98
- # @example
99
- # users = rom.relations[:users].call
100
- # users.primary_keys
101
- # # [1, 2, 3]
102
- #
103
- # @return [Array]
104
- #
105
- # @api public
106
- def primary_keys
107
- pluck(source.primary_key)
108
- end
109
-
110
- # Return if loaded relation is empty
111
- #
112
- # @return [TrueClass,FalseClass]
113
- #
114
- # @api public
115
- def empty?
116
- collection.empty?
117
- end
118
-
119
- # Return a loaded relation with a new collection
120
- #
121
- # @api public
122
- def new(collection)
123
- self.class.new(source, collection)
124
- end
125
- end
126
- end
127
- end
@@ -1,66 +0,0 @@
1
- module ROM
2
- class Relation
3
- # Interface for objects that can be materialized into a loaded relation
4
- #
5
- # @api public
6
- module Materializable
7
- # @abstract
8
- #
9
- # @api public
10
- def call(*)
11
- raise NotImplementedError, "#{self.class}#call must be implemented"
12
- end
13
-
14
- # Coerce the relation to an array
15
- #
16
- # @return [Array]
17
- #
18
- # @api public
19
- def to_a
20
- call.to_a
21
- end
22
- alias_method :to_ary, :to_a
23
-
24
- # Yield relation tuples
25
- #
26
- # @yield [Hash,Object]
27
- #
28
- # @api public
29
- def each(&block)
30
- return to_enum unless block
31
- to_a.each { |tuple| yield(tuple) }
32
- end
33
-
34
- # Delegate to loaded relation and return one object
35
- #
36
- # @return [Object]
37
- #
38
- # @see Loaded#one
39
- #
40
- # @api public
41
- def one
42
- call.one
43
- end
44
-
45
- # Delegate to loaded relation and return one object
46
- #
47
- # @return [Object]
48
- #
49
- # @see Loaded#one
50
- #
51
- # @api public
52
- def one!
53
- call.one!
54
- end
55
-
56
- # Return first tuple from a relation coerced to an array
57
- #
58
- # @return [Object]
59
- #
60
- # @api public
61
- def first
62
- to_a.first
63
- end
64
- end
65
- end
66
- end
@@ -1,102 +0,0 @@
1
- require 'dry/equalizer'
2
- require 'concurrent/map'
3
-
4
- module ROM
5
- class Relation
6
- # Relation name container
7
- #
8
- # This is a simple struct with two fields.
9
- # It handles both relation registration name (i.e. Symbol) and dataset name.
10
- # The reason we need it is a simplification of passing around these two objects.
11
- # It is quite common to have a dataset named differently from a relation
12
- # built on top if you are dealing with a legacy DB and often you need both
13
- # to support things such as associations (rom-sql as an example).
14
- #
15
- # @api private
16
- class Name
17
- include Dry::Equalizer(:relation, :dataset)
18
-
19
- # Coerce an object to a Name instance
20
- #
21
- # @return [ROM::Relation::Name]
22
- #
23
- # @api private
24
- def self.[](*args)
25
- cache.fetch_or_store(args.hash) do
26
- relation, dataset = args
27
-
28
- if relation.is_a?(Name)
29
- relation
30
- else
31
- new(relation, dataset)
32
- end
33
- end
34
- end
35
-
36
- # @api private
37
- def self.cache
38
- @cache ||= Concurrent::Map.new
39
- end
40
-
41
- # Relation registration name
42
- #
43
- # @return [Symbol]
44
- #
45
- # @api private
46
- attr_reader :relation
47
-
48
- # Underlying dataset name
49
- #
50
- # @return [Symbol]
51
- #
52
- # @api private
53
- attr_reader :dataset
54
-
55
- # @api private
56
- def initialize(relation, dataset = nil)
57
- @relation = relation
58
- @dataset = dataset || relation
59
- end
60
-
61
- # Return relation name
62
- #
63
- # @return [String]
64
- #
65
- # @api private
66
- def to_s
67
- if relation == dataset
68
- relation.to_s
69
- else
70
- "#{relation} on #{dataset}"
71
- end
72
- end
73
-
74
- # Alias for registration key implicitly called by ROM::Registry
75
- #
76
- # @return [Symbol]
77
- #
78
- # @api private
79
- def to_sym
80
- relation
81
- end
82
-
83
- # Return inspected relation
84
- #
85
- # @return [String]
86
- #
87
- # @api private
88
- def inspect
89
- "#{self.class.name}(#{to_s})"
90
- end
91
-
92
- # Build a new name. Useful for Curried and other relation proxies
93
- #
94
- # @return [ROM::Relation::Name]
95
- #
96
- # @api private
97
- def with(relation)
98
- self.class[relation, dataset]
99
- end
100
- end
101
- end
102
- end
@@ -1,64 +0,0 @@
1
- module ROM
2
- class Relation
3
- # ViewDSL is exposed in `Relation.view` method
4
- #
5
- # This is used to establish pre-defined relation views with explicit schemas.
6
- # Such views can be used to compose relations together, even from multiple
7
- # adapters.
8
- #
9
- # @api public
10
- class ViewDSL
11
- # @!attribute [r] name
12
- # @return [Symbol] The view name (relation method)
13
- attr_reader :name
14
-
15
- # @!attribute [r] relation_block
16
- # @return [Proc] The relation block that will be evaluated by the view method
17
- attr_reader :relation_block
18
-
19
- # @!attribute [r] new_schema
20
- # @return [Proc] The schema proc returned by the schema DSL
21
- attr_reader :new_schema
22
-
23
- # @api private
24
- def initialize(name, schema, &block)
25
- @name = name
26
- @schema = schema
27
- @new_schema = nil
28
- @relation_block = nil
29
- instance_eval(&block)
30
- end
31
-
32
- # Define a schema for a relation view
33
- #
34
- # @return [Proc]
35
- #
36
- # @see Relation::ClassInterface.view
37
- #
38
- # @api public
39
- def schema(&block)
40
- @new_schema = -> relations { @schema.with(relations: relations).instance_exec(&block) }
41
- end
42
-
43
- # Define a relation block for a relation view
44
- #
45
- # @return [Proc]
46
- #
47
- # @see Relation::ClassInterface.view
48
- #
49
- # @api public
50
- def relation(&block)
51
- @relation_block = lambda(&block)
52
- end
53
-
54
- # Return procs captured by the DSL
55
- #
56
- # @return [Array]
57
- #
58
- # @api private
59
- def call
60
- [name, new_schema, relation_block]
61
- end
62
- end
63
- end
64
- end
data/lib/rom/relation.rb DELETED
@@ -1,250 +0,0 @@
1
- require 'dry/core/class_attributes'
2
- require 'dry/core/deprecations'
3
-
4
- require 'rom/initializer'
5
- require 'rom/relation/class_interface'
6
-
7
- require 'rom/pipeline'
8
- require 'rom/mapper_registry'
9
-
10
- require 'rom/relation/loaded'
11
- require 'rom/relation/curried'
12
- require 'rom/relation/composite'
13
- require 'rom/relation/graph'
14
- require 'rom/relation/materializable'
15
- require 'rom/association_set'
16
-
17
- require 'rom/types'
18
- require 'rom/schema'
19
-
20
- module ROM
21
- # Base relation class
22
- #
23
- # Relation is a proxy for the dataset object provided by the gateway. It
24
- # can forward methods to the dataset, which is why the "native" interface of
25
- # the underlying gateway is available in the relation. This interface,
26
- # however, is considered private and should not be used outside of the
27
- # relation instance.
28
- #
29
- # Individual adapters sets up their relation classes and provide different APIs
30
- # depending on their persistence backend.
31
- #
32
- # Vanilla Relation class doesn't have APIs that are specific to ROM container setup.
33
- # When adapter Relation class inherits from this class, these APIs are added automatically,
34
- # so that they can be registered within a container.
35
- #
36
- # @see ROM::Relation::ClassInterface
37
- #
38
- # @api public
39
- class Relation
40
- # Default no-op output schema which is called in `Relation#each`
41
- NOOP_OUTPUT_SCHEMA = -> tuple { tuple }.freeze
42
-
43
- extend Initializer
44
- extend ClassInterface
45
- extend Dry::Core::Deprecations[:rom]
46
-
47
- extend Dry::Core::ClassAttributes
48
- defines :schema_class, :schema_inferrer, :schema_dsl
49
-
50
- schema_dsl Schema::DSL
51
- schema_class Schema
52
- schema_inferrer Schema::DEFAULT_INFERRER
53
-
54
- include Dry::Equalizer(:dataset)
55
- include Materializable
56
- include Pipeline
57
-
58
- # @!attribute [r] dataset
59
- # @return [Object] dataset used by the relation provided by relation's gateway
60
- # @api public
61
- param :dataset
62
-
63
- # @!attribute [r] mappers
64
- # @return [MapperRegistry] an optional mapper registry (empty by default)
65
- option :mappers, default: -> { MapperRegistry.new }
66
-
67
- # @!attribute [r] schema
68
- # @return [Schema] relation schema, defaults to class-level canonical
69
- # schema (if it was defined) and sets an empty one as
70
- # the fallback
71
- # @api public
72
- option :schema, default: -> { self.class.default_schema(self) }
73
-
74
- # @!attribute [r] input_schema
75
- # @return [Object#[]] tuple processing function, uses schema or defaults to Hash[]
76
- # @api private
77
- option :input_schema, default: -> { schema? ? schema.to_input_hash : Hash }
78
-
79
- # @!attribute [r] output_schema
80
- # @return [Object#[]] tuple processing function, uses schema or defaults to NOOP_OUTPUT_SCHEMA
81
- # @api private
82
- option :output_schema, default: -> {
83
- schema.any?(&:read?) ? schema.to_output_hash : NOOP_OUTPUT_SCHEMA
84
- }
85
-
86
- # Return schema attribute
87
- #
88
- # @example accessing canonical attribute
89
- # users[:id]
90
- # # => #<ROM::SQL::Attribute[Integer] primary_key=true name=:id source=ROM::Relation::Name(users)>
91
- #
92
- # @example accessing joined attribute
93
- # tasks_with_users = tasks.join(users).select_append(tasks[:title])
94
- # tasks_with_users[:title, :tasks]
95
- # # => #<ROM::SQL::Attribute[String] primary_key=false name=:title source=ROM::Relation::Name(tasks)>
96
- #
97
- # @return [Schema::Attribute]
98
- #
99
- # @api public
100
- def [](name)
101
- schema[name]
102
- end
103
-
104
- # Yields relation tuples
105
- #
106
- # Every tuple is processed through Relation#output_schema, it's a no-op by default
107
- #
108
- # @yield [Hash]
109
- #
110
- # @return [Enumerator] if block is not provided
111
- #
112
- # @api public
113
- def each(&block)
114
- return to_enum unless block
115
- dataset.each { |tuple| yield(output_schema[tuple]) }
116
- end
117
-
118
- # Composes with other relations
119
- #
120
- # @param [Array<Relation>] others The other relation(s) to compose with
121
- #
122
- # @return [Relation::Graph]
123
- #
124
- # @api public
125
- def graph(*others)
126
- Graph.build(self, others)
127
- end
128
- deprecate :combine, :graph
129
-
130
- # Loads relation
131
- #
132
- # @return [Relation::Loaded]
133
- #
134
- # @api public
135
- def call
136
- Loaded.new(self)
137
- end
138
-
139
- # Materializes a relation into an array
140
- #
141
- # @return [Array<Hash>]
142
- #
143
- # @api public
144
- def to_a
145
- to_enum.to_a
146
- end
147
-
148
- # Returns if this relation is curried
149
- #
150
- # @return [false]
151
- #
152
- # @api private
153
- def curried?
154
- false
155
- end
156
-
157
- # Returns if this relation is a graph
158
- #
159
- # @return [false]
160
- #
161
- # @api private
162
- def graph?
163
- false
164
- end
165
-
166
- # Returns true if a relation has schema defined
167
- #
168
- # @return [TrueClass, FalseClass]
169
- #
170
- # @api private
171
- def schema?
172
- ! schema.empty?
173
- end
174
-
175
- # Return a new relation with provided dataset and additional options
176
- #
177
- # Use this method whenever you need to use dataset API to get a new dataset
178
- # and you want to return a relation back. Typically relation API should be
179
- # enough though. If you find yourself using this method, it might be worth
180
- # to consider reporting an issue that some dataset functionality is not available
181
- # through relation API.
182
- #
183
- # @example with a new dataset
184
- # users.new(users.dataset.some_method)
185
- #
186
- # @example with a new dataset and options
187
- # users.new(users.dataset.some_method, other: 'options')
188
- #
189
- # @param [Object] dataset
190
- # @param [Hash] new_opts Additional options
191
- #
192
- # @api public
193
- def new(dataset, new_opts = EMPTY_HASH)
194
- if new_opts.empty?
195
- opts = options
196
- elsif new_opts.key?(:schema)
197
- opts = options.reject { |k, _| k == :input_schema || k == :output_schema }.merge(new_opts)
198
- else
199
- opts = options.merge(new_opts)
200
- end
201
-
202
- self.class.new(dataset, opts)
203
- end
204
-
205
- # Returns a new instance with the same dataset but new options
206
- #
207
- # @example
208
- # users.with(output_schema: -> tuple { .. })
209
- #
210
- # @param new_options [Hash]
211
- #
212
- # @return [Relation]
213
- #
214
- # @api private
215
- def with(new_options)
216
- new(dataset, options.merge(new_options))
217
- end
218
-
219
- # Return all registered relation schemas
220
- #
221
- # This holds all schemas defined via `view` DSL
222
- #
223
- # @return [Hash<Symbol=>Schema>]
224
- #
225
- # @api public
226
- def schemas
227
- @schemas ||= self.class.schemas
228
- end
229
-
230
- # Return schema's association set (empty by default)
231
- #
232
- # @return [AssociationSet] Schema's association set (empty by default)
233
- #
234
- # @api public
235
- def associations
236
- @associations ||= schema.associations
237
- end
238
-
239
- private
240
-
241
- # Hook used by `Pipeline` to get the class that should be used for composition
242
- #
243
- # @return [Class]
244
- #
245
- # @api private
246
- def composite_class
247
- Relation::Composite
248
- end
249
- end
250
- end
@@ -1,9 +0,0 @@
1
- module ROM
2
- class RelationRegistry < Registry
3
- def initialize(elements = {}, name = self.class.name)
4
- super
5
-
6
- yield(self, elements) if block_given?
7
- end
8
- end
9
- end