rom 2.0.2 → 5.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +122 -324
  3. data/LICENSE +17 -17
  4. data/README.md +91 -22
  5. data/lib/rom/version.rb +3 -1
  6. data/lib/rom.rb +4 -46
  7. metadata +42 -245
  8. data/.gitignore +0 -24
  9. data/.rspec +0 -3
  10. data/.rubocop.yml +0 -87
  11. data/.rubocop_todo.yml +0 -46
  12. data/.travis.yml +0 -28
  13. data/CODE_OF_CONDUCT.md +0 -13
  14. data/CONTRIBUTING.md +0 -1
  15. data/Gemfile +0 -41
  16. data/Guardfile +0 -24
  17. data/Rakefile +0 -22
  18. data/lib/rom/association_set.rb +0 -26
  19. data/lib/rom/command.rb +0 -173
  20. data/lib/rom/command_registry.rb +0 -153
  21. data/lib/rom/commands/class_interface.rb +0 -148
  22. data/lib/rom/commands/composite.rb +0 -54
  23. data/lib/rom/commands/create.rb +0 -13
  24. data/lib/rom/commands/delete.rb +0 -14
  25. data/lib/rom/commands/graph/builder.rb +0 -176
  26. data/lib/rom/commands/graph/class_interface.rb +0 -62
  27. data/lib/rom/commands/graph/input_evaluator.rb +0 -62
  28. data/lib/rom/commands/graph.rb +0 -103
  29. data/lib/rom/commands/lazy/create.rb +0 -23
  30. data/lib/rom/commands/lazy/delete.rb +0 -27
  31. data/lib/rom/commands/lazy/update.rb +0 -34
  32. data/lib/rom/commands/lazy.rb +0 -99
  33. data/lib/rom/commands/result.rb +0 -96
  34. data/lib/rom/commands/update.rb +0 -14
  35. data/lib/rom/commands.rb +0 -3
  36. data/lib/rom/configuration.rb +0 -88
  37. data/lib/rom/configuration_dsl/command.rb +0 -43
  38. data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
  39. data/lib/rom/configuration_dsl/mapper.rb +0 -37
  40. data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -44
  41. data/lib/rom/configuration_dsl/relation.rb +0 -26
  42. data/lib/rom/configuration_dsl.rb +0 -78
  43. data/lib/rom/configuration_plugin.rb +0 -17
  44. data/lib/rom/constants.rb +0 -30
  45. data/lib/rom/container.rb +0 -231
  46. data/lib/rom/create_container.rb +0 -61
  47. data/lib/rom/environment.rb +0 -70
  48. data/lib/rom/gateway.rb +0 -154
  49. data/lib/rom/global/plugin_dsl.rb +0 -49
  50. data/lib/rom/global.rb +0 -60
  51. data/lib/rom/lint/enumerable_dataset.rb +0 -54
  52. data/lib/rom/lint/gateway.rb +0 -94
  53. data/lib/rom/lint/linter.rb +0 -78
  54. data/lib/rom/lint/spec.rb +0 -20
  55. data/lib/rom/lint/test.rb +0 -98
  56. data/lib/rom/mapper_registry.rb +0 -35
  57. data/lib/rom/memory/commands.rb +0 -58
  58. data/lib/rom/memory/dataset.rb +0 -98
  59. data/lib/rom/memory/gateway.rb +0 -64
  60. data/lib/rom/memory/relation.rb +0 -49
  61. data/lib/rom/memory/storage.rb +0 -59
  62. data/lib/rom/memory/types.rb +0 -9
  63. data/lib/rom/memory.rb +0 -4
  64. data/lib/rom/pipeline.rb +0 -106
  65. data/lib/rom/plugin.rb +0 -17
  66. data/lib/rom/plugin_base.rb +0 -31
  67. data/lib/rom/plugin_registry.rb +0 -173
  68. data/lib/rom/plugins/command/schema.rb +0 -37
  69. data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -17
  70. data/lib/rom/plugins/relation/key_inference.rb +0 -46
  71. data/lib/rom/plugins/relation/registry_reader.rb +0 -32
  72. data/lib/rom/plugins/relation/view/dsl.rb +0 -32
  73. data/lib/rom/plugins/relation/view.rb +0 -95
  74. data/lib/rom/relation/class_interface.rb +0 -230
  75. data/lib/rom/relation/composite.rb +0 -46
  76. data/lib/rom/relation/curried.rb +0 -104
  77. data/lib/rom/relation/graph.rb +0 -115
  78. data/lib/rom/relation/loaded.rb +0 -118
  79. data/lib/rom/relation/materializable.rb +0 -66
  80. data/lib/rom/relation/name.rb +0 -102
  81. data/lib/rom/relation.rb +0 -172
  82. data/lib/rom/relation_registry.rb +0 -9
  83. data/lib/rom/schema/dsl.rb +0 -58
  84. data/lib/rom/schema.rb +0 -89
  85. data/lib/rom/setup/auto_registration.rb +0 -69
  86. data/lib/rom/setup/auto_registration_strategies/base.rb +0 -11
  87. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -22
  88. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -19
  89. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
  90. data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
  91. data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
  92. data/lib/rom/setup/finalize/finalize_relations.rb +0 -60
  93. data/lib/rom/setup/finalize.rb +0 -146
  94. data/lib/rom/setup.rb +0 -55
  95. data/lib/rom/support/configurable.rb +0 -80
  96. data/lib/rom/types.rb +0 -18
  97. data/log/.gitkeep +0 -0
  98. data/rakelib/benchmark.rake +0 -15
  99. data/rakelib/mutant.rake +0 -19
  100. data/rakelib/rubocop.rake +0 -18
  101. data/rom.gemspec +0 -26
  102. data/spec/fixtures/app/commands/create_user.rb +0 -2
  103. data/spec/fixtures/app/mappers/user_list.rb +0 -2
  104. data/spec/fixtures/app/my_commands/create_user.rb +0 -2
  105. data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
  106. data/spec/fixtures/app/my_relations/users.rb +0 -2
  107. data/spec/fixtures/app/relations/users.rb +0 -2
  108. data/spec/fixtures/custom/commands/create_user.rb +0 -6
  109. data/spec/fixtures/custom/mappers/user_list.rb +0 -6
  110. data/spec/fixtures/custom/relations/users.rb +0 -6
  111. data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
  112. data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
  113. data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
  114. data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
  115. data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
  116. data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
  117. data/spec/integration/command_registry_spec.rb +0 -60
  118. data/spec/integration/commands/create_spec.rb +0 -177
  119. data/spec/integration/commands/delete_spec.rb +0 -67
  120. data/spec/integration/commands/error_handling_spec.rb +0 -25
  121. data/spec/integration/commands/graph_builder_spec.rb +0 -213
  122. data/spec/integration/commands/graph_spec.rb +0 -288
  123. data/spec/integration/commands/update_spec.rb +0 -109
  124. data/spec/integration/commands_spec.rb +0 -67
  125. data/spec/integration/mappers/combine_spec.rb +0 -117
  126. data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
  127. data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
  128. data/spec/integration/mappers/embedded_spec.rb +0 -62
  129. data/spec/integration/mappers/exclude_spec.rb +0 -27
  130. data/spec/integration/mappers/fold_spec.rb +0 -71
  131. data/spec/integration/mappers/group_spec.rb +0 -163
  132. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
  133. data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
  134. data/spec/integration/mappers/prefix_spec.rb +0 -48
  135. data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
  136. data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
  137. data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
  138. data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
  139. data/spec/integration/mappers/step_spec.rb +0 -119
  140. data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
  141. data/spec/integration/mappers/unfold_spec.rb +0 -92
  142. data/spec/integration/mappers/ungroup_spec.rb +0 -126
  143. data/spec/integration/mappers/unwrap_spec.rb +0 -93
  144. data/spec/integration/mappers/wrap_spec.rb +0 -155
  145. data/spec/integration/memory/commands/create_spec.rb +0 -23
  146. data/spec/integration/memory/commands/delete_spec.rb +0 -23
  147. data/spec/integration/memory/commands/update_spec.rb +0 -23
  148. data/spec/integration/multi_env_spec.rb +0 -69
  149. data/spec/integration/multi_repo_spec.rb +0 -46
  150. data/spec/integration/relations/default_dataset_spec.rb +0 -38
  151. data/spec/integration/relations/inheritance_spec.rb +0 -37
  152. data/spec/integration/relations/reading_spec.rb +0 -169
  153. data/spec/integration/relations/registry_dsl_spec.rb +0 -45
  154. data/spec/integration/repositories/extending_relations_spec.rb +0 -58
  155. data/spec/integration/repositories/setting_logger_spec.rb +0 -34
  156. data/spec/integration/setup_spec.rb +0 -160
  157. data/spec/shared/command_behavior.rb +0 -28
  158. data/spec/shared/command_graph.rb +0 -50
  159. data/spec/shared/container.rb +0 -9
  160. data/spec/shared/enumerable_dataset.rb +0 -52
  161. data/spec/shared/gateway_only.rb +0 -6
  162. data/spec/shared/materializable.rb +0 -36
  163. data/spec/shared/no_container.rb +0 -16
  164. data/spec/shared/one_behavior.rb +0 -26
  165. data/spec/shared/proxy.rb +0 -0
  166. data/spec/shared/users_and_tasks.rb +0 -10
  167. data/spec/spec_helper.rb +0 -52
  168. data/spec/support/constant_leak_finder.rb +0 -14
  169. data/spec/support/mutant.rb +0 -10
  170. data/spec/support/types.rb +0 -5
  171. data/spec/test/memory_repository_lint_test.rb +0 -27
  172. data/spec/unit/rom/association_set_spec.rb +0 -23
  173. data/spec/unit/rom/commands/graph_spec.rb +0 -191
  174. data/spec/unit/rom/commands/lazy_spec.rb +0 -307
  175. data/spec/unit/rom/commands/result_spec.rb +0 -70
  176. data/spec/unit/rom/commands_spec.rb +0 -165
  177. data/spec/unit/rom/configurable_spec.rb +0 -49
  178. data/spec/unit/rom/configuration_spec.rb +0 -61
  179. data/spec/unit/rom/container_spec.rb +0 -99
  180. data/spec/unit/rom/create_container_spec.rb +0 -151
  181. data/spec/unit/rom/environment_spec.rb +0 -123
  182. data/spec/unit/rom/gateway_spec.rb +0 -146
  183. data/spec/unit/rom/mapper_registry_spec.rb +0 -25
  184. data/spec/unit/rom/memory/commands_spec.rb +0 -43
  185. data/spec/unit/rom/memory/dataset_spec.rb +0 -31
  186. data/spec/unit/rom/memory/relation_spec.rb +0 -109
  187. data/spec/unit/rom/memory/repository_spec.rb +0 -12
  188. data/spec/unit/rom/memory/storage_spec.rb +0 -45
  189. data/spec/unit/rom/plugin_spec.rb +0 -150
  190. data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
  191. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
  192. data/spec/unit/rom/plugins/relation/view_spec.rb +0 -51
  193. data/spec/unit/rom/relation/composite_spec.rb +0 -89
  194. data/spec/unit/rom/relation/curried_spec.rb +0 -52
  195. data/spec/unit/rom/relation/graph_spec.rb +0 -92
  196. data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
  197. data/spec/unit/rom/relation/lazy_spec.rb +0 -214
  198. data/spec/unit/rom/relation/loaded_spec.rb +0 -53
  199. data/spec/unit/rom/relation/name_spec.rb +0 -58
  200. data/spec/unit/rom/relation/schema_spec.rb +0 -117
  201. data/spec/unit/rom/relation_spec.rb +0 -237
  202. data/spec/unit/rom/schema_spec.rb +0 -10
  203. data/spec/unit/rom/setup/auto_registration_spec.rb +0 -152
@@ -1,148 +0,0 @@
1
- require 'rom/support/class_builder'
2
-
3
- module ROM
4
- # Base command class with factory class-level interface and setup-related logic
5
- #
6
- # @private
7
- class Command
8
- module ClassInterface
9
- # Return adapter specific sub-class based on the adapter identifier
10
- #
11
- # This is a syntax sugar to make things consistent
12
- #
13
- # @example
14
- # ROM::Commands::Create[:memory]
15
- # # => ROM::Memory::Commands::Create
16
- #
17
- # @param [Symbol] adapter identifier
18
- #
19
- # @return [Class]
20
- #
21
- # @api public
22
- def [](adapter)
23
- adapter_namespace(adapter).const_get(Inflector.demodulize(name))
24
- end
25
-
26
- # Return namespaces that contains command subclasses of a specific adapter
27
- #
28
- # @param [Symbol] adapter identifier
29
- #
30
- # @return [Module]
31
- #
32
- # @api private
33
- def adapter_namespace(adapter)
34
- ROM.adapters.fetch(adapter).const_get(:Commands)
35
- rescue KeyError
36
- raise AdapterNotPresentError.new(adapter, :relation)
37
- end
38
-
39
- # Build a command class for a specific relation with options
40
- #
41
- # @example
42
- # class CreateUser < ROM::Commands::Create[:memory]
43
- # end
44
- #
45
- # command = CreateUser.build(rom.relations[:users])
46
- #
47
- # @param [Relation] relation
48
- # @param [Hash] options
49
- #
50
- # @return [Command]
51
- #
52
- # @api public
53
- def build(relation, options = EMPTY_HASH)
54
- new(relation, self.options.merge(options))
55
- end
56
-
57
- # Create a command class with a specific type
58
- #
59
- # @param [Symbol] command name
60
- # @param [Class] parent class
61
- #
62
- # @yield [Class] create class
63
- #
64
- # @return [Class, Object] return result of the block if it was provided
65
- #
66
- # @api public
67
- def create_class(name, type, &block)
68
- klass = ClassBuilder
69
- .new(name: "#{Inflector.classify(type)}[:#{name}]", parent: type)
70
- .call
71
-
72
- if block
73
- yield(klass)
74
- else
75
- klass
76
- end
77
- end
78
-
79
- # Use a configured plugin in this relation
80
- #
81
- # @example
82
- # class CreateUser < ROM::Commands::Create[:memory]
83
- # use :pagintion
84
- #
85
- # per_page 30
86
- # end
87
- #
88
- # @param [Symbol] plugin
89
- # @param [Hash] options
90
- # @option options [Symbol] :adapter (:default) first adapter to check for plugin
91
- #
92
- # @api public
93
- def use(plugin, _options = EMPTY_HASH)
94
- ROM.plugin_registry.commands.fetch(plugin, adapter).apply_to(self)
95
- end
96
-
97
- # Extend a command class with relation view methods
98
- #
99
- # @param [Relation]
100
- #
101
- # @return [Class]
102
- #
103
- # @api public
104
- def extend_for_relation(relation)
105
- include(relation_methods_mod(relation.class))
106
- end
107
-
108
- # Return default name of the command class based on its name
109
- #
110
- # During setup phase this is used by defalut as `register_as` option
111
- #
112
- # @return [Symbol]
113
- #
114
- # @api private
115
- def default_name
116
- Inflector.underscore(Inflector.demodulize(name)).to_sym
117
- end
118
-
119
- # Return default options based on class macros
120
- #
121
- # @return [Hash]
122
- #
123
- # @api private
124
- def options
125
- { input: input, validator: validator, result: result }
126
- end
127
-
128
- # @api private
129
- def relation_methods_mod(relation_class)
130
- Module.new do
131
- relation_class.view_methods.each do |meth|
132
- module_eval <<-RUBY, __FILE__, __LINE__ + 1
133
- def #{meth}(*args)
134
- response = relation.public_send(:#{meth}, *args)
135
-
136
- if response.is_a?(relation.class)
137
- new(response)
138
- else
139
- response
140
- end
141
- end
142
- RUBY
143
- end
144
- end
145
- end
146
- end
147
- end
148
- end
@@ -1,54 +0,0 @@
1
- require 'rom/pipeline'
2
- require 'rom/support/constants'
3
-
4
- module ROM
5
- module Commands
6
- # Composite command that consists of left and right commands
7
- #
8
- # @api public
9
- class Composite < Pipeline::Composite
10
- # Calls the composite command
11
- #
12
- # Right command is called with a result from the left one
13
- #
14
- # @return [Object]
15
- #
16
- # @api public
17
- def call(*args)
18
- response = left.call(*args)
19
-
20
- if response.nil? || (many? && response.size == 0)
21
- return one? ? nil : EMPTY_ARRAY
22
- end
23
-
24
- if one? && !graph?
25
- if right.is_a?(Command) || right.is_a?(Commands::Composite)
26
- right.call([response].first)
27
- else
28
- right.call([response]).first
29
- end
30
- elsif one? && graph?
31
- right.call(response).first
32
- else
33
- right.call(response)
34
- end
35
- end
36
- alias_method :[], :call
37
-
38
- # @api private
39
- def graph?
40
- left.is_a?(Graph)
41
- end
42
-
43
- # @api private
44
- def result
45
- left.result
46
- end
47
-
48
- # @api private
49
- def decorate?(response)
50
- super || response.is_a?(Graph)
51
- end
52
- end
53
- end
54
- end
@@ -1,13 +0,0 @@
1
- require 'rom/command'
2
-
3
- module ROM
4
- module Commands
5
- # Create command
6
- #
7
- # This command inserts a new tuple into a relation
8
- #
9
- # @abstract
10
- class Create < Command
11
- end
12
- end
13
- end
@@ -1,14 +0,0 @@
1
- require 'rom/command'
2
-
3
- module ROM
4
- module Commands
5
- # Delete command
6
- #
7
- # This command removes tuples from its target relation
8
- #
9
- # @abstract
10
- class Delete < Command
11
- restrictable true
12
- end
13
- end
14
- end
@@ -1,176 +0,0 @@
1
- module ROM
2
- module Commands
3
- class Graph
4
- # Command graph builder DSL
5
- #
6
- # @api public
7
- class Builder
8
- # @api private
9
- UnspecifiedRelationError = Class.new(StandardError)
10
- DoubleRestrictionError = Class.new(StandardError)
11
-
12
- # @api private
13
- class Node
14
- # @api private
15
- Restriction = Struct.new(:relation, :proc)
16
-
17
- # @api private
18
- Command = Struct.new(:name, :relation, :key, :proc)
19
-
20
- # @api private
21
- def initialize
22
- @nodes = []
23
- end
24
-
25
- # @api public
26
- def to_ast
27
- []
28
- end
29
-
30
- # Any missing method called on this is treated as a ROM command
31
- #
32
- # @api private
33
- def method_missing(*args, &block)
34
- command(*args, &block)
35
- end
36
-
37
- # @api public
38
- def command(name, relation = nil, key = nil, proc = nil, &block)
39
- if relation.is_a?(Hash)
40
- key, relation = relation.to_a.first
41
- end
42
-
43
- raise UnspecifiedRelationError if relation.nil?
44
-
45
- if relation.is_a?(RestrictionNode)
46
- RestrictionNode.new(relation.restriction).command(name, from: key, &block)
47
- else
48
- key ||= relation
49
-
50
- command = Command.new(name, relation, key, proc)
51
- node = CommandNode.new(command)
52
- block.call(node) if block
53
- node
54
- end
55
- end
56
-
57
- # @api public
58
- def restrict(name, &block)
59
- RestrictionNode.new(Restriction.new(name, block), self)
60
- end
61
- end
62
-
63
- # @api private
64
- class CommandNode < Node
65
- # @api private
66
- def initialize(command = nil)
67
- @command = command
68
- @nodes = []
69
- end
70
-
71
- # Tiny bit of synctactic sugar
72
- #
73
- # @api public
74
- def each(&block)
75
- block.call(self)
76
- end
77
-
78
- # Return command ast from this union node
79
- #
80
- # @return [Array]
81
- #
82
- # @api private
83
- def to_ast
84
- if @command.proc
85
- command = [@command.name => @command.proc]
86
- else
87
- command = [@command.name]
88
- end
89
-
90
- key_relation_map = { @command.key => @command.relation }
91
-
92
- command << @nodes.map(&:to_ast) unless @nodes.empty?
93
-
94
- [key_relation_map, command]
95
- end
96
-
97
- # @api public
98
- def command(*args, &block)
99
- node = super
100
- @nodes << node
101
- node
102
- end
103
- end
104
-
105
- # @api private
106
- class RestrictionNode < Node
107
- attr_reader :restriction
108
-
109
- def initialize(restriction, parent_node = nil)
110
- super()
111
- @restriction = restriction
112
- @parent_node = parent_node
113
- end
114
-
115
- # @api public
116
- def command(name, options = {}, &block)
117
- relation = @restriction.relation
118
- key = options[:from] || relation
119
- proc = @restriction.proc
120
-
121
- if @parent_node
122
- @parent_node.command(name, relation, key, proc, &block)
123
- else
124
- super(name, relation, key, proc, &block)
125
- end
126
- end
127
-
128
- # @api private
129
- def restrict(*args, &block)
130
- raise DoubleRestrictionError
131
- end
132
- end
133
-
134
- # @api private
135
- class RootNode < Node
136
- def to_ast
137
- if @nodes.size > 0
138
- @nodes.first.to_ast
139
- else
140
- []
141
- end
142
- end
143
-
144
- def command(*args, &block)
145
- node = super
146
- @nodes << node
147
- node
148
- end
149
- end
150
-
151
- # @api private
152
- class BuilderNode < RootNode
153
- def initialize(container)
154
- super()
155
- @container = container
156
- end
157
-
158
- def command(*args, &block)
159
- super
160
- @container.command(to_ast)
161
- end
162
- end
163
-
164
- # @api public
165
- def initialize(container)
166
- @container = container
167
- end
168
-
169
- # @api private
170
- def method_missing(*args, &block)
171
- BuilderNode.new(@container).send(*args, &block)
172
- end
173
- end
174
- end
175
- end
176
- end
@@ -1,62 +0,0 @@
1
- require 'rom/commands/graph/input_evaluator'
2
-
3
- module ROM
4
- module Commands
5
- class Graph
6
- # Class methods for command Graph
7
- #
8
- # @api private
9
- module ClassInterface
10
- # Build a command graph recursively
11
- #
12
- # This is used by `Container#command` when array with options is passed in
13
- #
14
- # @param [Registry] registry The command registry from container
15
- # @param [Array] options The options array
16
- # @param [Array] path The path for input evaluator proc
17
- #
18
- # @return [Graph]
19
- #
20
- # @api private
21
- def build(registry, options, path = EMPTY_ARRAY)
22
- options.reduce { |spec, other| build_command(registry, spec, other, path) }
23
- end
24
-
25
- # @api private
26
- def build_command(registry, spec, other, path)
27
- cmd_opts, nodes = other
28
-
29
- key, relation =
30
- if spec.is_a?(Hash)
31
- spec.to_a.first
32
- else
33
- [spec, spec]
34
- end
35
-
36
- name, opts =
37
- if cmd_opts.is_a?(Hash)
38
- cmd_opts.to_a.first
39
- else
40
- [cmd_opts]
41
- end
42
-
43
- command = registry[relation][name]
44
- tuple_path = Array[*path] << key
45
- input_proc = InputEvaluator.build(tuple_path, nodes)
46
-
47
- command = command.with(input_proc, opts)
48
-
49
- if nodes
50
- if nodes.all? { |node| node.is_a?(Array) }
51
- command.combine(*nodes.map { |node| build(registry, node, tuple_path) })
52
- else
53
- command.combine(build(registry, nodes, tuple_path))
54
- end
55
- else
56
- command
57
- end
58
- end
59
- end
60
- end
61
- end
62
- end
@@ -1,62 +0,0 @@
1
- module ROM
2
- module Commands
3
- class Graph
4
- class InputEvaluator
5
- include Dry::Equalizer(:tuple_path, :excluded_keys)
6
-
7
- attr_reader :tuple_path
8
-
9
- attr_reader :excluded_keys
10
-
11
- attr_reader :exclude_proc
12
-
13
- def self.build(tuple_path, nodes)
14
- new(tuple_path, extract_excluded_keys(nodes))
15
- end
16
-
17
- def self.extract_excluded_keys(nodes)
18
- return unless nodes
19
-
20
- nodes
21
- .map { |item| item.is_a?(Array) && item.size > 1 ? item.first : item }
22
- .compact
23
- .map { |item| item.is_a?(Hash) ? item.keys.first : item }
24
- .reject { |item| item.is_a?(Array) }
25
- end
26
-
27
- def self.exclude_proc(excluded_keys)
28
- -> input { input.reject { |k, _| excluded_keys.include?(k) } }
29
- end
30
-
31
- def initialize(tuple_path, excluded_keys)
32
- @tuple_path = tuple_path
33
- @excluded_keys = excluded_keys
34
- @exclude_proc = self.class.exclude_proc(excluded_keys)
35
- end
36
-
37
- def call(*args)
38
- input, index = args
39
-
40
- value =
41
- begin
42
- if index
43
- tuple_path[0..tuple_path.size-2]
44
- .reduce(input) { |a, e| a.fetch(e) }
45
- .at(index)[tuple_path.last]
46
- else
47
- tuple_path.reduce(input) { |a, e| a.fetch(e) }
48
- end
49
- rescue KeyError => e
50
- raise KeyMissing, e.message
51
- end
52
-
53
- if excluded_keys
54
- value.is_a?(Array) ? value.map(&exclude_proc) : exclude_proc[value]
55
- else
56
- value
57
- end
58
- end
59
- end
60
- end
61
- end
62
- end
@@ -1,103 +0,0 @@
1
- require 'rom/pipeline'
2
- require 'rom/support/options'
3
- require 'rom/commands/graph/class_interface'
4
-
5
- module ROM
6
- module Commands
7
- # Command graph
8
- #
9
- # @api private
10
- class Graph
11
- include Dry::Equalizer(:root, :nodes)
12
-
13
- extend ClassInterface
14
-
15
- include Options
16
- include Pipeline
17
- include Pipeline::Proxy
18
-
19
- # @attr_reader [Command] root The root command
20
- attr_reader :root
21
-
22
- # @attr_reader [Array<Command>] nodes The child commands
23
- attr_reader :nodes
24
-
25
- # @attr_reader [Symbol] root's relation name
26
- attr_reader :name
27
-
28
- alias_method :left, :root
29
- alias_method :right, :nodes
30
-
31
- option :mappers, reader: true, default: proc { MapperRegistry.new }
32
-
33
- # @api private
34
- def initialize(root, nodes, options = EMPTY_HASH)
35
- super
36
- @root = root
37
- @nodes = nodes
38
- @name = root.name
39
- end
40
-
41
- # Calls root and all nodes with the result from root
42
- #
43
- # Graph results are mappable through `combine` operation in mapper DSL
44
- #
45
- # @example
46
- # create_user = rom.command(:users).create
47
- # create_task = rom.command(:tasks).create
48
- #
49
- # command = create_user
50
- # .with(name: 'Jane')
51
- # .combine(create_task.with(title: 'Task'))
52
- #
53
- # command.call
54
- #
55
- # @return [Array] nested array with command results
56
- #
57
- # @api public
58
- def call(*args)
59
- left = root.call(*args)
60
-
61
- right = nodes.map { |node|
62
- response =
63
- if node.lazy?
64
- node.call(args.first, left)
65
- else
66
- node.call(left)
67
- end
68
-
69
- if node.one? && !node.graph?
70
- [response]
71
- else
72
- response
73
- end
74
- }
75
-
76
- if one?
77
- [[left], right]
78
- else
79
- [left, right]
80
- end
81
- end
82
-
83
- # Return a new graph with updated options
84
- #
85
- # @api private
86
- def with(new_options)
87
- self.class.new(root, nodes, options.merge(new_options))
88
- end
89
-
90
- # @api private
91
- def graph?
92
- true
93
- end
94
-
95
- private
96
-
97
- # @api public
98
- def composite_class
99
- Command::Composite
100
- end
101
- end
102
- end
103
- end
@@ -1,23 +0,0 @@
1
- module ROM
2
- module Commands
3
- class Lazy
4
- class Create < Lazy
5
- def call(*args)
6
- first = args.first
7
- last = args.last
8
- size = args.size
9
-
10
- if size > 1 && last.is_a?(Array)
11
- last.map.with_index do |parent, index|
12
- children = evaluator.call(first, index)
13
- command_proc[command, parent, children].call(children, parent)
14
- end.reduce(:concat)
15
- else
16
- input = evaluator.call(first)
17
- command.call(input, *args[1..size-1])
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,27 +0,0 @@
1
- module ROM
2
- module Commands
3
- class Lazy
4
- class Delete < Lazy
5
- def call(*args)
6
- first = args.first
7
- last = args.last
8
- size = args.size
9
-
10
- if size > 1 && last.is_a?(Array)
11
- raise NotImplementedError
12
- else
13
- input = evaluator.call(first)
14
-
15
- if input.is_a?(Array)
16
- input.map do |item|
17
- command_proc[command, *(size > 1 ? [last, item] : [input])].call
18
- end
19
- else
20
- command_proc[command, input].call
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end