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,20 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
- class State
6
-
7
- # @api private
8
- class Transient < self
9
- include Concord::Public.new(:object, :mapper)
10
-
11
- # @api private
12
- def save(relation)
13
- Created.new(object, mapper, relation)
14
- end
15
-
16
- end # Transient
17
-
18
- end # State
19
- end # Session
20
- end # ROM
@@ -1,29 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
- class State
6
-
7
- # @api private
8
- class Updated < self
9
- include Adamantium::Flat
10
- include Concord::Public.new(:object, :mapper, :relation)
11
-
12
- # @api private
13
- def commit
14
- relation.update(object, original_tuple)
15
- Persisted.new(object, mapper)
16
- end
17
-
18
- private
19
-
20
- # @api private
21
- def original_tuple
22
- mapper.identity_map.fetch_tuple(mapper.identity(object))
23
- end
24
-
25
- end # Updated
26
-
27
- end # State
28
- end # Session
29
- end # ROM
@@ -1,62 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module ROM
4
- class Session
5
-
6
- # @api private
7
- class Tracker
8
- attr_reader :objects, :changelog
9
- private :objects, :changelog
10
-
11
- # @api private
12
- def initialize
13
- @objects = {}
14
- @changelog = []
15
- end
16
-
17
- # @api private
18
- def commit
19
- @changelog.each { |state| update(state.commit) }
20
- @changelog = []
21
- end
22
-
23
- # @api private
24
- def fetch(identity)
25
- @objects.fetch(identity) { raise ObjectNotTrackedError, identity }
26
- end
27
-
28
- # @api private
29
- def include?(identity)
30
- @objects.key?(identity)
31
- end
32
-
33
- # @api private
34
- def clean?
35
- changelog.empty?
36
- end
37
-
38
- # @api private
39
- def queue(state)
40
- @changelog << state
41
- update(state)
42
- end
43
-
44
- # @api private
45
- def update(state)
46
- @objects[state.identity] = state
47
- end
48
-
49
- # @api private
50
- def store_transient(object, mapper)
51
- update(State::Transient.new(object, mapper))
52
- end
53
-
54
- # @api private
55
- def store_persisted(object, mapper)
56
- update(State::Persisted.new(object, mapper))
57
- end
58
-
59
- end # Tracker
60
-
61
- end # Session
62
- end # ROM
@@ -1,111 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Axiom
4
-
5
- # Raised when passing an +uri+ with an unregistered scheme to {Adapter.new}
6
- UnknownAdapterError = Class.new(StandardError)
7
-
8
- # Provides base functionality for every axiom adapter
9
- #
10
- # @todo think about making this a (base) class
11
- #
12
- # @example
13
- #
14
- # class MyAdapter
15
- # extend Axiom::Adapter
16
- # uri_scheme :foo
17
- # end
18
- #
19
- module Adapter
20
-
21
- # The registry of adapters
22
- #
23
- # @return [Hash<String, Object>]
24
- # a hash of adapters, keyed by uri scheme
25
- #
26
- # @api private
27
- REGISTRY = {}
28
-
29
- # Return the adapter to use for the given +uri+
30
- #
31
- # @param [Addressable::URI] uri
32
- # the uri to initialize the adapter with
33
- #
34
- # @return [Object]
35
- # a axiom adapter
36
- #
37
- # @raise [UnknownAdapterError]
38
- # when the given +uri+'s scheme is not registered
39
- #
40
- # @api private
41
- def self.build(uri)
42
- require_adapter(uri)
43
-
44
- klass = get(uri)
45
-
46
- if klass.name == 'Axiom::Adapter::Memory'
47
- klass.new
48
- else
49
- klass.new(uri)
50
- end
51
- end
52
-
53
- # Return the adapter class registered for +uri+
54
- #
55
- # @param [Addressable::URI] uri
56
- # the uri that identifies the adapter class
57
- #
58
- # @return [Class]
59
- # a axiom adapter class
60
- #
61
- # @raise [UnknownAdapterError]
62
- # when the given +uri+'s scheme is not registered
63
- #
64
- # @api private
65
- def self.get(uri)
66
- uri_scheme = uri.scheme
67
-
68
- REGISTRY.fetch(uri_scheme) {
69
- raise(
70
- UnknownAdapterError,
71
- "#{uri_scheme.inspect} is no registered uri scheme"
72
- )
73
- }
74
- end
75
-
76
- # Try to load an adapter using a standard path
77
- #
78
- # @api private
79
- def self.require_adapter(uri)
80
- require "rom/support/axiom/adapter/#{uri.scheme}"
81
- rescue LoadError
82
- end
83
- private_class_method :require_adapter
84
-
85
- # Set the uri scheme for an adapter class
86
- #
87
- # @example for a DataObjects adapter
88
- #
89
- # class Postgres < Axiom::Adapter::DataObjects
90
- # uri_scheme :postgres
91
- # end
92
- #
93
- # @example for an arbitrary adapter
94
- #
95
- # class InMemory
96
- # extend Axiom::Adapter
97
- # uri_scheme :in_memory
98
- # end
99
- #
100
- # @param [#to_s] name
101
- # the name of the uri scheme
102
- #
103
- # @return [self]
104
- #
105
- # @api public
106
- def uri_scheme(name)
107
- REGISTRY[name.to_s] = self
108
- end
109
-
110
- end # module Adapter
111
- end # module Axiom
@@ -1,38 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'axiom-do-adapter'
4
-
5
- module Axiom
6
- module Adapter
7
-
8
- # Reopenend to add functionality that should eventually
9
- # be puhsed down to Adapter::DataObjects proper, or whatever
10
- # will be the base class.
11
- #
12
- class DataObjects
13
- extend Adapter
14
-
15
- include Equalizer.new(:uri)
16
-
17
- # The URI this adapter uses for establishing a connection
18
- #
19
- # @return [Addressable::URI]
20
- #
21
- # @api private
22
- attr_reader :uri
23
-
24
- # Wrap the given +relation+ with a gateway
25
- #
26
- # @param [Axiom::Relation] relation
27
- # the relation to wrap with a gateway
28
- #
29
- # @return [Axiom::Relation::Gateway]
30
- #
31
- # @api private
32
- def gateway(relation)
33
- Axiom::Relation::Gateway.new(self, relation)
34
- end
35
-
36
- end # DataObjects
37
- end # Adapter
38
- end # Axiom
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'axiom-memory-adapter'
4
- require 'rom/support/axiom/adapter'
5
-
6
- module Axiom
7
- module Adapter
8
-
9
- # A axiom in memory adapter
10
- #
11
- # This is basically a "null adapter"
12
- # as it doesn't make use of it's uri
13
- # and only passes through the given
14
- # +relation+ in {#gateway}
15
- #
16
- class Memory
17
- extend Adapter
18
-
19
- include Equalizer.new(:schema)
20
-
21
- uri_scheme :memory
22
-
23
- end # class Memory
24
- end # module Adapter
25
- end # module Axiom
@@ -1,19 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'do_postgres'
4
-
5
- require 'rom/support/axiom/adapter'
6
- require 'rom/support/axiom/adapter/data_objects'
7
-
8
- module Axiom
9
- module Adapter
10
-
11
- # A Axiom adapter for postgres
12
- #
13
- class Postgres < DataObjects
14
-
15
- uri_scheme :postgres
16
-
17
- end # class Postgres
18
- end # module Adapter
19
- end # module Axiom
@@ -1,20 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'do_sqlite3'
4
-
5
- require 'rom/support/axiom/adapter'
6
- require 'rom/support/axiom/adapter/data_objects'
7
-
8
- module Axiom
9
- module Adapter
10
-
11
- # A axiom adapter for sqlite3
12
- #
13
- class Sqlite3 < DataObjects
14
-
15
- uri_scheme :sqlite3
16
-
17
- end # Sqlite3
18
-
19
- end # Adapter
20
- end # Axiom
data/lib/version.rb DELETED
@@ -1,3 +0,0 @@
1
- module ROM
2
- VERSION = '0.2.0'.freeze
3
- end
@@ -1,24 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Setting up environment' do
6
- let(:env) do
7
- ROM::Environment.setup(memory: 'memory://test') do
8
- schema do
9
- base_relation :users do
10
- repository :memory
11
-
12
- attribute :id, Integer
13
- attribute :name, String
14
-
15
- key :id
16
- end
17
- end
18
- end
19
- end
20
-
21
- it 'registers relations within repositories' do
22
- expect(env.schema[:users]).to be_instance_of(Axiom::Relation::Variable::Materialized)
23
- end
24
- end
@@ -1,87 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Grouped mappers' do
6
- let(:env) do
7
- Environment.setup(test: 'memory://test') do
8
- schema do
9
- base_relation :users do
10
- repository :test
11
-
12
- attribute :id, Integer
13
- attribute :name, String
14
-
15
- key :id
16
- end
17
-
18
- base_relation :tasks do
19
- repository :test
20
-
21
- attribute :id, Integer
22
- attribute :title, String
23
-
24
- key :id
25
- end
26
- end
27
-
28
- mapping do
29
- relation(:users) do
30
- model User
31
- map :id, :name
32
- end
33
-
34
- relation(:tasks) do
35
- model Task
36
- map :id, :title
37
- end
38
- end
39
- end
40
- end
41
-
42
- before do
43
- User = mock_model(:id, :name, :tasks)
44
- Task = mock_model(:id, :title)
45
- end
46
-
47
- after do
48
- Object.send(:remove_const, :User) if defined?(User)
49
- Object.send(:remove_const, :Task) if defined?(Task)
50
- end
51
-
52
- subject(:mapper) { env[:users].mapper.group(:tasks => env[:tasks].mapper) }
53
-
54
- specify 'loading grouped tuples' do
55
- tuple = {
56
- :id => 1,
57
- :name => 'Jane',
58
- :tasks => [
59
- { :id => 2, :title => 'Task 1' },
60
- { :id => 3, :title => 'Task 2' }
61
- ]
62
- }
63
-
64
- task1 = Task.new(tuple[:tasks].first)
65
- task2 = Task.new(tuple[:tasks].last)
66
- user = User.new(:id => tuple[:id], :name => tuple[:name], :tasks => [task1, task2])
67
-
68
- expect(mapper.load(tuple)).to eql(user)
69
- end
70
-
71
- specify 'dumping grouped tuples' do
72
- tuple = {
73
- :id => 1,
74
- :name => 'Jane',
75
- :tasks => [
76
- { :id => 2, :title => 'Task 1' },
77
- { :id => 3, :title => 'Task 2' }
78
- ]
79
- }
80
-
81
- task1 = Task.new(tuple[:tasks].first)
82
- task2 = Task.new(tuple[:tasks].last)
83
- user = User.new(:id => tuple[:id], :name => tuple[:name], :tasks => [task1, task2])
84
-
85
- expect(mapper.dump(user)).to eql([1, 'Jane', [[2, 'Task 1'], [3, 'Task 2']]])
86
- end
87
- end