rom 0.5.0 → 0.6.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.yml +19 -15
- data/.rubocop_todo.yml +28 -0
- data/.travis.yml +8 -1
- data/CHANGELOG.md +40 -0
- data/Gemfile +10 -2
- data/Guardfile +12 -10
- data/README.md +42 -43
- data/Rakefile +13 -23
- data/lib/rom.rb +19 -27
- data/lib/rom/command.rb +118 -0
- data/lib/rom/command_registry.rb +13 -27
- data/lib/rom/commands.rb +1 -59
- data/lib/rom/commands/abstract.rb +147 -0
- data/lib/rom/commands/composite.rb +47 -0
- data/lib/rom/commands/create.rb +2 -17
- data/lib/rom/commands/delete.rb +5 -25
- data/lib/rom/commands/result.rb +5 -5
- data/lib/rom/commands/update.rb +3 -27
- data/lib/rom/constants.rb +19 -0
- data/lib/rom/env.rb +85 -35
- data/lib/rom/global.rb +173 -42
- data/lib/rom/header.rb +5 -5
- data/lib/rom/header/attribute.rb +2 -2
- data/lib/rom/lint/enumerable_dataset.rb +52 -0
- data/lib/rom/lint/linter.rb +64 -0
- data/lib/rom/lint/repository.rb +78 -0
- data/lib/rom/lint/spec.rb +20 -0
- data/lib/rom/lint/test.rb +98 -0
- data/lib/rom/mapper.rb +32 -5
- data/lib/rom/mapper/attribute_dsl.rb +240 -0
- data/lib/rom/mapper/dsl.rb +100 -0
- data/lib/rom/mapper/model_dsl.rb +55 -0
- data/lib/rom/mapper_registry.rb +8 -1
- data/lib/rom/memory.rb +4 -0
- data/lib/rom/memory/commands.rb +46 -0
- data/lib/rom/memory/dataset.rb +72 -0
- data/lib/rom/memory/relation.rb +44 -0
- data/lib/rom/memory/repository.rb +62 -0
- data/lib/rom/memory/storage.rb +57 -0
- data/lib/rom/model_builder.rb +44 -5
- data/lib/rom/processor.rb +1 -1
- data/lib/rom/processor/transproc.rb +109 -16
- data/lib/rom/reader.rb +91 -39
- data/lib/rom/relation.rb +165 -26
- data/lib/rom/relation/composite.rb +132 -0
- data/lib/rom/relation/curried.rb +48 -0
- data/lib/rom/relation/lazy.rb +173 -0
- data/lib/rom/relation/loaded.rb +75 -0
- data/lib/rom/relation/registry_reader.rb +23 -0
- data/lib/rom/repository.rb +93 -34
- data/lib/rom/setup.rb +54 -98
- data/lib/rom/setup/finalize.rb +85 -76
- data/lib/rom/setup_dsl/command.rb +36 -0
- data/lib/rom/setup_dsl/command_dsl.rb +34 -0
- data/lib/rom/setup_dsl/mapper.rb +32 -0
- data/lib/rom/setup_dsl/mapper_dsl.rb +30 -0
- data/lib/rom/setup_dsl/relation.rb +21 -0
- data/lib/rom/setup_dsl/setup.rb +75 -0
- data/lib/rom/support/array_dataset.rb +38 -0
- data/lib/rom/support/class_builder.rb +44 -0
- data/lib/rom/support/class_macros.rb +56 -0
- data/lib/rom/support/data_proxy.rb +102 -0
- data/lib/rom/support/enumerable_dataset.rb +58 -0
- data/lib/rom/support/inflector.rb +73 -0
- data/lib/rom/support/options.rb +188 -0
- data/lib/rom/support/registry.rb +4 -8
- data/lib/rom/version.rb +1 -1
- data/rakelib/benchmark.rake +13 -0
- data/rakelib/mutant.rake +16 -0
- data/rakelib/rubocop.rake +18 -0
- data/rom.gemspec +4 -7
- data/spec/integration/commands/create_spec.rb +32 -24
- data/spec/integration/commands/delete_spec.rb +15 -7
- data/spec/integration/commands/update_spec.rb +13 -11
- data/spec/integration/mappers/deep_embedded_spec.rb +4 -11
- data/spec/integration/mappers/definition_dsl_spec.rb +31 -44
- data/spec/integration/mappers/embedded_spec.rb +9 -24
- data/spec/integration/mappers/group_spec.rb +22 -30
- data/spec/integration/mappers/prefixing_attributes_spec.rb +18 -23
- data/spec/integration/mappers/renaming_attributes_spec.rb +23 -38
- data/spec/integration/mappers/symbolizing_attributes_spec.rb +18 -24
- data/spec/integration/mappers/wrap_spec.rb +22 -30
- data/spec/integration/multi_repo_spec.rb +15 -37
- data/spec/integration/relations/reading_spec.rb +82 -14
- data/spec/integration/repositories/extending_relations_spec.rb +50 -0
- data/spec/integration/{adapters → repositories}/setting_logger_spec.rb +6 -5
- data/spec/integration/setup_spec.rb +59 -62
- data/spec/shared/enumerable_dataset.rb +49 -0
- data/spec/shared/one_behavior.rb +26 -0
- data/spec/shared/users_and_tasks.rb +11 -23
- data/spec/spec_helper.rb +16 -7
- data/spec/support/constant_leak_finder.rb +14 -0
- data/spec/test/memory_repository_lint_test.rb +27 -0
- data/spec/unit/rom/command_registry_spec.rb +44 -0
- data/spec/unit/rom/commands/result_spec.rb +14 -0
- data/spec/unit/rom/commands_spec.rb +174 -0
- data/spec/unit/rom/env_spec.rb +40 -7
- data/spec/unit/rom/global_spec.rb +14 -0
- data/spec/unit/rom/{mapper_builder_spec.rb → mapper/dsl_spec.rb} +52 -38
- data/spec/unit/rom/mapper_spec.rb +51 -10
- data/spec/unit/rom/{adapter/memory → memory}/dataset_spec.rb +6 -4
- data/spec/unit/rom/memory/repository_spec.rb +12 -0
- data/spec/unit/rom/memory/storage_spec.rb +45 -0
- data/spec/unit/rom/model_builder_spec.rb +4 -3
- data/spec/unit/rom/processor/transproc_spec.rb +1 -0
- data/spec/unit/rom/reader_spec.rb +97 -24
- data/spec/unit/rom/relation/composite_spec.rb +65 -0
- data/spec/unit/rom/relation/lazy_spec.rb +145 -0
- data/spec/unit/rom/relation/loaded_spec.rb +28 -0
- data/spec/unit/rom/relation_spec.rb +111 -6
- data/spec/unit/rom/repository_spec.rb +59 -9
- data/spec/unit/rom/setup_spec.rb +99 -11
- data/spec/unit/rom/support/array_dataset_spec.rb +59 -0
- data/spec/unit/rom/support/class_builder_spec.rb +42 -0
- data/spec/unit/rom/support/enumerable_dataset_spec.rb +17 -0
- data/spec/unit/rom/support/inflector_spec.rb +89 -0
- data/spec/unit/rom/support/options_spec.rb +119 -0
- metadata +74 -112
- data/lib/rom/adapter.rb +0 -191
- data/lib/rom/adapter/memory.rb +0 -32
- data/lib/rom/adapter/memory/commands.rb +0 -31
- data/lib/rom/adapter/memory/dataset.rb +0 -67
- data/lib/rom/adapter/memory/storage.rb +0 -26
- data/lib/rom/commands/with_options.rb +0 -18
- data/lib/rom/config.rb +0 -70
- data/lib/rom/mapper_builder.rb +0 -52
- data/lib/rom/mapper_builder/mapper_dsl.rb +0 -114
- data/lib/rom/mapper_builder/model_dsl.rb +0 -29
- data/lib/rom/reader_builder.rb +0 -48
- data/lib/rom/relation_builder.rb +0 -62
- data/lib/rom/setup/base_relation_dsl.rb +0 -46
- data/lib/rom/setup/command_dsl.rb +0 -46
- data/lib/rom/setup/mapper_dsl.rb +0 -19
- data/lib/rom/setup/relation_dsl.rb +0 -20
- data/lib/rom/setup/schema_dsl.rb +0 -33
- data/spec/integration/adapters/extending_relations_spec.rb +0 -41
- data/spec/integration/commands/try_spec.rb +0 -27
- data/spec/integration/schema_spec.rb +0 -77
- data/spec/unit/config_spec.rb +0 -60
- data/spec/unit/rom/adapter_spec.rb +0 -79
- data/spec/unit/rom_spec.rb +0 -14
data/lib/rom/command.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'rom/commands/abstract'
|
2
|
+
|
3
|
+
module ROM
|
4
|
+
# Base command class with factory class-level interface and setup-related logic
|
5
|
+
#
|
6
|
+
# @private
|
7
|
+
class Command < Commands::Abstract
|
8
|
+
extend ClassMacros
|
9
|
+
|
10
|
+
include Equalizer.new(:relation, :options)
|
11
|
+
|
12
|
+
defines :relation, :result, :input, :validator, :register_as
|
13
|
+
|
14
|
+
input Hash
|
15
|
+
validator proc {}
|
16
|
+
result :many
|
17
|
+
|
18
|
+
# Registers Create/Update/Delete descendant classes during the setup phase
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
def self.inherited(klass)
|
22
|
+
super
|
23
|
+
return if klass.superclass == ROM::Command
|
24
|
+
ROM.register_command(klass)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Return adapter specific sub-class based on the adapter identifier
|
28
|
+
#
|
29
|
+
# This is a syntax sugar to make things consistent
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# ROM::Commands::Create[:memory]
|
33
|
+
# # => ROM::Memory::Commands::Create
|
34
|
+
#
|
35
|
+
# @param [Symbol] adapter identifier
|
36
|
+
#
|
37
|
+
# @return [Class]
|
38
|
+
#
|
39
|
+
# @api public
|
40
|
+
def self.[](adapter)
|
41
|
+
adapter_namespace(adapter).const_get(Inflector.demodulize(name))
|
42
|
+
end
|
43
|
+
|
44
|
+
# Return namespaces that contains command subclasses of a specific adapter
|
45
|
+
#
|
46
|
+
# @param [Symbol] adapter identifier
|
47
|
+
#
|
48
|
+
# @return [Module]
|
49
|
+
#
|
50
|
+
# @api private
|
51
|
+
def self.adapter_namespace(adapter)
|
52
|
+
ROM.adapters.fetch(adapter).const_get(:Commands)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Build a command class for a specific relation with options
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# class CreateUser < ROM::Commands::Create[:memory]
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# command = CreateUser.build(rom.relations[:users])
|
62
|
+
#
|
63
|
+
# @param [Relation] relation
|
64
|
+
# @param [Hash] options
|
65
|
+
#
|
66
|
+
# @return [Command]
|
67
|
+
#
|
68
|
+
# @api public
|
69
|
+
def self.build(relation, options = {})
|
70
|
+
new(relation, self.options.merge(options))
|
71
|
+
end
|
72
|
+
|
73
|
+
# Build command registry hash for provided relations
|
74
|
+
#
|
75
|
+
# @param [RelationRegistry] relations registry
|
76
|
+
# @param [Hash] repositories
|
77
|
+
# @param [Array] descendants a list of command subclasses
|
78
|
+
#
|
79
|
+
# @return [Hash]
|
80
|
+
#
|
81
|
+
# @api private
|
82
|
+
def self.registry(relations, repositories, descendants)
|
83
|
+
descendants.each_with_object({}) do |klass, h|
|
84
|
+
rel_name = klass.relation
|
85
|
+
|
86
|
+
next unless rel_name
|
87
|
+
|
88
|
+
relation = relations[rel_name]
|
89
|
+
name = klass.register_as || klass.default_name
|
90
|
+
|
91
|
+
repository = repositories[relation.class.repository]
|
92
|
+
repository.extend_command_class(klass, relation.dataset)
|
93
|
+
|
94
|
+
(h[rel_name] ||= {})[name] = klass.build(relation)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Return default name of the command class based on its name
|
99
|
+
#
|
100
|
+
# During setup phase this is used by defalut as `register_as` option
|
101
|
+
#
|
102
|
+
# @return [Symbol]
|
103
|
+
#
|
104
|
+
# @api private
|
105
|
+
def self.default_name
|
106
|
+
Inflector.underscore(Inflector.demodulize(name)).to_sym
|
107
|
+
end
|
108
|
+
|
109
|
+
# Return default options based on class macros
|
110
|
+
#
|
111
|
+
# @return [Hash]
|
112
|
+
#
|
113
|
+
# @api private
|
114
|
+
def self.options
|
115
|
+
{ input: input, validator: validator, result: result }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
data/lib/rom/command_registry.rb
CHANGED
@@ -3,34 +3,14 @@ require 'rom/commands/result'
|
|
3
3
|
module ROM
|
4
4
|
# Command registry exposes "try" interface for executing commands
|
5
5
|
#
|
6
|
-
# @public
|
6
|
+
# @api public
|
7
7
|
class CommandRegistry < Registry
|
8
|
-
|
9
|
-
include Concord.new(:registry)
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
# Call a command when method is matching command name
|
14
|
-
#
|
15
|
-
# TODO: this will be replaced by explicit definition of methods for all
|
16
|
-
# registered commands
|
17
|
-
#
|
18
|
-
# @api public
|
19
|
-
def method_missing(name, *args, &block)
|
20
|
-
command = registry[name]
|
21
|
-
|
22
|
-
super unless command
|
23
|
-
|
24
|
-
if args.size > 1
|
25
|
-
command.new(*args, &block)
|
26
|
-
else
|
27
|
-
command.call(*args, &block)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
8
|
+
include Commands
|
31
9
|
|
32
10
|
# Try to execute a command in a block
|
33
11
|
#
|
12
|
+
# @yield [command] Passes command to the block
|
13
|
+
#
|
34
14
|
# @example
|
35
15
|
#
|
36
16
|
# rom.command(:users).try { create(name: 'Jane') }
|
@@ -40,10 +20,16 @@ module ROM
|
|
40
20
|
# @return [Commands::Result]
|
41
21
|
#
|
42
22
|
# @api public
|
43
|
-
def try(&
|
44
|
-
|
23
|
+
def try(&block)
|
24
|
+
response = block.call
|
25
|
+
|
26
|
+
if response.is_a?(Command) || response.is_a?(Composite)
|
27
|
+
try { response.call }
|
28
|
+
else
|
29
|
+
Result::Success.new(response)
|
30
|
+
end
|
45
31
|
rescue CommandError => e
|
46
|
-
|
32
|
+
Result::Failure.new(e)
|
47
33
|
end
|
48
34
|
end
|
49
35
|
end
|
data/lib/rom/commands.rb
CHANGED
@@ -1,62 +1,4 @@
|
|
1
|
-
|
2
|
-
module Commands
|
3
|
-
class AbstractCommand
|
4
|
-
VALID_RESULTS = [:one, :many].freeze
|
5
|
-
|
6
|
-
attr_reader :relation, :options, :result
|
7
|
-
|
8
|
-
# @api private
|
9
|
-
def initialize(relation, options)
|
10
|
-
@relation = relation
|
11
|
-
@options = options
|
12
|
-
|
13
|
-
@result = options[:result] || :many
|
14
|
-
|
15
|
-
unless VALID_RESULTS.include?(result)
|
16
|
-
raise InvalidOptionError.new(:result, VALID_RESULTS)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# Call the command and return one or many tuples
|
21
|
-
#
|
22
|
-
# @api public
|
23
|
-
def call(*args)
|
24
|
-
tuples = execute(*args)
|
25
|
-
|
26
|
-
if result == :one
|
27
|
-
tuples.first
|
28
|
-
else
|
29
|
-
tuples
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# Target relation on which the command will operate
|
34
|
-
#
|
35
|
-
# By default this is set to the relation that's passed to the constructor.
|
36
|
-
# Specialized commands like Delete may set the target to a different
|
37
|
-
# relation.
|
38
|
-
#
|
39
|
-
# @return [Relation]
|
40
|
-
#
|
41
|
-
# @api public
|
42
|
-
def target
|
43
|
-
relation
|
44
|
-
end
|
45
|
-
|
46
|
-
# Assert that tuple count in the target relation corresponds to :result
|
47
|
-
# setting
|
48
|
-
#
|
49
|
-
# @raises TupleCountMismatchError
|
50
|
-
#
|
51
|
-
# @api private
|
52
|
-
def assert_tuple_count
|
53
|
-
if result == :one && target.size > 1
|
54
|
-
raise TupleCountMismatchError, "#{inspect} expects one tuple"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
1
|
+
require 'rom/support/options'
|
60
2
|
|
61
3
|
require 'rom/commands/create'
|
62
4
|
require 'rom/commands/update'
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require 'rom/commands/composite'
|
2
|
+
|
3
|
+
module ROM
|
4
|
+
module Commands
|
5
|
+
# Abstract command class
|
6
|
+
#
|
7
|
+
# Provides a constructor accepting relation with options and basic behavior
|
8
|
+
# for calling, currying and composing commands.
|
9
|
+
#
|
10
|
+
# Typically command subclasses should inherit from specialized
|
11
|
+
# Create/Update/Delete, not this one.
|
12
|
+
#
|
13
|
+
# @abstract
|
14
|
+
#
|
15
|
+
# @private
|
16
|
+
class Abstract
|
17
|
+
include Options
|
18
|
+
|
19
|
+
option :type, allow: [:create, :update, :delete]
|
20
|
+
option :result, reader: true, allow: [:one, :many]
|
21
|
+
option :target
|
22
|
+
option :validator, reader: true
|
23
|
+
option :input, reader: true
|
24
|
+
option :curry_args, type: Array, reader: true, default: []
|
25
|
+
|
26
|
+
attr_reader :relation
|
27
|
+
|
28
|
+
# @api private
|
29
|
+
def initialize(relation, options = {})
|
30
|
+
@relation = relation
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
# Execute the command
|
35
|
+
#
|
36
|
+
# @abstract
|
37
|
+
#
|
38
|
+
# @return [Array] an array with inserted tuples
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
def execute(*)
|
42
|
+
raise(
|
43
|
+
NotImplementedError,
|
44
|
+
"#{self.class}##{__method__} must be implemented"
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Call the command and return one or many tuples
|
49
|
+
#
|
50
|
+
# @api public
|
51
|
+
def call(*args)
|
52
|
+
tuples = execute(*(args + curry_args))
|
53
|
+
|
54
|
+
if result == :one
|
55
|
+
tuples.first
|
56
|
+
else
|
57
|
+
tuples
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Curry this command with provided args
|
62
|
+
#
|
63
|
+
# Curried command can be called without args
|
64
|
+
#
|
65
|
+
# @return [Command]
|
66
|
+
#
|
67
|
+
# @api public
|
68
|
+
def curry(*args)
|
69
|
+
self.class.new(relation, options.merge(curry_args: args))
|
70
|
+
end
|
71
|
+
alias_method :with, :curry
|
72
|
+
|
73
|
+
# Compose a command with another one
|
74
|
+
#
|
75
|
+
# The other one will be called with the result from the first one
|
76
|
+
#
|
77
|
+
# @example
|
78
|
+
#
|
79
|
+
# command = users.create.curry(name: 'Jane')
|
80
|
+
# command >>= tasks.create.curry(title: 'Task One')
|
81
|
+
#
|
82
|
+
# command.call # creates user, passes it to tasks and creates task
|
83
|
+
#
|
84
|
+
# @return [Composite]
|
85
|
+
#
|
86
|
+
# @api public
|
87
|
+
def >>(other)
|
88
|
+
Composite.new(self, other)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Return new update command with new relation
|
92
|
+
#
|
93
|
+
# @api private
|
94
|
+
def new(*args, &block)
|
95
|
+
self.class.build(relation.public_send(*args, &block), options)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Target relation on which the command will operate
|
99
|
+
#
|
100
|
+
# By default this is set to the relation that's passed to the constructor.
|
101
|
+
# Specialized commands like Delete may set the target to a different
|
102
|
+
# relation.
|
103
|
+
#
|
104
|
+
# @return [Relation]
|
105
|
+
#
|
106
|
+
# @api public
|
107
|
+
def target
|
108
|
+
relation
|
109
|
+
end
|
110
|
+
|
111
|
+
# Assert that tuple count in the target relation corresponds to :result
|
112
|
+
# setting
|
113
|
+
#
|
114
|
+
# @raise TupleCountMismatchError
|
115
|
+
#
|
116
|
+
# @api private
|
117
|
+
def assert_tuple_count
|
118
|
+
if result == :one && tuple_count > 1
|
119
|
+
raise TupleCountMismatchError, "#{inspect} expects one tuple"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Return number of tuples in the target relation
|
124
|
+
#
|
125
|
+
# This should be overridden by repositories when `#count` is not available
|
126
|
+
# in the relation objects
|
127
|
+
#
|
128
|
+
# @return [Fixnum]
|
129
|
+
#
|
130
|
+
# @api private
|
131
|
+
def tuple_count
|
132
|
+
target.count
|
133
|
+
end
|
134
|
+
|
135
|
+
private
|
136
|
+
|
137
|
+
# @api private
|
138
|
+
def method_missing(name, *args, &block)
|
139
|
+
if relation.respond_to?(name)
|
140
|
+
new(name, *args, &block)
|
141
|
+
else
|
142
|
+
super
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ROM
|
2
|
+
module Commands
|
3
|
+
# Composite command that consists of left and right commands
|
4
|
+
#
|
5
|
+
# @api public
|
6
|
+
class Composite
|
7
|
+
include Equalizer.new(:left, :right)
|
8
|
+
|
9
|
+
# @return [Proc,Command] left command
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
attr_reader :left
|
13
|
+
|
14
|
+
# @return [Proc,Command] right command
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
attr_reader :right
|
18
|
+
|
19
|
+
# @api private
|
20
|
+
def initialize(left, right)
|
21
|
+
@left, @right = left, right
|
22
|
+
end
|
23
|
+
|
24
|
+
# Calls the composite command
|
25
|
+
#
|
26
|
+
# Right command is called with a result from the left one
|
27
|
+
#
|
28
|
+
# @return [Object]
|
29
|
+
#
|
30
|
+
# @api public
|
31
|
+
def call(*args)
|
32
|
+
right.call(left.call(*args))
|
33
|
+
end
|
34
|
+
|
35
|
+
# Compose another composite command from self and other
|
36
|
+
#
|
37
|
+
# @param [Proc, Command] other command
|
38
|
+
#
|
39
|
+
# @return [Composite]
|
40
|
+
#
|
41
|
+
# @api public
|
42
|
+
def >>(other)
|
43
|
+
self.class.new(self, other)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/rom/commands/create.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'rom/
|
1
|
+
require 'rom/command'
|
2
2
|
|
3
3
|
module ROM
|
4
4
|
module Commands
|
@@ -7,22 +7,7 @@ module ROM
|
|
7
7
|
# This command inserts a new tuple into a relation
|
8
8
|
#
|
9
9
|
# @abstract
|
10
|
-
class Create <
|
11
|
-
include WithOptions
|
12
|
-
|
13
|
-
# Execute the command
|
14
|
-
#
|
15
|
-
# @abstract
|
16
|
-
#
|
17
|
-
# @return [Array] an array with inserted tuples
|
18
|
-
#
|
19
|
-
# @api private
|
20
|
-
def execute(_tuple)
|
21
|
-
raise(
|
22
|
-
NotImplementedError,
|
23
|
-
"#{self.class}##{__method__} must be implemented"
|
24
|
-
)
|
25
|
-
end
|
10
|
+
class Create < Command
|
26
11
|
end
|
27
12
|
end
|
28
13
|
end
|