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,87 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Session' do
6
- let(:users) { TEST_ENV.schema[:users] }
7
- let(:relation) { TEST_ENV[:users] }
8
- let(:mapper) { relation.mapper }
9
- let(:model) { mapper.model }
10
-
11
- before do
12
- users.insert([[1, 'John'], [2, 'Jane']])
13
- end
14
-
15
- after do
16
- users.delete([[1, 'John'], [2, 'Jane'], [2, 'Jane Doe'], [3, 'Piotr']])
17
- end
18
-
19
- specify 'fetching an object from a relation' do
20
- TEST_ENV.session do |session|
21
- # fetch user for the first time
22
- jane1 = session[:users].restrict(name: 'Jane').one
23
-
24
- expect(jane1).to eq(model.new(id: 2, name: 'Jane'))
25
-
26
- # here IM-powered loader kicks in
27
- jane2 = session[:users].restrict(name: 'Jane').one
28
-
29
- expect(jane1).to be(jane2)
30
- end
31
- end
32
-
33
- specify 'deleting an object from a relation' do
34
- TEST_ENV.session do |session|
35
- jane = session[:users].restrict(name: 'Jane').one
36
-
37
- session[:users].delete(jane)
38
-
39
- session.flush
40
-
41
- expect(relation.to_a).not_to include(jane)
42
- end
43
- end
44
-
45
- specify 'saving an object to a relation' do
46
- TEST_ENV.session do |session|
47
- piotr = session[:users].new(id: 3, name: 'Piotr')
48
-
49
- session[:users].save(piotr)
50
-
51
- session.flush
52
-
53
- expect(relation.to_a).to include(piotr)
54
- end
55
- end
56
-
57
- specify 'updating an object in a relation' do
58
- TEST_ENV.session do |session|
59
- jane = session[:users].restrict(id: 2).one
60
- jane.name = 'Jane Doe'
61
-
62
- session[:users].save(jane)
63
-
64
- session.flush
65
-
66
- expect(relation.count).to be(2)
67
-
68
- expect(relation.to_a.last).to eql(jane)
69
- end
70
- end
71
-
72
- specify 'updating an immutable object in a relation' do
73
- TEST_ENV.session do |session|
74
- jane = session[:users].restrict(id: 2).one
75
-
76
- jane.freeze
77
-
78
- session[:users].update_attributes(jane, name: 'Jane Doe')
79
-
80
- session.flush
81
-
82
- expect(relation.count).to be(2)
83
-
84
- expect(relation.to_a.last).to eql(jane.update(name: 'Jane Doe'))
85
- end
86
- end
87
- end
@@ -1,73 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Wrapped 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)
44
- Task = mock_model(:id, :title, :user)
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[:tasks].mapper.wrap(:user => env[:users].mapper) }
53
-
54
- specify 'loading wrapped tuples' do
55
- tuple = { :id => 1, :title => 'Task 1', :user => { :id => 2, :name => 'Jane' } }
56
-
57
- user = User.new(tuple[:user])
58
- task = Task.new(:id => tuple[:id], :title => tuple[:title], :user => user)
59
-
60
- expect(mapper.load(tuple)).to eql(task)
61
- end
62
-
63
- specify 'dumping wrapped tuples' do
64
- mapper = env[:tasks].mapper.wrap(:user => env[:users].mapper)
65
-
66
- tuple = { :id => 1, :title => 'Task 1', :user => { :id => 2, :name => 'Jane' } }
67
-
68
- user = User.new(tuple[:user])
69
- task = Task.new(:id => tuple[:id], :title => tuple[:title], :user => user)
70
-
71
- expect(mapper.dump(task)).to eql([1, 'Task 1', [2, 'Jane']])
72
- end
73
- end
@@ -1,6 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_context 'Environment' do
4
- let(:object) { Environment.setup(test: 'memory://test').finalize }
5
- let(:uri) { 'memory://test' }
6
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_examples_for 'Mapper::Loader' do
4
- subject(:loader) { described_class.new(header, model, transformer) }
5
-
6
- let(:header) { Mapper::Header.build([[:id, type: Integer, key: true], [:name, type: String]]) }
7
- let(:tuple) { Hash[id: 1, name: 'Jane', something: 'foo'] }
8
- let(:model) { mock_model(:id, :name) }
9
- let(:object) { model.new(id: 1, name: 'Jane') }
10
- let(:transformer) { fake('transformer') { Morpher::Evaluator::Transformer } }
11
- end
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_examples_for 'Mapper::Loader#identity' do
4
- subject(:loader) { described_class.build(header, model) }
5
-
6
- let(:header) { Mapper::Header.build([[:id, Integer], [:name, String]], keys: [:id]) }
7
- let(:tuple) { Hash[id: 1, name: 'Jane'] }
8
- let(:model) { mock_model(:id, :name) }
9
-
10
- it "returns object's identity" do
11
- expect(loader.identity(tuple)).to eq([1])
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_context 'Mapper' do
4
- let(:mapper) { described_class.build([[:id, key: true], [:name]], model: model) }
5
-
6
- let(:header) { fake(:header) { Mapper::Header } }
7
- let(:data) { [1, 'Jane'] }
8
- let(:tuple) { Hash[id: 1, name: 'Jane'] }
9
- let(:object) { model.new(id: 1, name: 'Jane') }
10
- let(:model) { mock_model(:id, :name) }
11
- end
@@ -1,82 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_context 'Relation' do
4
- subject(:relation) { described_class.new(users, mapper) }
5
-
6
- let(:header) {
7
- Axiom::Relation::Header.coerce([[:id, Integer], [:name, String]], keys: [:id])
8
- }
9
-
10
- let(:users) {
11
- Axiom::Relation.new(header, [
12
- [1, 'John'], [2, 'Jane'], [3, 'Jack'], [4, 'Jade']
13
- ])
14
- }
15
-
16
- let(:model) { mock_model(:id, :name) }
17
- let(:mapper) { TestMapper.new(users.header, model) }
18
-
19
- let(:john) { model.new(id: 1, name: 'John') }
20
- let(:jane) { model.new(id: 2, name: 'Jane') }
21
- let(:jack) { model.new(id: 3, name: 'Jack') }
22
- let(:jade) { model.new(id: 4, name: 'Jade') }
23
- end
24
-
25
- shared_context 'Project with tasks' do
26
- subject(:relation) { described_class.new(projects_with_tasks, mapper) }
27
-
28
- let(:header) {
29
- Axiom::Relation::Header.coerce(
30
- [
31
- [:id, Integer],
32
- [:name, String ],
33
- [:task_id, Integer],
34
- [:task_name, String ],
35
- ]
36
- )
37
- }
38
-
39
- let(:projects_with_tasks) {
40
- Axiom::Relation.new(header, [
41
- [1, 'rom-relation', 1, 'Add ROM::Relation#group' ],
42
- [1, 'rom-relation', 2, 'Add ROM::Relation#ungroup'],
43
- ])
44
- }
45
-
46
- let(:project_with_tasks_model) { mock_model(:id, :name, :tasks) }
47
- let(:task_model) { mock_model(:task_id, :task_name) }
48
-
49
- let(:mapper) { ProjectWithTasksMapper.new(header, project_with_tasks_model, task_model) }
50
-
51
- let(:project_with_tasks) {
52
- project_with_tasks_model.new(id: 1, name: 'rom-relation', tasks: tasks)
53
- }
54
-
55
- let(:tasks) {[
56
- # TODO add renaming support: [[:id, Integer], [:name, String]]
57
- task_model.new(task_id: 1, task_name: 'Add ROM::Relation#group'),
58
- task_model.new(task_id: 2, task_name: 'Add ROM::Relation#ungroup')
59
- ]}
60
- end
61
-
62
- shared_context 'City with location' do
63
- subject(:relation) { described_class.new(city_relation, mapper) }
64
-
65
- let(:header) {
66
- Axiom::Relation::Header.coerce([
67
- [:id, Integer], [:name, String], [:location_id, Integer], [:lat, Float], [:lng, Float]
68
- ])
69
- }
70
-
71
- let(:city_relation) {
72
- Axiom::Relation.new(header, [[1, 'Krakow', 1, 2.0, 3.0]])
73
- }
74
-
75
- let(:city_model) { mock_model(:id, :name, :location) }
76
- let(:location_model) { mock_model(:lat, :lng) }
77
-
78
- let(:mapper) { CityWithLocationMapper.new(header, city_model, location_model) }
79
-
80
- let(:city) { city_model.new(id: 1, name: 'Krakow', location: location) }
81
- let(:location) { location_model.new(lat: 2.0, lng: 3.0) }
82
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_context 'Session::Environment' do
4
- let(:object) { described_class.new({ users: users }, Session::Tracker.new) }
5
-
6
- let(:users) {
7
- relation = TEST_ENV.repository(:test)[:users]
8
- mapper = Mapper.build([[:id], [:name]], model: mock_model(:id, :name))
9
- Relation.new(relation, mapper)
10
- }
11
- end
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- shared_context 'Session::Relation' do
4
- let(:users) { session[:users] }
5
- let(:object) { users }
6
-
7
- let(:session) { Session.new(env) }
8
- let(:env) { Session::Environment.new({ users: relation }, tracker) }
9
- let(:tracker) { Session::Tracker.new }
10
-
11
- let(:mapper) { Mapper.build([[:id, type: Integer, key: true], [:name, type: String]], model: model) }
12
- let(:model) { mock_model(:id, :name) }
13
- let(:header) { TEST_ENV.schema[:users].header }
14
- let(:axiom) { Axiom::Relation::Variable.new(Axiom::Relation.new(header, [[1, 'John'], [2, 'Jane']])) }
15
- let(:relation) { Relation.new(axiom, mapper) }
16
-
17
- let(:user) { session[:users].to_a.first }
18
- end
@@ -1,34 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module SpecHelper
4
-
5
- def mock_model(*attributes, &block)
6
- model = Class.new {
7
- include Equalizer.new(*attributes)
8
-
9
- const_set(:ATTRIBUTES, attributes)
10
-
11
- attributes.each { |name| attr_accessor name }
12
-
13
- def initialize(attrs = {}, &block)
14
- attrs.each { |name, value| send("#{name}=", value) }
15
- instance_eval(&block) if block
16
- end
17
-
18
- def update(tuple)
19
- self.class.new(to_h.update(tuple))
20
- end
21
-
22
- def attribute_names
23
- self.class.const_get(:ATTRIBUTES)
24
- end
25
-
26
- def to_h
27
- attribute_names.each_with_object({}) { |name, h| h[name] = send(name) }
28
- end
29
- }
30
- model.class_eval(&block) if block
31
- model
32
- end
33
-
34
- end
@@ -1,10 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'ice_nine'
4
-
5
- module IceNine
6
- class Freezer
7
- class RSpec < NoFreeze
8
- end
9
- end
10
- end
@@ -1,110 +0,0 @@
1
- # encoding: utf-8
2
-
3
- class TestMapper < Struct.new(:header, :model)
4
-
5
- def call(relation)
6
- relation
7
- end
8
-
9
- def load(tuple)
10
- model.new(
11
- Hash[
12
- header.map { |attribute| [attribute.name, tuple[attribute.name]] }
13
- ]
14
- )
15
- end
16
-
17
- def dump(object)
18
- header.each_with_object([]) { |attribute, tuple|
19
- tuple << object.send(attribute.name)
20
- }
21
- end
22
-
23
- end
24
-
25
- class CityWithLocationMapper < Struct.new(:header, :model, :location_model)
26
- attr_reader :city_header
27
- attr_reader :location_header
28
-
29
- def initialize(header, model, location_model)
30
- super
31
- @city_header = header.project(city_header_names)
32
- @location_header = header.project(location_header_names)
33
- end
34
-
35
- def call(relation)
36
- relation
37
- end
38
-
39
- def load(tuple)
40
- model.new(city_attributes(tuple).merge(location: location_object(tuple[:location])))
41
- end
42
-
43
- def dump(object)
44
- raise NotImplementedError, "#{self.class}##{__method__} must be implemented"
45
- end
46
-
47
- private
48
-
49
- def city_attributes(tuple)
50
- Hash[city_header.map { |attribute| [attribute.name, tuple[attribute.name]] }]
51
- end
52
-
53
- def location_object(tuple)
54
- TestMapper.new(location_header, location_model).load(tuple)
55
- end
56
-
57
- def city_header_names
58
- [:id, :name]
59
- end
60
-
61
- def location_header_names
62
- [:lat, :lng]
63
- end
64
-
65
- end
66
-
67
- class ProjectWithTasksMapper < Struct.new(:header, :model, :task_model)
68
- attr_reader :task_header
69
- attr_reader :project_header
70
-
71
- def initialize(header, model, task_model)
72
- super
73
- @task_header = header.project(task_header_names)#.rename(task_aliases)
74
- @project_header = header.project(project_header_names)
75
- end
76
-
77
- def call(relation)
78
- relation
79
- end
80
-
81
- def load(tuple)
82
- model.new(project_attributes(tuple).merge(tasks: task_collection(tuple)))
83
- end
84
-
85
- def dump(object)
86
- raise NotImplementedError, "#{self.class}##{__method__} must be implemented"
87
- end
88
-
89
- private
90
-
91
- def project_attributes(tuple)
92
- Hash[project_header.map { |attribute| [attribute.name, tuple[attribute.name]] }]
93
- end
94
-
95
- def task_collection(tuple)
96
- tuple[:tasks].map(&method(:task_object))
97
- end
98
-
99
- def task_object(task_tuple)
100
- TestMapper.new(task_header, task_model).load(task_tuple)#.rename(task_aliases))
101
- end
102
-
103
- def task_header_names
104
- [:task_id, :task_name]
105
- end
106
-
107
- def project_header_names
108
- [:id, :name]
109
- end
110
- end