rom 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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