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
data/spec/shared/repo.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
RSpec.shared_context('repo') do
|
2
|
-
include_context 'models'
|
3
|
-
include_context 'mappers'
|
4
|
-
|
5
|
-
let(:repo) { repo_class.new(rom) }
|
6
|
-
|
7
|
-
let(:repo_class) do
|
8
|
-
Class.new(ROM::Repository[:users]) do
|
9
|
-
relations :tasks, :tags, :posts, :labels, :posts_labels, :books, :authors
|
10
|
-
|
11
|
-
def find_users(criteria)
|
12
|
-
users.find(criteria)
|
13
|
-
end
|
14
|
-
|
15
|
-
def all_users
|
16
|
-
users.all
|
17
|
-
end
|
18
|
-
|
19
|
-
def all_users_as_users
|
20
|
-
users.as(:user).all
|
21
|
-
end
|
22
|
-
|
23
|
-
def users_with_tasks
|
24
|
-
aggregate(many: { all_tasks: tasks.for_users })
|
25
|
-
end
|
26
|
-
|
27
|
-
def users_with_tasks_and_tags
|
28
|
-
aggregate(many: { all_tasks: tasks_with_tags(tasks.for_users) })
|
29
|
-
end
|
30
|
-
|
31
|
-
def users_with_task
|
32
|
-
aggregate(one: tasks)
|
33
|
-
end
|
34
|
-
|
35
|
-
def users_with_task_by_title(title)
|
36
|
-
aggregate(one: tasks.find(title: title))
|
37
|
-
end
|
38
|
-
|
39
|
-
def users_with_posts_and_their_labels
|
40
|
-
users.combine(posts: [:labels])
|
41
|
-
end
|
42
|
-
|
43
|
-
def posts_with_labels
|
44
|
-
posts.combine_children(many: labels)
|
45
|
-
end
|
46
|
-
|
47
|
-
def label_with_posts
|
48
|
-
labels.combine_children(one: posts)
|
49
|
-
end
|
50
|
-
|
51
|
-
def tasks_for_users(users)
|
52
|
-
tasks.for_users(users)
|
53
|
-
end
|
54
|
-
|
55
|
-
def task_with_user
|
56
|
-
tasks.find(tasks[:id].qualified => 2).wrap_parent(user: users)
|
57
|
-
end
|
58
|
-
|
59
|
-
def task_with_owner
|
60
|
-
tasks.find(id: 2).combine_parents(one: { owner: users })
|
61
|
-
end
|
62
|
-
|
63
|
-
def tasks_with_tags(tasks = self.tasks)
|
64
|
-
tasks.combine_children(many: tags)
|
65
|
-
end
|
66
|
-
|
67
|
-
def tag_with_wrapped_task
|
68
|
-
tags.wrap_parent(task: tasks)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
let(:comments_repo) do
|
74
|
-
Class.new(ROM::Repository[:comments]) do
|
75
|
-
relations :likes
|
76
|
-
|
77
|
-
def comments_with_likes
|
78
|
-
aggregate(many: { likes: likes })
|
79
|
-
end
|
80
|
-
|
81
|
-
def comments_with_emotions
|
82
|
-
root.combine(:emotions)
|
83
|
-
end
|
84
|
-
end.new(rom)
|
85
|
-
end
|
86
|
-
end
|
data/spec/shared/seeds.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
RSpec.shared_context 'seeds' do
|
2
|
-
before do
|
3
|
-
jane_id = conn[:users].insert name: 'Jane'
|
4
|
-
joe_id = conn[:users].insert name: 'Joe'
|
5
|
-
|
6
|
-
conn[:tasks].insert user_id: joe_id, title: 'Joe Task'
|
7
|
-
task_id = conn[:tasks].insert user_id: jane_id, title: 'Jane Task'
|
8
|
-
|
9
|
-
conn[:tags].insert task_id: task_id, name: 'red'
|
10
|
-
|
11
|
-
jane_post_id = conn[:posts].insert author_id: jane_id, title: 'Hello From Jane', body: 'Jane Post'
|
12
|
-
joe_post_id = conn[:posts].insert author_id: joe_id, title: 'Hello From Joe', body: 'Joe Post'
|
13
|
-
|
14
|
-
red_id = conn[:labels].insert name: 'red'
|
15
|
-
green_id = conn[:labels].insert name: 'green'
|
16
|
-
blue_id = conn[:labels].insert name: 'blue'
|
17
|
-
|
18
|
-
conn[:posts_labels].insert post_id: jane_post_id, label_id: red_id
|
19
|
-
conn[:posts_labels].insert post_id: jane_post_id, label_id: blue_id
|
20
|
-
|
21
|
-
conn[:posts_labels].insert post_id: joe_post_id, label_id: green_id
|
22
|
-
|
23
|
-
conn[:messages].insert author: 'Jane', body: 'Hello folks'
|
24
|
-
conn[:messages].insert author: 'Joe', body: 'Hello Jane'
|
25
|
-
|
26
|
-
conn[:reactions].insert message_id: 1, author: 'Joe'
|
27
|
-
conn[:reactions].insert message_id: 1, author: 'Anonymous'
|
28
|
-
conn[:reactions].insert message_id: 2, author: 'Jane'
|
29
|
-
end
|
30
|
-
end
|
data/spec/shared/structs.rb
DELETED
@@ -1,140 +0,0 @@
|
|
1
|
-
RSpec.shared_context 'structs' do
|
2
|
-
let(:user_struct) do
|
3
|
-
repo.users.mapper.model
|
4
|
-
end
|
5
|
-
|
6
|
-
let(:task_struct) do
|
7
|
-
repo.tasks.mapper.model
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:tag_struct) do
|
11
|
-
repo.tags.mapper.model
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:post_struct) do
|
15
|
-
repo.posts.mapper.model
|
16
|
-
end
|
17
|
-
|
18
|
-
let(:label_struct) do
|
19
|
-
repo.labels.mapper.model
|
20
|
-
end
|
21
|
-
|
22
|
-
let(:post_with_labels_struct) do
|
23
|
-
mapper_for(repo.posts_with_labels).model
|
24
|
-
end
|
25
|
-
|
26
|
-
let(:label_with_posts_struct) do
|
27
|
-
mapper_for(repo.label_with_posts).model
|
28
|
-
end
|
29
|
-
|
30
|
-
let(:tag_with_task_struct) do
|
31
|
-
mapper_for(repo.tag_with_wrapped_task).model
|
32
|
-
end
|
33
|
-
|
34
|
-
let(:user_with_tasks_struct) do
|
35
|
-
mapper_for(repo.users_with_tasks).model
|
36
|
-
end
|
37
|
-
|
38
|
-
let(:user_with_task_struct) do
|
39
|
-
mapper_for(repo.users_with_task).model
|
40
|
-
end
|
41
|
-
|
42
|
-
let(:user_with_posts_struct) do
|
43
|
-
mapper_for(repo.users_with_posts_and_their_labels).model
|
44
|
-
end
|
45
|
-
|
46
|
-
let(:task_with_tags_struct) do
|
47
|
-
mapper_for(repo.tasks_with_tags).model
|
48
|
-
end
|
49
|
-
|
50
|
-
let(:task_with_user_struct) do
|
51
|
-
mapper_for(repo.task_with_user).model
|
52
|
-
end
|
53
|
-
|
54
|
-
let(:task_with_owner_struct) do
|
55
|
-
mapper_for(repo.task_with_owner).model
|
56
|
-
end
|
57
|
-
|
58
|
-
let(:jane) do
|
59
|
-
user_struct.new(id: 1, name: 'Jane')
|
60
|
-
end
|
61
|
-
|
62
|
-
let(:jane_with_tasks) do
|
63
|
-
user_with_tasks_struct.new(id: 1, name: 'Jane', all_tasks: [jane_task])
|
64
|
-
end
|
65
|
-
|
66
|
-
let(:jane_with_task) do
|
67
|
-
user_with_task_struct.new(id: 1, name: 'Jane', task: jane_task)
|
68
|
-
end
|
69
|
-
|
70
|
-
let(:jane_without_task) do
|
71
|
-
user_with_task_struct.new(id: 1, name: 'Jane', task: nil)
|
72
|
-
end
|
73
|
-
|
74
|
-
let(:jane_task) do
|
75
|
-
task_struct.new(id: 2, user_id: 1, title: 'Jane Task')
|
76
|
-
end
|
77
|
-
|
78
|
-
let(:task_with_user) do
|
79
|
-
task_with_user_struct.new(id: 2, user_id: 1, title: 'Jane Task', user: jane)
|
80
|
-
end
|
81
|
-
|
82
|
-
let(:task_with_owner) do
|
83
|
-
task_with_owner_struct.new(id: 2, user_id: 1, title: 'Jane Task', owner: jane)
|
84
|
-
end
|
85
|
-
|
86
|
-
let(:tag) do
|
87
|
-
tag_struct.new(id: 1, task_id: 2, name: 'red')
|
88
|
-
end
|
89
|
-
|
90
|
-
let(:task) do
|
91
|
-
task_struct.new(id: 2, user_id: 1, title: 'Jane Task')
|
92
|
-
end
|
93
|
-
|
94
|
-
let(:tag_with_task) do
|
95
|
-
tag_with_task_struct.new(id: 1, task_id: 2, name: 'red', task: task)
|
96
|
-
end
|
97
|
-
|
98
|
-
let(:task_with_tag) do
|
99
|
-
task_with_tags_struct.new(id: 2, user_id: 1, title: 'Jane Task', tags: [tag])
|
100
|
-
end
|
101
|
-
|
102
|
-
let(:user_with_task_and_tags) do
|
103
|
-
user_with_tasks_struct.new(id: 1, name: 'Jane', all_tasks: [task_with_tag])
|
104
|
-
end
|
105
|
-
|
106
|
-
let(:joe) do
|
107
|
-
user_struct.new(id: 2, name: 'Joe')
|
108
|
-
end
|
109
|
-
|
110
|
-
let(:joe_with_tasks) do
|
111
|
-
user_with_tasks_struct.new(id: 2, name: 'Joe', all_tasks: [joe_task])
|
112
|
-
end
|
113
|
-
|
114
|
-
let(:joe_with_task) do
|
115
|
-
user_with_task_struct.new(id: 2, name: 'Joe', task: joe_task)
|
116
|
-
end
|
117
|
-
|
118
|
-
let(:joe_task) do
|
119
|
-
task_struct.new(id: 1, user_id: 2, title: 'Joe Task')
|
120
|
-
end
|
121
|
-
|
122
|
-
let(:jane_with_posts) do
|
123
|
-
user_with_posts_struct.new(id: 1, name: 'Jane', posts: [post_with_label])
|
124
|
-
end
|
125
|
-
|
126
|
-
let(:label_red) do
|
127
|
-
label_with_posts_struct.new(id: 1, name: 'red', post: 1)
|
128
|
-
end
|
129
|
-
|
130
|
-
let(:label_blue) do
|
131
|
-
label_with_posts_struct.new(id: 3, name: 'blue', post: 1)
|
132
|
-
end
|
133
|
-
|
134
|
-
let(:post_with_label) do
|
135
|
-
post_with_labels_struct.new(id: 2, title: 'Hello From Jane',
|
136
|
-
body: 'Jane Post',
|
137
|
-
author_id: 1,
|
138
|
-
labels: [label_red, label_blue])
|
139
|
-
end
|
140
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
# this is needed for guard to work, not sure why :(
|
2
|
-
require "bundler"
|
3
|
-
Bundler.setup
|
4
|
-
|
5
|
-
if RUBY_ENGINE == 'ruby' && ENV['COVERAGE'] == 'true'
|
6
|
-
require 'yaml'
|
7
|
-
rubies = YAML.load(File.read(File.join(__dir__, '..', '.travis.yml')))['rvm']
|
8
|
-
latest_mri = rubies.select { |v| v =~ /\A\d+\.\d+.\d+\z/ }.max
|
9
|
-
|
10
|
-
if RUBY_VERSION == latest_mri
|
11
|
-
require 'simplecov'
|
12
|
-
SimpleCov.start do
|
13
|
-
add_filter '/spec/'
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
require 'rom-sql'
|
19
|
-
require 'rom-repository'
|
20
|
-
|
21
|
-
begin
|
22
|
-
require 'byebug'
|
23
|
-
rescue LoadError
|
24
|
-
end
|
25
|
-
|
26
|
-
root = Pathname(__FILE__).dirname
|
27
|
-
LOGGER = Logger.new(File.open('./log/test.log', 'a'))
|
28
|
-
|
29
|
-
require 'dry/core/deprecations'
|
30
|
-
Dry::Core::Deprecations.set_logger!(root.join('../log/deprecations.log'))
|
31
|
-
|
32
|
-
# Make inference errors quiet
|
33
|
-
class ROM::SQL::Schema::Inferrer
|
34
|
-
def self.on_error(*args)
|
35
|
-
# shush
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# Namespace holding all objects created during specs
|
40
|
-
module Test
|
41
|
-
def self.remove_constants
|
42
|
-
constants.each(&method(:remove_const))
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
warning_api_available = RUBY_VERSION >= '2.4.0'
|
47
|
-
|
48
|
-
module SileneceWarnings
|
49
|
-
def warn(str)
|
50
|
-
if str['/sequel/'] || str['/rspec-core']
|
51
|
-
nil
|
52
|
-
else
|
53
|
-
super
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
DB_URI = if defined? JRUBY_VERSION
|
59
|
-
'jdbc:postgresql://localhost/rom_repository'
|
60
|
-
else
|
61
|
-
'postgres://localhost/rom_repository'
|
62
|
-
end
|
63
|
-
|
64
|
-
Warning.extend(SileneceWarnings) if warning_api_available
|
65
|
-
|
66
|
-
RSpec.configure do |config|
|
67
|
-
config.disable_monkey_patching!
|
68
|
-
config.warnings = warning_api_available
|
69
|
-
|
70
|
-
config.after do
|
71
|
-
Test.remove_constants
|
72
|
-
end
|
73
|
-
|
74
|
-
Dir[root.join('support/*.rb').to_s].each do |f|
|
75
|
-
require f
|
76
|
-
end
|
77
|
-
|
78
|
-
Dir[root.join('shared/*.rb').to_s].each do |f|
|
79
|
-
require f
|
80
|
-
end
|
81
|
-
|
82
|
-
config.include(MapperRegistry)
|
83
|
-
end
|
data/spec/support/mutant.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe ROM::Changeset, '#associate' do
|
4
|
-
include_context 'database setup'
|
5
|
-
|
6
|
-
before do
|
7
|
-
[:todos, :projects, :people].each { |table| conn.drop_table?(table) }
|
8
|
-
|
9
|
-
conn.create_table :people do
|
10
|
-
primary_key :id
|
11
|
-
column :name, String
|
12
|
-
end
|
13
|
-
|
14
|
-
conn.create_table :projects do
|
15
|
-
primary_key :id
|
16
|
-
column :name, String
|
17
|
-
end
|
18
|
-
|
19
|
-
conn.create_table :todos do
|
20
|
-
primary_key :id
|
21
|
-
foreign_key :user_id, :people, null: false, on_delete: :cascade
|
22
|
-
foreign_key :project_id, :projects, null: true, on_delete: :cascade
|
23
|
-
column :title, String
|
24
|
-
end
|
25
|
-
|
26
|
-
configuration.relation(:people) do
|
27
|
-
schema(infer: true) do
|
28
|
-
associations do
|
29
|
-
has_many :todos
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
configuration.relation(:projects) do
|
35
|
-
schema(infer: true) do
|
36
|
-
associations do
|
37
|
-
has_many :todos
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
configuration.relation(:todos) do
|
43
|
-
schema(infer: true) do
|
44
|
-
associations do
|
45
|
-
belongs_to :people, as: :user
|
46
|
-
belongs_to :projects, as: :project
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
let(:user_repo) do
|
53
|
-
Class.new(ROM::Repository[:people]) { commands :create }.new(rom)
|
54
|
-
end
|
55
|
-
|
56
|
-
let(:project_repo) do
|
57
|
-
Class.new(ROM::Repository[:projects]) { commands :create }.new(rom)
|
58
|
-
end
|
59
|
-
|
60
|
-
let(:task_repo) do
|
61
|
-
Class.new(ROM::Repository[:todos]) { commands :create }.new(rom)
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'with Create' do
|
65
|
-
let(:jane) do
|
66
|
-
user_repo.create(name: 'Jane')
|
67
|
-
end
|
68
|
-
|
69
|
-
let(:project) do
|
70
|
-
project_repo.create(name: 'rom-rb')
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'associates child with parent' do
|
74
|
-
changeset = task_repo.changeset(title: 'Test 1').associate(jane, :user)
|
75
|
-
|
76
|
-
expect(changeset.commit).to include(user_id: jane.id, title: 'Test 1')
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'associates child with multiple parents' do
|
80
|
-
changeset = task_repo.changeset(title: 'Test 1').
|
81
|
-
associate(jane, :user).
|
82
|
-
associate(project)
|
83
|
-
|
84
|
-
expect(changeset.commit).
|
85
|
-
to include(user_id: jane.id, project_id: project.id, title: 'Test 1')
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'raises when assoc name cannot be inferred' do
|
89
|
-
other = Class.new do
|
90
|
-
def self.schema
|
91
|
-
[]
|
92
|
-
end
|
93
|
-
end.new
|
94
|
-
|
95
|
-
expect { task_repo.changeset(title: 'Test 1').associate(other) }.
|
96
|
-
to raise_error(ArgumentError, /can't infer association name for/)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context 'with Update' do
|
101
|
-
let!(:john) do
|
102
|
-
user_repo.create(name: 'John')
|
103
|
-
end
|
104
|
-
|
105
|
-
let!(:jane) do
|
106
|
-
user_repo.create(name: 'Jane')
|
107
|
-
end
|
108
|
-
|
109
|
-
let!(:task) do
|
110
|
-
task_repo.create(title: 'Test 1', user_id: john.id)
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'associates child with parent' do
|
114
|
-
changeset = task_repo.changeset(task.id, title: 'Test 2')
|
115
|
-
|
116
|
-
expect(changeset.associate(jane, :user).commit).
|
117
|
-
to include(user_id: jane.id, title: 'Test 2')
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|