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
@@ -1,114 +0,0 @@
|
|
1
|
-
require 'rom/mapper_builder/model_dsl'
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class MapperBuilder
|
5
|
-
# @api private
|
6
|
-
class MapperDSL
|
7
|
-
include ModelDSL
|
8
|
-
|
9
|
-
attr_reader :attributes, :options, :symbolize_keys, :prefix
|
10
|
-
|
11
|
-
def initialize(attributes, options)
|
12
|
-
@attributes = attributes
|
13
|
-
@options = options
|
14
|
-
@symbolize_keys = options[:symbolize_keys]
|
15
|
-
@prefix = options[:prefix]
|
16
|
-
end
|
17
|
-
|
18
|
-
def attribute(name, options = EMPTY_HASH)
|
19
|
-
with_attr_options(name, options) do |attr_options|
|
20
|
-
add_attribute(name, attr_options)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def exclude(*names)
|
25
|
-
names.each { |name| attributes.delete([name]) }
|
26
|
-
end
|
27
|
-
|
28
|
-
def embedded(name, options, &block)
|
29
|
-
with_attr_options(name) do |attr_options|
|
30
|
-
dsl = new(options, &block)
|
31
|
-
|
32
|
-
attr_options.update(options)
|
33
|
-
|
34
|
-
add_attribute(
|
35
|
-
name, { header: dsl.header, type: :array }.update(attr_options)
|
36
|
-
)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def wrap(*args, &block)
|
41
|
-
with_name_or_options(*args) do |name, options|
|
42
|
-
dsl(name, { type: :hash, wrap: true }.update(options), &block)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def group(*args, &block)
|
47
|
-
with_name_or_options(*args) do |name, options|
|
48
|
-
dsl(name, { type: :array, group: true }.update(options), &block)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def header
|
53
|
-
Header.coerce(attributes, model)
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def with_attr_options(name, options = EMPTY_HASH)
|
59
|
-
attr_options = options.dup
|
60
|
-
|
61
|
-
attr_options[:from] ||= :"#{prefix}_#{name}" if prefix
|
62
|
-
|
63
|
-
if symbolize_keys
|
64
|
-
attr_options.update(from: attr_options.fetch(:from) { name }.to_s)
|
65
|
-
end
|
66
|
-
|
67
|
-
yield(attr_options)
|
68
|
-
end
|
69
|
-
|
70
|
-
def with_name_or_options(*args)
|
71
|
-
name, options =
|
72
|
-
if args.size > 1
|
73
|
-
args
|
74
|
-
else
|
75
|
-
[args.first, {}]
|
76
|
-
end
|
77
|
-
|
78
|
-
yield(name, options)
|
79
|
-
end
|
80
|
-
|
81
|
-
def dsl(name_or_attrs, options, &block)
|
82
|
-
if block
|
83
|
-
attributes_from_block(name_or_attrs, options, &block)
|
84
|
-
else
|
85
|
-
attributes_from_hash(name_or_attrs, options)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def attributes_from_block(name, options, &block)
|
90
|
-
dsl = new(options, &block)
|
91
|
-
add_attribute(name, options.update(header: dsl.header))
|
92
|
-
end
|
93
|
-
|
94
|
-
def attributes_from_hash(hash, options)
|
95
|
-
hash.each do |name, header|
|
96
|
-
with_attr_options(name, options) do |attr_options|
|
97
|
-
add_attribute(name, attr_options.update(header: header.zip))
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def add_attribute(name, options)
|
103
|
-
exclude(name, name.to_s)
|
104
|
-
attributes << [name, options]
|
105
|
-
end
|
106
|
-
|
107
|
-
def new(options, &block)
|
108
|
-
dsl = self.class.new([], @options.merge(options))
|
109
|
-
dsl.instance_exec(&block)
|
110
|
-
dsl
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'rom/model_builder'
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class MapperBuilder
|
5
|
-
module ModelDSL
|
6
|
-
attr_reader :attributes, :builder, :klass
|
7
|
-
|
8
|
-
DEFAULT_TYPE = :poro
|
9
|
-
|
10
|
-
def model(options = nil)
|
11
|
-
if options.is_a?(Class)
|
12
|
-
@klass = options
|
13
|
-
elsif options
|
14
|
-
type = options.fetch(:type) { DEFAULT_TYPE }
|
15
|
-
@builder = ModelBuilder[type].new(options)
|
16
|
-
end
|
17
|
-
|
18
|
-
build_class unless options
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def build_class
|
24
|
-
return klass if klass
|
25
|
-
return builder.call(attributes.map(&:first)) if builder
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/rom/reader_builder.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'rom/mapper_registry'
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
# @api private
|
5
|
-
class ReaderBuilder
|
6
|
-
DEFAULT_OPTIONS = { inherit_header: true }.freeze
|
7
|
-
|
8
|
-
attr_reader :relations, :readers
|
9
|
-
|
10
|
-
# @api private
|
11
|
-
def initialize(relations)
|
12
|
-
@relations = relations
|
13
|
-
@readers = {}
|
14
|
-
end
|
15
|
-
|
16
|
-
# @api private
|
17
|
-
def call(name, input_options = {}, &block)
|
18
|
-
with_options(input_options) do |options|
|
19
|
-
parent = relations[options.fetch(:parent) { name }]
|
20
|
-
|
21
|
-
builder = MapperBuilder.new(name, parent, options)
|
22
|
-
builder.instance_exec(&block) if block
|
23
|
-
mapper = builder.call
|
24
|
-
|
25
|
-
mappers =
|
26
|
-
if options[:parent]
|
27
|
-
readers.fetch(parent.name).mappers
|
28
|
-
else
|
29
|
-
MapperRegistry.new
|
30
|
-
end
|
31
|
-
|
32
|
-
mappers[name] = mapper
|
33
|
-
|
34
|
-
unless options[:parent]
|
35
|
-
readers[name] = Reader.build(
|
36
|
-
name, parent, mappers, parent.class.relation_methods
|
37
|
-
)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def with_options(options)
|
45
|
-
yield(DEFAULT_OPTIONS.merge(options))
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/lib/rom/relation_builder.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
module ROM
|
2
|
-
# @api private
|
3
|
-
class RelationBuilder
|
4
|
-
attr_reader :schema, :mod
|
5
|
-
|
6
|
-
# @api private
|
7
|
-
def initialize(schema, relations)
|
8
|
-
@schema = schema
|
9
|
-
|
10
|
-
@mod = Module.new
|
11
|
-
|
12
|
-
@mod.module_exec do
|
13
|
-
define_method(:__relations__) { relations }
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# @api private
|
18
|
-
def call(name)
|
19
|
-
schema_relation = schema[name]
|
20
|
-
|
21
|
-
klass = Class.new(Relation)
|
22
|
-
|
23
|
-
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
24
|
-
def self.name
|
25
|
-
"#{Relation.name}[#{Inflecto.camelize(name)}]"
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.inspect
|
29
|
-
name
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.to_s
|
33
|
-
name
|
34
|
-
end
|
35
|
-
|
36
|
-
def name
|
37
|
-
#{name.inspect}
|
38
|
-
end
|
39
|
-
|
40
|
-
def respond_to_missing?(name, _include_private = false)
|
41
|
-
__relations__.key?(name) || super
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def method_missing(name, *args, &block)
|
47
|
-
if __relations__.key?(name)
|
48
|
-
__relations__[name]
|
49
|
-
else
|
50
|
-
super
|
51
|
-
end
|
52
|
-
end
|
53
|
-
RUBY
|
54
|
-
|
55
|
-
klass.send(:include, mod)
|
56
|
-
|
57
|
-
yield(klass)
|
58
|
-
|
59
|
-
klass.new(schema_relation.dataset, schema_relation.header)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module ROM
|
2
|
-
class Setup
|
3
|
-
class BaseRelationDSL
|
4
|
-
attr_reader :env, :name, :header
|
5
|
-
|
6
|
-
def initialize(env, name, &block)
|
7
|
-
@env = env
|
8
|
-
@name = name
|
9
|
-
@header = []
|
10
|
-
@repository = nil
|
11
|
-
instance_exec(&block)
|
12
|
-
end
|
13
|
-
|
14
|
-
def repository(name = nil)
|
15
|
-
if @repository
|
16
|
-
@repository
|
17
|
-
else
|
18
|
-
@repository = env[name]
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def attribute(name)
|
23
|
-
header << name
|
24
|
-
end
|
25
|
-
|
26
|
-
def call
|
27
|
-
dataset =
|
28
|
-
if adapter.respond_to?(:dataset)
|
29
|
-
adapter.dataset(name, header)
|
30
|
-
else
|
31
|
-
adapter[name]
|
32
|
-
end
|
33
|
-
|
34
|
-
base_header = dataset.respond_to?(:header) ? dataset.header : header
|
35
|
-
|
36
|
-
[name, dataset, base_header]
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def adapter
|
42
|
-
repository.adapter
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'rom/mapper_builder'
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class Setup
|
5
|
-
class CommandDSL
|
6
|
-
attr_reader :commands
|
7
|
-
|
8
|
-
class CommandDefinition
|
9
|
-
attr_reader :options
|
10
|
-
|
11
|
-
def initialize(options, &block)
|
12
|
-
@options = options
|
13
|
-
instance_exec(&block) if block
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_h
|
17
|
-
options
|
18
|
-
end
|
19
|
-
|
20
|
-
def type
|
21
|
-
options[:type]
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def method_missing(name, *args, &block)
|
27
|
-
if args.size == 1
|
28
|
-
options[name] = args.first
|
29
|
-
else
|
30
|
-
super
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def initialize(&block)
|
36
|
-
@commands = {}
|
37
|
-
instance_exec(&block)
|
38
|
-
end
|
39
|
-
|
40
|
-
def define(name, options = {}, &block)
|
41
|
-
commands[name] = CommandDefinition.new(options, &block)
|
42
|
-
self
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/lib/rom/setup/mapper_dsl.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'rom/mapper_builder'
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class Setup
|
5
|
-
class MapperDSL
|
6
|
-
attr_reader :mappers
|
7
|
-
|
8
|
-
def initialize(&block)
|
9
|
-
@mappers = []
|
10
|
-
instance_exec(&block)
|
11
|
-
end
|
12
|
-
|
13
|
-
def define(name, options = {}, &block)
|
14
|
-
mappers << [name, options, block]
|
15
|
-
self
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module ROM
|
2
|
-
class Setup
|
3
|
-
class RelationDSL
|
4
|
-
attr_reader :schema, :relations
|
5
|
-
|
6
|
-
def initialize(schema, relations)
|
7
|
-
@schema = schema
|
8
|
-
@relations = relations
|
9
|
-
end
|
10
|
-
|
11
|
-
def register(name, &block)
|
12
|
-
relations[name] = [block]
|
13
|
-
end
|
14
|
-
|
15
|
-
def call
|
16
|
-
relations
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/rom/setup/schema_dsl.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'rom/setup/base_relation_dsl'
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class Setup
|
5
|
-
# @private
|
6
|
-
class SchemaDSL
|
7
|
-
attr_reader :env, :schema
|
8
|
-
|
9
|
-
# @api private
|
10
|
-
def initialize(env, schema, &block)
|
11
|
-
@env = env
|
12
|
-
@schema = schema
|
13
|
-
initialize_schema
|
14
|
-
instance_exec(&block)
|
15
|
-
end
|
16
|
-
|
17
|
-
# @api public
|
18
|
-
def base_relation(name, &block)
|
19
|
-
dsl = BaseRelationDSL.new(env, name, &block)
|
20
|
-
schema[dsl.repository] << dsl.call
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
# @api private
|
26
|
-
def initialize_schema
|
27
|
-
env.repositories.each_value do |repository|
|
28
|
-
schema[repository] ||= []
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Adapter" do
|
4
|
-
include_context "users and tasks" do
|
5
|
-
before(:all) do
|
6
|
-
Class.new(ROM::Adapter::Memory) do
|
7
|
-
def self.schemes
|
8
|
-
[:memory]
|
9
|
-
end
|
10
|
-
|
11
|
-
def extend_relation_class(klass)
|
12
|
-
klass.class_eval do
|
13
|
-
def self.freaking_awesome?
|
14
|
-
true
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def extend_relation_instance(relation)
|
20
|
-
relation.instance_eval do
|
21
|
-
def freaking_cool?
|
22
|
-
true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
before do
|
31
|
-
setup.relation(:users)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "can extend relation class" do
|
35
|
-
expect(rom.relations.users.class).to be_freaking_awesome
|
36
|
-
end
|
37
|
-
|
38
|
-
it "can extend relation instance" do
|
39
|
-
expect(rom.relations.users).to be_freaking_cool
|
40
|
-
end
|
41
|
-
end
|