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