rom 0.2.0 → 0.3.0

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 (175) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -3
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +13 -14
  5. data/{Changelog.md → CHANGELOG.md} +12 -3
  6. data/Gemfile +14 -10
  7. data/Gemfile.devtools +16 -16
  8. data/Guardfile +2 -5
  9. data/README.md +68 -56
  10. data/Rakefile +3 -3
  11. data/config/flay.yml +2 -2
  12. data/config/mutant.yml +2 -4
  13. data/config/rubocop.yml +30 -0
  14. data/lib/rom.rb +47 -9
  15. data/lib/rom/adapter.rb +52 -0
  16. data/lib/rom/adapter/memory.rb +70 -0
  17. data/lib/rom/boot.rb +158 -0
  18. data/lib/rom/boot/base_relation_dsl.rb +43 -0
  19. data/lib/rom/boot/dsl.rb +30 -0
  20. data/lib/rom/boot/mapper_dsl.rb +23 -0
  21. data/lib/rom/boot/relation_dsl.rb +23 -0
  22. data/lib/rom/boot/schema_dsl.rb +27 -0
  23. data/lib/rom/env.rb +48 -0
  24. data/lib/rom/header.rb +123 -0
  25. data/lib/rom/mapper.rb +38 -153
  26. data/lib/rom/mapper_builder.rb +85 -0
  27. data/lib/rom/model_builder.rb +58 -0
  28. data/lib/rom/ra.rb +196 -0
  29. data/lib/rom/ra/operation/group.rb +49 -0
  30. data/lib/rom/ra/operation/join.rb +41 -0
  31. data/lib/rom/ra/operation/wrap.rb +45 -0
  32. data/lib/rom/reader.rb +62 -0
  33. data/lib/rom/reader_builder.rb +28 -0
  34. data/lib/rom/relation.rb +41 -350
  35. data/lib/rom/relation_builder.rb +48 -0
  36. data/lib/rom/repository.rb +28 -53
  37. data/lib/rom/support/registry.rb +34 -0
  38. data/lib/rom/version.rb +3 -0
  39. data/rom.gemspec +12 -10
  40. data/spec/integration/adapters/extending_relations_spec.rb +43 -0
  41. data/spec/integration/mappers/definition_dsl_spec.rb +82 -0
  42. data/spec/integration/mappers/prefixing_attributes_spec.rb +42 -0
  43. data/spec/integration/mappers/renaming_attributes_spec.rb +138 -0
  44. data/spec/integration/ra/group_spec.rb +47 -0
  45. data/spec/integration/ra/join_spec.rb +24 -0
  46. data/spec/integration/ra/wrap_spec.rb +37 -0
  47. data/spec/integration/relations/reading_spec.rb +116 -0
  48. data/spec/integration/relations/registry_dsl_spec.rb +44 -0
  49. data/spec/integration/schema_spec.rb +29 -0
  50. data/spec/integration/setup_spec.rb +18 -0
  51. data/spec/shared/users_and_tasks.rb +34 -0
  52. data/spec/spec_helper.rb +14 -36
  53. data/spec/unit/rom/adapter_spec.rb +59 -0
  54. data/spec/unit/rom/header_spec.rb +58 -0
  55. data/spec/unit/rom/mapper_spec.rb +27 -0
  56. data/spec/unit/rom/ra/operation/group_spec.rb +55 -0
  57. data/spec/unit/rom/ra/operation/wrap_spec.rb +29 -0
  58. data/spec/unit/rom/relation_spec.rb +34 -0
  59. metadata +122 -190
  60. data/lib/rom/constants.rb +0 -16
  61. data/lib/rom/environment.rb +0 -105
  62. data/lib/rom/environment/builder.rb +0 -71
  63. data/lib/rom/mapper/attribute.rb +0 -108
  64. data/lib/rom/mapper/builder.rb +0 -58
  65. data/lib/rom/mapper/builder/definition.rb +0 -162
  66. data/lib/rom/mapper/header.rb +0 -103
  67. data/lib/rom/mapper/loader_builder.rb +0 -26
  68. data/lib/rom/schema.rb +0 -21
  69. data/lib/rom/schema/builder.rb +0 -59
  70. data/lib/rom/schema/definition.rb +0 -84
  71. data/lib/rom/schema/definition/relation.rb +0 -80
  72. data/lib/rom/schema/definition/relation/base.rb +0 -27
  73. data/lib/rom/session.rb +0 -111
  74. data/lib/rom/session/environment.rb +0 -67
  75. data/lib/rom/session/identity_map.rb +0 -43
  76. data/lib/rom/session/mapper.rb +0 -62
  77. data/lib/rom/session/relation.rb +0 -140
  78. data/lib/rom/session/state.rb +0 -59
  79. data/lib/rom/session/state/created.rb +0 -22
  80. data/lib/rom/session/state/deleted.rb +0 -25
  81. data/lib/rom/session/state/persisted.rb +0 -34
  82. data/lib/rom/session/state/transient.rb +0 -20
  83. data/lib/rom/session/state/updated.rb +0 -29
  84. data/lib/rom/session/tracker.rb +0 -62
  85. data/lib/rom/support/axiom/adapter.rb +0 -111
  86. data/lib/rom/support/axiom/adapter/data_objects.rb +0 -38
  87. data/lib/rom/support/axiom/adapter/memory.rb +0 -25
  88. data/lib/rom/support/axiom/adapter/postgres.rb +0 -19
  89. data/lib/rom/support/axiom/adapter/sqlite3.rb +0 -20
  90. data/lib/version.rb +0 -3
  91. data/spec/integration/environment_setup_spec.rb +0 -24
  92. data/spec/integration/grouped_mappers_spec.rb +0 -87
  93. data/spec/integration/join_and_group_spec.rb +0 -76
  94. data/spec/integration/join_and_wrap_spec.rb +0 -68
  95. data/spec/integration/mapping_embedded_relations_spec.rb +0 -73
  96. data/spec/integration/mapping_relations_spec.rb +0 -120
  97. data/spec/integration/schema_definition_spec.rb +0 -152
  98. data/spec/integration/session_spec.rb +0 -87
  99. data/spec/integration/wrapped_mappers_spec.rb +0 -73
  100. data/spec/shared/unit/environment_context.rb +0 -6
  101. data/spec/shared/unit/loader.rb +0 -11
  102. data/spec/shared/unit/loader_identity.rb +0 -13
  103. data/spec/shared/unit/mapper_context.rb +0 -11
  104. data/spec/shared/unit/relation_context.rb +0 -82
  105. data/spec/shared/unit/session_environment_context.rb +0 -11
  106. data/spec/shared/unit/session_relation_context.rb +0 -18
  107. data/spec/support/helper.rb +0 -34
  108. data/spec/support/ice_nine_config.rb +0 -10
  109. data/spec/support/test_mapper.rb +0 -110
  110. data/spec/unit/rom/environment/builder/mapping_spec.rb +0 -24
  111. data/spec/unit/rom/environment/builder/schema_spec.rb +0 -33
  112. data/spec/unit/rom/environment/class_methods/setup_spec.rb +0 -18
  113. data/spec/unit/rom/environment/repository_spec.rb +0 -21
  114. data/spec/unit/rom/mapper/attribute/embedded_collection/to_ast_spec.rb +0 -18
  115. data/spec/unit/rom/mapper/attribute/embedded_value/to_ast_spec.rb +0 -16
  116. data/spec/unit/rom/mapper/attribute/rename_spec.rb +0 -9
  117. data/spec/unit/rom/mapper/attribute/to_ast_spec.rb +0 -9
  118. data/spec/unit/rom/mapper/builder/class_methods/call_spec.rb +0 -61
  119. data/spec/unit/rom/mapper/class_methods/build_spec.rb +0 -55
  120. data/spec/unit/rom/mapper/dump_spec.rb +0 -11
  121. data/spec/unit/rom/mapper/group_spec.rb +0 -35
  122. data/spec/unit/rom/mapper/header/each_spec.rb +0 -26
  123. data/spec/unit/rom/mapper/header/element_reader_spec.rb +0 -21
  124. data/spec/unit/rom/mapper/header/group_spec.rb +0 -18
  125. data/spec/unit/rom/mapper/header/join_spec.rb +0 -14
  126. data/spec/unit/rom/mapper/header/keys_spec.rb +0 -29
  127. data/spec/unit/rom/mapper/header/project_spec.rb +0 -13
  128. data/spec/unit/rom/mapper/header/rename_spec.rb +0 -11
  129. data/spec/unit/rom/mapper/header/to_ast_spec.rb +0 -11
  130. data/spec/unit/rom/mapper/header/wrap_spec.rb +0 -18
  131. data/spec/unit/rom/mapper/identity_from_tuple_spec.rb +0 -11
  132. data/spec/unit/rom/mapper/identity_spec.rb +0 -11
  133. data/spec/unit/rom/mapper/join_spec.rb +0 -15
  134. data/spec/unit/rom/mapper/load_spec.rb +0 -11
  135. data/spec/unit/rom/mapper/new_object_spec.rb +0 -14
  136. data/spec/unit/rom/mapper/project_spec.rb +0 -11
  137. data/spec/unit/rom/mapper/rename_spec.rb +0 -16
  138. data/spec/unit/rom/mapper/wrap_spec.rb +0 -35
  139. data/spec/unit/rom/relation/delete_spec.rb +0 -15
  140. data/spec/unit/rom/relation/drop_spec.rb +0 -11
  141. data/spec/unit/rom/relation/each_spec.rb +0 -23
  142. data/spec/unit/rom/relation/first_spec.rb +0 -19
  143. data/spec/unit/rom/relation/group_spec.rb +0 -29
  144. data/spec/unit/rom/relation/inject_mapper_spec.rb +0 -17
  145. data/spec/unit/rom/relation/insert_spec.rb +0 -13
  146. data/spec/unit/rom/relation/last_spec.rb +0 -19
  147. data/spec/unit/rom/relation/one_spec.rb +0 -49
  148. data/spec/unit/rom/relation/rename_spec.rb +0 -21
  149. data/spec/unit/rom/relation/replace_spec.rb +0 -13
  150. data/spec/unit/rom/relation/restrict_spec.rb +0 -25
  151. data/spec/unit/rom/relation/sort_by_spec.rb +0 -25
  152. data/spec/unit/rom/relation/take_spec.rb +0 -11
  153. data/spec/unit/rom/relation/to_a_spec.rb +0 -20
  154. data/spec/unit/rom/relation/update_spec.rb +0 -25
  155. data/spec/unit/rom/relation/wrap_spec.rb +0 -29
  156. data/spec/unit/rom/repository/class_methods/build_spec.rb +0 -27
  157. data/spec/unit/rom/repository/element_reader_spec.rb +0 -21
  158. data/spec/unit/rom/repository/element_writer_spec.rb +0 -18
  159. data/spec/unit/rom/schema/builder/class_methods/build_spec.rb +0 -103
  160. data/spec/unit/rom/schema/element_reader_spec.rb +0 -15
  161. data/spec/unit/rom/session/class_methods/start_spec.rb +0 -23
  162. data/spec/unit/rom/session/clean_predicate_spec.rb +0 -21
  163. data/spec/unit/rom/session/environment/element_reader_spec.rb +0 -13
  164. data/spec/unit/rom/session/flush_spec.rb +0 -58
  165. data/spec/unit/rom/session/mapper/load_spec.rb +0 -47
  166. data/spec/unit/rom/session/relation/delete_spec.rb +0 -28
  167. data/spec/unit/rom/session/relation/dirty_predicate_spec.rb +0 -35
  168. data/spec/unit/rom/session/relation/identity_spec.rb +0 -11
  169. data/spec/unit/rom/session/relation/new_spec.rb +0 -50
  170. data/spec/unit/rom/session/relation/save_spec.rb +0 -50
  171. data/spec/unit/rom/session/relation/state_spec.rb +0 -23
  172. data/spec/unit/rom/session/relation/track_spec.rb +0 -23
  173. data/spec/unit/rom/session/relation/tracking_predicate_spec.rb +0 -23
  174. data/spec/unit/rom/session/relation/update_attributes_spec.rb +0 -45
  175. 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
- if ENV['COVERAGE'] == 'true'
4
- require 'simplecov'
5
- require 'coveralls'
3
+ # this is needed for guard to work, not sure why :(
4
+ require "bundler"
5
+ Bundler.setup
6
6
 
7
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
8
- SimpleCov::Formatter::HTMLFormatter,
9
- Coveralls::SimpleCov::Formatter
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
- require 'bogus/rspec'
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
- attribute :id, Integer
37
- attribute :name, String
17
+ Dir[root.join('shared/*.rb').to_s].each { |f| require f }
38
18
 
39
- key :id
40
- end
19
+ RSpec.configure do |config|
20
+ config.before do
21
+ @constants = Object.constants
41
22
  end
42
23
 
43
- mapping do
44
- relation(:users) do
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