rom 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Group operation' do
|
4
|
+
include_context 'users and tasks'
|
5
|
+
|
6
|
+
specify 'defining a grouped relation' do
|
7
|
+
setup.relation(:users) do
|
8
|
+
|
9
|
+
def with_tasks
|
10
|
+
in_memory {
|
11
|
+
group(join(tasks), tasks: [:title, :priority])
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def by_name(name)
|
16
|
+
restrict(name: name)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
users = rom.relations.users
|
22
|
+
|
23
|
+
expect(users.with_tasks.to_a).to eql(
|
24
|
+
[
|
25
|
+
{
|
26
|
+
name: "Joe", email: "joe@doe.org", tasks: [
|
27
|
+
{ title: "be nice", priority: 1 },
|
28
|
+
{ title: "sleep well", priority: 2 }
|
29
|
+
]
|
30
|
+
},
|
31
|
+
{ name: "Jane", email: "jane@doe.org", tasks: [{ title: "be cool", priority: 2 }] }
|
32
|
+
]
|
33
|
+
)
|
34
|
+
|
35
|
+
expect(users.with_tasks.by_name("Jane").to_a).to eql(
|
36
|
+
[
|
37
|
+
{ name: "Jane", email: "jane@doe.org", tasks: [{ title: "be cool", priority: 2 }] }
|
38
|
+
]
|
39
|
+
)
|
40
|
+
|
41
|
+
expect(users.by_name("Jane").with_tasks.to_a).to eql(
|
42
|
+
[
|
43
|
+
{ name: "Jane", email: "jane@doe.org", tasks: [{ title: "be cool", priority: 2 }] }
|
44
|
+
]
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe 'Join operation' do
|
4
|
+
include_context 'users and tasks'
|
5
|
+
|
6
|
+
specify 'defining a joined relation' do
|
7
|
+
setup.relation(:users) do
|
8
|
+
def with_tasks
|
9
|
+
in_memory { join(tasks) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
users = rom.relations.users
|
14
|
+
|
15
|
+
expect(users.with_tasks.to_a).to eql(
|
16
|
+
[
|
17
|
+
{ name: 'Joe', email: 'joe@doe.org', title: 'be nice', priority: 1 },
|
18
|
+
{ name: 'Joe', email: 'joe@doe.org', title: 'sleep well', priority: 2 },
|
19
|
+
{ name: 'Jane', email: 'jane@doe.org', title: 'be cool', priority: 2 }
|
20
|
+
]
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Wrap operation' do
|
4
|
+
include_context 'users and tasks'
|
5
|
+
|
6
|
+
subject(:rom) { setup.finalize }
|
7
|
+
|
8
|
+
specify 'defining a wrapped relation' do
|
9
|
+
setup.relation(:users) do
|
10
|
+
def with_task
|
11
|
+
in_memory { wrap(join(tasks), task: [:title, :priority]) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
users = rom.relations.users
|
16
|
+
|
17
|
+
expect(users.with_task.to_a).to eql(
|
18
|
+
[
|
19
|
+
{
|
20
|
+
name: "Joe",
|
21
|
+
email: "joe@doe.org",
|
22
|
+
task: { title: "be nice", priority: 1 }
|
23
|
+
},
|
24
|
+
{
|
25
|
+
name: "Joe",
|
26
|
+
email: "joe@doe.org",
|
27
|
+
task: { title: "sleep well", priority: 2 }
|
28
|
+
},
|
29
|
+
{
|
30
|
+
name: "Jane",
|
31
|
+
email: "jane@doe.org",
|
32
|
+
task: { title: "be cool", priority: 2 }
|
33
|
+
}
|
34
|
+
]
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Reading relations' do
|
4
|
+
include_context 'users and tasks'
|
5
|
+
|
6
|
+
it 'exposes a relation reader' do
|
7
|
+
setup.relation(:users) do
|
8
|
+
def by_name(name)
|
9
|
+
restrict(name: name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def sorted
|
13
|
+
order(:name, :email)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
setup.mappers do
|
18
|
+
define(:users) do
|
19
|
+
model name: 'User'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
rom = setup.finalize
|
24
|
+
|
25
|
+
users = rom.read(:users).sorted.by_name('Jane')
|
26
|
+
user = users.first
|
27
|
+
|
28
|
+
expect(user).to be_an_instance_of(User)
|
29
|
+
expect(user.name).to eql 'Jane'
|
30
|
+
expect(user.email).to eql 'jane@doe.org'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'maps grouped relations' do
|
34
|
+
setup.relation(:users) do
|
35
|
+
def with_tasks
|
36
|
+
in_memory { group(join(tasks), tasks: [:title, :priority]) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def sorted
|
40
|
+
order(:name)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
setup.mappers do
|
45
|
+
define(:users) do
|
46
|
+
model name: 'User'
|
47
|
+
end
|
48
|
+
|
49
|
+
define(:with_tasks, parent: :users) do
|
50
|
+
model name: 'UserWithTasks'
|
51
|
+
|
52
|
+
group tasks: [:title, :priority]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
rom = setup.finalize
|
57
|
+
|
58
|
+
User.send(:include, Equalizer.new(:name, :email))
|
59
|
+
UserWithTasks.send(:include, Equalizer.new(:name, :email, :tasks))
|
60
|
+
|
61
|
+
expect(rom.read(:users).with_tasks.header).to eql([:name, :email, :tasks])
|
62
|
+
|
63
|
+
user = rom.read(:users).sorted.first
|
64
|
+
|
65
|
+
expect(user).to eql(
|
66
|
+
User.new(name: "Jane", email: "jane@doe.org")
|
67
|
+
)
|
68
|
+
|
69
|
+
user = rom.read(:users).with_tasks.sorted.first
|
70
|
+
|
71
|
+
expect(user).to eql(
|
72
|
+
UserWithTasks.new(
|
73
|
+
name: "Jane",
|
74
|
+
email: "jane@doe.org",
|
75
|
+
tasks: [{ title: "be cool", priority: 2 }])
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'maps wrapped relations' do
|
80
|
+
setup.relation(:users) do
|
81
|
+
def with_task
|
82
|
+
in_memory { wrap(join(tasks), task: [:title, :priority]) }
|
83
|
+
end
|
84
|
+
|
85
|
+
def sorted
|
86
|
+
order(:name)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
setup.mappers do
|
91
|
+
define(:users) do
|
92
|
+
model name: 'User'
|
93
|
+
end
|
94
|
+
|
95
|
+
define(:with_task, parent: :users) do
|
96
|
+
model name: 'UserWithTask'
|
97
|
+
|
98
|
+
wrap task: [:title, :priority]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
rom = setup.finalize
|
103
|
+
|
104
|
+
User.send(:include, Equalizer.new(:name, :email))
|
105
|
+
UserWithTask.send(:include, Equalizer.new(:name, :email, :task))
|
106
|
+
|
107
|
+
expect(rom.read(:users).with_task.header).to eql([:name, :email, :task])
|
108
|
+
|
109
|
+
user = rom.read(:users).sorted.with_task.first
|
110
|
+
|
111
|
+
expect(user).to eql(
|
112
|
+
UserWithTask.new(name: "Jane", email: "jane@doe.org",
|
113
|
+
task: { title: "be cool", priority: 2 })
|
114
|
+
)
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Relation registration DSL' do
|
4
|
+
include_context 'users and tasks'
|
5
|
+
|
6
|
+
it 'allows to expose chainable relations' do
|
7
|
+
setup.relation(:tasks) do
|
8
|
+
def high_priority
|
9
|
+
restrict { |tuple| tuple[:priority] < 2 }
|
10
|
+
end
|
11
|
+
|
12
|
+
def by_title(title)
|
13
|
+
restrict(title: title)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
setup.relation(:users) do
|
18
|
+
def with_tasks
|
19
|
+
in_memory { join(tasks) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
tasks = rom.relations.tasks
|
24
|
+
|
25
|
+
expect(tasks.class.name).to eql("ROM::Relation[Tasks]")
|
26
|
+
expect(tasks.high_priority.inspect).to include("#<ROM::Relation[Tasks]")
|
27
|
+
|
28
|
+
expect(tasks.high_priority.by_title("be nice")).to match_array(
|
29
|
+
[name: "Joe", title: "be nice", priority: 1]
|
30
|
+
)
|
31
|
+
|
32
|
+
expect(tasks.by_title("be cool")).to match_array(
|
33
|
+
[name: "Jane", title: "be cool", priority: 2]
|
34
|
+
)
|
35
|
+
|
36
|
+
users = rom.relations.users
|
37
|
+
|
38
|
+
expect(users.with_tasks.to_a).to eql(
|
39
|
+
[{ name: "Joe", email: "joe@doe.org", title: "be nice", priority: 1 },
|
40
|
+
{ name: "Joe", email: "joe@doe.org", title: "sleep well", priority: 2 },
|
41
|
+
{ name: "Jane", email: "jane@doe.org", title: "be cool", priority: 2 }]
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Defining schema' do
|
4
|
+
let(:setup) { ROM.setup(memory: 'memory://localhost') }
|
5
|
+
let(:rom) { setup.finalize }
|
6
|
+
let(:schema) { rom.schema }
|
7
|
+
|
8
|
+
describe '.schema' do
|
9
|
+
it 'returns schema with relations' do
|
10
|
+
setup.schema do
|
11
|
+
base_relation(:users) do
|
12
|
+
repository :memory
|
13
|
+
|
14
|
+
attribute :id
|
15
|
+
attribute :name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
users = schema.users
|
20
|
+
|
21
|
+
expect(users.dataset.to_a).to eql(rom.memory.users.to_a)
|
22
|
+
expect(users.header).to eql([:id, :name])
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns an empty schema if it was not defined' do
|
26
|
+
expect(schema.users).to be_nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Setting up ROM' do
|
4
|
+
include_context 'users and tasks'
|
5
|
+
|
6
|
+
let(:jane) { { name: 'Jane', email: 'jane@doe.org' } }
|
7
|
+
let(:joe) { { name: 'Joe', email: 'joe@doe.org' } }
|
8
|
+
|
9
|
+
it 'configures relations' do
|
10
|
+
expect(rom.memory.users).to match_array([joe, jane])
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'raises on double-finalize' do
|
14
|
+
expect {
|
15
|
+
2.times { setup.finalize }
|
16
|
+
}.to raise_error(ROM::EnvAlreadyFinalizedError)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
RSpec.shared_context 'users and tasks' do
|
2
|
+
subject(:rom) { setup.finalize }
|
3
|
+
|
4
|
+
let(:setup) { ROM.setup(memory: "memory://localhost") }
|
5
|
+
|
6
|
+
before do
|
7
|
+
setup.schema do
|
8
|
+
base_relation(:users) do
|
9
|
+
repository :memory
|
10
|
+
|
11
|
+
attribute :name
|
12
|
+
attribute :email
|
13
|
+
end
|
14
|
+
|
15
|
+
base_relation(:tasks) do
|
16
|
+
repository :memory
|
17
|
+
|
18
|
+
attribute :name
|
19
|
+
attribute :title
|
20
|
+
attribute :priority
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
db = setup.memory
|
25
|
+
|
26
|
+
db[:users].insert(name: "Joe", email: "joe@doe.org")
|
27
|
+
db[:users].insert(name: "Jane", email: "jane@doe.org")
|
28
|
+
|
29
|
+
db[:tasks].insert(name: "Joe", title: "be nice", priority: 1)
|
30
|
+
db[:tasks].insert(name: "Joe", title: "sleep well", priority: 2)
|
31
|
+
|
32
|
+
db[:tasks].insert(name: "Jane", title: "be cool", priority: 2)
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,49 +1,27 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
# this is needed for guard to work, not sure why :(
|
4
|
+
require "bundler"
|
5
|
+
Bundler.setup
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
]
|
11
|
-
|
12
|
-
SimpleCov.start do
|
13
|
-
command_name 'spec:unit'
|
14
|
-
|
15
|
-
add_filter 'config'
|
16
|
-
add_filter 'lib/rom/support'
|
17
|
-
add_filter 'spec'
|
18
|
-
end
|
7
|
+
if RUBY_ENGINE == "rbx"
|
8
|
+
require "codeclimate-test-reporter"
|
9
|
+
CodeClimate::TestReporter.start
|
19
10
|
end
|
20
11
|
|
21
|
-
require 'devtools/spec_helper'
|
22
|
-
|
23
12
|
require 'rom'
|
13
|
+
require 'rom/adapter/memory'
|
24
14
|
|
25
|
-
|
26
|
-
|
27
|
-
include ROM
|
28
|
-
include SpecHelper
|
29
|
-
include Morpher::NodeHelpers
|
30
|
-
|
31
|
-
TEST_ENV = Environment.setup(test: 'memory://test') do
|
32
|
-
schema do
|
33
|
-
base_relation :users do
|
34
|
-
repository :test
|
15
|
+
root = Pathname(__FILE__).dirname
|
35
16
|
|
36
|
-
|
37
|
-
attribute :name, String
|
17
|
+
Dir[root.join('shared/*.rb').to_s].each { |f| require f }
|
38
18
|
|
39
|
-
|
40
|
-
|
19
|
+
RSpec.configure do |config|
|
20
|
+
config.before do
|
21
|
+
@constants = Object.constants
|
41
22
|
end
|
42
23
|
|
43
|
-
|
44
|
-
|
45
|
-
model mock_model(:id, :name)
|
46
|
-
map :id, :name
|
47
|
-
end
|
24
|
+
config.after do
|
25
|
+
(Object.constants - @constants).each { |name| Object.send(:remove_const, name) }
|
48
26
|
end
|
49
27
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ROM::Adapter do
|
4
|
+
before do
|
5
|
+
class TestAdapter < ROM::Adapter
|
6
|
+
def self.schemes
|
7
|
+
[:test_scheme]
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(uri); end
|
11
|
+
|
12
|
+
ROM::Adapter.register(self)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.setup' do
|
17
|
+
it 'sets up connection based on a uri' do
|
18
|
+
adapter = ROM::Adapter.setup("test_scheme::memory")
|
19
|
+
|
20
|
+
expect(adapter).to be_instance_of(TestAdapter)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'raises an exception if the scheme is not supported' do
|
24
|
+
expect {
|
25
|
+
ROM::Adapter.setup("bogus:///non-existent")
|
26
|
+
}.to raise_error(ArgumentError, '"bogus:///non-existent" uri is not supported')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '.[]' do
|
31
|
+
it "looks up and return the adapter class for the given schema" do
|
32
|
+
expect(ROM::Adapter[:test_scheme]).to eq TestAdapter
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'Registration order' do
|
37
|
+
it "prefers the last-defined adapter" do
|
38
|
+
class OrderTestFirst < TestAdapter
|
39
|
+
def self.schemes
|
40
|
+
[:order_test]
|
41
|
+
end
|
42
|
+
|
43
|
+
ROM::Adapter.register(self)
|
44
|
+
end
|
45
|
+
|
46
|
+
adapter = ROM::Adapter.setup("order_test::memory")
|
47
|
+
expect(adapter).to be_instance_of(OrderTestFirst)
|
48
|
+
|
49
|
+
class OrderTestSecond < OrderTestFirst
|
50
|
+
ROM::Adapter.register(self)
|
51
|
+
end
|
52
|
+
|
53
|
+
adapter = ROM::Adapter.setup("order_test::memory")
|
54
|
+
|
55
|
+
expect(adapter).to be_instance_of(OrderTestSecond)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|