rom-repository 1.4.0 → 2.0.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/CHANGELOG.md +14 -6
- data/{LICENSE.txt → LICENSE} +1 -1
- data/README.md +18 -1
- data/lib/rom-repository.rb +1 -2
- data/lib/rom/repository.rb +9 -216
- data/lib/rom/repository/class_interface.rb +16 -33
- data/lib/rom/repository/relation_reader.rb +46 -0
- data/lib/rom/repository/root.rb +3 -59
- data/lib/rom/repository/version.rb +1 -1
- metadata +9 -98
- data/.gitignore +0 -3
- data/.rspec +0 -3
- data/.travis.yml +0 -27
- data/.yardopts +0 -2
- data/Gemfile +0 -38
- data/Rakefile +0 -19
- data/lib/rom/open_struct.rb +0 -35
- data/lib/rom/repository/changeset.rb +0 -155
- data/lib/rom/repository/changeset/associated.rb +0 -100
- data/lib/rom/repository/changeset/create.rb +0 -16
- data/lib/rom/repository/changeset/delete.rb +0 -17
- data/lib/rom/repository/changeset/pipe.rb +0 -97
- data/lib/rom/repository/changeset/restricted.rb +0 -28
- data/lib/rom/repository/changeset/stateful.rb +0 -282
- data/lib/rom/repository/changeset/update.rb +0 -82
- data/lib/rom/repository/command_compiler.rb +0 -257
- data/lib/rom/repository/command_proxy.rb +0 -26
- data/lib/rom/repository/header_builder.rb +0 -65
- data/lib/rom/repository/mapper_builder.rb +0 -23
- data/lib/rom/repository/relation_proxy.rb +0 -337
- data/lib/rom/repository/relation_proxy/combine.rb +0 -320
- data/lib/rom/repository/relation_proxy/wrap.rb +0 -78
- data/lib/rom/repository/struct_builder.rb +0 -83
- data/lib/rom/struct.rb +0 -113
- data/log/.gitkeep +0 -0
- data/rom-repository.gemspec +0 -23
- data/spec/integration/changeset_spec.rb +0 -193
- data/spec/integration/command_macros_spec.rb +0 -191
- data/spec/integration/command_spec.rb +0 -228
- data/spec/integration/multi_adapter_spec.rb +0 -73
- data/spec/integration/repository/aggregate_spec.rb +0 -58
- data/spec/integration/repository_spec.rb +0 -406
- data/spec/integration/root_repository_spec.rb +0 -106
- data/spec/integration/typed_structs_spec.rb +0 -64
- data/spec/shared/database.rb +0 -79
- data/spec/shared/mappers.rb +0 -35
- data/spec/shared/models.rb +0 -41
- data/spec/shared/plugins.rb +0 -66
- data/spec/shared/relations.rb +0 -115
- data/spec/shared/repo.rb +0 -86
- data/spec/shared/seeds.rb +0 -30
- data/spec/shared/structs.rb +0 -140
- data/spec/spec_helper.rb +0 -83
- data/spec/support/mapper_registry.rb +0 -9
- data/spec/support/mutant.rb +0 -10
- data/spec/unit/changeset/associate_spec.rb +0 -120
- data/spec/unit/changeset/map_spec.rb +0 -111
- data/spec/unit/changeset_spec.rb +0 -186
- data/spec/unit/relation_proxy_spec.rb +0 -202
- data/spec/unit/repository/changeset_spec.rb +0 -197
- data/spec/unit/repository/inspect_spec.rb +0 -18
- data/spec/unit/repository/session_spec.rb +0 -251
- data/spec/unit/repository/transaction_spec.rb +0 -42
- data/spec/unit/session_spec.rb +0 -46
- data/spec/unit/struct_builder_spec.rb +0 -128
@@ -1,42 +0,0 @@
|
|
1
|
-
RSpec.describe ROM::Repository, '#transaction' do
|
2
|
-
let(:user_repo) do
|
3
|
-
Class.new(ROM::Repository[:users]) { commands :create }.new(rom)
|
4
|
-
end
|
5
|
-
|
6
|
-
let(:task_repo) do
|
7
|
-
Class.new(ROM::Repository[:tasks]) { commands :create, :update }.new(rom)
|
8
|
-
end
|
9
|
-
|
10
|
-
include_context 'database'
|
11
|
-
include_context 'relations'
|
12
|
-
|
13
|
-
it 'creating user with tasks' do
|
14
|
-
user, task = user_repo.transaction do
|
15
|
-
user_changeset = user_repo.changeset(name: 'Jane')
|
16
|
-
task_changeset = task_repo.changeset(title: 'Task One')
|
17
|
-
|
18
|
-
user = user_repo.create(user_changeset)
|
19
|
-
task = task_repo.create(task_changeset.associate(user, :user))
|
20
|
-
|
21
|
-
[user, task]
|
22
|
-
end
|
23
|
-
|
24
|
-
expect(user.name).to eql('Jane')
|
25
|
-
expect(task.user_id).to be(user.id)
|
26
|
-
expect(task.title).to eql('Task One')
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'updating tasks user' do
|
30
|
-
jane = user_repo.create(name: 'Jane')
|
31
|
-
john = user_repo.create(name: 'John')
|
32
|
-
task = task_repo.create(title: 'Jane Task', user_id: jane.id)
|
33
|
-
|
34
|
-
task = task_repo.transaction do
|
35
|
-
task_changeset = task_repo.changeset(task.id, title: 'John Task').associate(john, :user).commit
|
36
|
-
task_repo.update(task_changeset)
|
37
|
-
end
|
38
|
-
|
39
|
-
expect(task.user_id).to be(john.id)
|
40
|
-
expect(task.title).to eql('John Task')
|
41
|
-
end
|
42
|
-
end
|
data/spec/unit/session_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
RSpec.describe ROM::Session do
|
2
|
-
subject(:session) do
|
3
|
-
ROM::Session.new(repo)
|
4
|
-
end
|
5
|
-
|
6
|
-
let(:repo) { instance_double(ROM::Repository) }
|
7
|
-
let(:create_changeset) { instance_double(ROM::Changeset::Create, relation: relation) }
|
8
|
-
let(:delete_changeset) { instance_double(ROM::Changeset::Delete, relation: relation) }
|
9
|
-
let(:relation) { double.as_null_object }
|
10
|
-
|
11
|
-
describe '#pending?' do
|
12
|
-
it 'returns true before commit' do
|
13
|
-
expect(session).to be_pending
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'returns false after commit' do
|
17
|
-
expect(session.commit!).to_not be_pending
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#commit!' do
|
22
|
-
it 'executes ops and restores pristine state' do
|
23
|
-
expect(create_changeset).to receive(:commit).and_return(true)
|
24
|
-
|
25
|
-
session.add(create_changeset).commit!
|
26
|
-
session.commit!
|
27
|
-
|
28
|
-
expect(session).to be_success
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'executes ops and restores pristine state when exception was raised' do
|
32
|
-
expect(create_changeset).to_not receive(:commit)
|
33
|
-
expect(delete_changeset).to receive(:commit).and_raise(StandardError, 'oops')
|
34
|
-
|
35
|
-
expect {
|
36
|
-
session.add(delete_changeset)
|
37
|
-
session.add(create_changeset)
|
38
|
-
session.commit!
|
39
|
-
}.to raise_error(StandardError, 'oops')
|
40
|
-
|
41
|
-
expect(session).to be_failure
|
42
|
-
|
43
|
-
session.commit!
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,128 +0,0 @@
|
|
1
|
-
RSpec.describe 'struct builder', '#call' do
|
2
|
-
subject(:builder) { ROM::Repository::StructBuilder.new }
|
3
|
-
|
4
|
-
def attr_double(name, type, **opts)
|
5
|
-
double(
|
6
|
-
name: name,
|
7
|
-
aliased?: false,
|
8
|
-
wrapped?: false,
|
9
|
-
foreign_key?: false,
|
10
|
-
to_read_type: ROM::Types.const_get(type),
|
11
|
-
**opts
|
12
|
-
)
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:input) do
|
16
|
-
[:users, [:header, [
|
17
|
-
[:attribute, attr_double(:id, :Int)],
|
18
|
-
[:attribute, attr_double(:name, :String)]]]]
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'ROM::Struct' do
|
22
|
-
before { builder[*input] }
|
23
|
-
|
24
|
-
it 'generates a struct for a given relation name and columns' do
|
25
|
-
struct = builder.class.cache[input.hash]
|
26
|
-
|
27
|
-
user = struct.new(id: 1, name: 'Jane')
|
28
|
-
|
29
|
-
expect(user.id).to be(1)
|
30
|
-
expect(user.name).to eql('Jane')
|
31
|
-
|
32
|
-
expect(user[:id]).to be(1)
|
33
|
-
expect(user[:name]).to eql('Jane')
|
34
|
-
|
35
|
-
expect(Hash[user]).to eql(id: 1, name: 'Jane')
|
36
|
-
|
37
|
-
expect(user.inspect).to eql('#<ROM::Struct::User id=1 name="Jane">')
|
38
|
-
expect(user.to_s).to match(/\A#<ROM::Struct::User:0x[0-9a-f]+>\z/)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'stores struct in the cache' do
|
42
|
-
expect(builder.class.cache[input.hash]).to be(builder[*input])
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'with reserved keywords as attribute names' do
|
46
|
-
let(:input) do
|
47
|
-
[:users, [:header, [
|
48
|
-
[:attribute, attr_double(:id, :Int)],
|
49
|
-
[:attribute, attr_double(:name, :String)],
|
50
|
-
[:attribute, attr_double(:alias, :String)],
|
51
|
-
[:attribute, attr_double(:until, :Time)]]]]
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'allows to build a struct class without complaining' do
|
55
|
-
struct = builder.class.cache[input.hash]
|
56
|
-
|
57
|
-
user = struct.new(id: 1, name: 'Jane', alias: 'JD', until: Time.new(2030))
|
58
|
-
|
59
|
-
expect(user.id).to be(1)
|
60
|
-
expect(user.name).to eql('Jane')
|
61
|
-
expect(user.alias).to eql('JD')
|
62
|
-
expect(user.until).to eql(Time.new(2030))
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'raise a friendly error on missing keys' do
|
67
|
-
struct = builder.class.cache[input.hash]
|
68
|
-
|
69
|
-
expect { struct.new(id: 1) }.to raise_error(
|
70
|
-
Dry::Struct::Error, /:name is missing/
|
71
|
-
)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
context 'custom entity container' do
|
76
|
-
before do
|
77
|
-
module Test
|
78
|
-
module Custom
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
let(:struct) { builder[*input] }
|
84
|
-
subject(:builder) { ROM::Repository::StructBuilder.new(Test::Custom) }
|
85
|
-
|
86
|
-
it 'generates a struct class inside a given module' do
|
87
|
-
expect(struct.name).to eql('Test::Custom::User')
|
88
|
-
user = struct.new(id: 1, name: 'Jane')
|
89
|
-
|
90
|
-
expect(user.inspect).to eql(%q{#<Test::Custom::User id=1 name="Jane">})
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'uses the existing class as a parent' do
|
94
|
-
class Test::Custom::User < ROM::Struct
|
95
|
-
def upcased_name
|
96
|
-
name.upcase
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
user = struct.new(id: 1, name: 'Jane')
|
101
|
-
|
102
|
-
expect(user.upcased_name).to eql('JANE')
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'raises a nice error on missing attributes' do
|
106
|
-
class Test::Custom::User < ROM::Struct
|
107
|
-
def upcased_middle_name
|
108
|
-
middle_name.upcase
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
user = struct.new(id: 1, name: 'Jane')
|
113
|
-
|
114
|
-
expect {
|
115
|
-
user.upcased_middle_name
|
116
|
-
}.to raise_error(
|
117
|
-
ROM::Struct::MissingAttribute,
|
118
|
-
/not loaded attribute\?/
|
119
|
-
)
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'works with implicit coercions' do
|
123
|
-
user = struct.new(id: 1, name: 'Jane')
|
124
|
-
|
125
|
-
expect([user].flatten).to eql([user])
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|