rom 0.9.1 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +30 -12
- data/.travis.yml +1 -1
- data/CHANGELOG.md +24 -0
- data/Gemfile +7 -3
- data/README.md +24 -11
- data/lib/rom.rb +9 -26
- data/lib/rom/command.rb +113 -75
- data/lib/rom/commands/class_interface.rb +115 -0
- data/lib/rom/commands/graph.rb +17 -23
- data/lib/rom/commands/graph/builder.rb +176 -0
- data/lib/rom/commands/graph/class_interface.rb +8 -2
- data/lib/rom/commands/graph/input_evaluator.rb +13 -9
- data/lib/rom/commands/lazy.rb +23 -17
- data/lib/rom/commands/lazy/create.rb +23 -0
- data/lib/rom/commands/lazy/delete.rb +27 -0
- data/lib/rom/commands/lazy/update.rb +34 -0
- data/lib/rom/commands/result.rb +14 -0
- data/lib/rom/commands/update.rb +0 -4
- data/lib/rom/configuration.rb +86 -0
- data/lib/rom/{setup_dsl/setup.rb → configuration_dsl.rb} +9 -7
- data/lib/rom/configuration_dsl/command.rb +43 -0
- data/lib/rom/{setup_dsl → configuration_dsl}/command_dsl.rb +5 -4
- data/lib/rom/configuration_dsl/mapper.rb +37 -0
- data/lib/rom/{setup_dsl → configuration_dsl}/mapper_dsl.rb +11 -5
- data/lib/rom/configuration_dsl/relation.rb +26 -0
- data/lib/rom/configuration_plugin.rb +17 -0
- data/lib/rom/constants.rb +5 -12
- data/lib/rom/container.rb +11 -8
- data/lib/rom/create_container.rb +61 -0
- data/lib/rom/environment.rb +27 -241
- data/lib/rom/gateway.rb +18 -2
- data/lib/rom/global.rb +24 -0
- data/lib/rom/global/plugin_dsl.rb +2 -0
- data/lib/rom/lint/spec.rb +0 -12
- data/lib/rom/lint/test.rb +0 -31
- data/lib/rom/memory/commands.rb +2 -2
- data/lib/rom/memory/gateway.rb +2 -0
- data/lib/rom/pipeline.rb +1 -1
- data/lib/rom/plugin_base.rb +1 -1
- data/lib/rom/plugin_registry.rb +12 -10
- data/lib/rom/plugins/configuration/configuration_dsl.rb +16 -0
- data/lib/rom/plugins/relation/key_inference.rb +31 -0
- data/lib/rom/plugins/relation/view.rb +90 -0
- data/lib/rom/plugins/relation/view/dsl.rb +32 -0
- data/lib/rom/relation.rb +1 -11
- data/lib/rom/relation/class_interface.rb +37 -50
- data/lib/rom/setup.rb +13 -104
- data/lib/rom/setup/auto_registration.rb +55 -0
- data/lib/rom/setup/finalize.rb +113 -127
- data/lib/rom/setup/finalize/commands.rb +67 -0
- data/lib/rom/setup/finalize/mappers.rb +36 -0
- data/lib/rom/setup/finalize/relations.rb +53 -0
- data/lib/rom/support/configurable.rb +21 -7
- data/lib/rom/version.rb +1 -1
- data/rakelib/mutant.rake +4 -1
- data/rom.gemspec +3 -4
- data/spec/fixtures/app/commands/create_user.rb +2 -0
- data/spec/fixtures/app/mappers/user_list.rb +2 -0
- data/spec/fixtures/app/relations/users.rb +2 -0
- data/spec/fixtures/lib/persistence/commands/create_user.rb +6 -0
- data/spec/fixtures/lib/persistence/mappers/user_list.rb +6 -0
- data/spec/fixtures/lib/persistence/relations/users.rb +6 -0
- data/spec/{unit/rom → integration}/command_registry_spec.rb +8 -9
- data/spec/integration/commands/create_spec.rb +17 -13
- data/spec/integration/commands/delete_spec.rb +12 -11
- data/spec/integration/commands/error_handling_spec.rb +5 -4
- data/spec/integration/commands/graph_builder_spec.rb +213 -0
- data/spec/integration/commands/graph_spec.rb +112 -49
- data/spec/integration/commands/update_spec.rb +14 -11
- data/spec/integration/commands_spec.rb +60 -0
- data/spec/integration/mappers/combine_spec.rb +7 -6
- data/spec/integration/mappers/deep_embedded_spec.rb +5 -6
- data/spec/integration/mappers/definition_dsl_spec.rb +19 -18
- data/spec/integration/mappers/embedded_spec.rb +11 -12
- data/spec/integration/mappers/exclude_spec.rb +5 -6
- data/spec/integration/mappers/fold_spec.rb +8 -7
- data/spec/integration/mappers/group_spec.rb +16 -15
- data/spec/integration/mappers/overwrite_attributes_value_spec.rb +5 -5
- data/spec/integration/mappers/prefix_separator_spec.rb +5 -7
- data/spec/integration/mappers/prefix_spec.rb +5 -7
- data/spec/integration/mappers/prefixing_attributes_spec.rb +7 -7
- data/spec/integration/mappers/registering_custom_mappers_spec.rb +4 -5
- data/spec/integration/mappers/renaming_attributes_spec.rb +18 -18
- data/spec/integration/mappers/step_spec.rb +11 -12
- data/spec/integration/mappers/symbolizing_attributes_spec.rb +11 -8
- data/spec/integration/mappers/unfold_spec.rb +9 -10
- data/spec/integration/mappers/ungroup_spec.rb +10 -11
- data/spec/integration/mappers/unwrap_spec.rb +10 -15
- data/spec/integration/mappers/wrap_spec.rb +16 -15
- data/spec/{unit/rom → integration}/memory/commands/create_spec.rb +7 -5
- data/spec/{unit/rom → integration}/memory/commands/delete_spec.rb +7 -5
- data/spec/{unit/rom → integration}/memory/commands/update_spec.rb +7 -5
- data/spec/integration/multi_env_spec.rb +16 -124
- data/spec/integration/multi_repo_spec.rb +9 -9
- data/spec/integration/relations/default_dataset_spec.rb +15 -0
- data/spec/integration/relations/inheritance_spec.rb +5 -7
- data/spec/integration/relations/reading_spec.rb +32 -65
- data/spec/integration/relations/registry_dsl_spec.rb +5 -4
- data/spec/integration/repositories/extending_relations_spec.rb +6 -7
- data/spec/integration/repositories/setting_logger_spec.rb +5 -7
- data/spec/integration/setup_spec.rb +49 -61
- data/spec/shared/command_graph.rb +50 -0
- data/spec/shared/container.rb +9 -0
- data/spec/shared/gateway_only.rb +6 -0
- data/spec/shared/no_container.rb +16 -0
- data/spec/shared/one_behavior.rb +4 -4
- data/spec/shared/users_and_tasks.rb +5 -17
- data/spec/spec_helper.rb +5 -3
- data/spec/test/memory_repository_lint_test.rb +1 -1
- data/spec/unit/rom/auto_registration_spec.rb +54 -0
- data/spec/unit/rom/commands/graph_spec.rb +18 -44
- data/spec/unit/rom/commands/lazy_spec.rb +246 -35
- data/spec/unit/rom/commands/result_spec.rb +56 -0
- data/spec/unit/rom/commands_spec.rb +9 -73
- data/spec/unit/rom/configurable_spec.rb +49 -0
- data/spec/unit/rom/configuration_spec.rb +61 -0
- data/spec/unit/rom/container_spec.rb +39 -33
- data/spec/unit/rom/create_container_spec.rb +151 -0
- data/spec/unit/rom/environment_spec.rb +123 -0
- data/spec/unit/rom/gateway_spec.rb +58 -2
- data/spec/unit/rom/global_spec.rb +10 -7
- data/spec/unit/rom/plugin_spec.rb +44 -25
- data/spec/unit/rom/plugins/relation/key_inference_spec.rb +27 -0
- data/spec/unit/rom/plugins/relation/view_spec.rb +47 -0
- data/spec/unit/rom/relation/composite_spec.rb +20 -20
- data/spec/unit/rom/relation/curried_spec.rb +10 -11
- data/spec/unit/rom/relation/graph_spec.rb +27 -27
- data/spec/unit/rom/relation/lazy/combine_spec.rb +26 -20
- data/spec/unit/rom/relation/lazy_spec.rb +38 -38
- data/spec/unit/rom/relation/loaded_spec.rb +2 -3
- data/spec/unit/rom/relation_spec.rb +39 -2
- metadata +58 -66
- data/lib/rom/commands/abstract.rb +0 -184
- data/lib/rom/environment_plugin.rb +0 -17
- data/lib/rom/environment_plugins/auto_registration.rb +0 -38
- data/lib/rom/repository.rb +0 -16
- data/lib/rom/setup_dsl/command.rb +0 -36
- data/lib/rom/setup_dsl/mapper.rb +0 -32
- data/lib/rom/setup_dsl/relation.rb +0 -30
- data/spec/integration/inline_setup_spec.rb +0 -65
- data/spec/unit/rom/repository_spec.rb +0 -12
- data/spec/unit/rom/setup_spec.rb +0 -253
@@ -0,0 +1,23 @@
|
|
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
|
@@ -0,0 +1,27 @@
|
|
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
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ROM
|
2
|
+
module Commands
|
3
|
+
class Lazy
|
4
|
+
class Update < 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
|
+
|
14
|
+
children.map do |child|
|
15
|
+
command_proc[command, parent, child].call(child, parent)
|
16
|
+
end
|
17
|
+
end.reduce(:concat)
|
18
|
+
else
|
19
|
+
input = evaluator.call(first)
|
20
|
+
|
21
|
+
if input.is_a?(Array)
|
22
|
+
input.map.with_index do |item, index|
|
23
|
+
command_proc[command, last, item].call(item, *args[1..size-1])
|
24
|
+
end
|
25
|
+
else
|
26
|
+
command_proc[command, *(size > 1 ? [last, input] : [input])]
|
27
|
+
.call(input, *args[1..size-1])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/rom/commands/result.rb
CHANGED
@@ -24,6 +24,20 @@ module ROM
|
|
24
24
|
end
|
25
25
|
alias_method :to_a, :to_ary
|
26
26
|
|
27
|
+
# Return true if command successful
|
28
|
+
#
|
29
|
+
# @api public
|
30
|
+
def success?
|
31
|
+
is_a?(Success)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Return true if command failed
|
35
|
+
#
|
36
|
+
# @api public
|
37
|
+
def failure?
|
38
|
+
is_a?(Failure)
|
39
|
+
end
|
40
|
+
|
27
41
|
# Success result has a value and no error
|
28
42
|
#
|
29
43
|
# @api public
|
data/lib/rom/commands/update.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'rom/command'
|
2
|
-
require 'rom/support/deprecations'
|
3
2
|
|
4
3
|
module ROM
|
5
4
|
module Commands
|
@@ -9,14 +8,11 @@ module ROM
|
|
9
8
|
#
|
10
9
|
# @abstract
|
11
10
|
class Update < Command
|
12
|
-
extend Deprecations
|
13
|
-
|
14
11
|
# @see AbstractCommand#call
|
15
12
|
def call(*args)
|
16
13
|
assert_tuple_count
|
17
14
|
super
|
18
15
|
end
|
19
|
-
deprecate :set, :call
|
20
16
|
end
|
21
17
|
end
|
22
18
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'rom/environment'
|
2
|
+
require 'rom/setup'
|
3
|
+
|
4
|
+
module ROM
|
5
|
+
class Configuration
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
NoDefaultAdapterError = Class.new(StandardError)
|
9
|
+
|
10
|
+
attr_reader :environment, :setup
|
11
|
+
|
12
|
+
def_delegators :@setup, :register_relation, :register_command, :register_mapper,
|
13
|
+
:relation_classes, :command_classes, :mapper_classes,
|
14
|
+
:auto_registration
|
15
|
+
|
16
|
+
def_delegators :@environment, :gateways, :gateways_map, :configure, :config
|
17
|
+
|
18
|
+
# @api public
|
19
|
+
def initialize(*args, &block)
|
20
|
+
@environment = Environment.new(*args)
|
21
|
+
@setup = Setup.new
|
22
|
+
|
23
|
+
block.call(self) unless block.nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
# Apply a plugin to the configuration
|
27
|
+
#
|
28
|
+
# @param [Mixed] The plugin identifier, usually a Symbol
|
29
|
+
# @param [Hash] Plugin options
|
30
|
+
#
|
31
|
+
# @api public
|
32
|
+
def use(plugin, options = {})
|
33
|
+
if plugin.is_a?(Array)
|
34
|
+
plugin.each { |p| use(p) }
|
35
|
+
elsif plugin.is_a?(Hash)
|
36
|
+
plugin.to_a.each { |p| use(*p) }
|
37
|
+
else
|
38
|
+
ROM.plugin_registry.configuration.fetch(plugin).apply_to(self, options)
|
39
|
+
end
|
40
|
+
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
# Return gateway identified by name
|
45
|
+
#
|
46
|
+
# @return [Gateway]
|
47
|
+
#
|
48
|
+
# @api private
|
49
|
+
def [](name)
|
50
|
+
gateways.fetch(name)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns gateway if method is a name of a registered gateway
|
54
|
+
#
|
55
|
+
# @return [Gateway]
|
56
|
+
#
|
57
|
+
# @api private
|
58
|
+
def method_missing(name, *)
|
59
|
+
gateways.fetch(name) { super }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Hook for respond_to? used internally
|
63
|
+
#
|
64
|
+
# @api private
|
65
|
+
def respond_to?(name, include_all=false)
|
66
|
+
gateways.has_key?(name) || super
|
67
|
+
end
|
68
|
+
|
69
|
+
# @api private
|
70
|
+
def default_gateway
|
71
|
+
@default_gateway ||= gateways[:default]
|
72
|
+
end
|
73
|
+
|
74
|
+
# @api private
|
75
|
+
def adapter_for_gateway(gateway)
|
76
|
+
ROM.adapters.select do |key, value|
|
77
|
+
value.const_defined?(:Gateway) && gateway.kind_of?(value.const_get(:Gateway))
|
78
|
+
end.keys.first
|
79
|
+
end
|
80
|
+
|
81
|
+
# @api private
|
82
|
+
def default_adapter
|
83
|
+
@default_adapter ||= adapter_for_gateway(default_gateway) || ROM.adapters.keys.first
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -1,13 +1,14 @@
|
|
1
|
-
require 'rom/
|
1
|
+
require 'rom/support/constants'
|
2
2
|
|
3
|
-
require 'rom/
|
4
|
-
require 'rom/
|
3
|
+
require 'rom/configuration_dsl/relation'
|
4
|
+
require 'rom/configuration_dsl/mapper_dsl'
|
5
|
+
require 'rom/configuration_dsl/command_dsl'
|
5
6
|
|
6
7
|
module ROM
|
7
|
-
# This extends
|
8
|
+
# This extends Configuration class with the DSL methods
|
8
9
|
#
|
9
10
|
# @api public
|
10
|
-
|
11
|
+
module ConfigurationDSL
|
11
12
|
# Relation definition DSL
|
12
13
|
#
|
13
14
|
# @example
|
@@ -24,6 +25,7 @@ module ROM
|
|
24
25
|
klass = Relation.build_class(name, klass_opts)
|
25
26
|
klass.register_as(name)
|
26
27
|
klass.class_eval(&block) if block
|
28
|
+
register_relation(klass)
|
27
29
|
klass
|
28
30
|
end
|
29
31
|
|
@@ -43,7 +45,7 @@ module ROM
|
|
43
45
|
#
|
44
46
|
# @api public
|
45
47
|
def mappers(&block)
|
46
|
-
MapperDSL.new(self,
|
48
|
+
register_mapper(*MapperDSL.new(self, mapper_classes, block).mapper_classes)
|
47
49
|
end
|
48
50
|
|
49
51
|
# Command definition DSL
|
@@ -70,7 +72,7 @@ module ROM
|
|
70
72
|
#
|
71
73
|
# @api public
|
72
74
|
def commands(name, &block)
|
73
|
-
CommandDSL.new(name, default_adapter, &block)
|
75
|
+
register_command(*CommandDSL.new(name, default_adapter, &block).command_classes)
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rom/support/constants'
|
2
|
+
|
3
|
+
require 'rom/support/inflector'
|
4
|
+
require 'rom/support/class_builder'
|
5
|
+
|
6
|
+
module ROM
|
7
|
+
module ConfigurationDSL
|
8
|
+
# Setup DSL-specific command extensions
|
9
|
+
#
|
10
|
+
# @private
|
11
|
+
class Command
|
12
|
+
# Generate a command subclass
|
13
|
+
#
|
14
|
+
# This is used by Setup#commands DSL and its `define` block
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
def self.build_class(name, relation, options = EMPTY_HASH, &block)
|
18
|
+
type = options.fetch(:type) { name }
|
19
|
+
command_type = Inflector.classify(type)
|
20
|
+
adapter = options.fetch(:adapter)
|
21
|
+
parent = ROM::Command.adapter_namespace(adapter).const_get(command_type)
|
22
|
+
class_name = generate_class_name(adapter, command_type, relation)
|
23
|
+
|
24
|
+
ClassBuilder.new(name: class_name, parent: parent).call do |klass|
|
25
|
+
klass.register_as(name)
|
26
|
+
klass.relation(relation)
|
27
|
+
klass.class_eval(&block) if block
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Create a command subclass name based on adapter, type and relation
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
def self.generate_class_name(adapter, command_type, relation)
|
35
|
+
pieces = ['ROM']
|
36
|
+
pieces << Inflector.classify(adapter)
|
37
|
+
pieces << 'Commands'
|
38
|
+
pieces << "#{command_type}[#{Inflector.classify(relation)}s]"
|
39
|
+
pieces.join('::')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -1,17 +1,18 @@
|
|
1
|
-
require 'rom/
|
1
|
+
require 'rom/configuration_dsl/command'
|
2
2
|
|
3
3
|
module ROM
|
4
|
-
|
4
|
+
module ConfigurationDSL
|
5
5
|
# Command `define` DSL used by Setup#commands
|
6
6
|
#
|
7
7
|
# @private
|
8
8
|
class CommandDSL
|
9
|
-
attr_reader :relation, :adapter
|
9
|
+
attr_reader :relation, :adapter, :command_classes
|
10
10
|
|
11
11
|
# @api private
|
12
12
|
def initialize(relation, adapter = nil, &block)
|
13
13
|
@relation = relation
|
14
14
|
@adapter = adapter
|
15
|
+
@command_classes = []
|
15
16
|
instance_exec(&block)
|
16
17
|
end
|
17
18
|
|
@@ -25,7 +26,7 @@ module ROM
|
|
25
26
|
#
|
26
27
|
# @api public
|
27
28
|
def define(name, options = EMPTY_HASH, &block)
|
28
|
-
Command.build_class(
|
29
|
+
@command_classes << Command.build_class(
|
29
30
|
name, relation, { adapter: adapter }.merge(options), &block
|
30
31
|
)
|
31
32
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rom/support/constants'
|
2
|
+
require 'rom/support/class_builder'
|
3
|
+
|
4
|
+
module ROM
|
5
|
+
module ConfigurationDSL
|
6
|
+
# Setup DSL-specific mapper extensions
|
7
|
+
#
|
8
|
+
# @private
|
9
|
+
class Mapper
|
10
|
+
# Generate a mapper subclass
|
11
|
+
#
|
12
|
+
# This is used by Setup#mappers DSL
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
def self.build_class(name, mapper_registry, options = EMPTY_HASH, &block)
|
16
|
+
class_name = "ROM::Mapper[#{name}]"
|
17
|
+
|
18
|
+
parent = options[:parent]
|
19
|
+
inherit_header = options.fetch(:inherit_header) { ROM::Mapper.inherit_header }
|
20
|
+
|
21
|
+
parent_class =
|
22
|
+
if parent
|
23
|
+
mapper_registry.detect { |klass| klass.relation == parent }
|
24
|
+
else
|
25
|
+
ROM::Mapper
|
26
|
+
end
|
27
|
+
|
28
|
+
ClassBuilder.new(name: class_name, parent: parent_class).call do |klass|
|
29
|
+
klass.relation(name)
|
30
|
+
klass.inherit_header(inherit_header)
|
31
|
+
|
32
|
+
klass.class_eval(&block) if block
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,17 +1,23 @@
|
|
1
|
-
require 'rom/
|
1
|
+
require 'rom/support/constants'
|
2
|
+
require 'rom/configuration_dsl/mapper'
|
2
3
|
|
3
4
|
module ROM
|
4
|
-
|
5
|
+
module ConfigurationDSL
|
5
6
|
# Mapper definition DSL used by Setup DSL
|
6
7
|
#
|
7
8
|
# @private
|
8
9
|
class MapperDSL
|
9
|
-
attr_reader :registry
|
10
|
+
attr_reader :registry, :mapper_classes, :mapper_classes
|
10
11
|
|
11
12
|
# @api private
|
12
|
-
def initialize(registry,
|
13
|
+
def initialize(registry, mapper_classes, block)
|
13
14
|
@registry = registry
|
15
|
+
@mapper_classes = mapper_classes
|
16
|
+
@defined_mappers = []
|
17
|
+
|
14
18
|
instance_exec(&block)
|
19
|
+
|
20
|
+
@mapper_classes = @defined_mappers
|
15
21
|
end
|
16
22
|
|
17
23
|
# Define a mapper class
|
@@ -23,7 +29,7 @@ module ROM
|
|
23
29
|
#
|
24
30
|
# @api public
|
25
31
|
def define(name, options = EMPTY_HASH, &block)
|
26
|
-
Mapper.build_class(name, options, &block)
|
32
|
+
@defined_mappers << Mapper.build_class(name, (@mapper_classes + @defined_mappers), options, &block)
|
27
33
|
self
|
28
34
|
end
|
29
35
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rom/support/constants'
|
2
|
+
require 'rom/support/class_builder'
|
3
|
+
|
4
|
+
module ROM
|
5
|
+
module ConfigurationDSL
|
6
|
+
# Setup DSL-specific relation extensions
|
7
|
+
#
|
8
|
+
# @private
|
9
|
+
class Relation
|
10
|
+
# Generate a relation subclass
|
11
|
+
#
|
12
|
+
# This is used by Setup#relation DSL
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
def self.build_class(name, options = EMPTY_HASH)
|
16
|
+
class_name = "ROM::Relation[#{Inflector.camelize(name)}]"
|
17
|
+
adapter = options.fetch(:adapter)
|
18
|
+
|
19
|
+
ClassBuilder.new(name: class_name, parent: ROM::Relation[adapter]).call do |klass|
|
20
|
+
klass.gateway(options.fetch(:gateway, :default))
|
21
|
+
klass.dataset(name)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rom/plugin_base'
|
2
|
+
|
3
|
+
module ROM
|
4
|
+
# ConfigurationPlugin is a simple object used to store configuration plugin configurations
|
5
|
+
#
|
6
|
+
# @private
|
7
|
+
class ConfigurationPlugin < PluginBase
|
8
|
+
# Apply this plugin to the provided configuration
|
9
|
+
#
|
10
|
+
# @param [ROM::Configuration] configuration
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
def apply_to(configuration, options = {})
|
14
|
+
mod.apply(configuration, options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|