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
@@ -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