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,67 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
-
6
- # Session-specific environment wrapping ROM's environment
7
- #
8
- # It works exactly the same as ROM::Environment except it returns
9
- # session relations
10
- #
11
- # @api public
12
- class Environment
13
- include Charlatan.new(:environment)
14
-
15
- attr_reader :environment, :tracker, :memory
16
- private :environment, :tracker, :memory
17
-
18
- # @api private
19
- def self.build(environment, tracker = Tracker.new)
20
- new(environment, tracker)
21
- end
22
-
23
- # @api private
24
- def initialize(environment, tracker)
25
- super
26
- @environment = environment
27
- @tracker = tracker
28
- initialize_memory
29
- end
30
-
31
- # Return a relation identified by name
32
- #
33
- # @param [Symbol] name of a relation
34
- #
35
- # @return [Session::Relation] rom's relation wrapped by session
36
- #
37
- # @api public
38
- def [](name)
39
- memory[name]
40
- end
41
-
42
- # @api private
43
- def commit
44
- tracker.commit
45
- end
46
-
47
- # @api private
48
- def clean?
49
- tracker.clean?
50
- end
51
-
52
- private
53
-
54
- # @api private
55
- def initialize_memory
56
- @memory = Hash.new { |_, name| memory[name] = build_relation(name) }
57
- end
58
-
59
- # @api private
60
- def build_relation(name)
61
- Relation.build(environment[name], tracker)
62
- end
63
-
64
- end # Environment
65
-
66
- end # Session
67
- end # ROM
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
-
6
- # @api private
7
- class IdentityMap
8
- include Concord.new(:objects)
9
-
10
- class LoadedObject
11
- include Concord::Public.new(:object, :tuple)
12
- end
13
-
14
- # @api private
15
- def self.build(objects = {})
16
- new(objects)
17
- end
18
-
19
- # @api private
20
- def [](identity)
21
- objects[identity]
22
- end
23
-
24
- # @api private
25
- def fetch_object(identity, &block)
26
- objects.fetch(identity, &block).object
27
- end
28
-
29
- # @api private
30
- def fetch_tuple(identity)
31
- self[identity].tuple
32
- end
33
-
34
- # @api private
35
- def store(identity, object, tuple)
36
- objects[identity] = LoadedObject.new(object, tuple)
37
- self
38
- end
39
-
40
- end # IdentityMap
41
-
42
- end # Session
43
- end # ROM
@@ -1,62 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
-
6
- # @api private
7
- class Mapper
8
- include Charlatan.new(:mapper)
9
-
10
- attr_reader :tracker, :identity_map
11
-
12
- def initialize(mapper, tracker, identity_map)
13
- super
14
- @tracker = tracker
15
- @identity_map = identity_map
16
- end
17
-
18
- # @api private
19
- def self.build(mapper, tracker)
20
- new(mapper, tracker, IdentityMap.build)
21
- end
22
-
23
- # @api public
24
- def identity(object)
25
- keys = mapper.identity(object)
26
-
27
- if keys.empty?
28
- object.__id__
29
- else
30
- keys
31
- end
32
- end
33
-
34
- # @api private
35
- def dirty?(object)
36
- identity_map.fetch_tuple(identity(object)) != dump(object)
37
- end
38
-
39
- # @api private
40
- def load(tuple)
41
- identity = mapper.identity_from_tuple(tuple)
42
- identity_map.fetch_object(identity) { load_and_track(identity, tuple) }
43
- end
44
-
45
- # @api private
46
- def store_in_identity_map(object)
47
- identity_map.store(identity(object), object, dump(object))
48
- end
49
-
50
- private
51
-
52
- # @api private
53
- def load_and_track(identity, tuple)
54
- object = mapper.load(tuple)
55
- tracker.store_persisted(object, self)
56
- identity_map.store(identity, object, tuple)[identity]
57
- end
58
-
59
- end # Mapper
60
-
61
- end # Session
62
- end # ROM
@@ -1,140 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
-
6
- # Adds session-specific functionality on top of ROM's relation.
7
- #
8
- # A session relation builds a queue of state changes that will be committed
9
- # when a session is flushed.
10
- #
11
- # @api public
12
- class Relation
13
- include Charlatan.new(:relation, kind: ROM::Relation)
14
-
15
- attr_reader :tracker
16
- private :tracker
17
-
18
- # @api private
19
- def self.build(relation, tracker)
20
- mapper = Mapper.build(relation.mapper, tracker)
21
- new(relation.inject_mapper(mapper), tracker)
22
- end
23
-
24
- # @api private
25
- def initialize(relation, tracker)
26
- super
27
- @relation, @tracker = relation, tracker
28
- end
29
-
30
- # Transition an object into a saved state
31
- #
32
- # Transient object's state turns into Created
33
- # Persisted object's state turns into Updated
34
- #
35
- # @param [Object] an object to be saved
36
- #
37
- # @return [Session::Relation]
38
- #
39
- # @api public
40
- def save(object)
41
- tracker.queue(state(object).save(relation))
42
- self
43
- end
44
-
45
- # Queue an object to be updated
46
- #
47
- # @param [Object] object to be updated
48
- # @param [Hash] new attributes for the update
49
- #
50
- # @return [self]
51
- #
52
- # @api public
53
- def update_attributes(object, tuple)
54
- tracker.queue(state(object).update(relation, tuple))
55
- self
56
- end
57
-
58
- # Transient an object into a deleted state
59
- #
60
- # @param [Object] an object to be deleted
61
- #
62
- # @return [Session::Relation]
63
- #
64
- # @api public
65
- def delete(object)
66
- tracker.queue(state(object).delete(relation))
67
- self
68
- end
69
-
70
- # Return current state of the tracked object
71
- #
72
- # @param [Object] an object
73
- #
74
- # @return [Session::State]
75
- #
76
- # @api public
77
- def state(object)
78
- tracker.fetch(identity(object))
79
- end
80
-
81
- # Return object's identity
82
- #
83
- # @param [Object] an object
84
- #
85
- # @return [Array]
86
- #
87
- # @api public
88
- def identity(object)
89
- mapper.identity(object)
90
- end
91
-
92
- # Start tracking an object within this session
93
- #
94
- # @param [Object] an object to be track
95
- #
96
- # @return [Session::Relation]
97
- #
98
- # @api public
99
- def track(object)
100
- tracker.store_transient(object, mapper)
101
- self
102
- end
103
-
104
- # Build a new object instance and start tracking
105
- #
106
- # @return [Object]
107
- #
108
- # @api public
109
- def new(*args, &block)
110
- object = mapper.new_object(*args, &block)
111
- track(object)
112
- object
113
- end
114
-
115
- # Check if a tracked object is dirty
116
- #
117
- # @param [Object] an object
118
- #
119
- # @return [Boolean]
120
- #
121
- # @api public
122
- def dirty?(object)
123
- state(object).transient? || mapper.dirty?(object)
124
- end
125
-
126
- # Check if an object is being tracked
127
- #
128
- # @param [Object]
129
- #
130
- # @return [Boolean]
131
- #
132
- # @api public
133
- def tracking?(object)
134
- tracker.include?(identity(object))
135
- end
136
-
137
- end # Relation
138
-
139
- end # Session
140
- end # ROM
@@ -1,59 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
-
6
- # @api private
7
- class State
8
- include Concord::Public.new(:object, :mapper)
9
-
10
- TransitionError = Class.new(StandardError)
11
-
12
- # @api private
13
- def save(*)
14
- raise TransitionError, "cannot save object with #{self.class} state"
15
- end
16
-
17
- # @api private
18
- def delete(*)
19
- raise TransitionError, "cannot delete object with #{self.class} state"
20
- end
21
-
22
- # @api private
23
- def update(*)
24
- raise TransitionError, "cannot update object with #{self.class} state"
25
- end
26
-
27
- # @api private
28
- def transient?
29
- instance_of?(Transient)
30
- end
31
-
32
- # @api private
33
- def created?
34
- instance_of?(Created)
35
- end
36
-
37
- # @api private
38
- def persisted?
39
- instance_of?(Persisted)
40
- end
41
-
42
- # @api private
43
- def updated?
44
- instance_of?(Updated)
45
- end
46
-
47
- # @api private
48
- def deleted?
49
- instance_of?(Deleted)
50
- end
51
-
52
- # @api private
53
- def identity
54
- mapper.identity(object)
55
- end
56
- end # State
57
-
58
- end # Session
59
- end # ROM
@@ -1,22 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
- class State
6
-
7
- # @api private
8
- class Created < self
9
- include Concord::Public.new(:object, :mapper, :relation), Adamantium::Flat
10
-
11
- # @api private
12
- def commit
13
- relation.insert(object)
14
- mapper.store_in_identity_map(object)
15
- Persisted.new(object, mapper)
16
- end
17
-
18
- end # Created
19
-
20
- end # State
21
- end # Session
22
- end # ROM
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
- class State
6
-
7
- # @api private
8
- class Deleted < self
9
- include Concord::Public.new(:object, :mapper, :relation), Adamantium::Flat
10
-
11
- class Committed < State
12
- include Adamantium::Flat
13
- end
14
-
15
- # @api private
16
- def commit
17
- relation.delete(object)
18
- Committed.new(object, mapper)
19
- end
20
-
21
- end # Deleted
22
-
23
- end # State
24
- end # Session
25
- end # ROM
@@ -1,34 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
- class State
6
-
7
- # @api private
8
- class Persisted < self
9
- include Concord::Public.new(:object, :mapper)
10
-
11
- # @api private
12
- def save(relation)
13
- if mapper.dirty?(object)
14
- Updated.new(object, mapper, relation)
15
- else
16
- self
17
- end
18
- end
19
-
20
- # @api private
21
- def update(relation, tuple)
22
- Updated.new(object.update(tuple), mapper, relation)
23
- end
24
-
25
- # @api private
26
- def delete(relation)
27
- Deleted.new(object, mapper, relation)
28
- end
29
-
30
- end # Persisted
31
-
32
- end # State
33
- end # Session
34
- end # ROM