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,24 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Environment::Builder, '#mapping' do
6
- subject(:builder) { Environment::Builder.call(test: "memory://test") }
7
-
8
- let!(:schema) do
9
- builder.schema do
10
- base_relation(:users) do
11
- repository :test
12
- attribute :name, String
13
- end
14
- end
15
- end
16
-
17
- it 'sets up rom mapper' do
18
- builder.mapping do
19
- relation(:users) { map :name }
20
- end
21
-
22
- expect(builder.mappers[:users]).to be_instance_of(Mapper)
23
- end
24
- end
@@ -1,33 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Environment::Builder, '#schema' do
6
- let(:repositories) { Hash.new }
7
- let(:object) { Environment::Builder.call(test: "memory://test") }
8
- let(:block) { -> { } }
9
-
10
- fake(:builder) { Schema::Builder }
11
-
12
- before do
13
- fake_class(Schema::Builder, build: -> { builder })
14
- end
15
-
16
- describe 'with a block' do
17
- subject { object.schema(&block) }
18
-
19
- it 'calls the schema' do
20
- expect(subject).to be(builder)
21
- expect(builder).to have_received.call
22
- end
23
- end
24
-
25
- describe 'without a block' do
26
- subject { object.schema }
27
-
28
- it 'calls the schema' do
29
- expect(subject).to be(builder)
30
- expect(builder).not_to have_received.call
31
- end
32
- end
33
- end
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Environment, '.setup' do
6
- subject { described_class.setup(config).finalize }
7
-
8
- context 'when a repository config hash is passed' do
9
- let(:config) { { name => uri } }
10
- let(:name) { :test }
11
- let(:uri) { 'memory://test' }
12
-
13
- let(:coerced_config) { Hash[test: Repository.build(name, coerced_uri)] }
14
- let(:coerced_uri) { Addressable::URI.parse(uri) }
15
-
16
- its(:repositories) { should eql(described_class.new(coerced_config, {}, {}, {}).repositories) }
17
- end
18
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Environment, '#repository' do
6
- include_context 'Environment'
7
-
8
- subject { object.repository(name) }
9
-
10
- context 'when repository exists' do
11
- let(:name) { :test }
12
-
13
- it { should be_instance_of(Repository) }
14
- end
15
-
16
- context 'when is not known' do
17
- let(:name) { :not_here }
18
-
19
- it { should be(nil) }
20
- end
21
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mapper::Attribute::EmbeddedCollection, '#to_ast' do
4
- subject(:attribute) { Mapper::Attribute::EmbeddedCollection.build(:tasks, node: mapper.loader.node) }
5
-
6
- let(:mapper) { Mapper.build([[:id]], model: model) }
7
- let(:model) { mock_model(:id) }
8
-
9
- it 'returns a morpher transformer node' do
10
- loader = Morpher.compile(attribute.to_ast)
11
-
12
- task1 = model.new(id: 1)
13
- task2 = model.new(id: 1)
14
- tuple = { tasks: [{ id: 1 }, { id: 1 }] }
15
-
16
- expect(loader.call(tuple)).to eql([:tasks, [task1, task2]])
17
- end
18
- end
@@ -1,16 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mapper::Attribute::EmbeddedValue, '#to_ast' do
4
- subject(:attribute) { Mapper::Attribute::EmbeddedValue.build(:model, node: mapper.loader.node) }
5
-
6
- let(:mapper) { Mapper.build([[:id]], model: model) }
7
- let(:model) { mock_model(:id) }
8
-
9
- it 'returns a morpher transformer node' do
10
- loader = Morpher.compile(attribute.to_ast)
11
- object = model.new(id: 1)
12
- tuple = { model: { id: 1 } }
13
-
14
- expect(loader.call(tuple)).to eql([:model, object])
15
- end
16
- end
@@ -1,9 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mapper::Attribute, '#rename' do
4
- subject(:attribute) { Mapper::Attribute.build(:title) }
5
-
6
- it 'returns a new attribute with changed name' do
7
- expect(attribute.rename(:book_title)).to eql(Mapper::Attribute.build(:book_title))
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mapper::Attribute, '#to_ast' do
4
- subject(:attribute) { Mapper::Attribute.build(:title) }
5
-
6
- it 'returns a morpher transformer node' do
7
- expect(Morpher.compile(attribute.to_ast).call(title: 'Title', other: 'Foo')).to eql([:title, 'Title'])
8
- end
9
- end
@@ -1,61 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper::Builder, '.call' do
6
- let(:header) { [[:id, Integer], [:user_name, String], [:age, Integer], [:email, String]] }
7
- let(:relation) { Axiom::Relation::Base.new(:users, header) }
8
- let(:model) { mock_model(:id, :name, :email) }
9
- let(:env) { Environment.setup(test: 'memory://test') }
10
- let(:schema) { Hash[users: relation] }
11
-
12
- context 'when attribute mapping is used' do
13
- let(:mapper) { subject.mappers[:users] }
14
-
15
- subject do
16
- user_model = model
17
-
18
- Mapper::Builder.call(schema) do
19
- relation(:users) do
20
- model user_model
21
-
22
- map :id, :email
23
- map :name, from: :user_name
24
- end
25
- end
26
- end
27
-
28
- it 'builds rom mapper' do
29
- expect(mapper.header.map(&:name)).to eql([:id, :email, :name])
30
- expect(mapper.header.map(&:type)).to eql([Integer, String, String])
31
- end
32
-
33
- it 'sets up the model' do
34
- object = mapper.new_object(id: 1, name: 'Jane', email: 'jane@rom.org')
35
- expect(object).to be_instance_of(model)
36
- end
37
- end
38
-
39
- context 'when custom mapper is injected' do
40
- subject do
41
- custom_mapper = test_mapper
42
- Mapper::Builder.call(schema) { relation(:users) { mapper(custom_mapper) } }
43
- end
44
-
45
- let(:test_mapper) { TestMapper.new(header, model) }
46
-
47
- it 'sets the custom mapper' do
48
- expect(subject.mappers[:users]).to be(test_mapper)
49
- end
50
- end
51
-
52
- context 'when unknown relation name is used' do
53
- subject { described_class.call(schema) { not_here(1, 'a') {} } }
54
-
55
- it 'raises error' do
56
- expect { subject }.to raise_error(
57
- NoMethodError, /undefined method `not_here'/
58
- )
59
- end
60
- end
61
- end
@@ -1,55 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper, '.build' do
6
- subject { described_class.build(header, model: model) }
7
-
8
- let(:model) { mock_model(:name) }
9
- let(:attributes) { [[:name, type: String, from: :user_name]] }
10
-
11
- describe 'when header is a primitive' do
12
- let(:header) { attributes }
13
-
14
- its(:model) { should be(model) }
15
-
16
- it 'builds correct header' do
17
- expect(subject.header.mapping).to eql(user_name: :name)
18
- end
19
-
20
- let(:object) { model.new(name: 'Jane') }
21
- let(:params) { Hash[user_name: 'Jane'] }
22
-
23
- specify do
24
- expect(subject.load(params)).to eq(object)
25
- end
26
-
27
- specify do
28
- expect(subject.dump(object)).to eq(params.values)
29
- end
30
- end
31
-
32
- describe 'when header is a mapper header instance' do
33
- let(:header) { Mapper::Header.build(attributes) }
34
- let(:options) { Hash.new }
35
-
36
- its(:model) { should be(model) }
37
- its(:header) { should eql(header) }
38
- end
39
-
40
- describe 'when options has custom loader' do
41
- let(:header) { Mapper::Header.build(attributes) }
42
- let(:options) { Hash[loader: :load_attribute_hash] }
43
-
44
- its(:model) { should be(model) }
45
- its(:header) { should eql(header) }
46
- end
47
-
48
- describe 'loader is set to :load_attribute_accessors' do
49
- let(:header) { Mapper::Header.build(attributes) }
50
- let(:options) { Hash[loader: :load_attribute_accessors] }
51
-
52
- its(:model) { should be(model) }
53
- its(:header) { should eql(header) }
54
- end
55
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper, '#dump' do
6
- include_context 'Mapper'
7
-
8
- it 'dumps the object into data tuple' do
9
- expect(mapper.dump(object)).to eql(data)
10
- end
11
- end
@@ -1,35 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mapper, "#group" do
4
- subject(:mapper) { user.group(tasks: task) }
5
-
6
- let(:user) { Mapper.build([[:name]], model: user_model) }
7
- let(:task) { Mapper.build([[:title]], model: task_model) }
8
-
9
- let(:user_model) { mock_model(:name, :tasks) }
10
- let(:task_model) { mock_model(:title) }
11
-
12
- let(:loader_transformer) do
13
- Morpher.compile(
14
- s(:block,
15
- s(:hash_transform,
16
- s(:block, s(:key_fetch, :name), s(:key_dump, :name)),
17
- s(:key_transform, :tasks, :tasks, s(:map, task.loader.node))
18
- ),
19
- s(:load_instance_variables, s(:param, user_model, :name, :tasks))
20
- )
21
- )
22
- end
23
-
24
- let(:dumper_transformer) do
25
- loader_transformer.inverse
26
- end
27
-
28
- it "returns a mapper that can load wrapped tuples" do
29
- expect(mapper.loader).to eq(loader_transformer)
30
- end
31
-
32
- it "returns a mapper that can dump wrapped objects" do
33
- expect(mapper.dumper).to eq(dumper_transformer)
34
- end
35
- end
@@ -1,26 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper::Header, '#each' do
6
- subject(:header) { Mapper::Header.build([[:id], [:name]]) }
7
-
8
- let(:id) { header[:id] }
9
- let(:name) { header[:name] }
10
-
11
- context 'with a block' do
12
- it 'yields attributes' do
13
- result = []
14
-
15
- header.each { |attribute| result << attribute }
16
-
17
- expect(result).to eql([id, name])
18
- end
19
- end
20
-
21
- context 'without a block' do
22
- subject { header.each }
23
-
24
- it { should be_instance_of(Enumerator) }
25
- end
26
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper::Header, '#[]' do
6
- subject(:header) { Mapper::Header.build([[:id]]) }
7
-
8
- context 'when attribute exists' do
9
- subject { header[:id] }
10
-
11
- let(:id) { Mapper::Attribute.build(:id) }
12
-
13
- it { should eql(id) }
14
- end
15
-
16
- context 'when attribute does not exist' do
17
- specify do
18
- expect { header[:not_here] }.to raise_error(KeyError)
19
- end
20
- end
21
- end
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper::Header, '#group' do
6
- subject(:header) { left.group(models: mapper) }
7
-
8
- let(:left) { Mapper::Header.build([[:id], [:name]]) }
9
- let(:mapper) { Mapper.build([[:id], [:title]]) }
10
-
11
- it 'returns a header with embedded collection attribute' do
12
- expected = Mapper::Header.build([
13
- [:id], [:name], mapper.attribute(Mapper::Attribute::EmbeddedCollection, :models)
14
- ])
15
-
16
- expect(header).to eq(expected)
17
- end
18
- end
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper::Header, '#join' do
6
- subject(:header) { left.join(right) }
7
-
8
- let(:left) { Mapper::Header.build([[:id], [:name]]) }
9
- let(:right) { Mapper::Header.build([[:id], [:title]]) }
10
-
11
- it 'returns a joined header with uniq attributes' do
12
- expect(header).to eql(Mapper::Header.build([[:id], [:name], [:title]]))
13
- end
14
- end
@@ -1,29 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe Mapper::Header, '#keys' do
6
- subject { object.keys }
7
-
8
- let(:object) { Mapper::Header.build(attributes) }
9
- let(:id) { object[:id] }
10
- let(:name) { object[:name] }
11
-
12
- context 'without mapping' do
13
- let(:attributes) { [[:id], [:name]] }
14
-
15
- it { should eql([]) }
16
- end
17
-
18
- context 'with mapping' do
19
- let(:attributes) { [[:id, from: :user_id, key: true], [:name]] }
20
-
21
- it { should eql([id]) }
22
- end
23
-
24
- context 'with multiple keys' do
25
- let(:attributes) { [[:id, key: true], [:name, key: true]] }
26
-
27
- it { should eql([id, name]) }
28
- end
29
- end