rom 0.9.1 → 1.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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +30 -12
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +24 -0
  5. data/Gemfile +7 -3
  6. data/README.md +24 -11
  7. data/lib/rom.rb +9 -26
  8. data/lib/rom/command.rb +113 -75
  9. data/lib/rom/commands/class_interface.rb +115 -0
  10. data/lib/rom/commands/graph.rb +17 -23
  11. data/lib/rom/commands/graph/builder.rb +176 -0
  12. data/lib/rom/commands/graph/class_interface.rb +8 -2
  13. data/lib/rom/commands/graph/input_evaluator.rb +13 -9
  14. data/lib/rom/commands/lazy.rb +23 -17
  15. data/lib/rom/commands/lazy/create.rb +23 -0
  16. data/lib/rom/commands/lazy/delete.rb +27 -0
  17. data/lib/rom/commands/lazy/update.rb +34 -0
  18. data/lib/rom/commands/result.rb +14 -0
  19. data/lib/rom/commands/update.rb +0 -4
  20. data/lib/rom/configuration.rb +86 -0
  21. data/lib/rom/{setup_dsl/setup.rb → configuration_dsl.rb} +9 -7
  22. data/lib/rom/configuration_dsl/command.rb +43 -0
  23. data/lib/rom/{setup_dsl → configuration_dsl}/command_dsl.rb +5 -4
  24. data/lib/rom/configuration_dsl/mapper.rb +37 -0
  25. data/lib/rom/{setup_dsl → configuration_dsl}/mapper_dsl.rb +11 -5
  26. data/lib/rom/configuration_dsl/relation.rb +26 -0
  27. data/lib/rom/configuration_plugin.rb +17 -0
  28. data/lib/rom/constants.rb +5 -12
  29. data/lib/rom/container.rb +11 -8
  30. data/lib/rom/create_container.rb +61 -0
  31. data/lib/rom/environment.rb +27 -241
  32. data/lib/rom/gateway.rb +18 -2
  33. data/lib/rom/global.rb +24 -0
  34. data/lib/rom/global/plugin_dsl.rb +2 -0
  35. data/lib/rom/lint/spec.rb +0 -12
  36. data/lib/rom/lint/test.rb +0 -31
  37. data/lib/rom/memory/commands.rb +2 -2
  38. data/lib/rom/memory/gateway.rb +2 -0
  39. data/lib/rom/pipeline.rb +1 -1
  40. data/lib/rom/plugin_base.rb +1 -1
  41. data/lib/rom/plugin_registry.rb +12 -10
  42. data/lib/rom/plugins/configuration/configuration_dsl.rb +16 -0
  43. data/lib/rom/plugins/relation/key_inference.rb +31 -0
  44. data/lib/rom/plugins/relation/view.rb +90 -0
  45. data/lib/rom/plugins/relation/view/dsl.rb +32 -0
  46. data/lib/rom/relation.rb +1 -11
  47. data/lib/rom/relation/class_interface.rb +37 -50
  48. data/lib/rom/setup.rb +13 -104
  49. data/lib/rom/setup/auto_registration.rb +55 -0
  50. data/lib/rom/setup/finalize.rb +113 -127
  51. data/lib/rom/setup/finalize/commands.rb +67 -0
  52. data/lib/rom/setup/finalize/mappers.rb +36 -0
  53. data/lib/rom/setup/finalize/relations.rb +53 -0
  54. data/lib/rom/support/configurable.rb +21 -7
  55. data/lib/rom/version.rb +1 -1
  56. data/rakelib/mutant.rake +4 -1
  57. data/rom.gemspec +3 -4
  58. data/spec/fixtures/app/commands/create_user.rb +2 -0
  59. data/spec/fixtures/app/mappers/user_list.rb +2 -0
  60. data/spec/fixtures/app/relations/users.rb +2 -0
  61. data/spec/fixtures/lib/persistence/commands/create_user.rb +6 -0
  62. data/spec/fixtures/lib/persistence/mappers/user_list.rb +6 -0
  63. data/spec/fixtures/lib/persistence/relations/users.rb +6 -0
  64. data/spec/{unit/rom → integration}/command_registry_spec.rb +8 -9
  65. data/spec/integration/commands/create_spec.rb +17 -13
  66. data/spec/integration/commands/delete_spec.rb +12 -11
  67. data/spec/integration/commands/error_handling_spec.rb +5 -4
  68. data/spec/integration/commands/graph_builder_spec.rb +213 -0
  69. data/spec/integration/commands/graph_spec.rb +112 -49
  70. data/spec/integration/commands/update_spec.rb +14 -11
  71. data/spec/integration/commands_spec.rb +60 -0
  72. data/spec/integration/mappers/combine_spec.rb +7 -6
  73. data/spec/integration/mappers/deep_embedded_spec.rb +5 -6
  74. data/spec/integration/mappers/definition_dsl_spec.rb +19 -18
  75. data/spec/integration/mappers/embedded_spec.rb +11 -12
  76. data/spec/integration/mappers/exclude_spec.rb +5 -6
  77. data/spec/integration/mappers/fold_spec.rb +8 -7
  78. data/spec/integration/mappers/group_spec.rb +16 -15
  79. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +5 -5
  80. data/spec/integration/mappers/prefix_separator_spec.rb +5 -7
  81. data/spec/integration/mappers/prefix_spec.rb +5 -7
  82. data/spec/integration/mappers/prefixing_attributes_spec.rb +7 -7
  83. data/spec/integration/mappers/registering_custom_mappers_spec.rb +4 -5
  84. data/spec/integration/mappers/renaming_attributes_spec.rb +18 -18
  85. data/spec/integration/mappers/step_spec.rb +11 -12
  86. data/spec/integration/mappers/symbolizing_attributes_spec.rb +11 -8
  87. data/spec/integration/mappers/unfold_spec.rb +9 -10
  88. data/spec/integration/mappers/ungroup_spec.rb +10 -11
  89. data/spec/integration/mappers/unwrap_spec.rb +10 -15
  90. data/spec/integration/mappers/wrap_spec.rb +16 -15
  91. data/spec/{unit/rom → integration}/memory/commands/create_spec.rb +7 -5
  92. data/spec/{unit/rom → integration}/memory/commands/delete_spec.rb +7 -5
  93. data/spec/{unit/rom → integration}/memory/commands/update_spec.rb +7 -5
  94. data/spec/integration/multi_env_spec.rb +16 -124
  95. data/spec/integration/multi_repo_spec.rb +9 -9
  96. data/spec/integration/relations/default_dataset_spec.rb +15 -0
  97. data/spec/integration/relations/inheritance_spec.rb +5 -7
  98. data/spec/integration/relations/reading_spec.rb +32 -65
  99. data/spec/integration/relations/registry_dsl_spec.rb +5 -4
  100. data/spec/integration/repositories/extending_relations_spec.rb +6 -7
  101. data/spec/integration/repositories/setting_logger_spec.rb +5 -7
  102. data/spec/integration/setup_spec.rb +49 -61
  103. data/spec/shared/command_graph.rb +50 -0
  104. data/spec/shared/container.rb +9 -0
  105. data/spec/shared/gateway_only.rb +6 -0
  106. data/spec/shared/no_container.rb +16 -0
  107. data/spec/shared/one_behavior.rb +4 -4
  108. data/spec/shared/users_and_tasks.rb +5 -17
  109. data/spec/spec_helper.rb +5 -3
  110. data/spec/test/memory_repository_lint_test.rb +1 -1
  111. data/spec/unit/rom/auto_registration_spec.rb +54 -0
  112. data/spec/unit/rom/commands/graph_spec.rb +18 -44
  113. data/spec/unit/rom/commands/lazy_spec.rb +246 -35
  114. data/spec/unit/rom/commands/result_spec.rb +56 -0
  115. data/spec/unit/rom/commands_spec.rb +9 -73
  116. data/spec/unit/rom/configurable_spec.rb +49 -0
  117. data/spec/unit/rom/configuration_spec.rb +61 -0
  118. data/spec/unit/rom/container_spec.rb +39 -33
  119. data/spec/unit/rom/create_container_spec.rb +151 -0
  120. data/spec/unit/rom/environment_spec.rb +123 -0
  121. data/spec/unit/rom/gateway_spec.rb +58 -2
  122. data/spec/unit/rom/global_spec.rb +10 -7
  123. data/spec/unit/rom/plugin_spec.rb +44 -25
  124. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +27 -0
  125. data/spec/unit/rom/plugins/relation/view_spec.rb +47 -0
  126. data/spec/unit/rom/relation/composite_spec.rb +20 -20
  127. data/spec/unit/rom/relation/curried_spec.rb +10 -11
  128. data/spec/unit/rom/relation/graph_spec.rb +27 -27
  129. data/spec/unit/rom/relation/lazy/combine_spec.rb +26 -20
  130. data/spec/unit/rom/relation/lazy_spec.rb +38 -38
  131. data/spec/unit/rom/relation/loaded_spec.rb +2 -3
  132. data/spec/unit/rom/relation_spec.rb +39 -2
  133. metadata +58 -66
  134. data/lib/rom/commands/abstract.rb +0 -184
  135. data/lib/rom/environment_plugin.rb +0 -17
  136. data/lib/rom/environment_plugins/auto_registration.rb +0 -38
  137. data/lib/rom/repository.rb +0 -16
  138. data/lib/rom/setup_dsl/command.rb +0 -36
  139. data/lib/rom/setup_dsl/mapper.rb +0 -32
  140. data/lib/rom/setup_dsl/relation.rb +0 -30
  141. data/spec/integration/inline_setup_spec.rb +0 -65
  142. data/spec/unit/rom/repository_spec.rb +0 -12
  143. data/spec/unit/rom/setup_spec.rb +0 -253
@@ -16,9 +16,13 @@ module ROM
16
16
  super
17
17
 
18
18
  klass.extend ClassMacros
19
- klass.extend Deprecations
20
19
  klass.defines :adapter
21
20
 
21
+ if respond_to?(:adapter) && adapter.nil?
22
+ raise MissingAdapterIdentifierError,
23
+ "relation class +#{self}+ is missing the adapter identifier"
24
+ end
25
+
22
26
  # Extend with functionality required by adapters *only* if this is a direct
23
27
  # descendant of an adapter-specific relation subclass
24
28
  return unless respond_to?(:adapter) && klass.superclass == ROM::Relation[adapter]
@@ -26,10 +30,7 @@ module ROM
26
30
  klass.class_eval do
27
31
  use :registry_reader
28
32
 
29
- defines :gateway, :dataset, :register_as
30
-
31
- deprecate_class_method :repository, :gateway
32
- deprecate :repository, :gateway
33
+ defines :gateway, :dataset, :dataset_proc, :register_as
33
34
 
34
35
  gateway :default
35
36
 
@@ -44,6 +45,29 @@ module ROM
44
45
  # @api public
45
46
  attr_reader :name
46
47
 
48
+ # Set dataset name
49
+ #
50
+ # If a block is passed it will be evaluated in the context of the dataset
51
+ # to define the default dataset which will be injected into a relation
52
+ # when setting up relation registry
53
+ #
54
+ # @example
55
+ # class Relations::Users < ROM::Relation[:memory]
56
+ # dataset :users
57
+ # end
58
+ #
59
+ # class Users < ROM::Relation[:memory]
60
+ # dataset { sort_by(:id) }
61
+ # end
62
+ #
63
+ # @param [Symbol] value The name of the dataset
64
+ #
65
+ # @api public
66
+ def self.dataset(value = Undefined, &block)
67
+ dataset_proc(block) if block
68
+ super
69
+ end
70
+
47
71
  # Set or get name under which a relation will be registered
48
72
  #
49
73
  # This defaults to `dataset` or `default_name` for descendant relations
@@ -65,12 +89,6 @@ module ROM
65
89
  end
66
90
  end
67
91
 
68
- # @api public
69
- def self.exposed_relations(*args)
70
- Deprecations.announce("#{self}.exposed_relations", 'this method has no effect anymore')
71
- Set.new
72
- end
73
-
74
92
  # @api private
75
93
  def initialize(dataset, options = EMPTY_HASH)
76
94
  @name = self.class.dataset
@@ -142,51 +160,20 @@ module ROM
142
160
  # @api private
143
161
  def default_name
144
162
  return unless name
145
- Inflector.underscore(name).gsub('/', '_').to_sym
163
+ Inflector.underscore(name).tr('/', '_').to_sym
146
164
  end
147
165
 
148
- # Build relation registry of specified descendant classes
149
- #
150
- # This is used by the setup
151
- #
152
- # @param [Hash] gateways
153
- # @param [Array] descendants a list of relation descendants
154
- #
155
- # @return [Hash]
156
- #
157
166
  # @api private
158
- def registry(gateways, descendants)
159
- registry = {}
160
-
161
- descendants.each do |klass|
162
- # TODO: raise a meaningful error here and add spec covering the case
163
- # where klass' gateway points to non-existant repo
164
- gateway = gateways.fetch(klass.gateway)
165
- dataset = gateway.dataset(klass.dataset)
166
-
167
- relation = klass.new(dataset, __registry__: registry)
168
-
169
- name = klass.register_as
170
-
171
- if registry.key?(name)
172
- raise RelationAlreadyDefinedError,
173
- "Relation with `register_as #{name.inspect}` registered more " \
174
- "than once"
175
- end
176
-
177
- registry[name] = relation
178
- end
179
-
180
- registry.each_value do |relation|
181
- relation.class.finalize(registry, relation)
182
- end
183
-
184
- registry
167
+ def curried
168
+ Curried
185
169
  end
186
170
 
187
171
  # @api private
188
- def curried
189
- Curried
172
+ def view_methods
173
+ ancestor_methods = ancestors.reject { |klass| klass == self }
174
+ .map(&:instance_methods).flatten
175
+
176
+ instance_methods - ancestor_methods
190
177
  end
191
178
 
192
179
  # Hook to finalize a relation after its instance was created
data/lib/rom/setup.rb CHANGED
@@ -1,38 +1,7 @@
1
- require 'rom/support/configurable'
2
-
3
- require 'rom/setup/finalize'
4
- require 'rom/support/deprecations'
1
+ require 'rom/setup/auto_registration'
5
2
 
6
3
  module ROM
7
- # Exposes DSL for defining relations, mappers and commands
8
- #
9
- # @api public
10
4
  class Setup
11
- include Configurable
12
-
13
- extend Deprecations
14
- include Equalizer.new(:gateways, :container)
15
-
16
- # @return [Hash] configured gateways
17
- #
18
- # @api private
19
- attr_reader :gateways
20
-
21
- # @attr_reader [Hash<Gateway=>Symbol>] gateway_map Environment gateway map
22
- #
23
- # @api private
24
- attr_reader :gateway_map
25
-
26
- # Deprecated accessor for gateways.
27
- #
28
- # @see gateways
29
- deprecate :repositories, :gateways
30
-
31
- # @return [Symbol] default (first) adapter
32
- #
33
- # @api private
34
- attr_reader :default_adapter
35
-
36
5
  # @return [Array] registered relation subclasses
37
6
  #
38
7
  # @api private
@@ -48,99 +17,39 @@ module ROM
48
17
  # @api private
49
18
  attr_reader :command_classes
50
19
 
51
- # @return [Conainer] finalized container after setup phase is over
52
- #
53
- # @api private
54
- attr_reader :container
55
- alias_method :env, :container
56
-
57
20
  # @api private
58
- def initialize(gateways, options = {})
59
- @gateways = gateways
60
-
61
- @gateway_map = options.fetch(:gateway_map, {})
62
- @default_adapter = options.fetch(:default_adapter, nil)
63
-
21
+ def initialize
64
22
  @relation_classes = []
65
23
  @command_classes = []
66
24
  @mapper_classes = []
67
- @container = nil
68
- end
69
-
70
- # Finalize the setup
71
- #
72
- # @return [Container] frozen container with access to gateways,
73
- # relations, mappers and commands
74
- #
75
- # @api public
76
- def finalize
77
- raise EnvAlreadyFinalizedError if container
78
-
79
- # initialize default configs for all gateways
80
- gateways.each_key do |key|
81
- gateway_config = config.gateways[key]
82
-
83
- gateway_config.infer_relations = true unless gateway_config.key?(:infer_relations)
84
- end
85
-
86
- finalize = Finalize.new(
87
- gateways: gateways,
88
- gateway_map: gateway_map,
89
- relation_classes: relation_classes,
90
- command_classes: command_classes,
91
- mappers: mapper_classes,
92
- config: config.freeze
93
- )
94
-
95
- @container = finalize.run!
96
- end
97
-
98
- # Return gateway identified by name
99
- #
100
- # @return [Gateway]
101
- #
102
- # @api private
103
- def [](name)
104
- gateways.fetch(name)
105
25
  end
106
26
 
107
27
  # Relation sub-classes are being registered with this method during setup
108
28
  #
109
29
  # @api private
110
- def register_relation(klass)
111
- @relation_classes << klass
30
+ def register_relation(*klasses)
31
+ klasses.reduce(@relation_classes, :<<)
112
32
  end
113
33
 
114
34
  # Mapper sub-classes are being registered with this method during setup
115
35
  #
116
36
  # @api private
117
- def register_mapper(klass)
118
- @mapper_classes << klass
37
+ def register_mapper(*klasses)
38
+ klasses.reduce(@mapper_classes, :<<)
119
39
  end
120
40
 
121
41
  # Command sub-classes are being registered with this method during setup
122
42
  #
123
43
  # @api private
124
- def register_command(klass)
125
- @command_classes << klass
126
- end
127
-
128
- # Hook for respond_to? used internally
129
- #
130
- # @api private
131
- def respond_to_missing?(name, _include_context = false)
132
- gateways.key?(name)
44
+ def register_command(*klasses)
45
+ klasses.reduce(@command_classes, :<<)
133
46
  end
134
47
 
135
- private
136
-
137
- # Returns gateway if method is a name of a registered gateway
138
- #
139
- # @return [Gateway]
140
- #
141
- # @api private
142
- def method_missing(name, *)
143
- gateways.fetch(name) { super }
48
+ def auto_registration(directory, options = {})
49
+ auto_registration = AutoRegistration.new(directory, options)
50
+ auto_registration.relations.map { |r| register_relation(r) }
51
+ auto_registration.commands.map { |r| register_command(r) }
52
+ auto_registration.mappers.map { |r| register_mapper(r) }
144
53
  end
145
54
  end
146
55
  end
@@ -0,0 +1,55 @@
1
+ require 'pathname'
2
+
3
+ require 'rom/support/constants'
4
+ require 'rom/support/inflector'
5
+ require 'rom/support/options'
6
+
7
+ module ROM
8
+ class AutoRegistration
9
+ include Options
10
+
11
+ option :namespace, reader: true, type: [TrueClass, FalseClass], default: true
12
+
13
+ attr_reader :globs, :directory
14
+
15
+ def initialize(directory, options = EMPTY_HASH)
16
+ super
17
+ @directory = directory
18
+ @globs = Hash[[:relations, :commands, :mappers].map { |name|
19
+ [name, Pathname(directory).join("#{name}/**/*.rb")]
20
+ }]
21
+ end
22
+
23
+ def relations
24
+ load_entities(:relations)
25
+ end
26
+
27
+ def commands
28
+ load_entities(:commands)
29
+ end
30
+
31
+ def mappers
32
+ load_entities(:mappers)
33
+ end
34
+
35
+ private
36
+
37
+ def load_entities(entity)
38
+ Dir[globs[entity]].map do |file|
39
+ require file
40
+ Inflector.constantize(const_name(entity, file))
41
+ end
42
+ end
43
+
44
+ def const_name(entity, file)
45
+ name =
46
+ if namespace
47
+ file.gsub("#{directory.dirname}/", '')
48
+ else
49
+ file.gsub("#{directory}/#{entity}/", '')
50
+ end.gsub('.rb', '')
51
+
52
+ Inflector.camelize(name)
53
+ end
54
+ end
55
+ end
@@ -2,159 +2,145 @@ require 'rom/relation'
2
2
  require 'rom/command'
3
3
 
4
4
  require 'rom/support/registry'
5
- require 'rom/relation_registry'
6
5
  require 'rom/command_registry'
7
6
  require 'rom/mapper_registry'
8
7
 
9
8
  require 'rom/container'
9
+ require 'rom/setup/finalize/commands'
10
+ require 'rom/setup/finalize/relations'
11
+ require 'rom/setup/finalize/mappers'
12
+
13
+ # temporary
14
+ require 'rom/configuration_dsl/relation'
10
15
 
11
16
  module ROM
12
- class Setup
13
- # This giant builds an container using defined classes for core parts of ROM
17
+ # This giant builds an container using defined classes for core parts of ROM
18
+ #
19
+ # It is used by the setup object after it's done gathering class definitions
20
+ #
21
+ # @private
22
+ class Finalize
23
+ attr_reader :gateways, :repo_adapter, :datasets, :gateway_map,
24
+ :relation_classes, :mapper_classes, :mapper_objects, :command_classes, :config
25
+
26
+ # @api private
27
+ def initialize(options)
28
+ @gateways = options.fetch(:gateways)
29
+ @gateway_map = options.fetch(:gateway_map)
30
+
31
+ @relation_classes = options.fetch(:relation_classes)
32
+ @command_classes = options.fetch(:command_classes)
33
+
34
+ mappers = options.fetch(:mappers, [])
35
+ @mapper_classes = mappers.select { |mapper| mapper.is_a?(Class) }
36
+ @mapper_objects = (mappers - @mapper_classes).reduce(:merge) || {}
37
+
38
+ @config = options.fetch(:config)
39
+
40
+ initialize_datasets
41
+ end
42
+
43
+ # Return adapter identifier for a given gateway object
14
44
  #
15
- # It is used by the setup object after it's done gathering class definitions
45
+ # @return [Symbol]
16
46
  #
17
- # @private
18
- class Finalize
19
- attr_reader :gateways, :repo_adapter, :datasets, :gateway_map,
20
- :relation_classes, :mapper_classes, :mapper_objects, :command_classes, :config
21
-
22
- # @api private
23
- def initialize(options)
24
- @gateways = options.fetch(:gateways)
25
- @gateway_map = options.fetch(:gateway_map)
26
-
27
- @relation_classes = options.fetch(:relation_classes)
28
- @command_classes = options.fetch(:command_classes)
29
-
30
- mappers = options.fetch(:mappers, [])
31
- @mapper_classes = mappers.select { |mapper| mapper.is_a?(Class) }
32
- @mapper_objects = (mappers - @mapper_classes).reduce(:merge) || {}
47
+ # @api private
48
+ def adapter_for(gateway)
49
+ @gateway_map.fetch(gateways[gateway])
50
+ end
33
51
 
34
- @config = options.fetch(:config)
52
+ # Run the finalization process
53
+ #
54
+ # This creates relations, mappers and commands
55
+ #
56
+ # @return [Container]
57
+ #
58
+ # @api private
59
+ def run!
60
+ infer_relations_relations
35
61
 
36
- initialize_datasets
37
- end
62
+ relations = load_relations
63
+ mappers = load_mappers
64
+ commands = load_commands(relations)
38
65
 
39
- # Return adapter identifier for a given gateway object
40
- #
41
- # @return [Symbol]
42
- #
43
- # @api private
44
- def adapter_for(gateway)
45
- @gateway_map.fetch(gateways[gateway])
46
- end
66
+ container = Container.new(gateways, relations, mappers, commands)
67
+ container.freeze
68
+ container
69
+ end
47
70
 
48
- # Run the finalization process
49
- #
50
- # This creates relations, mappers and commands
51
- #
52
- # @return [Container]
53
- #
54
- # @api private
55
- def run!
56
- infer_relations_relations
57
-
58
- relations = load_relations
59
- mappers = load_mappers
60
- commands = load_commands(relations)
61
-
62
- Container.new(gateways, relations, mappers, commands)
63
- end
71
+ private
64
72
 
65
- private
66
-
67
- # Infer all datasets using configured gateways
68
- #
69
- # Not all gateways can do that, by default an empty array is returned
70
- #
71
- # @return [Hash] gateway name => array with datasets map
72
- #
73
- # @api private
74
- def initialize_datasets
75
- @datasets = gateways.each_with_object({}) do |(key, gateway), h|
76
- h[key] = gateway.schema if config.gateways[key][:infer_relations]
77
- end
73
+ # Infer all datasets using configured gateways
74
+ #
75
+ # Not all gateways can do that, by default an empty array is returned
76
+ #
77
+ # @return [Hash] gateway name => array with datasets map
78
+ #
79
+ # @api private
80
+ def initialize_datasets
81
+ @datasets = gateways.each_with_object({}) do |(key, gateway), h|
82
+ infer_relations = config.gateways && config.gateways[key] && config.gateways[key][:infer_relations]
83
+ h[key] = gateway.schema if infer_relations
78
84
  end
85
+ end
79
86
 
80
- # Build entire relation registry from all known relation subclasses
81
- #
82
- # This includes both classes created via DSL and explicit definitions
83
- #
84
- # @api private
85
- def load_relations
86
- relations = Relation.registry(gateways, relation_classes)
87
- RelationRegistry.new(relations)
88
- end
87
+ # Build entire relation registry from all known relation subclasses
88
+ #
89
+ # This includes both classes created via DSL and explicit definitions
90
+ #
91
+ # @api private
92
+ def load_relations
93
+ FinalizeRelations.new(gateways, relation_classes).run!
94
+ end
89
95
 
90
- # @api private
91
- def load_mappers
92
- mapper_registry = Mapper.registry(mapper_classes).each_with_object({})
96
+ # @api private
97
+ def load_mappers
98
+ FinalizeMappers.new(mapper_classes, mapper_objects).run!
99
+ end
93
100
 
94
- registry_hash = mapper_registry.each { |(relation, mappers), h|
95
- h[relation] = MapperRegistry.new(mappers)
96
- }
101
+ # Build entire command registries
102
+ #
103
+ # This includes both classes created via DSL and explicit definitions
104
+ #
105
+ # @api private
106
+ def load_commands(relations)
107
+ FinalizeCommands.new(relations, gateways, command_classes).run!
108
+ end
97
109
 
98
- mapper_objects.each do |relation, mappers|
99
- if registry_hash.key?(relation)
100
- mappers.each { |name, mapper| registry[name] = mapper }
110
+ # For every dataset infered from gateways we infer a relation
111
+ #
112
+ # Relations explicitly defined are being skipped
113
+ #
114
+ # @api private
115
+ def infer_relations_relations
116
+ datasets.each do |gateway, schema|
117
+ schema.each do |name|
118
+ if infer_relation?(gateway, name)
119
+ klass = ROM::ConfigurationDSL::Relation.build_class(name, adapter: adapter_for(gateway))
120
+ klass.gateway(gateway)
121
+ klass.dataset(name)
122
+ @relation_classes << klass
101
123
  else
102
- registry_hash[relation] = MapperRegistry.new(mappers)
103
- end
104
- end
105
-
106
- Registry.new(registry_hash)
107
- end
108
-
109
- # Build entire command registries
110
- #
111
- # This includes both classes created via DSL and explicit definitions
112
- #
113
- # @api private
114
- def load_commands(relations)
115
- registry = Command.registry(relations, gateways, command_classes)
116
-
117
- commands = registry.each_with_object({}) do |(name, rel_commands), h|
118
- h[name] = CommandRegistry.new(rel_commands)
119
- end
120
-
121
- Registry.new(commands)
122
- end
123
-
124
- # For every dataset infered from gateways we infer a relation
125
- #
126
- # Relations explicitly defined are being skipped
127
- #
128
- # @api private
129
- def infer_relations_relations
130
- datasets.each do |gateway, schema|
131
- schema.each do |name|
132
- if infer_relation?(gateway, name)
133
- klass = Relation.build_class(name, adapter: adapter_for(gateway))
134
- klass.gateway(gateway)
135
- klass.dataset(name)
136
- else
137
- next
138
- end
124
+ next
139
125
  end
140
126
  end
141
127
  end
128
+ end
142
129
 
143
- def infer_relation?(gateway, name)
144
- inferrable_relations(gateway).include?(name) && relation_classes.none? { |klass|
145
- klass.dataset == name
146
- }
147
- end
130
+ def infer_relation?(gateway, name)
131
+ inferrable_relations(gateway).include?(name) && relation_classes.none? { |klass|
132
+ klass.dataset == name
133
+ }
134
+ end
148
135
 
149
- def inferrable_relations(gateway)
150
- gateway_config = config.gateways[gateway]
151
- schema = gateways[gateway].schema
136
+ def inferrable_relations(gateway)
137
+ gateway_config = config.gateways[gateway]
138
+ schema = gateways[gateway].schema
152
139
 
153
- allowed = gateway_config[:inferrable_relations] || schema
154
- skipped = gateway_config[:not_inferrable_relations] || []
140
+ allowed = gateway_config[:inferrable_relations] || schema
141
+ skipped = gateway_config[:not_inferrable_relations] || []
155
142
 
156
- schema & allowed - skipped
157
- end
143
+ schema & allowed - skipped
158
144
  end
159
145
  end
160
146
  end