rom 0.5.0 → 0.6.0.beta1
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 +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/support/registry.rb
CHANGED
@@ -19,7 +19,7 @@ module ROM
|
|
19
19
|
|
20
20
|
def each(&block)
|
21
21
|
return to_enum unless block
|
22
|
-
elements.each(
|
22
|
+
elements.each { |element| yield(element) }
|
23
23
|
end
|
24
24
|
|
25
25
|
def [](key)
|
@@ -27,17 +27,13 @@ module ROM
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def respond_to_missing?(name, include_private = false)
|
30
|
-
key?(name) || super
|
30
|
+
elements.key?(name) || super
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
def method_missing(name, *
|
36
|
-
|
37
|
-
self[name]
|
38
|
-
else
|
39
|
-
super
|
40
|
-
end
|
35
|
+
def method_missing(name, *)
|
36
|
+
elements.fetch(name) { super }
|
41
37
|
end
|
42
38
|
end
|
43
39
|
end
|
data/lib/rom/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
desc "Run benchmarks (tweak count via COUNT envvar)"
|
2
|
+
task :benchmark do
|
3
|
+
sh "ruby benchmarks/basic.rb"
|
4
|
+
end
|
5
|
+
|
6
|
+
namespace :benchmark do
|
7
|
+
desc "Verify benchmarks"
|
8
|
+
task :verify do
|
9
|
+
ENV['VERIFY'] = "true"
|
10
|
+
ENV['COUNT'] = "1"
|
11
|
+
Rake::Task[:benchmark].invoke
|
12
|
+
end
|
13
|
+
end
|
data/rakelib/mutant.rake
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
desc "Run mutant against a specific subject"
|
2
|
+
task :mutant do
|
3
|
+
subject = ARGV.last
|
4
|
+
if subject == 'mutant'
|
5
|
+
abort "usage: rake mutant SUBJECT\nexample: rake mutant ROM::Header"
|
6
|
+
else
|
7
|
+
opts = {
|
8
|
+
'include' => 'lib',
|
9
|
+
'require' => 'rom',
|
10
|
+
'use' => 'rspec',
|
11
|
+
'ignore-subject' => "#{subject}#respond_to_missing?"
|
12
|
+
}.to_a.map { |k, v| "--#{k} #{v}" }.join(' ')
|
13
|
+
|
14
|
+
exec("bundle exec mutant #{opts} #{subject}")
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
begin
|
2
|
+
require "rubocop/rake_task"
|
3
|
+
|
4
|
+
Rake::Task[:default].enhance [:rubocop]
|
5
|
+
|
6
|
+
RuboCop::RakeTask.new do |task|
|
7
|
+
task.options << "--display-cop-names"
|
8
|
+
end
|
9
|
+
|
10
|
+
namespace :rubocop do
|
11
|
+
desc 'Generate a configuration file acting as a TODO list.'
|
12
|
+
task :auto_gen_config do
|
13
|
+
exec "bundle exec rubocop --auto-gen-config"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
rescue LoadError
|
18
|
+
end
|
data/rom.gemspec
CHANGED
@@ -14,16 +14,13 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.files = `git ls-files`.split("\n").reject { |name| name.include?('benchmarks') }
|
15
15
|
gem.test_files = `git ls-files -- {spec}/*`.split("\n")
|
16
16
|
gem.license = 'MIT'
|
17
|
+
gem.required_ruby_version = '~> 2.0'
|
17
18
|
|
18
|
-
gem.add_runtime_dependency 'addressable', '~> 2.3'
|
19
19
|
gem.add_runtime_dependency 'transproc', '~> 0.1'
|
20
20
|
gem.add_runtime_dependency 'equalizer', '~> 0.0', '>= 0.0.9'
|
21
|
-
gem.add_runtime_dependency 'concord', '~> 0.1', '>= 0.1.4'
|
22
|
-
gem.add_runtime_dependency 'charlatan', '~> 0.1', '>= 0.1'
|
23
|
-
gem.add_runtime_dependency 'inflecto', '~> 0.0', '>= 0.0.2'
|
24
21
|
|
25
22
|
gem.add_development_dependency 'rake', '~> 10.3'
|
26
|
-
gem.add_development_dependency 'rspec-core', '~> 3.
|
27
|
-
gem.add_development_dependency 'rspec-mocks', '~> 3.
|
28
|
-
gem.add_development_dependency 'rspec-expectations', '~> 3.
|
23
|
+
gem.add_development_dependency 'rspec-core', '~> 3.2'
|
24
|
+
gem.add_development_dependency 'rspec-mocks', '~> 3.2'
|
25
|
+
gem.add_development_dependency 'rspec-expectations', '~> 3.2'
|
29
26
|
end
|
@@ -7,12 +7,14 @@ describe 'Commands / Create' do
|
|
7
7
|
let(:tasks) { rom.commands.tasks }
|
8
8
|
|
9
9
|
before do
|
10
|
-
|
11
|
-
|
10
|
+
module Test
|
11
|
+
UserValidator = Class.new do
|
12
|
+
ValidationError = Class.new(ROM::CommandError)
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
def self.call(params)
|
15
|
+
unless params[:name] && params[:email]
|
16
|
+
raise ValidationError, ":name and :email are required"
|
17
|
+
end
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
@@ -20,40 +22,46 @@ describe 'Commands / Create' do
|
|
20
22
|
setup.relation(:users)
|
21
23
|
setup.relation(:tasks)
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
class Test::CreateUser < ROM::Commands::Create[:memory]
|
26
|
+
relation :users
|
27
|
+
register_as :create
|
28
|
+
result :one
|
29
|
+
validator Test::UserValidator
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
|
32
|
+
class Test::CreateTask < ROM::Commands::Create[:memory]
|
33
|
+
relation :tasks
|
34
|
+
register_as :create
|
35
|
+
result :one
|
36
|
+
|
37
|
+
def execute(user, task)
|
38
|
+
super(task.merge(name: user[:name]))
|
39
|
+
end
|
31
40
|
end
|
32
41
|
end
|
33
42
|
|
34
43
|
it 'inserts user on successful validation' do
|
35
|
-
result = users.try
|
44
|
+
result = users.try do
|
45
|
+
users.create.call(name: 'Piotr', email: 'piotr@solnic.eu')
|
46
|
+
end
|
36
47
|
|
37
|
-
expect(result).to
|
48
|
+
expect(result.value).to eql(name: 'Piotr', email: 'piotr@solnic.eu')
|
38
49
|
end
|
39
50
|
|
40
51
|
it 'inserts user and associated task when things go well' do
|
41
52
|
result = users.try {
|
42
|
-
create(name: 'Piotr', email: 'piotr@solnic.eu')
|
43
|
-
|
44
|
-
|
45
|
-
create(name: users.first[:name], title: 'Finish command-api')
|
46
|
-
}
|
53
|
+
command = users.create.with(name: 'Piotr', email: 'piotr@solnic.eu')
|
54
|
+
command >>= tasks.create.with(title: 'Finish command-api')
|
55
|
+
command
|
47
56
|
}
|
48
57
|
|
49
|
-
expect(result)
|
50
|
-
.to match_array([{ name: 'Piotr', title: 'Finish command-api' }])
|
58
|
+
expect(result.value).to eql(name: 'Piotr', title: 'Finish command-api')
|
51
59
|
end
|
52
60
|
|
53
61
|
it 'returns validation object with errors on failed validation' do
|
54
|
-
result = users.try { create(name: 'Piotr') }
|
62
|
+
result = users.try { users.create.call(name: 'Piotr') }
|
55
63
|
|
56
|
-
expect(result.error).to be_instance_of(ValidationError)
|
64
|
+
expect(result.error).to be_instance_of(Test::ValidationError)
|
57
65
|
expect(result.error.message).to eql(":name and :email are required")
|
58
66
|
expect(rom.relations.users.count).to be(2)
|
59
67
|
end
|
@@ -69,7 +77,7 @@ describe 'Commands / Create' do
|
|
69
77
|
tuple = { name: 'Piotr', email: 'piotr@solnic.eu' }
|
70
78
|
|
71
79
|
result = users.try {
|
72
|
-
create_one(tuple)
|
80
|
+
users.create_one.call(tuple)
|
73
81
|
}
|
74
82
|
|
75
83
|
expect(result.value).to eql(tuple)
|
@@ -83,7 +91,7 @@ describe 'Commands / Create' do
|
|
83
91
|
end
|
84
92
|
end
|
85
93
|
setup.finalize
|
86
|
-
}.to raise_error(ROM::
|
94
|
+
}.to raise_error(ROM::InvalidOptionValueError)
|
87
95
|
end
|
88
96
|
end
|
89
97
|
end
|
@@ -11,14 +11,14 @@ describe 'Commands / Delete' do
|
|
11
11
|
restrict(name: name)
|
12
12
|
end
|
13
13
|
end
|
14
|
+
end
|
14
15
|
|
16
|
+
it 'deletes all tuples when there is no restriction' do
|
15
17
|
setup.commands(:users) do
|
16
18
|
define(:delete)
|
17
19
|
end
|
18
|
-
end
|
19
20
|
|
20
|
-
|
21
|
-
result = users.try { delete }
|
21
|
+
result = users.try { users.delete.call }
|
22
22
|
|
23
23
|
expect(result).to match_array([
|
24
24
|
{ name: 'Jane', email: 'jane@doe.org' },
|
@@ -27,13 +27,21 @@ describe 'Commands / Delete' do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'deletes tuples matching restriction' do
|
30
|
-
|
30
|
+
setup.commands(:users) do
|
31
|
+
define(:delete)
|
32
|
+
end
|
33
|
+
|
34
|
+
result = users.try { users.delete.by_name('Joe').call }
|
31
35
|
|
32
36
|
expect(result).to match_array([{ name: 'Joe', email: 'joe@doe.org' }])
|
33
37
|
end
|
34
38
|
|
35
39
|
it 'returns untouched relation if there are no tuples to delete' do
|
36
|
-
|
40
|
+
setup.commands(:users) do
|
41
|
+
define(:delete)
|
42
|
+
end
|
43
|
+
|
44
|
+
result = users.try { users.delete.by_name('Not here').call }
|
37
45
|
|
38
46
|
expect(result).to match_array([])
|
39
47
|
end
|
@@ -45,7 +53,7 @@ describe 'Commands / Delete' do
|
|
45
53
|
end
|
46
54
|
end
|
47
55
|
|
48
|
-
result = users.try { delete_one(
|
56
|
+
result = users.try { users.delete_one.by_name('Jane').call }
|
49
57
|
|
50
58
|
expect(result.value).to eql(name: 'Jane', email: 'jane@doe.org')
|
51
59
|
end
|
@@ -57,7 +65,7 @@ describe 'Commands / Delete' do
|
|
57
65
|
end
|
58
66
|
end
|
59
67
|
|
60
|
-
result = users.try { delete }
|
68
|
+
result = users.try { users.delete.call }
|
61
69
|
|
62
70
|
expect(result.error).to be_instance_of(ROM::TupleCountMismatchError)
|
63
71
|
|
@@ -8,11 +8,13 @@ describe 'Commands / Update' do
|
|
8
8
|
subject(:users) { rom.commands.users }
|
9
9
|
|
10
10
|
before do
|
11
|
-
|
12
|
-
|
11
|
+
module Test
|
12
|
+
UserValidator = Class.new do
|
13
|
+
ValidationError = Class.new(ROM::CommandError)
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
def self.call(params)
|
16
|
+
raise ValidationError, ":email is required" unless params[:email]
|
17
|
+
end
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
@@ -28,14 +30,14 @@ describe 'Commands / Update' do
|
|
28
30
|
|
29
31
|
setup.commands(:users) do
|
30
32
|
define(:update) do
|
31
|
-
validator UserValidator
|
33
|
+
validator Test::UserValidator
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
38
|
it 'update tuples on successful validation' do
|
37
39
|
result = users.try {
|
38
|
-
update(
|
40
|
+
users.update.all(name: 'Jane').set(email: 'jane.doe@test.com')
|
39
41
|
}
|
40
42
|
|
41
43
|
expect(result)
|
@@ -43,9 +45,9 @@ describe 'Commands / Update' do
|
|
43
45
|
end
|
44
46
|
|
45
47
|
it 'returns validation object with errors on failed validation' do
|
46
|
-
result = users.try { update(
|
48
|
+
result = users.try { users.update.all(name: 'Jane').set(email: nil) }
|
47
49
|
|
48
|
-
expect(result.error).to be_instance_of(ValidationError)
|
50
|
+
expect(result.error).to be_instance_of(Test::ValidationError)
|
49
51
|
expect(result.error.message).to eql(':email is required')
|
50
52
|
|
51
53
|
expect(rom.relations.users.restrict(name: 'Jane')).to match_array([
|
@@ -62,7 +64,7 @@ describe 'Commands / Update' do
|
|
62
64
|
end
|
63
65
|
|
64
66
|
result = users.try {
|
65
|
-
update_one(
|
67
|
+
users.update_one.by_name('Jane').set(email: 'jane.doe@test.com')
|
66
68
|
}
|
67
69
|
|
68
70
|
expect(result.value).to eql(name: 'Jane', email: 'jane.doe@test.com')
|
@@ -76,7 +78,7 @@ describe 'Commands / Update' do
|
|
76
78
|
end
|
77
79
|
|
78
80
|
result = users.try {
|
79
|
-
update_one.set(email: 'jane.doe@test.com')
|
81
|
+
users.update_one.set(email: 'jane.doe@test.com')
|
80
82
|
}
|
81
83
|
|
82
84
|
expect(result.error).to be_instance_of(ROM::TupleCountMismatchError)
|
@@ -95,7 +97,7 @@ describe 'Commands / Update' do
|
|
95
97
|
end
|
96
98
|
end
|
97
99
|
setup.finalize
|
98
|
-
}.to raise_error(ROM::
|
100
|
+
}.to raise_error(ROM::InvalidOptionValueError)
|
99
101
|
end
|
100
102
|
end
|
101
103
|
end
|
@@ -1,23 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'rom/memory'
|
2
3
|
|
3
4
|
describe 'Mappers / deeply embedded tuples' do
|
4
|
-
let(:setup) { ROM.setup(
|
5
|
+
let(:setup) { ROM.setup(:memory) }
|
5
6
|
let(:rom) { setup.finalize }
|
6
7
|
|
7
8
|
it 'allows mapping embedded tuples' do
|
8
|
-
setup.schema do
|
9
|
-
base_relation(:users) do
|
10
|
-
repository :default
|
11
|
-
attribute 'name'
|
12
|
-
attribute 'tasks'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
9
|
setup.relation(:users)
|
17
10
|
|
18
11
|
setup.mappers do
|
19
12
|
define(:users) do
|
20
|
-
model name: 'User'
|
13
|
+
model name: 'Test::User'
|
21
14
|
|
22
15
|
attribute :name, from: 'name'
|
23
16
|
|
@@ -32,7 +25,7 @@ describe 'Mappers / deeply embedded tuples' do
|
|
32
25
|
end
|
33
26
|
end
|
34
27
|
|
35
|
-
rom.
|
28
|
+
rom.relations.users << {
|
36
29
|
'name' => 'Jane',
|
37
30
|
'tasks' => [
|
38
31
|
{ 'title' => 'Task One', 'priority' => { 'value' => 1, 'desc' => 'high' } },
|
@@ -19,50 +19,38 @@ describe 'Mapper definition DSL' do
|
|
19
19
|
before do
|
20
20
|
setup.mappers do
|
21
21
|
define(:users) do
|
22
|
-
model name: 'User'
|
22
|
+
model name: 'Test::User'
|
23
|
+
|
24
|
+
attribute :name
|
25
|
+
attribute :email
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
27
30
|
it 'defines a constant for the model class' do
|
28
|
-
expect(mapper.model).to be(User)
|
31
|
+
expect(mapper.model).to be(Test::User)
|
29
32
|
end
|
30
33
|
|
31
|
-
it '
|
32
|
-
expect(header.keys).to eql(
|
34
|
+
it 'defines header with attributes' do
|
35
|
+
expect(header.keys).to eql([:name, :email])
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
36
39
|
describe 'excluding attributes' do
|
37
|
-
context 'using exclude' do
|
38
|
-
subject(:mapper) { rom.read(:users).mapper }
|
39
|
-
|
40
|
-
before do
|
41
|
-
setup.mappers do
|
42
|
-
define(:users) do
|
43
|
-
model name: 'User'
|
44
|
-
|
45
|
-
exclude :name
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'only maps provided attributes' do
|
51
|
-
expect(header.keys).to eql([:email])
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
40
|
context 'by setting :inherit_header to false' do
|
56
41
|
subject(:mapper) { rom.read(:users).email_index.mapper }
|
57
42
|
|
58
43
|
before do
|
59
44
|
setup.mappers do
|
60
45
|
define(:users) do
|
61
|
-
model name: 'User'
|
46
|
+
model name: 'Test::User'
|
47
|
+
|
48
|
+
attribute :name
|
49
|
+
attribute :email
|
62
50
|
end
|
63
51
|
|
64
52
|
define(:email_index, parent: :users, inherit_header: false) do
|
65
|
-
model name: 'UserWithoutName'
|
53
|
+
model name: 'Test::UserWithoutName'
|
66
54
|
attribute :email
|
67
55
|
end
|
68
56
|
end
|
@@ -80,13 +68,14 @@ describe 'Mapper definition DSL' do
|
|
80
68
|
before do
|
81
69
|
setup.mappers do
|
82
70
|
define(:users) do
|
83
|
-
model name: 'User'
|
71
|
+
model name: 'Test::User'
|
72
|
+
|
73
|
+
attribute :name
|
74
|
+
attribute :email
|
84
75
|
end
|
85
|
-
end
|
86
76
|
|
87
|
-
setup.mappers do
|
88
77
|
define(:email_index, parent: :users) do
|
89
|
-
model name: 'UserWithoutName'
|
78
|
+
model name: 'Test::UserWithoutName'
|
90
79
|
exclude :name
|
91
80
|
end
|
92
81
|
end
|
@@ -97,7 +86,7 @@ describe 'Mapper definition DSL' do
|
|
97
86
|
end
|
98
87
|
|
99
88
|
it 'builds a new model' do
|
100
|
-
expect(mapper.model).to be(UserWithoutName)
|
89
|
+
expect(mapper.model).to be(Test::UserWithoutName)
|
101
90
|
end
|
102
91
|
end
|
103
92
|
|
@@ -109,11 +98,9 @@ describe 'Mapper definition DSL' do
|
|
109
98
|
end
|
110
99
|
end
|
111
100
|
|
112
|
-
setup.relation(:users)
|
113
|
-
|
114
101
|
setup.mappers do
|
115
102
|
define(:tasks) do
|
116
|
-
model name: 'Task'
|
103
|
+
model name: 'Test::Task'
|
117
104
|
|
118
105
|
attribute :title
|
119
106
|
attribute :priority
|
@@ -124,7 +111,7 @@ describe 'Mapper definition DSL' do
|
|
124
111
|
it 'allows defining wrapped attributes via options hash' do
|
125
112
|
setup.mappers do
|
126
113
|
define(:with_user, parent: :tasks) do
|
127
|
-
model name: 'TaskWithUser'
|
114
|
+
model name: 'Test::TaskWithUser'
|
128
115
|
|
129
116
|
attribute :title
|
130
117
|
attribute :priority
|
@@ -135,12 +122,12 @@ describe 'Mapper definition DSL' do
|
|
135
122
|
|
136
123
|
rom = setup.finalize
|
137
124
|
|
138
|
-
TaskWithUser.send(:include, Equalizer.new(:title, :priority, :user))
|
125
|
+
Test::TaskWithUser.send(:include, Equalizer.new(:title, :priority, :user))
|
139
126
|
|
140
127
|
jane = rom.read(:tasks).with_user.to_a.last
|
141
128
|
|
142
129
|
expect(jane).to eql(
|
143
|
-
TaskWithUser.new(
|
130
|
+
Test::TaskWithUser.new(
|
144
131
|
title: 'be cool',
|
145
132
|
priority: 2,
|
146
133
|
user: { email: 'jane@doe.org' }
|
@@ -151,7 +138,7 @@ describe 'Mapper definition DSL' do
|
|
151
138
|
it 'allows defining wrapped attributes via options block' do
|
152
139
|
setup.mappers do
|
153
140
|
define(:with_user, parent: :tasks) do
|
154
|
-
model name: 'TaskWithUser'
|
141
|
+
model name: 'Test::TaskWithUser'
|
155
142
|
|
156
143
|
attribute :title
|
157
144
|
attribute :priority
|
@@ -164,12 +151,12 @@ describe 'Mapper definition DSL' do
|
|
164
151
|
|
165
152
|
rom = setup.finalize
|
166
153
|
|
167
|
-
TaskWithUser.send(:include, Equalizer.new(:title, :priority, :user))
|
154
|
+
Test::TaskWithUser.send(:include, Equalizer.new(:title, :priority, :user))
|
168
155
|
|
169
156
|
jane = rom.read(:tasks).with_user.to_a.last
|
170
157
|
|
171
158
|
expect(jane).to eql(
|
172
|
-
TaskWithUser.new(
|
159
|
+
Test::TaskWithUser.new(
|
173
160
|
title: 'be cool',
|
174
161
|
priority: 2,
|
175
162
|
user: { email: 'jane@doe.org' }
|
@@ -180,13 +167,13 @@ describe 'Mapper definition DSL' do
|
|
180
167
|
it 'allows defining wrapped attributes mapped to a model' do
|
181
168
|
setup.mappers do
|
182
169
|
define(:with_user, parent: :tasks) do
|
183
|
-
model name: 'TaskWithUser'
|
170
|
+
model name: 'Test::TaskWithUser'
|
184
171
|
|
185
172
|
attribute :title
|
186
173
|
attribute :priority
|
187
174
|
|
188
175
|
wrap :user do
|
189
|
-
model name: 'User'
|
176
|
+
model name: 'Test::User'
|
190
177
|
attribute :email
|
191
178
|
end
|
192
179
|
end
|
@@ -194,16 +181,16 @@ describe 'Mapper definition DSL' do
|
|
194
181
|
|
195
182
|
rom = setup.finalize
|
196
183
|
|
197
|
-
TaskWithUser.send(:include, Equalizer.new(:title, :priority, :user))
|
198
|
-
User.send(:include, Equalizer.new(:email))
|
184
|
+
Test::TaskWithUser.send(:include, Equalizer.new(:title, :priority, :user))
|
185
|
+
Test::User.send(:include, Equalizer.new(:email))
|
199
186
|
|
200
187
|
jane = rom.read(:tasks).with_user.to_a.last
|
201
188
|
|
202
189
|
expect(jane).to eql(
|
203
|
-
TaskWithUser.new(
|
190
|
+
Test::TaskWithUser.new(
|
204
191
|
title: 'be cool',
|
205
192
|
priority: 2,
|
206
|
-
user: User.new(email: 'jane@doe.org')
|
193
|
+
user: Test::User.new(email: 'jane@doe.org')
|
207
194
|
)
|
208
195
|
)
|
209
196
|
end
|