rom 0.2.0 → 0.3.0
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -3
- data/.ruby-version +1 -1
- data/.travis.yml +13 -14
- data/{Changelog.md → CHANGELOG.md} +12 -3
- data/Gemfile +14 -10
- data/Gemfile.devtools +16 -16
- data/Guardfile +2 -5
- data/README.md +68 -56
- data/Rakefile +3 -3
- data/config/flay.yml +2 -2
- data/config/mutant.yml +2 -4
- data/config/rubocop.yml +30 -0
- data/lib/rom.rb +47 -9
- data/lib/rom/adapter.rb +52 -0
- data/lib/rom/adapter/memory.rb +70 -0
- data/lib/rom/boot.rb +158 -0
- data/lib/rom/boot/base_relation_dsl.rb +43 -0
- data/lib/rom/boot/dsl.rb +30 -0
- data/lib/rom/boot/mapper_dsl.rb +23 -0
- data/lib/rom/boot/relation_dsl.rb +23 -0
- data/lib/rom/boot/schema_dsl.rb +27 -0
- data/lib/rom/env.rb +48 -0
- data/lib/rom/header.rb +123 -0
- data/lib/rom/mapper.rb +38 -153
- data/lib/rom/mapper_builder.rb +85 -0
- data/lib/rom/model_builder.rb +58 -0
- data/lib/rom/ra.rb +196 -0
- data/lib/rom/ra/operation/group.rb +49 -0
- data/lib/rom/ra/operation/join.rb +41 -0
- data/lib/rom/ra/operation/wrap.rb +45 -0
- data/lib/rom/reader.rb +62 -0
- data/lib/rom/reader_builder.rb +28 -0
- data/lib/rom/relation.rb +41 -350
- data/lib/rom/relation_builder.rb +48 -0
- data/lib/rom/repository.rb +28 -53
- data/lib/rom/support/registry.rb +34 -0
- data/lib/rom/version.rb +3 -0
- data/rom.gemspec +12 -10
- data/spec/integration/adapters/extending_relations_spec.rb +43 -0
- data/spec/integration/mappers/definition_dsl_spec.rb +82 -0
- data/spec/integration/mappers/prefixing_attributes_spec.rb +42 -0
- data/spec/integration/mappers/renaming_attributes_spec.rb +138 -0
- data/spec/integration/ra/group_spec.rb +47 -0
- data/spec/integration/ra/join_spec.rb +24 -0
- data/spec/integration/ra/wrap_spec.rb +37 -0
- data/spec/integration/relations/reading_spec.rb +116 -0
- data/spec/integration/relations/registry_dsl_spec.rb +44 -0
- data/spec/integration/schema_spec.rb +29 -0
- data/spec/integration/setup_spec.rb +18 -0
- data/spec/shared/users_and_tasks.rb +34 -0
- data/spec/spec_helper.rb +14 -36
- data/spec/unit/rom/adapter_spec.rb +59 -0
- data/spec/unit/rom/header_spec.rb +58 -0
- data/spec/unit/rom/mapper_spec.rb +27 -0
- data/spec/unit/rom/ra/operation/group_spec.rb +55 -0
- data/spec/unit/rom/ra/operation/wrap_spec.rb +29 -0
- data/spec/unit/rom/relation_spec.rb +34 -0
- metadata +122 -190
- data/lib/rom/constants.rb +0 -16
- data/lib/rom/environment.rb +0 -105
- data/lib/rom/environment/builder.rb +0 -71
- data/lib/rom/mapper/attribute.rb +0 -108
- data/lib/rom/mapper/builder.rb +0 -58
- data/lib/rom/mapper/builder/definition.rb +0 -162
- data/lib/rom/mapper/header.rb +0 -103
- data/lib/rom/mapper/loader_builder.rb +0 -26
- data/lib/rom/schema.rb +0 -21
- data/lib/rom/schema/builder.rb +0 -59
- data/lib/rom/schema/definition.rb +0 -84
- data/lib/rom/schema/definition/relation.rb +0 -80
- data/lib/rom/schema/definition/relation/base.rb +0 -27
- data/lib/rom/session.rb +0 -111
- data/lib/rom/session/environment.rb +0 -67
- data/lib/rom/session/identity_map.rb +0 -43
- data/lib/rom/session/mapper.rb +0 -62
- data/lib/rom/session/relation.rb +0 -140
- data/lib/rom/session/state.rb +0 -59
- data/lib/rom/session/state/created.rb +0 -22
- data/lib/rom/session/state/deleted.rb +0 -25
- data/lib/rom/session/state/persisted.rb +0 -34
- data/lib/rom/session/state/transient.rb +0 -20
- data/lib/rom/session/state/updated.rb +0 -29
- data/lib/rom/session/tracker.rb +0 -62
- data/lib/rom/support/axiom/adapter.rb +0 -111
- data/lib/rom/support/axiom/adapter/data_objects.rb +0 -38
- data/lib/rom/support/axiom/adapter/memory.rb +0 -25
- data/lib/rom/support/axiom/adapter/postgres.rb +0 -19
- data/lib/rom/support/axiom/adapter/sqlite3.rb +0 -20
- data/lib/version.rb +0 -3
- data/spec/integration/environment_setup_spec.rb +0 -24
- data/spec/integration/grouped_mappers_spec.rb +0 -87
- data/spec/integration/join_and_group_spec.rb +0 -76
- data/spec/integration/join_and_wrap_spec.rb +0 -68
- data/spec/integration/mapping_embedded_relations_spec.rb +0 -73
- data/spec/integration/mapping_relations_spec.rb +0 -120
- data/spec/integration/schema_definition_spec.rb +0 -152
- data/spec/integration/session_spec.rb +0 -87
- data/spec/integration/wrapped_mappers_spec.rb +0 -73
- data/spec/shared/unit/environment_context.rb +0 -6
- data/spec/shared/unit/loader.rb +0 -11
- data/spec/shared/unit/loader_identity.rb +0 -13
- data/spec/shared/unit/mapper_context.rb +0 -11
- data/spec/shared/unit/relation_context.rb +0 -82
- data/spec/shared/unit/session_environment_context.rb +0 -11
- data/spec/shared/unit/session_relation_context.rb +0 -18
- data/spec/support/helper.rb +0 -34
- data/spec/support/ice_nine_config.rb +0 -10
- data/spec/support/test_mapper.rb +0 -110
- data/spec/unit/rom/environment/builder/mapping_spec.rb +0 -24
- data/spec/unit/rom/environment/builder/schema_spec.rb +0 -33
- data/spec/unit/rom/environment/class_methods/setup_spec.rb +0 -18
- data/spec/unit/rom/environment/repository_spec.rb +0 -21
- data/spec/unit/rom/mapper/attribute/embedded_collection/to_ast_spec.rb +0 -18
- data/spec/unit/rom/mapper/attribute/embedded_value/to_ast_spec.rb +0 -16
- data/spec/unit/rom/mapper/attribute/rename_spec.rb +0 -9
- data/spec/unit/rom/mapper/attribute/to_ast_spec.rb +0 -9
- data/spec/unit/rom/mapper/builder/class_methods/call_spec.rb +0 -61
- data/spec/unit/rom/mapper/class_methods/build_spec.rb +0 -55
- data/spec/unit/rom/mapper/dump_spec.rb +0 -11
- data/spec/unit/rom/mapper/group_spec.rb +0 -35
- data/spec/unit/rom/mapper/header/each_spec.rb +0 -26
- data/spec/unit/rom/mapper/header/element_reader_spec.rb +0 -21
- data/spec/unit/rom/mapper/header/group_spec.rb +0 -18
- data/spec/unit/rom/mapper/header/join_spec.rb +0 -14
- data/spec/unit/rom/mapper/header/keys_spec.rb +0 -29
- data/spec/unit/rom/mapper/header/project_spec.rb +0 -13
- data/spec/unit/rom/mapper/header/rename_spec.rb +0 -11
- data/spec/unit/rom/mapper/header/to_ast_spec.rb +0 -11
- data/spec/unit/rom/mapper/header/wrap_spec.rb +0 -18
- data/spec/unit/rom/mapper/identity_from_tuple_spec.rb +0 -11
- data/spec/unit/rom/mapper/identity_spec.rb +0 -11
- data/spec/unit/rom/mapper/join_spec.rb +0 -15
- data/spec/unit/rom/mapper/load_spec.rb +0 -11
- data/spec/unit/rom/mapper/new_object_spec.rb +0 -14
- data/spec/unit/rom/mapper/project_spec.rb +0 -11
- data/spec/unit/rom/mapper/rename_spec.rb +0 -16
- data/spec/unit/rom/mapper/wrap_spec.rb +0 -35
- data/spec/unit/rom/relation/delete_spec.rb +0 -15
- data/spec/unit/rom/relation/drop_spec.rb +0 -11
- data/spec/unit/rom/relation/each_spec.rb +0 -23
- data/spec/unit/rom/relation/first_spec.rb +0 -19
- data/spec/unit/rom/relation/group_spec.rb +0 -29
- data/spec/unit/rom/relation/inject_mapper_spec.rb +0 -17
- data/spec/unit/rom/relation/insert_spec.rb +0 -13
- data/spec/unit/rom/relation/last_spec.rb +0 -19
- data/spec/unit/rom/relation/one_spec.rb +0 -49
- data/spec/unit/rom/relation/rename_spec.rb +0 -21
- data/spec/unit/rom/relation/replace_spec.rb +0 -13
- data/spec/unit/rom/relation/restrict_spec.rb +0 -25
- data/spec/unit/rom/relation/sort_by_spec.rb +0 -25
- data/spec/unit/rom/relation/take_spec.rb +0 -11
- data/spec/unit/rom/relation/to_a_spec.rb +0 -20
- data/spec/unit/rom/relation/update_spec.rb +0 -25
- data/spec/unit/rom/relation/wrap_spec.rb +0 -29
- data/spec/unit/rom/repository/class_methods/build_spec.rb +0 -27
- data/spec/unit/rom/repository/element_reader_spec.rb +0 -21
- data/spec/unit/rom/repository/element_writer_spec.rb +0 -18
- data/spec/unit/rom/schema/builder/class_methods/build_spec.rb +0 -103
- data/spec/unit/rom/schema/element_reader_spec.rb +0 -15
- data/spec/unit/rom/session/class_methods/start_spec.rb +0 -23
- data/spec/unit/rom/session/clean_predicate_spec.rb +0 -21
- data/spec/unit/rom/session/environment/element_reader_spec.rb +0 -13
- data/spec/unit/rom/session/flush_spec.rb +0 -58
- data/spec/unit/rom/session/mapper/load_spec.rb +0 -47
- data/spec/unit/rom/session/relation/delete_spec.rb +0 -28
- data/spec/unit/rom/session/relation/dirty_predicate_spec.rb +0 -35
- data/spec/unit/rom/session/relation/identity_spec.rb +0 -11
- data/spec/unit/rom/session/relation/new_spec.rb +0 -50
- data/spec/unit/rom/session/relation/save_spec.rb +0 -50
- data/spec/unit/rom/session/relation/state_spec.rb +0 -23
- data/spec/unit/rom/session/relation/track_spec.rb +0 -23
- data/spec/unit/rom/session/relation/tracking_predicate_spec.rb +0 -23
- data/spec/unit/rom/session/relation/update_attributes_spec.rb +0 -45
- data/spec/unit/rom/session/state_spec.rb +0 -79
@@ -1,20 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class Session
|
5
|
-
class State
|
6
|
-
|
7
|
-
# @api private
|
8
|
-
class Transient < self
|
9
|
-
include Concord::Public.new(:object, :mapper)
|
10
|
-
|
11
|
-
# @api private
|
12
|
-
def save(relation)
|
13
|
-
Created.new(object, mapper, relation)
|
14
|
-
end
|
15
|
-
|
16
|
-
end # Transient
|
17
|
-
|
18
|
-
end # State
|
19
|
-
end # Session
|
20
|
-
end # ROM
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class Session
|
5
|
-
class State
|
6
|
-
|
7
|
-
# @api private
|
8
|
-
class Updated < self
|
9
|
-
include Adamantium::Flat
|
10
|
-
include Concord::Public.new(:object, :mapper, :relation)
|
11
|
-
|
12
|
-
# @api private
|
13
|
-
def commit
|
14
|
-
relation.update(object, original_tuple)
|
15
|
-
Persisted.new(object, mapper)
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
# @api private
|
21
|
-
def original_tuple
|
22
|
-
mapper.identity_map.fetch_tuple(mapper.identity(object))
|
23
|
-
end
|
24
|
-
|
25
|
-
end # Updated
|
26
|
-
|
27
|
-
end # State
|
28
|
-
end # Session
|
29
|
-
end # ROM
|
data/lib/rom/session/tracker.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module ROM
|
4
|
-
class Session
|
5
|
-
|
6
|
-
# @api private
|
7
|
-
class Tracker
|
8
|
-
attr_reader :objects, :changelog
|
9
|
-
private :objects, :changelog
|
10
|
-
|
11
|
-
# @api private
|
12
|
-
def initialize
|
13
|
-
@objects = {}
|
14
|
-
@changelog = []
|
15
|
-
end
|
16
|
-
|
17
|
-
# @api private
|
18
|
-
def commit
|
19
|
-
@changelog.each { |state| update(state.commit) }
|
20
|
-
@changelog = []
|
21
|
-
end
|
22
|
-
|
23
|
-
# @api private
|
24
|
-
def fetch(identity)
|
25
|
-
@objects.fetch(identity) { raise ObjectNotTrackedError, identity }
|
26
|
-
end
|
27
|
-
|
28
|
-
# @api private
|
29
|
-
def include?(identity)
|
30
|
-
@objects.key?(identity)
|
31
|
-
end
|
32
|
-
|
33
|
-
# @api private
|
34
|
-
def clean?
|
35
|
-
changelog.empty?
|
36
|
-
end
|
37
|
-
|
38
|
-
# @api private
|
39
|
-
def queue(state)
|
40
|
-
@changelog << state
|
41
|
-
update(state)
|
42
|
-
end
|
43
|
-
|
44
|
-
# @api private
|
45
|
-
def update(state)
|
46
|
-
@objects[state.identity] = state
|
47
|
-
end
|
48
|
-
|
49
|
-
# @api private
|
50
|
-
def store_transient(object, mapper)
|
51
|
-
update(State::Transient.new(object, mapper))
|
52
|
-
end
|
53
|
-
|
54
|
-
# @api private
|
55
|
-
def store_persisted(object, mapper)
|
56
|
-
update(State::Persisted.new(object, mapper))
|
57
|
-
end
|
58
|
-
|
59
|
-
end # Tracker
|
60
|
-
|
61
|
-
end # Session
|
62
|
-
end # ROM
|
@@ -1,111 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Axiom
|
4
|
-
|
5
|
-
# Raised when passing an +uri+ with an unregistered scheme to {Adapter.new}
|
6
|
-
UnknownAdapterError = Class.new(StandardError)
|
7
|
-
|
8
|
-
# Provides base functionality for every axiom adapter
|
9
|
-
#
|
10
|
-
# @todo think about making this a (base) class
|
11
|
-
#
|
12
|
-
# @example
|
13
|
-
#
|
14
|
-
# class MyAdapter
|
15
|
-
# extend Axiom::Adapter
|
16
|
-
# uri_scheme :foo
|
17
|
-
# end
|
18
|
-
#
|
19
|
-
module Adapter
|
20
|
-
|
21
|
-
# The registry of adapters
|
22
|
-
#
|
23
|
-
# @return [Hash<String, Object>]
|
24
|
-
# a hash of adapters, keyed by uri scheme
|
25
|
-
#
|
26
|
-
# @api private
|
27
|
-
REGISTRY = {}
|
28
|
-
|
29
|
-
# Return the adapter to use for the given +uri+
|
30
|
-
#
|
31
|
-
# @param [Addressable::URI] uri
|
32
|
-
# the uri to initialize the adapter with
|
33
|
-
#
|
34
|
-
# @return [Object]
|
35
|
-
# a axiom adapter
|
36
|
-
#
|
37
|
-
# @raise [UnknownAdapterError]
|
38
|
-
# when the given +uri+'s scheme is not registered
|
39
|
-
#
|
40
|
-
# @api private
|
41
|
-
def self.build(uri)
|
42
|
-
require_adapter(uri)
|
43
|
-
|
44
|
-
klass = get(uri)
|
45
|
-
|
46
|
-
if klass.name == 'Axiom::Adapter::Memory'
|
47
|
-
klass.new
|
48
|
-
else
|
49
|
-
klass.new(uri)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Return the adapter class registered for +uri+
|
54
|
-
#
|
55
|
-
# @param [Addressable::URI] uri
|
56
|
-
# the uri that identifies the adapter class
|
57
|
-
#
|
58
|
-
# @return [Class]
|
59
|
-
# a axiom adapter class
|
60
|
-
#
|
61
|
-
# @raise [UnknownAdapterError]
|
62
|
-
# when the given +uri+'s scheme is not registered
|
63
|
-
#
|
64
|
-
# @api private
|
65
|
-
def self.get(uri)
|
66
|
-
uri_scheme = uri.scheme
|
67
|
-
|
68
|
-
REGISTRY.fetch(uri_scheme) {
|
69
|
-
raise(
|
70
|
-
UnknownAdapterError,
|
71
|
-
"#{uri_scheme.inspect} is no registered uri scheme"
|
72
|
-
)
|
73
|
-
}
|
74
|
-
end
|
75
|
-
|
76
|
-
# Try to load an adapter using a standard path
|
77
|
-
#
|
78
|
-
# @api private
|
79
|
-
def self.require_adapter(uri)
|
80
|
-
require "rom/support/axiom/adapter/#{uri.scheme}"
|
81
|
-
rescue LoadError
|
82
|
-
end
|
83
|
-
private_class_method :require_adapter
|
84
|
-
|
85
|
-
# Set the uri scheme for an adapter class
|
86
|
-
#
|
87
|
-
# @example for a DataObjects adapter
|
88
|
-
#
|
89
|
-
# class Postgres < Axiom::Adapter::DataObjects
|
90
|
-
# uri_scheme :postgres
|
91
|
-
# end
|
92
|
-
#
|
93
|
-
# @example for an arbitrary adapter
|
94
|
-
#
|
95
|
-
# class InMemory
|
96
|
-
# extend Axiom::Adapter
|
97
|
-
# uri_scheme :in_memory
|
98
|
-
# end
|
99
|
-
#
|
100
|
-
# @param [#to_s] name
|
101
|
-
# the name of the uri scheme
|
102
|
-
#
|
103
|
-
# @return [self]
|
104
|
-
#
|
105
|
-
# @api public
|
106
|
-
def uri_scheme(name)
|
107
|
-
REGISTRY[name.to_s] = self
|
108
|
-
end
|
109
|
-
|
110
|
-
end # module Adapter
|
111
|
-
end # module Axiom
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'axiom-do-adapter'
|
4
|
-
|
5
|
-
module Axiom
|
6
|
-
module Adapter
|
7
|
-
|
8
|
-
# Reopenend to add functionality that should eventually
|
9
|
-
# be puhsed down to Adapter::DataObjects proper, or whatever
|
10
|
-
# will be the base class.
|
11
|
-
#
|
12
|
-
class DataObjects
|
13
|
-
extend Adapter
|
14
|
-
|
15
|
-
include Equalizer.new(:uri)
|
16
|
-
|
17
|
-
# The URI this adapter uses for establishing a connection
|
18
|
-
#
|
19
|
-
# @return [Addressable::URI]
|
20
|
-
#
|
21
|
-
# @api private
|
22
|
-
attr_reader :uri
|
23
|
-
|
24
|
-
# Wrap the given +relation+ with a gateway
|
25
|
-
#
|
26
|
-
# @param [Axiom::Relation] relation
|
27
|
-
# the relation to wrap with a gateway
|
28
|
-
#
|
29
|
-
# @return [Axiom::Relation::Gateway]
|
30
|
-
#
|
31
|
-
# @api private
|
32
|
-
def gateway(relation)
|
33
|
-
Axiom::Relation::Gateway.new(self, relation)
|
34
|
-
end
|
35
|
-
|
36
|
-
end # DataObjects
|
37
|
-
end # Adapter
|
38
|
-
end # Axiom
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'axiom-memory-adapter'
|
4
|
-
require 'rom/support/axiom/adapter'
|
5
|
-
|
6
|
-
module Axiom
|
7
|
-
module Adapter
|
8
|
-
|
9
|
-
# A axiom in memory adapter
|
10
|
-
#
|
11
|
-
# This is basically a "null adapter"
|
12
|
-
# as it doesn't make use of it's uri
|
13
|
-
# and only passes through the given
|
14
|
-
# +relation+ in {#gateway}
|
15
|
-
#
|
16
|
-
class Memory
|
17
|
-
extend Adapter
|
18
|
-
|
19
|
-
include Equalizer.new(:schema)
|
20
|
-
|
21
|
-
uri_scheme :memory
|
22
|
-
|
23
|
-
end # class Memory
|
24
|
-
end # module Adapter
|
25
|
-
end # module Axiom
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'do_postgres'
|
4
|
-
|
5
|
-
require 'rom/support/axiom/adapter'
|
6
|
-
require 'rom/support/axiom/adapter/data_objects'
|
7
|
-
|
8
|
-
module Axiom
|
9
|
-
module Adapter
|
10
|
-
|
11
|
-
# A Axiom adapter for postgres
|
12
|
-
#
|
13
|
-
class Postgres < DataObjects
|
14
|
-
|
15
|
-
uri_scheme :postgres
|
16
|
-
|
17
|
-
end # class Postgres
|
18
|
-
end # module Adapter
|
19
|
-
end # module Axiom
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'do_sqlite3'
|
4
|
-
|
5
|
-
require 'rom/support/axiom/adapter'
|
6
|
-
require 'rom/support/axiom/adapter/data_objects'
|
7
|
-
|
8
|
-
module Axiom
|
9
|
-
module Adapter
|
10
|
-
|
11
|
-
# A axiom adapter for sqlite3
|
12
|
-
#
|
13
|
-
class Sqlite3 < DataObjects
|
14
|
-
|
15
|
-
uri_scheme :sqlite3
|
16
|
-
|
17
|
-
end # Sqlite3
|
18
|
-
|
19
|
-
end # Adapter
|
20
|
-
end # Axiom
|
data/lib/version.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe 'Setting up environment' do
|
6
|
-
let(:env) do
|
7
|
-
ROM::Environment.setup(memory: 'memory://test') do
|
8
|
-
schema do
|
9
|
-
base_relation :users do
|
10
|
-
repository :memory
|
11
|
-
|
12
|
-
attribute :id, Integer
|
13
|
-
attribute :name, String
|
14
|
-
|
15
|
-
key :id
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'registers relations within repositories' do
|
22
|
-
expect(env.schema[:users]).to be_instance_of(Axiom::Relation::Variable::Materialized)
|
23
|
-
end
|
24
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe 'Grouped mappers' do
|
6
|
-
let(:env) do
|
7
|
-
Environment.setup(test: 'memory://test') do
|
8
|
-
schema do
|
9
|
-
base_relation :users do
|
10
|
-
repository :test
|
11
|
-
|
12
|
-
attribute :id, Integer
|
13
|
-
attribute :name, String
|
14
|
-
|
15
|
-
key :id
|
16
|
-
end
|
17
|
-
|
18
|
-
base_relation :tasks do
|
19
|
-
repository :test
|
20
|
-
|
21
|
-
attribute :id, Integer
|
22
|
-
attribute :title, String
|
23
|
-
|
24
|
-
key :id
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
mapping do
|
29
|
-
relation(:users) do
|
30
|
-
model User
|
31
|
-
map :id, :name
|
32
|
-
end
|
33
|
-
|
34
|
-
relation(:tasks) do
|
35
|
-
model Task
|
36
|
-
map :id, :title
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
before do
|
43
|
-
User = mock_model(:id, :name, :tasks)
|
44
|
-
Task = mock_model(:id, :title)
|
45
|
-
end
|
46
|
-
|
47
|
-
after do
|
48
|
-
Object.send(:remove_const, :User) if defined?(User)
|
49
|
-
Object.send(:remove_const, :Task) if defined?(Task)
|
50
|
-
end
|
51
|
-
|
52
|
-
subject(:mapper) { env[:users].mapper.group(:tasks => env[:tasks].mapper) }
|
53
|
-
|
54
|
-
specify 'loading grouped tuples' do
|
55
|
-
tuple = {
|
56
|
-
:id => 1,
|
57
|
-
:name => 'Jane',
|
58
|
-
:tasks => [
|
59
|
-
{ :id => 2, :title => 'Task 1' },
|
60
|
-
{ :id => 3, :title => 'Task 2' }
|
61
|
-
]
|
62
|
-
}
|
63
|
-
|
64
|
-
task1 = Task.new(tuple[:tasks].first)
|
65
|
-
task2 = Task.new(tuple[:tasks].last)
|
66
|
-
user = User.new(:id => tuple[:id], :name => tuple[:name], :tasks => [task1, task2])
|
67
|
-
|
68
|
-
expect(mapper.load(tuple)).to eql(user)
|
69
|
-
end
|
70
|
-
|
71
|
-
specify 'dumping grouped tuples' do
|
72
|
-
tuple = {
|
73
|
-
:id => 1,
|
74
|
-
:name => 'Jane',
|
75
|
-
:tasks => [
|
76
|
-
{ :id => 2, :title => 'Task 1' },
|
77
|
-
{ :id => 3, :title => 'Task 2' }
|
78
|
-
]
|
79
|
-
}
|
80
|
-
|
81
|
-
task1 = Task.new(tuple[:tasks].first)
|
82
|
-
task2 = Task.new(tuple[:tasks].last)
|
83
|
-
user = User.new(:id => tuple[:id], :name => tuple[:name], :tasks => [task1, task2])
|
84
|
-
|
85
|
-
expect(mapper.dump(user)).to eql([1, 'Jane', [[2, 'Task 1'], [3, 'Task 2']]])
|
86
|
-
end
|
87
|
-
end
|