rom 3.3.3 → 4.0.0.beta1

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 (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,390 +0,0 @@
1
- require 'delegate'
2
- require 'dry/equalizer'
3
- require 'dry/types/decorator'
4
- require 'rom/initializer'
5
-
6
- module ROM
7
- class Schema
8
- # Schema attributes provide meta information about types and an API
9
- # for additional operations. This class can be extended by adapters to provide
10
- # database-specific features. In example rom-sql provides SQL::Attribute
11
- # with more features like creating SQL expressions for queries.
12
- #
13
- # Schema attributes are accessible through canonical relation schemas and
14
- # instance-level schemas.
15
- #
16
- # @api public
17
- class Attribute
18
- include Dry::Equalizer(:type, :options)
19
-
20
- extend Initializer
21
-
22
- # !@attribute [r] type
23
- # @return [Dry::Types::Definition, Dry::Types::Sum, Dry::Types::Constrained]
24
- param :type
25
-
26
- # @api private
27
- def [](input)
28
- type[input]
29
- end
30
-
31
- # Return true if this attribute type is a primary key
32
- #
33
- # @example
34
- # class Users < ROM::Relation[:memory]
35
- # schema do
36
- # attribute :id, Types::Int
37
- # attribute :name, Types::String
38
- #
39
- # primary_key :id
40
- # end
41
- # end
42
- #
43
- # Users.schema[:id].primary_key?
44
- # # => true
45
- #
46
- # Users.schema[:name].primary_key?
47
- # # => false
48
- #
49
- # @return [TrueClass,FalseClass]
50
- #
51
- # @api public
52
- def primary_key?
53
- meta[:primary_key].equal?(true)
54
- end
55
-
56
- # Return true if this attribute type is a foreign key
57
- #
58
- # @example
59
- # class Tasks < ROM::Relation[:memory]
60
- # schema do
61
- # attribute :id, Types::Int
62
- # attribute :user_id, Types.ForeignKey(:users)
63
- # end
64
- # end
65
- #
66
- # Users.schema[:user_id].foreign_key?
67
- # # => true
68
- #
69
- # Users.schema[:id].foreign_key?
70
- # # => false
71
- #
72
- # @return [TrueClass,FalseClass]
73
- #
74
- # @api public
75
- def foreign_key?
76
- meta[:foreign_key].equal?(true)
77
- end
78
-
79
- # Return true if this attribute type is a foreign key
80
- #
81
- # @example
82
- # class Tasks < ROM::Relation[:memory]
83
- # schema do
84
- # attribute :user_id, Types::Int.meta(alias: :id)
85
- # attribute :name, Types::String
86
- # end
87
- # end
88
- #
89
- # Users.schema[:user_id].aliased?
90
- # # => true
91
- #
92
- # Users.schema[:name].aliased?
93
- # # => false
94
- #
95
- # @return [TrueClass,FalseClass]
96
- #
97
- # @api public
98
- def aliased?
99
- !meta[:alias].nil?
100
- end
101
-
102
- # Return source relation of this attribute type
103
- #
104
- # @example
105
- # class Tasks < ROM::Relation[:memory]
106
- # schema do
107
- # attribute :id, Types::Int
108
- # attribute :user_id, Types.ForeignKey(:users)
109
- # end
110
- # end
111
- #
112
- # Users.schema[:id].source
113
- # # => :tasks
114
- #
115
- # Users.schema[:user_id].source
116
- # # => :tasks
117
- #
118
- # @return [Symbol, Relation::Name]
119
- #
120
- # @api public
121
- def source
122
- meta[:source]
123
- end
124
-
125
- # Return target relation of this attribute type
126
- #
127
- # @example
128
- # class Tasks < ROM::Relation[:memory]
129
- # schema do
130
- # attribute :id, Types::Int
131
- # attribute :user_id, Types.ForeignKey(:users)
132
- # end
133
- # end
134
- #
135
- # Users.schema[:id].target
136
- # # => nil
137
- #
138
- # Users.schema[:user_id].target
139
- # # => :users
140
- #
141
- # @return [NilClass, Symbol, Relation::Name]
142
- #
143
- # @api public
144
- def target
145
- meta[:target]
146
- end
147
-
148
- # Return the canonical name of this attribute name
149
- #
150
- # This *always* returns the name that is used in the datastore, even when
151
- # an attribute is aliased
152
- #
153
- # @example
154
- # class Tasks < ROM::Relation[:memory]
155
- # schema do
156
- # attribute :user_id, Types::Int.meta(alias: :id)
157
- # attribute :name, Types::String
158
- # end
159
- # end
160
- #
161
- # Users.schema[:id].name
162
- # # => :id
163
- #
164
- # Users.schema[:user_id].name
165
- # # => :user_id
166
- #
167
- # @return [Symbol]
168
- #
169
- # @api public
170
- def name
171
- meta[:name]
172
- end
173
-
174
- # Return tuple key
175
- #
176
- # When schemas are projected with aliased attributes, we need a simple access to tuple keys
177
- #
178
- # @example
179
- # class Tasks < ROM::Relation[:memory]
180
- # schema do
181
- # attribute :user_id, Types::Int.meta(alias: :id)
182
- # attribute :name, Types::String
183
- # end
184
- # end
185
- #
186
- # Users.schema[:id].key
187
- # # :id
188
- #
189
- # Users.schema.project(Users.schema[:id].aliased(:user_id)).key
190
- # # :user_id
191
- #
192
- # @return [Symbol]
193
- #
194
- # @api public
195
- def key
196
- meta[:alias] || name
197
- end
198
-
199
- # Return attribute's alias
200
- #
201
- # @example
202
- # class Tasks < ROM::Relation[:memory]
203
- # schema do
204
- # attribute :user_id, Types::Int.meta(alias: :id)
205
- # attribute :name, Types::String
206
- # end
207
- # end
208
- #
209
- # Users.schema[:user_id].alias
210
- # # => :user_id
211
- #
212
- # Users.schema[:name].alias
213
- # # => nil
214
- #
215
- # @return [NilClass,Symbol]
216
- #
217
- # @api public
218
- def alias
219
- meta[:alias]
220
- end
221
-
222
- # Return new attribute type with provided alias
223
- #
224
- # @example
225
- # class Tasks < ROM::Relation[:memory]
226
- # schema do
227
- # attribute :user_id, Types::Int
228
- # attribute :name, Types::String
229
- # end
230
- # end
231
- #
232
- # aliased_user_id = Users.schema[:user_id].aliased(:id)
233
- #
234
- # aliased_user_id.aliased?
235
- # # => true
236
- #
237
- # aliased_user_id.name
238
- # # => :user_id
239
- #
240
- # aliased_user_id.alias
241
- # # => :id
242
- #
243
- # @param [Symbol] name The alias
244
- #
245
- # @return [Schema::Attribute]
246
- #
247
- # @api public
248
- def aliased(name)
249
- meta(alias: name)
250
- end
251
- alias_method :as, :aliased
252
-
253
- # Return new attribute type with an alias using provided prefix
254
- #
255
- # @example
256
- # class Users < ROM::Relation[:memory]
257
- # schema do
258
- # attribute :id, Types::Int
259
- # attribute :name, Types::String
260
- # end
261
- # end
262
- #
263
- # prefixed_id = Users.schema[:id].prefixed
264
- #
265
- # prefixed_id.aliased?
266
- # # => true
267
- #
268
- # prefixed_id.name
269
- # # => :id
270
- #
271
- # prefixed_id.alias
272
- # # => :users_id
273
- #
274
- # prefixed_id = Users.schema[:id].prefixed(:user)
275
- #
276
- # prefixed_id.alias
277
- # # => :user_id
278
- #
279
- # @param [Symbol] prefix The prefix (defaults to source.dataset)
280
- #
281
- # @return [Schema::Attribute]
282
- #
283
- # @api public
284
- def prefixed(prefix = source.dataset)
285
- aliased(:"#{prefix}_#{name}")
286
- end
287
-
288
- # Return if the attribute type is from a wrapped relation
289
- #
290
- # Wrapped attributes are used when two schemas from different relations
291
- # are merged together. This way we can identify them easily and handle
292
- # correctly in places like auto-mapping.
293
- #
294
- # @api public
295
- def wrapped?
296
- meta[:wrapped].equal?(true)
297
- end
298
-
299
- # Return attribute type wrapped for the specified relation name
300
- #
301
- # @param [Symbol] name The name of the source relation (defaults to source.dataset)
302
- #
303
- # @return [Schema::Attribute]
304
- #
305
- # @api public
306
- def wrapped(name = source.dataset)
307
- self.class.new(prefixed(name).meta(wrapped: true))
308
- end
309
-
310
- # Return attribute type with additional meta information
311
- #
312
- # Return meta information hash if no opts are provided
313
- #
314
- # @param [Hash] opts The meta options
315
- #
316
- # @return [Schema::Attribute]
317
- #
318
- # @api public
319
- def meta(opts = nil)
320
- if opts
321
- self.class.new(type.meta(opts))
322
- else
323
- type.meta
324
- end
325
- end
326
-
327
- # Return string representation of the attribute type
328
- #
329
- # @return [String]
330
- #
331
- # @api public
332
- def inspect
333
- %(#<#{self.class}[#{type.name}] #{meta.map { |k, v| "#{k}=#{v.inspect}" }.join(' ')}>)
334
- end
335
- alias_method :pretty_inspect, :inspect
336
-
337
- # Check if the attribute type is equal to another
338
- #
339
- # @param [Dry::Type, Schema::Attribute]
340
- #
341
- # @return [TrueClass,FalseClass]
342
- #
343
- # @api public
344
- def eql?(other)
345
- other.is_a?(self.class) ? super : type.eql?(other)
346
- end
347
-
348
- # Return if this attribute type has additional attribute type for reading
349
- # tuple values
350
- #
351
- # @return [TrueClass, FalseClass]
352
- #
353
- # @api private
354
- def read?
355
- ! meta[:read].nil?
356
- end
357
-
358
- # Return read type or self
359
- #
360
- # @return [Schema::Attribute]
361
- #
362
- # @api private
363
- def to_read_type
364
- read? ? meta[:read] : type
365
- end
366
-
367
- # @api private
368
- def respond_to_missing?(name, include_private = false)
369
- type.respond_to?(name) || super
370
- end
371
-
372
- private
373
-
374
- # @api private
375
- def method_missing(meth, *args, &block)
376
- if type.respond_to?(meth)
377
- response = type.__send__(meth, *args, &block)
378
-
379
- if response.is_a?(type.class)
380
- self.class.new(type, options)
381
- else
382
- response
383
- end
384
- else
385
- super
386
- end
387
- end
388
- end
389
- end
390
- end
@@ -1,67 +0,0 @@
1
- require 'dry-equalizer'
2
- require 'rom/types'
3
-
4
- module ROM
5
- # Relation schema
6
- #
7
- # @api public
8
- class Schema
9
- AttributeAlreadyDefinedError = Class.new(StandardError)
10
-
11
- include Dry::Equalizer(:name, :attributes)
12
- include Enumerable
13
-
14
- attr_reader :name, :attributes, :inferrer
15
-
16
- # @api public
17
- class DSL < BasicObject
18
- attr_reader :relation, :attributes, :inferrer, :schema_class
19
-
20
- # @api private
21
- def initialize(relation, schema_class: Schema, inferrer: Schema::DEFAULT_INFERRER, &block)
22
- @relation = relation
23
- @inferrer = inferrer
24
- @schema_class = schema_class
25
- @attributes = {}
26
-
27
- if block
28
- instance_exec(&block)
29
- end
30
- end
31
-
32
- # Defines a relation attribute with its type
33
- #
34
- # @see Relation.schema
35
- #
36
- # @api public
37
- def attribute(name, type, options = EMPTY_HASH)
38
- if @attributes.key?(name)
39
- ::Kernel.raise ::ROM::Schema::AttributeAlreadyDefinedError,
40
- "Attribute #{ name.inspect } already defined"
41
- end
42
-
43
- @attributes[name] =
44
- if options[:read]
45
- type.meta(name: name, source: relation, read: options[:read])
46
- else
47
- type.meta(name: name, source: relation)
48
- end
49
- end
50
-
51
- # Specify which key(s) should be the primary key
52
- #
53
- # @api public
54
- def primary_key(*names)
55
- names.each do |name|
56
- attributes[name] = attributes[name].meta(primary_key: true)
57
- end
58
- self
59
- end
60
-
61
- # @api private
62
- def call
63
- schema_class.define(relation, attributes: attributes.values, inferrer: inferrer)
64
- end
65
- end
66
- end
67
- end