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
@@ -1,47 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Mapper, '#load' do
6
- subject { object.load(tuple) }
7
-
8
- let(:object) { described_class.new(mapper, tracker, im) }
9
-
10
- let(:mapper) { fake(:mapper) { ROM::Mapper } }
11
-
12
- let(:tuple) { Hash[id: identity, name: 'Jane'] }
13
- let(:identity) { [1] }
14
- let(:user) { model.new(tuple) }
15
- let(:model) { mock_model(:id, :name) }
16
- let(:im) { Session::IdentityMap.build }
17
- let(:tracker) { Session::Tracker.new }
18
-
19
- before do
20
- stub(mapper).identity_from_tuple(tuple) { identity }
21
- stub(mapper).identity(user) { identity }
22
- stub(mapper).load(tuple) { user }
23
- end
24
-
25
- context 'when IM does not include the loaded object' do
26
- it 'loads the object' do
27
- expect(subject).to be(user)
28
- mapper.should have_received.load(tuple)
29
- end
30
-
31
- it 'stores persisted state in the tracker' do
32
- expect(subject).to be(user)
33
- expect(tracker.fetch(identity)).to be_persisted
34
- end
35
- end
36
-
37
- context 'when IM includes the loaded object' do
38
- before do
39
- im.store(identity, user, tuple)
40
- end
41
-
42
- it 'returns already loaded object' do
43
- expect(subject).to be(user)
44
- mapper.should_not have_received.load(tuple)
45
- end
46
- end
47
- end
@@ -1,28 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#delete' do
6
- subject { users.delete(user) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- let(:state) { subject.state(user) }
11
-
12
- context 'with a persisted object' do
13
- it_behaves_like 'a command method'
14
-
15
- specify { expect(state).to be_deleted }
16
- end
17
-
18
- context 'with a transient object' do
19
- let(:user) { users.new }
20
-
21
- specify do
22
- expect { subject }.to raise_error(
23
- Session::State::TransitionError,
24
- 'cannot delete object with ROM::Session::State::Transient state'
25
- )
26
- end
27
- end
28
- end
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#dirty?' do
6
- subject { users.dirty?(user) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- context 'with a transient object' do
11
- let(:user) { users.new }
12
-
13
- it { should be(true) }
14
- end
15
-
16
- context 'when persisted object was changed' do
17
- before do
18
- user.name = 'John Doe'
19
- end
20
-
21
- it { should be(true) }
22
- end
23
-
24
- context 'when persisted object was not changed' do
25
- it { should be(false) }
26
- end
27
-
28
- context 'when object is not tracked' do
29
- let(:user) { model.new(id: 3, name: 'Unknown') }
30
-
31
- specify do
32
- expect { subject }.to raise_error(Session::ObjectNotTrackedError)
33
- end
34
- end
35
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#save' do
6
- subject { object.identity(user) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- it { should eq([user.id]) }
11
- end
@@ -1,50 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#new' do
6
- share_examples_for 'a new tracked object' do
7
- it { should be_instance_of(model) }
8
-
9
- it 'sets state to transient' do
10
- expect(object.state(subject)).to be_transient
11
- end
12
-
13
- it 'auto-tracks the new object' do
14
- expect(object.tracking?(subject)).to be_true
15
- end
16
- end
17
-
18
- include_context 'Session::Relation'
19
-
20
- let(:attributes) { Hash[id: 1, name: 'Jane'] }
21
-
22
- context 'with attributes' do
23
- subject { users.new(attributes) }
24
-
25
- it { should eq(model.new(attributes)) }
26
-
27
- it_behaves_like 'a new tracked object'
28
- end
29
-
30
- context 'with attributes and block' do
31
- subject { users.new(attributes, &block) }
32
-
33
- let(:model) {
34
- mock_model(:id, :name) {
35
- attr_reader :attributes
36
-
37
- def initialize(attributes, &block)
38
- @attributes = attributes
39
- yield(attributes)
40
- end
41
- }
42
- }
43
-
44
- let(:block) { proc { |attributes| attributes[:test] = true } }
45
-
46
- its(:attributes) { should eq(attributes.merge(test: true)) }
47
-
48
- it_behaves_like 'a new tracked object'
49
- end
50
- end
@@ -1,50 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#save' do
6
- subject { object.save(user) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- let(:state) { subject.state(user) }
11
-
12
- context 'when an object is transient' do
13
- let(:user) { users.new(id: 3, name: 'John') }
14
-
15
- it_behaves_like 'a command method'
16
-
17
- specify { state.should be_created }
18
- end
19
-
20
- context 'when an object is persisted' do
21
- context 'when not dirty' do
22
- it_behaves_like 'a command method'
23
-
24
- specify { state.should be_persisted }
25
- end
26
-
27
- context 'when dirty' do
28
- before do
29
- user.name = 'John Doe'
30
- end
31
-
32
- it_behaves_like 'a command method'
33
-
34
- specify { state.should be_updated }
35
- end
36
- end
37
-
38
- context 'when an object is deleted' do
39
- before do
40
- object.delete(user)
41
- end
42
-
43
- specify do
44
- expect { subject }.to raise_error(
45
- Session::State::TransitionError,
46
- 'cannot save object with ROM::Session::State::Deleted state'
47
- )
48
- end
49
- end
50
- end
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#state' do
6
- subject { users.state(user) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- context 'when object is tracked' do
11
- it { should be_kind_of(Session::State) }
12
-
13
- its(:object) { should be(user) }
14
- end
15
-
16
- context 'when object is not tracked' do
17
- let(:user) { model.new }
18
-
19
- specify do
20
- expect { subject }.to raise_error(Session::ObjectNotTrackedError)
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#track' do
6
- subject { users.track(user) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- let(:user) { model.new(id: 3, name: 'John') }
11
-
12
- before do
13
- users.track(user)
14
- end
15
-
16
- it_behaves_like 'a command method'
17
-
18
- it { should be(subject) }
19
-
20
- it 'starts tracking the object' do
21
- expect(users.tracking?(user)).to be_true
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#tracking?' do
6
- subject { users.tracking?(user) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- let(:user) { model.new(id: 3, name: 'John') }
11
-
12
- context 'when the object is being tracked' do
13
- before do
14
- users.track(user)
15
- end
16
-
17
- it { should be(true) }
18
- end
19
-
20
- context 'when the object is not being tracked' do
21
- it { should be(false) }
22
- end
23
- end
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::Relation, '#update_attributes' do
6
- subject { object.update_attributes(user, new_attributes) }
7
-
8
- include_context 'Session::Relation'
9
-
10
- let(:state) { subject.state(user) }
11
- let(:new_attributes) { { name: 'Other' } }
12
-
13
- before do
14
- user.freeze
15
- end
16
-
17
- context 'when an object is persisted' do
18
- context 'when dirty' do
19
- it_behaves_like 'a command method'
20
-
21
- specify { state.should be_updated }
22
- end
23
- end
24
-
25
- context 'when an object is transient' do
26
- let(:user) { model.new }
27
-
28
- specify do
29
- expect { subject }.to raise_error(Session::ObjectNotTrackedError)
30
- end
31
- end
32
-
33
- context 'when an object is deleted' do
34
- before do
35
- object.delete(user)
36
- end
37
-
38
- specify do
39
- expect { subject }.to raise_error(
40
- Session::State::TransitionError,
41
- 'cannot update object with ROM::Session::State::Deleted state'
42
- )
43
- end
44
- end
45
- end
@@ -1,79 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Session::State do
6
- fake(:object)
7
- fake(:mapper)
8
- fake(:relation)
9
-
10
- describe '#transient?' do
11
- context 'with transient state' do
12
- subject { Session::State::Transient.new(object, mapper) }
13
-
14
- it { should be_transient }
15
- end
16
-
17
- context 'with a non-transient state' do
18
- subject { Session::State::Persisted.new(object, mapper) }
19
-
20
- it { should_not be_transient }
21
- end
22
- end
23
-
24
- describe '#persisted?' do
25
- context 'with a persisted state' do
26
- subject { Session::State::Persisted.new(object, mapper) }
27
-
28
- it { should be_persisted }
29
- end
30
-
31
- context 'with a non-persisted state' do
32
- subject { Session::State::Transient.new(object, mapper) }
33
-
34
- it { should_not be_persisted }
35
- end
36
- end
37
-
38
- describe '#created?' do
39
- context 'with a created state' do
40
- subject { Session::State::Created.new(object, mapper, relation) }
41
-
42
- it { should be_created }
43
- end
44
-
45
- context 'with a non-created state' do
46
- subject { Session::State::Transient.new(object, mapper) }
47
-
48
- it { should_not be_created }
49
- end
50
- end
51
-
52
- describe '#updated?' do
53
- context 'with an updated state' do
54
- subject { Session::State::Updated.new(object, [], relation) }
55
-
56
- it { should be_updated }
57
- end
58
-
59
- context 'with a non-updated state' do
60
- subject { Session::State::Transient.new(object, mapper) }
61
-
62
- it { should_not be_updated }
63
- end
64
- end
65
-
66
- describe '#deleted?' do
67
- context 'with a deleted state' do
68
- subject { Session::State::Deleted.new(object, mapper, relation) }
69
-
70
- it { should be_deleted }
71
- end
72
-
73
- context 'with a non-updated state' do
74
- subject { Session::State::Transient.new(object, mapper) }
75
-
76
- it { should_not be_deleted }
77
- end
78
- end
79
- end