rom 0.9.1 → 1.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.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +30 -12
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +24 -0
  5. data/Gemfile +7 -3
  6. data/README.md +24 -11
  7. data/lib/rom.rb +9 -26
  8. data/lib/rom/command.rb +113 -75
  9. data/lib/rom/commands/class_interface.rb +115 -0
  10. data/lib/rom/commands/graph.rb +17 -23
  11. data/lib/rom/commands/graph/builder.rb +176 -0
  12. data/lib/rom/commands/graph/class_interface.rb +8 -2
  13. data/lib/rom/commands/graph/input_evaluator.rb +13 -9
  14. data/lib/rom/commands/lazy.rb +23 -17
  15. data/lib/rom/commands/lazy/create.rb +23 -0
  16. data/lib/rom/commands/lazy/delete.rb +27 -0
  17. data/lib/rom/commands/lazy/update.rb +34 -0
  18. data/lib/rom/commands/result.rb +14 -0
  19. data/lib/rom/commands/update.rb +0 -4
  20. data/lib/rom/configuration.rb +86 -0
  21. data/lib/rom/{setup_dsl/setup.rb → configuration_dsl.rb} +9 -7
  22. data/lib/rom/configuration_dsl/command.rb +43 -0
  23. data/lib/rom/{setup_dsl → configuration_dsl}/command_dsl.rb +5 -4
  24. data/lib/rom/configuration_dsl/mapper.rb +37 -0
  25. data/lib/rom/{setup_dsl → configuration_dsl}/mapper_dsl.rb +11 -5
  26. data/lib/rom/configuration_dsl/relation.rb +26 -0
  27. data/lib/rom/configuration_plugin.rb +17 -0
  28. data/lib/rom/constants.rb +5 -12
  29. data/lib/rom/container.rb +11 -8
  30. data/lib/rom/create_container.rb +61 -0
  31. data/lib/rom/environment.rb +27 -241
  32. data/lib/rom/gateway.rb +18 -2
  33. data/lib/rom/global.rb +24 -0
  34. data/lib/rom/global/plugin_dsl.rb +2 -0
  35. data/lib/rom/lint/spec.rb +0 -12
  36. data/lib/rom/lint/test.rb +0 -31
  37. data/lib/rom/memory/commands.rb +2 -2
  38. data/lib/rom/memory/gateway.rb +2 -0
  39. data/lib/rom/pipeline.rb +1 -1
  40. data/lib/rom/plugin_base.rb +1 -1
  41. data/lib/rom/plugin_registry.rb +12 -10
  42. data/lib/rom/plugins/configuration/configuration_dsl.rb +16 -0
  43. data/lib/rom/plugins/relation/key_inference.rb +31 -0
  44. data/lib/rom/plugins/relation/view.rb +90 -0
  45. data/lib/rom/plugins/relation/view/dsl.rb +32 -0
  46. data/lib/rom/relation.rb +1 -11
  47. data/lib/rom/relation/class_interface.rb +37 -50
  48. data/lib/rom/setup.rb +13 -104
  49. data/lib/rom/setup/auto_registration.rb +55 -0
  50. data/lib/rom/setup/finalize.rb +113 -127
  51. data/lib/rom/setup/finalize/commands.rb +67 -0
  52. data/lib/rom/setup/finalize/mappers.rb +36 -0
  53. data/lib/rom/setup/finalize/relations.rb +53 -0
  54. data/lib/rom/support/configurable.rb +21 -7
  55. data/lib/rom/version.rb +1 -1
  56. data/rakelib/mutant.rake +4 -1
  57. data/rom.gemspec +3 -4
  58. data/spec/fixtures/app/commands/create_user.rb +2 -0
  59. data/spec/fixtures/app/mappers/user_list.rb +2 -0
  60. data/spec/fixtures/app/relations/users.rb +2 -0
  61. data/spec/fixtures/lib/persistence/commands/create_user.rb +6 -0
  62. data/spec/fixtures/lib/persistence/mappers/user_list.rb +6 -0
  63. data/spec/fixtures/lib/persistence/relations/users.rb +6 -0
  64. data/spec/{unit/rom → integration}/command_registry_spec.rb +8 -9
  65. data/spec/integration/commands/create_spec.rb +17 -13
  66. data/spec/integration/commands/delete_spec.rb +12 -11
  67. data/spec/integration/commands/error_handling_spec.rb +5 -4
  68. data/spec/integration/commands/graph_builder_spec.rb +213 -0
  69. data/spec/integration/commands/graph_spec.rb +112 -49
  70. data/spec/integration/commands/update_spec.rb +14 -11
  71. data/spec/integration/commands_spec.rb +60 -0
  72. data/spec/integration/mappers/combine_spec.rb +7 -6
  73. data/spec/integration/mappers/deep_embedded_spec.rb +5 -6
  74. data/spec/integration/mappers/definition_dsl_spec.rb +19 -18
  75. data/spec/integration/mappers/embedded_spec.rb +11 -12
  76. data/spec/integration/mappers/exclude_spec.rb +5 -6
  77. data/spec/integration/mappers/fold_spec.rb +8 -7
  78. data/spec/integration/mappers/group_spec.rb +16 -15
  79. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +5 -5
  80. data/spec/integration/mappers/prefix_separator_spec.rb +5 -7
  81. data/spec/integration/mappers/prefix_spec.rb +5 -7
  82. data/spec/integration/mappers/prefixing_attributes_spec.rb +7 -7
  83. data/spec/integration/mappers/registering_custom_mappers_spec.rb +4 -5
  84. data/spec/integration/mappers/renaming_attributes_spec.rb +18 -18
  85. data/spec/integration/mappers/step_spec.rb +11 -12
  86. data/spec/integration/mappers/symbolizing_attributes_spec.rb +11 -8
  87. data/spec/integration/mappers/unfold_spec.rb +9 -10
  88. data/spec/integration/mappers/ungroup_spec.rb +10 -11
  89. data/spec/integration/mappers/unwrap_spec.rb +10 -15
  90. data/spec/integration/mappers/wrap_spec.rb +16 -15
  91. data/spec/{unit/rom → integration}/memory/commands/create_spec.rb +7 -5
  92. data/spec/{unit/rom → integration}/memory/commands/delete_spec.rb +7 -5
  93. data/spec/{unit/rom → integration}/memory/commands/update_spec.rb +7 -5
  94. data/spec/integration/multi_env_spec.rb +16 -124
  95. data/spec/integration/multi_repo_spec.rb +9 -9
  96. data/spec/integration/relations/default_dataset_spec.rb +15 -0
  97. data/spec/integration/relations/inheritance_spec.rb +5 -7
  98. data/spec/integration/relations/reading_spec.rb +32 -65
  99. data/spec/integration/relations/registry_dsl_spec.rb +5 -4
  100. data/spec/integration/repositories/extending_relations_spec.rb +6 -7
  101. data/spec/integration/repositories/setting_logger_spec.rb +5 -7
  102. data/spec/integration/setup_spec.rb +49 -61
  103. data/spec/shared/command_graph.rb +50 -0
  104. data/spec/shared/container.rb +9 -0
  105. data/spec/shared/gateway_only.rb +6 -0
  106. data/spec/shared/no_container.rb +16 -0
  107. data/spec/shared/one_behavior.rb +4 -4
  108. data/spec/shared/users_and_tasks.rb +5 -17
  109. data/spec/spec_helper.rb +5 -3
  110. data/spec/test/memory_repository_lint_test.rb +1 -1
  111. data/spec/unit/rom/auto_registration_spec.rb +54 -0
  112. data/spec/unit/rom/commands/graph_spec.rb +18 -44
  113. data/spec/unit/rom/commands/lazy_spec.rb +246 -35
  114. data/spec/unit/rom/commands/result_spec.rb +56 -0
  115. data/spec/unit/rom/commands_spec.rb +9 -73
  116. data/spec/unit/rom/configurable_spec.rb +49 -0
  117. data/spec/unit/rom/configuration_spec.rb +61 -0
  118. data/spec/unit/rom/container_spec.rb +39 -33
  119. data/spec/unit/rom/create_container_spec.rb +151 -0
  120. data/spec/unit/rom/environment_spec.rb +123 -0
  121. data/spec/unit/rom/gateway_spec.rb +58 -2
  122. data/spec/unit/rom/global_spec.rb +10 -7
  123. data/spec/unit/rom/plugin_spec.rb +44 -25
  124. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +27 -0
  125. data/spec/unit/rom/plugins/relation/view_spec.rb +47 -0
  126. data/spec/unit/rom/relation/composite_spec.rb +20 -20
  127. data/spec/unit/rom/relation/curried_spec.rb +10 -11
  128. data/spec/unit/rom/relation/graph_spec.rb +27 -27
  129. data/spec/unit/rom/relation/lazy/combine_spec.rb +26 -20
  130. data/spec/unit/rom/relation/lazy_spec.rb +38 -38
  131. data/spec/unit/rom/relation/loaded_spec.rb +2 -3
  132. data/spec/unit/rom/relation_spec.rb +39 -2
  133. metadata +58 -66
  134. data/lib/rom/commands/abstract.rb +0 -184
  135. data/lib/rom/environment_plugin.rb +0 -17
  136. data/lib/rom/environment_plugins/auto_registration.rb +0 -38
  137. data/lib/rom/repository.rb +0 -16
  138. data/lib/rom/setup_dsl/command.rb +0 -36
  139. data/lib/rom/setup_dsl/mapper.rb +0 -32
  140. data/lib/rom/setup_dsl/relation.rb +0 -30
  141. data/spec/integration/inline_setup_spec.rb +0 -65
  142. data/spec/unit/rom/repository_spec.rb +0 -12
  143. data/spec/unit/rom/setup_spec.rb +0 -253
@@ -1,16 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ROM::Relation::Composite do
4
+ include_context 'gateway only'
4
5
  include_context 'users and tasks'
5
6
 
6
- let(:users) { rom.relation(:users) }
7
- let(:tasks) { rom.relation(:tasks) }
8
-
9
- let(:name_list) { proc { |r| r.map { |t| t[:name] } } }
10
- let(:upcaser) { proc { |r| r.map(&:upcase) } }
11
-
12
- before do
13
- setup.relation(:users) do
7
+ let(:users_relation) do
8
+ Class.new(ROM::Memory::Relation) do
14
9
  def by_name(name)
15
10
  restrict(name: name)
16
11
  end
@@ -18,30 +13,35 @@ describe ROM::Relation::Composite do
18
13
  def sorted(other)
19
14
  other.source.order(:name)
20
15
  end
21
- end
16
+ end.new(users_dataset)
17
+ end
22
18
 
23
- setup.relation(:tasks) do
19
+ let(:tasks_relation) do
20
+ Class.new(ROM::Memory::Relation) do
24
21
  def for_users(users)
25
22
  restrict(name: users.map { |u| u[:name] })
26
23
  end
27
- end
24
+ end.new(tasks_dataset)
28
25
  end
29
26
 
27
+ let(:name_list) { proc { |r| r.map { |t| t[:name] } } }
28
+ let(:upcaser) { proc { |r| r.map(&:upcase) } }
29
+
30
30
  describe '#call' do
31
31
  it 'sends a relation through mappers' do
32
- relation = users >> name_list >> upcaser
32
+ relation = users_relation >> name_list >> upcaser
33
33
  loaded = relation.call
34
34
 
35
- expect(loaded.source).to eql(users)
35
+ expect(loaded.source).to eql(users_relation)
36
36
 
37
37
  expect(loaded).to match_array(%w(JANE JOE))
38
38
  end
39
39
 
40
40
  it 'sends a relation through another relation' do
41
- relation = users >> users.sorted
41
+ relation = users_relation >> users_relation.sorted
42
42
  loaded = relation.call
43
43
 
44
- expect(loaded.source).to eql(users.sorted(users.call))
44
+ expect(loaded.source).to eql(users_relation.sorted(users_relation.call))
45
45
 
46
46
  expect(loaded).to match_array([
47
47
  { name: 'Jane', email: 'jane@doe.org' },
@@ -50,12 +50,12 @@ describe ROM::Relation::Composite do
50
50
  end
51
51
 
52
52
  it 'sends a relation through another composite relation' do
53
- task_mapper = -> tasks { tasks }
54
- relation = users.by_name('Jane') >> (tasks.for_users >> task_mapper)
53
+ task_mapper = -> tasks_relation { tasks_relation }
54
+ relation = users_relation.by_name('Jane') >> (tasks_relation.for_users >> task_mapper)
55
55
 
56
56
  loaded = relation.call
57
57
 
58
- expect(loaded.source).to eql(tasks.for_users(users.by_name('Jane')))
58
+ expect(loaded.source).to eql(tasks_relation.for_users(users_relation.by_name('Jane')))
59
59
 
60
60
  expect(loaded).to match_array([
61
61
  { name: 'Jane', title: 'be cool', priority: 2 }
@@ -64,7 +64,7 @@ describe ROM::Relation::Composite do
64
64
  end
65
65
 
66
66
  describe '#each' do
67
- let(:relation) { users >> name_list >> upcaser }
67
+ let(:relation) { users_relation >> name_list >> upcaser }
68
68
 
69
69
  it 'calls and iterates' do
70
70
  result = []
@@ -80,7 +80,7 @@ describe ROM::Relation::Composite do
80
80
  end
81
81
 
82
82
  describe '#first' do
83
- let(:relation) { users >> name_list >> upcaser }
83
+ let(:relation) { users_relation >> name_list >> upcaser }
84
84
 
85
85
  it 'calls and returns the first object' do
86
86
  expect(relation.first).to eql('JOE')
@@ -1,12 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe ROM::Relation::Curried do
4
+ include_context 'gateway only'
4
5
  include_context 'users and tasks'
5
6
 
6
- let(:users) { rom.relations.users }
7
-
8
- before do
9
- setup.relation(:users) do
7
+ let(:users_relation) do
8
+ Class.new(ROM::Memory::Relation) do
10
9
  def by_name(name)
11
10
  restrict(name: name)
12
11
  end
@@ -14,11 +13,11 @@ RSpec.describe ROM::Relation::Curried do
14
13
  def find(criteria)
15
14
  restrict(criteria)
16
15
  end
17
- end
16
+ end.new(users_dataset)
18
17
  end
19
18
 
20
19
  describe '#call' do
21
- let(:relation) { users.by_name.('Jane') }
20
+ let(:relation) { users_relation.by_name.call('Jane') }
22
21
 
23
22
  it 'materializes a relation' do
24
23
  expect(relation).to match_array([
@@ -27,27 +26,27 @@ RSpec.describe ROM::Relation::Curried do
27
26
  end
28
27
 
29
28
  it 'returns a loaded relation' do
30
- expect(relation.source).to eql(users.by_name('Jane'))
29
+ expect(relation.source).to eql(users_relation.by_name('Jane'))
31
30
  end
32
31
  end
33
32
 
34
33
  describe '#respond_to?' do
35
34
  it 'returns true if wrapped relation responds to a method' do
36
- expect(users.by_name).to respond_to(:dataset)
35
+ expect(users_relation.by_name).to respond_to(:dataset)
37
36
  end
38
37
 
39
38
  it 'returns false if wrapped relation does not respond to a method' do
40
- expect(users.by_name).not_to respond_to(:not_here)
39
+ expect(users_relation.by_name).not_to respond_to(:not_here)
41
40
  end
42
41
  end
43
42
 
44
43
  describe '#method_missing' do
45
44
  it 'forwards to the relation' do
46
- expect(users.by_name.dataset).to eql(users.dataset)
45
+ expect(users_relation.by_name.dataset).to eql(users_relation.dataset)
47
46
  end
48
47
 
49
48
  it 'does not forward to the relation when method is auto-curried' do
50
- expect { users.by_name.find }.to raise_error(NoMethodError, /find/)
49
+ expect { users_relation.by_name.find }.to raise_error(NoMethodError, /find/)
51
50
  end
52
51
  end
53
52
  end
@@ -1,36 +1,36 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ROM::Relation::Graph do
4
- subject(:graph) { ROM::Relation::Graph.new(users, [tasks.for_users]) }
5
-
4
+ include_context 'gateway only'
6
5
  include_context 'users and tasks'
7
6
 
8
- it_behaves_like 'materializable relation' do
9
- let(:mapper) do
10
- T(:combine, [[:tasks, name: :name]])
11
- end
12
-
13
- let(:relation) do
14
- ROM::Relation::Graph.new(users.by_name('Jane'), [tasks.for_users]) >> mapper
15
- end
16
- end
17
-
18
- before do
19
- setup.relation(:users) do
7
+ let(:users_relation) do
8
+ Class.new(ROM::Memory::Relation) do
20
9
  def by_name(name)
21
10
  restrict(name: name)
22
11
  end
23
- end
12
+ end.new(users_dataset)
13
+ end
24
14
 
25
- setup.relation(:tasks) do
15
+ let(:tasks_relation) do
16
+ Class.new(ROM::Memory::Relation) do
26
17
  def for_users(_users)
27
18
  self
28
19
  end
29
- end
20
+ end.new(tasks_dataset)
30
21
  end
31
22
 
32
- let(:users) { rom.relation(:users) }
33
- let(:tasks) { rom.relation(:tasks) }
23
+ subject(:graph) { ROM::Relation::Graph.new(users_relation, [tasks_relation.for_users]) }
24
+
25
+ it_behaves_like 'materializable relation' do
26
+ let(:mapper) do
27
+ T(:combine, [[:tasks, name: :name]])
28
+ end
29
+
30
+ let(:relation) do
31
+ ROM::Relation::Graph.new(users_relation.by_name('Jane'), [tasks_relation.for_users]) >> mapper
32
+ end
33
+ end
34
34
 
35
35
  describe '#method_missing' do
36
36
  it 'responds to the root methods' do
@@ -42,11 +42,11 @@ describe ROM::Relation::Graph do
42
42
  end
43
43
 
44
44
  it 'forwards methods to the root and decorates curried response' do
45
- expect((users.combine(tasks.for_users)).by_name).to be_instance_of(ROM::Relation::Graph)
45
+ expect((users_relation.combine(tasks_relation.for_users)).by_name).to be_instance_of(ROM::Relation::Graph)
46
46
  end
47
47
 
48
48
  it 'returns original response from the root' do
49
- expect(graph.mappers).to eql(users.mappers)
49
+ expect(graph.mappers).to eql(users_relation.mappers)
50
50
  end
51
51
 
52
52
  it 'raises method error' do
@@ -57,8 +57,8 @@ describe ROM::Relation::Graph do
57
57
  describe '#call' do
58
58
  it 'materializes relations' do
59
59
  expect(graph.call).to match_array([
60
- rom.relations.users,
61
- [rom.relations.tasks]
60
+ users_relation,
61
+ [tasks_relation]
62
62
  ])
63
63
  end
64
64
  end
@@ -66,16 +66,16 @@ describe ROM::Relation::Graph do
66
66
  describe '#to_a' do
67
67
  it 'coerces to an array' do
68
68
  expect(graph).to match_array([
69
- users.to_a,
70
- [tasks.for_users(users).to_a]
69
+ users_relation.to_a,
70
+ [tasks_relation.for_users(users_relation).to_a]
71
71
  ])
72
72
  end
73
73
 
74
74
  it 'returns empty arrays when left was empty' do
75
- graph = ROM::Relation::Graph.new(users.by_name('Not here'), [tasks.for_users])
75
+ graph = ROM::Relation::Graph.new(users_relation.by_name('Not here'), [tasks_relation.for_users])
76
76
 
77
77
  expect(graph).to match_array([
78
- [], [ROM::Relation::Loaded.new(tasks.for_users, [])]
78
+ [], [ROM::Relation::Loaded.new(tasks_relation.for_users, [])]
79
79
  ])
80
80
  end
81
81
  end
@@ -1,23 +1,31 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ROM::Relation, '#combine' do
4
+ include_context 'gateway only'
4
5
  include_context 'users and tasks'
5
6
 
6
- before do
7
- setup.relation(:users) do
7
+ let(:tags_dataset) { gateway.dataset(:tags) }
8
+
9
+ let(:users_relation) do
10
+ Class.new(ROM::Memory::Relation) do
8
11
  def by_name(name)
9
12
  restrict(name: name)
10
13
  end
11
- end
14
+ end.new(users_dataset)
15
+ end
12
16
 
13
- setup.relation(:tasks) do
17
+ let(:tasks_relation) do
18
+ Class.new(ROM::Memory::Relation) do
14
19
  def for_users(users)
15
20
  names = users.map { |user| user[:name] }
16
21
  restrict { |task| names.include?(task[:name]) }
17
22
  end
18
- end
23
+ end.new(tasks_dataset)
24
+ end
19
25
 
20
- setup.relation(:tags) do
26
+ let(:tags_relation) do
27
+ Class.new(ROM::Memory::Relation) do
28
+ attr_accessor :tasks
21
29
  forward :map
22
30
 
23
31
  def for_tasks(tasks)
@@ -34,15 +42,13 @@ describe ROM::Relation, '#combine' do
34
42
  } [:name])
35
43
  }
36
44
  end
37
- end
38
-
39
- setup.gateways[:default].dataset(:tags).insert(task: 'be cool', name: 'red')
40
- setup.gateways[:default].dataset(:tags).insert(task: 'be cool', name: 'green')
45
+ end.new(tags_dataset).tap { |r| r.tasks = tasks_relation }
41
46
  end
42
47
 
43
- let(:users) { rom.relation(:users) }
44
- let(:tasks) { rom.relation(:tasks) }
45
- let(:tags) { rom.relation(:tags) }
48
+ before do
49
+ tags_dataset.insert(task: 'be cool', name: 'red')
50
+ tags_dataset.insert(task: 'be cool', name: 'green')
51
+ end
46
52
 
47
53
  let(:map_users) {
48
54
  proc { |users, tasks|
@@ -87,7 +93,7 @@ describe ROM::Relation, '#combine' do
87
93
 
88
94
  it 'raises error when composite relation is passed as a node' do
89
95
  expect {
90
- users.combine(tasks >> proc {})
96
+ users_relation.combine(tasks_relation >> proc {})
91
97
  }.to raise_error(ROM::UnsupportedRelationError)
92
98
  end
93
99
 
@@ -106,8 +112,8 @@ describe ROM::Relation, '#combine' do
106
112
  }
107
113
  ]
108
114
 
109
- user_with_tasks_and_tags = users.by_name('Jane')
110
- .combine(tasks.for_users, tags.for_users)
115
+ user_with_tasks_and_tags = users_relation.by_name('Jane')
116
+ .combine(tasks_relation.for_users, tags_relation.for_users)
111
117
 
112
118
  result = user_with_tasks_and_tags >> map_user_with_tasks_and_tags
113
119
 
@@ -129,8 +135,8 @@ describe ROM::Relation, '#combine' do
129
135
  }
130
136
  ]
131
137
 
132
- user_with_tasks_and_tags = users.by_name('Jane')
133
- .combine(tasks.for_users).combine(tags.for_users)
138
+ user_with_tasks_and_tags = users_relation.by_name('Jane')
139
+ .combine(tasks_relation.for_users).combine(tags_relation.for_users)
134
140
 
135
141
  result = user_with_tasks_and_tags >> map_user_with_tasks_and_tags
136
142
 
@@ -149,8 +155,8 @@ describe ROM::Relation, '#combine' do
149
155
  }
150
156
  ]
151
157
 
152
- user_with_tasks = users.by_name('Jane')
153
- .combine(tasks.for_users.combine(tags.for_tasks))
158
+ user_with_tasks = users_relation.by_name('Jane')
159
+ .combine(tasks_relation.for_users.combine(tags_relation.for_tasks))
154
160
 
155
161
  result = user_with_tasks >> map_user_with_tasks
156
162
 
@@ -1,13 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ROM::Relation do
4
+ include_context 'gateway only'
4
5
  include_context 'users and tasks'
5
6
 
6
- let(:users) { rom.relations.users }
7
- let(:tasks) { rom.relations.tasks }
8
-
9
- before do
10
- setup.relation(:users) do
7
+ let(:users_relation) do
8
+ Class.new(ROM::Memory::Relation) do
11
9
  def by_name(name)
12
10
  restrict(name: name)
13
11
  end
@@ -35,31 +33,33 @@ describe ROM::Relation do
35
33
  self
36
34
  end
37
35
  end
38
- end
36
+ end.new(users_dataset)
37
+ end
39
38
 
40
- setup.relation(:tasks) do
39
+ let(:tasks_relation) do
40
+ Class.new(ROM::Memory::Relation) do
41
41
  def for_users(users)
42
42
  names = users.map { |u| u[:name] }
43
43
  restrict { |t| names.include?(t[:name]) }
44
44
  end
45
- end
45
+ end.new(tasks_dataset)
46
46
  end
47
47
 
48
48
  it_behaves_like 'a relation that returns one tuple' do
49
- let(:relation) { users }
49
+ let(:relation) { users_relation }
50
50
  end
51
51
 
52
52
  describe '#map_with' do
53
53
  it 'raises error when unknown mapper was selected' do
54
54
  expect {
55
- users.as(:not_here)
55
+ users_relation.as(:not_here)
56
56
  }.to raise_error(ROM::MapperMissingError, /not_here/)
57
57
  end
58
58
  end
59
59
 
60
60
  describe '#method_missing' do
61
61
  it 'forwards to relation and auto-curries' do
62
- relation = users.by_name_and_email_sorted('Jane')
62
+ relation = users_relation.by_name_and_email_sorted('Jane')
63
63
 
64
64
  expect(relation.name).to eql(:by_name_and_email_sorted)
65
65
  expect(relation.curry_args).to eql(['Jane'])
@@ -70,46 +70,46 @@ describe ROM::Relation do
70
70
  expect(relation.curry_args).to eql(['Jane', 'jane@doe.org'])
71
71
 
72
72
  expect(relation[:email]).to match_array(
73
- rom.relations.users.by_name_and_email_sorted('Jane', 'jane@doe.org', :email)
73
+ users_relation.by_name_and_email_sorted('Jane', 'jane@doe.org', :email)
74
74
  )
75
75
  end
76
76
 
77
77
  it 'forwards to relation and does not auto-curry when it is not needed' do
78
- relation = users.by_name('Jane')
78
+ relation = users_relation.by_name('Jane')
79
79
 
80
80
  expect(relation).to_not be_curried
81
- expect(relation).to match_array(rom.relations.users.by_name('Jane'))
81
+ expect(relation).to match_array(users_relation.by_name('Jane'))
82
82
  end
83
83
 
84
84
  it 'forwards to relation and return lazy when arity is unknown' do
85
- relation = users.all(name: 'Jane')
85
+ relation = users_relation.all(name: 'Jane')
86
86
  expect(relation).to_not be_curried
87
- expect(relation).to match_array(rom.relations.users.by_name('Jane').to_a)
87
+ expect(relation).to match_array(users_relation.by_name('Jane').to_a)
88
88
  end
89
89
 
90
90
  it 'returns original response if it is not a relation' do
91
- expect(users.gateway).to be(:default)
91
+ expect(users_relation.gateway).to be(:default)
92
92
  end
93
93
 
94
94
  it 'raises NoMethodError when relation does not respond to a method' do
95
- expect { users.not_here }.to raise_error(NoMethodError, /not_here/)
95
+ expect { users_relation.not_here }.to raise_error(NoMethodError, /not_here/)
96
96
  end
97
97
  end
98
98
 
99
99
  describe '#call' do
100
100
  it 'auto-curries' do
101
- relation = users.by_name
101
+ relation = users_relation.by_name
102
102
 
103
103
  expect(relation.name).to eql(:by_name)
104
- expect(relation['Jane'].to_a).to eql(rom.relations.users.by_name('Jane').to_a)
104
+ expect(relation['Jane'].to_a).to eql(users_relation.by_name('Jane').to_a)
105
105
  end
106
106
 
107
107
  it 'returns relation' do
108
- expect(users.call.to_a).to eql(rom.relations.users.to_a)
108
+ expect(users_relation.call.to_a).to eql(users_relation.to_a)
109
109
  end
110
110
 
111
111
  describe 'using mappers' do
112
- subject(:users) { rom.relations.users.with(mappers: mappers) }
112
+ subject(:users) { users_relation.with(mappers: mappers) }
113
113
 
114
114
  let(:name_list) { proc { |r| r.map { |t| t[:name] } } }
115
115
  let(:upcaser) { proc { |r| r.map(&:upcase) } }
@@ -125,24 +125,24 @@ describe ROM::Relation do
125
125
 
126
126
  describe '#first' do
127
127
  it 'return first tuple' do
128
- expect(users.first).to eql(name: 'Joe', email: 'joe@doe.org')
128
+ expect(users_relation.first).to eql(name: 'Joe', email: 'joe@doe.org')
129
129
  end
130
130
 
131
131
  it 'raises when relation is curried and arity does not match' do
132
- expect { users.by_name.first }.to raise_error(
133
- ArgumentError, 'ROM::Relation[Users]#by_name arity is 1 (0 args given)'
132
+ expect { users_relation.by_name.first }.to raise_error(
133
+ ArgumentError, "#{users_relation.class.to_s}#by_name arity is 1 (0 args given)"
134
134
  )
135
135
  end
136
136
 
137
137
  it 'does not raise when relation is curried and arity matches' do
138
- expect { users.by_name_sorted('Joe').first }.to_not raise_error
138
+ expect { users_relation.by_name_sorted('Joe').first }.to_not raise_error
139
139
  end
140
140
  end
141
141
 
142
142
  describe '#each' do
143
143
  it 'yields relation tuples' do
144
144
  result = []
145
- users.each do |tuple|
145
+ users_relation.each do |tuple|
146
146
  result << tuple
147
147
  end
148
148
  expect(result).to match_array([
@@ -152,45 +152,45 @@ describe ROM::Relation do
152
152
  end
153
153
 
154
154
  it 'returns an enumerator if block is not provided' do
155
- expect(users.each.to_a).to match_array([
155
+ expect(users_relation.each.to_a).to match_array([
156
156
  { name: 'Jane', email: 'jane@doe.org' },
157
157
  { name: 'Joe', email: 'joe@doe.org' }
158
158
  ])
159
159
  end
160
160
 
161
161
  it 'raises when relation is curried and arity does not match' do
162
- expect { users.by_name.each {} }.to raise_error(
163
- ArgumentError, 'ROM::Relation[Users]#by_name arity is 1 (0 args given)'
162
+ expect { users_relation.by_name.each {} }.to raise_error(
163
+ ArgumentError, "#{users_relation.class.to_s}#by_name arity is 1 (0 args given)"
164
164
  )
165
165
  end
166
166
 
167
167
  it 'does not raise when relation is curried and arity matches' do
168
- expect { users.by_name_sorted('Jane').first }.to_not raise_error
168
+ expect { users_relation.by_name_sorted('Jane').first }.to_not raise_error
169
169
  end
170
170
  end
171
171
 
172
172
  describe '#to_ary' do
173
173
  it 'returns an array with relation tuples' do
174
- expect(users.to_ary).to match_array([
174
+ expect(users_relation.to_ary).to match_array([
175
175
  { name: 'Jane', email: 'jane@doe.org' },
176
176
  { name: 'Joe', email: 'joe@doe.org' }
177
177
  ])
178
178
  end
179
179
 
180
180
  it 'raises when relation is curried and arity does not match' do
181
- expect { users.by_name.to_ary }.to raise_error(
182
- ArgumentError, 'ROM::Relation[Users]#by_name arity is 1 (0 args given)'
181
+ expect { users_relation.by_name.to_ary }.to raise_error(
182
+ ArgumentError, "#{users_relation.class.to_s}#by_name arity is 1 (0 args given)"
183
183
  )
184
184
  end
185
185
 
186
186
  it 'does not raise when relation is curried and arity matches' do
187
- expect { users.by_name_sorted('Jane').first }.to_not raise_error
187
+ expect { users_relation.by_name_sorted('Jane').first }.to_not raise_error
188
188
  end
189
189
  end
190
190
 
191
191
  describe '#>>' do
192
192
  it 'composes two relations' do
193
- other = users.by_name('Jane') >> tasks.for_users
193
+ other = users_relation.by_name('Jane') >> tasks_relation.for_users
194
194
 
195
195
  expect(other).to match_array([
196
196
  { name: 'Jane', title: 'be cool', priority: 2 }
@@ -198,12 +198,12 @@ describe ROM::Relation do
198
198
  end
199
199
 
200
200
  it_behaves_like 'a relation that returns one tuple' do
201
- let(:relation) { rom.relation(:users) >> proc { |r| r } }
201
+ let(:relation) { users_relation >> proc { |r| r } }
202
202
 
203
203
  describe 'using a mapper' do
204
204
  it 'returns one mapped tuple' do
205
205
  mapper = proc { |r| r.map { |t| t[:name].upcase } }
206
- relation = users.by_name('Jane') >> mapper
206
+ relation = users_relation.by_name('Jane') >> mapper
207
207
 
208
208
  expect(relation.one).to eql('JANE')
209
209
  expect(relation.one!).to eql('JANE')