datamappify 0.10.1 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +2 -0
  4. data/CHANGELOG.md +11 -0
  5. data/README.md +55 -29
  6. data/datamappify.gemspec +4 -4
  7. data/lib/datamappify/data/errors.rb +3 -0
  8. data/lib/datamappify/data/provider/active_record/persistence.rb +31 -0
  9. data/lib/datamappify/data/provider/active_record.rb +16 -0
  10. data/lib/datamappify/data/provider/common/persistence.rb +57 -0
  11. data/lib/datamappify/data/provider/common/relational/persistence.rb +85 -0
  12. data/lib/datamappify/data/provider/common/relational/record/mapper.rb +24 -0
  13. data/lib/datamappify/data/provider/common/relational/record/writer.rb +67 -0
  14. data/lib/datamappify/data/provider/sequel/persistence.rb +31 -0
  15. data/lib/datamappify/data/provider/sequel.rb +18 -0
  16. data/lib/datamappify/data.rb +0 -1
  17. data/lib/datamappify/repository/attribute_source_data_class_builder.rb +16 -11
  18. data/lib/datamappify/repository/attributes_mapper.rb +17 -13
  19. data/lib/datamappify/repository/dsl.rb +9 -0
  20. data/lib/datamappify/repository/mapping_hash.rb +8 -0
  21. data/lib/datamappify/repository.rb +96 -4
  22. data/lib/datamappify/util.rb +13 -0
  23. data/lib/datamappify/version.rb +1 -1
  24. data/spec/entity_spec.rb +9 -8
  25. data/spec/repository/persistence_spec.rb +156 -56
  26. data/spec/repository_spec.rb +10 -33
  27. data/spec/spec_helper.rb +14 -8
  28. data/spec/support/entities/hero_user.rb +11 -0
  29. data/spec/support/entities/user.rb +5 -5
  30. data/spec/support/repositories/active_record/comment_repository.rb +6 -0
  31. data/spec/support/repositories/active_record/group_repository.rb +6 -0
  32. data/spec/support/repositories/active_record/role_repository.rb +6 -0
  33. data/spec/support/repositories/active_record/user_repository.rb +11 -0
  34. data/spec/support/repositories/hero_user_repository.rb +9 -0
  35. data/spec/support/repositories/sequel/comment_repository.rb +6 -0
  36. data/spec/support/repositories/sequel/group_repository.rb +6 -0
  37. data/spec/support/repositories/sequel/role_repository.rb +6 -0
  38. data/spec/support/repositories/sequel/user_repository.rb +11 -0
  39. data/spec/support/{active_record_tables.rb → tables/active_record.rb} +15 -9
  40. data/spec/support/tables/sequel.rb +76 -0
  41. metadata +64 -41
  42. data/lib/datamappify/data/base.rb +0 -7
  43. data/lib/datamappify/repository/persistence.rb +0 -137
  44. data/spec/support/repositories/comment_repository.rb +0 -7
  45. data/spec/support/repositories/group_repository.rb +0 -7
  46. data/spec/support/repositories/role_repository.rb +0 -7
  47. data/spec/support/repositories/user_repository.rb +0 -11
@@ -5,6 +5,15 @@ module Datamappify
5
5
  self.entity_class = entity_class
6
6
  end
7
7
 
8
+ def default_provider(provider_name)
9
+ self.class_eval { require "datamappify/data/provider/#{provider_name.to_s.underscore}" }
10
+
11
+ provider_namespace = "Datamappify::Data::#{provider_name}"
12
+
13
+ self.default_provider_class_name = provider_name.to_s
14
+ self.default_data_class_name = self.entity_class.name
15
+ end
16
+
8
17
  def map_attribute(attribute, source)
9
18
  self.custom_attributes_mapping[attribute] = source
10
19
  end
@@ -0,0 +1,8 @@
1
+ module Datamappify
2
+ module Repository
3
+ class MappingHash < Hash
4
+ alias :field_names :keys
5
+ alias :attribute_names :values
6
+ end
7
+ end
8
+ end
@@ -1,20 +1,21 @@
1
1
  require 'singleton'
2
- require 'datamappify/repository/persistence'
2
+ require 'datamappify/util'
3
+ require 'datamappify/repository/mapping_hash'
3
4
  require 'datamappify/repository/dsl'
4
5
  require 'datamappify/repository/attributes_mapper'
5
6
 
6
7
  module Datamappify
7
8
  module Repository
8
- include Persistence
9
-
10
9
  def self.included(klass)
11
10
  klass.class_eval do
12
11
  mattr_accessor :entity_class
12
+ mattr_accessor :default_provider_class_name
13
+ mattr_accessor :default_data_class_name
13
14
  mattr_accessor :custom_attributes_mapping
14
15
  mattr_accessor :data_mapping
15
16
 
16
17
  klass.custom_attributes_mapping = {}
17
- klass.data_mapping = {}
18
+ klass.data_mapping = {}
18
19
 
19
20
  include Singleton
20
21
  extend DSL
@@ -23,6 +24,97 @@ module Datamappify
23
24
 
24
25
  def initialize
25
26
  AttributesMapper.new(self).build_data_classes
27
+ self
28
+ end
29
+
30
+ def find(id_or_ids)
31
+ entities = Array.wrap(id_or_ids).map { |id| entity_class.new(:id => id) }
32
+
33
+ data_mapping_walker do |provider_class_name, data_class_name, data_fields_mapping|
34
+ persistence_class(provider_class_name).new(
35
+ provider_class_name, entities, data_class_name
36
+ ).find(data_fields_mapping)
37
+ end
38
+
39
+ id_or_ids.is_a?(Array) ? entities : entities[0]
40
+ end
41
+
42
+ def save(entity_or_entities)
43
+ Array.wrap(entity_or_entities).each do |entity|
44
+ create_or_update(entity)
45
+ end
46
+
47
+ entity_or_entities
48
+ rescue Datamappify::Data::EntityInvalid
49
+ false
50
+ end
51
+
52
+ def save!(entity_or_entities)
53
+ save(entity_or_entities) || raise(Datamappify::Data::EntityNotSaved)
54
+ end
55
+
56
+ def destroy(id_ids_or_entity_entities)
57
+ ids = Array.wrap(id_ids_or_entity_entities).map do |id_or_entity|
58
+ Util.extract_entity_id(id_or_entity)
59
+ end
60
+
61
+ default_persistence.destroy(ids)
62
+ end
63
+
64
+ def destroy!(id_ids_or_entity_entities)
65
+ destroy(id_ids_or_entity_entities) || raise(Datamappify::Data::EntityNotDestroyed)
66
+ end
67
+
68
+ def method_missing(symbol, *args)
69
+ default_persistence.send symbol, *args
70
+ end
71
+
72
+ private
73
+
74
+ def default_persistence
75
+ persistence_class(default_provider_class_name).new(
76
+ default_provider_class_name, [], default_data_class_name
77
+ )
78
+ end
79
+
80
+ def persistence_class(provider_class_name)
81
+ "Datamappify::Data::Provider::#{provider_class_name}::Persistence".constantize
82
+ end
83
+
84
+ def create_or_update(entity)
85
+ raise Datamappify::Data::EntityInvalid.new(entity) if entity.invalid?
86
+
87
+ default_persistence.exists?(entity.id) ? update(entity) : create(entity)
88
+ end
89
+
90
+ def create(entity)
91
+ data_mapping_walker do |provider_class_name, data_class_name, data_fields_mapping|
92
+ persistence_class(provider_class_name).new(
93
+ provider_class_name, [entity], data_class_name
94
+ ).create(data_fields_mapping)
95
+ end
96
+
97
+ entity
98
+ end
99
+
100
+ def update(entity)
101
+ data_mapping_walker do |provider_class_name, data_class_name, data_fields_mapping|
102
+ persistence_class(provider_class_name).new(
103
+ provider_class_name, [entity], data_class_name
104
+ ).update(data_fields_mapping)
105
+ end
106
+
107
+ entity
108
+ end
109
+
110
+ def data_mapping_walker
111
+ default_persistence.transaction do
112
+ data_mapping.each do |provider_class_name, data_class_mapping|
113
+ data_class_mapping.each do |data_class_name, data_fields_mapping|
114
+ yield(provider_class_name, data_class_name, data_fields_mapping)
115
+ end
116
+ end
117
+ end
26
118
  end
27
119
  end
28
120
  end
@@ -0,0 +1,13 @@
1
+ module Datamappify
2
+ class Util
3
+ class << self
4
+ def attributes_filtered_by(entity, attribute_names)
5
+ entity.attributes.select { |attr| attribute_names.include?(attr) }
6
+ end
7
+
8
+ def extract_entity_id(id_or_entity)
9
+ id_or_entity.is_a?(Integer) ? id_or_entity : id_or_entity.id
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Datamappify
2
- VERSION = '0.10.1'
2
+ VERSION = '0.20.0'
3
3
  end
data/spec/entity_spec.rb CHANGED
@@ -7,32 +7,33 @@ describe Datamappify::Entity do
7
7
 
8
8
  describe "attributes" do
9
9
  it "has defined attributes" do
10
- user.first_name.must_be_nil
10
+ user.first_name.should be_nil
11
+ user.last_name.should be_nil
11
12
  end
12
13
 
13
14
  it "raises error on undefined attributes" do
14
- -> { user.attribute_that_does_not_exist }.must_raise NoMethodError
15
+ -> { user.surname }.should raise_error(NoMethodError)
15
16
  end
16
17
 
17
18
  it "assigns an attribute" do
18
19
  user.first_name = 'Fred'
19
- user.first_name.must_equal 'Fred'
20
+ user.first_name.should == 'Fred'
20
21
  end
21
22
 
22
23
  it "coerces an attribute" do
23
24
  user.age = '42'
24
- user.age.must_be_kind_of Fixnum
25
- user.age.must_equal 42
25
+ user.age.should be_kind_of(Fixnum)
26
+ user.age.should == 42
26
27
  end
27
28
  end
28
29
 
29
30
  describe "validations" do
30
31
  it "validates attributes" do
31
- user.valid?.must_equal false
32
+ user.valid?.should == false
32
33
 
33
34
  user.first_name = 'Fred'
34
- user.passport = 'FREDWU42'
35
- user.valid?.must_equal true
35
+ user.driver_license = 'FREDWU42'
36
+ user.valid?.should == true
36
37
  end
37
38
  end
38
39
  end
@@ -1,95 +1,195 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
- describe Datamappify::Repository do
4
- let(:user_repository) { UserRepository.instance }
5
- let(:user) { User.new(:id => 1, :first_name => 'Fred', :gender => 'male', :passport => 'FREDWU42') }
6
- let(:user_valid) { User.new(:first_name => 'Batman', :gender => 'male', :passport => 'ARKHAMCITY') }
7
- let(:user_invalid) { User.new(:first_name => 'a') }
8
-
9
- let(:has_db_user) do
10
- Datamappify::Data::User.create!(:first_name => 'Fred', :sex => 'male')
11
- Datamappify::Data::UserPassport.create!(:number => 'FREDWU42', :user_id => 1)
12
- end
3
+ shared_examples_for "repository persistence" do |data_provider|
4
+ let!(:user_repository) { "UserRepository#{data_provider}".constantize.instance }
5
+ let(:existing_user) { User.new(:id => 1, :first_name => 'Fred', :driver_license => 'FREDWU42') }
6
+ let(:new_valid_user) { User.new(:first_name => 'Batman', :driver_license => 'ARKHAMCITY') }
7
+ let(:new_valid_user2) { User.new(:first_name => 'Ironman', :driver_license => 'NEWYORKCITY') }
8
+ let(:new_invalid_user) { User.new(:first_name => 'a') }
9
+ let(:new_invalid_user2) { User.new(:first_name => 'b') }
10
+ let(:data_passports) { "Datamappify::Data::#{data_provider}::UserPassport".constantize }
11
+ let(:data_driver_licenses) { "Datamappify::Data::#{data_provider}::UserDriverLicense".constantize }
13
12
 
14
13
  before do
15
- user_repository
14
+ user_repository.save(existing_user)
16
15
  end
17
16
 
18
17
  describe "#find" do
19
- it "found" do
20
- has_db_user
18
+ describe "resource" do
19
+ let!(:user) { user_repository.save(existing_user) }
21
20
 
22
- user_repository.find(1).must_equal user
23
- user_repository.find([1]).must_equal [user]
24
- end
21
+ it "found" do
22
+ user_repository.find(user.id).should == existing_user
23
+ user_repository.find([user.id]).should == [existing_user]
24
+ end
25
25
 
26
- it "not found" do
27
- user_repository.find(1).must_equal nil
26
+ it "not found" do
27
+ user_repository.find(42).should == nil
28
+ end
28
29
  end
29
30
 
30
- it "partial found collection" do
31
- has_db_user
31
+ describe "collection" do
32
+ let!(:user) { user_repository.save(existing_user) }
33
+
34
+ it "found" do
35
+ user_repository.find([user.id]).should == [existing_user]
36
+ end
37
+
38
+ it "partial found" do
39
+ user_repository.find([user.id, 42]).should == [existing_user]
40
+ end
32
41
 
33
- user_repository.find([1, 2]).must_equal [user]
42
+ it "not found" do
43
+ user_repository.find([42, 255]).should == []
44
+ end
34
45
  end
35
46
  end
36
47
 
37
48
  describe "#save" do
38
49
  it "success" do
39
- user_repository.save(user_valid)
40
- user_repository.count.must_equal 1
50
+ new_user = nil
41
51
 
42
- new_user = user_repository.find(1)
43
- new_user.must_be_kind_of User
44
- new_user.first_name.must_equal 'Batman'
45
- new_user.passport.must_equal 'ARKHAMCITY'
52
+ expect { new_user = user_repository.save(new_valid_user) }.to change { user_repository.count }.by(1)
53
+
54
+ new_user.should be_kind_of(User)
55
+ new_user.first_name.should == 'Batman'
56
+ new_user.driver_license.should == 'ARKHAMCITY'
46
57
  end
47
58
 
48
59
  it "failure" do
49
- -> { user_repository.save!(user_invalid) }.must_raise Datamappify::Data::EntityNotSaved
60
+ -> { user_repository.save!(new_invalid_user) }.should raise_error(Datamappify::Data::EntityNotSaved)
50
61
  end
51
62
 
52
63
  it "transaction" do
53
- user_valid.driver_license = 'DEVOPS'
54
- -> { user_repository.save(user_valid) }.must_raise ActiveRecord::StatementInvalid
64
+ new_valid_user.passport = 'DEVOPS'
65
+
66
+ save_action = Proc.new { -> { user_repository.save(new_valid_user) }.should raise_error }
55
67
 
56
- user_repository.count.must_equal 0
57
- Datamappify::Data::UserPassport.count.must_equal 0
58
- Datamappify::Data::UserDriverLicense.count.must_equal 0
68
+ expect { save_action.call }.to change { user_repository.count }.by(0)
69
+ expect { save_action.call }.to change { data_passports.count }.by(0)
70
+ expect { save_action.call }.to change { data_driver_licenses.count }.by(0)
59
71
  end
60
- end
61
72
 
62
- it "updates an existing record" do
63
- has_db_user
73
+ describe "update multiple entities" do
74
+ describe "#save" do
75
+ it "all successes" do
76
+ expect { user_repository.save([new_valid_user, new_valid_user2]) }.to change { user_repository.count }.by(2)
77
+ end
78
+
79
+ it "successes + failures" do
80
+ expect { user_repository.save([new_valid_user, new_invalid_user]) }.to change { user_repository.count }.by(1)
81
+ end
82
+
83
+ it "all failures" do
84
+ expect { user_repository.save([new_invalid_user, new_invalid_user2]) }.to change { user_repository.count }.by(0)
85
+ end
86
+ end
87
+
88
+ describe "#save!" do
89
+ it "all successes" do
90
+ expect { user_repository.save!([new_valid_user, new_valid_user2]) }.to change { user_repository.count }.by(2)
91
+ end
92
+
93
+ it "successes + failures" do
94
+ expect { -> { user_repository.save!([new_valid_user, new_invalid_user]) }.should raise_error(Datamappify::Data::EntityNotSaved) }.to change { user_repository.count }.by(1)
95
+ end
96
+
97
+ it "all failures" do
98
+ expect { -> { user_repository.save!([new_invalid_user, new_invalid_user2]) }.should raise_error(Datamappify::Data::EntityNotSaved) }.to change { user_repository.count }.by(0)
99
+ end
100
+ end
101
+ end
102
+
103
+ describe "update an existing entity" do
104
+ it "updates existing records" do
105
+ user = user_repository.find(1)
106
+
107
+ user.first_name = 'Vivian'
108
+ user.driver_license = 'LOCOMOTE'
109
+
110
+ updated_user = nil
111
+
112
+ expect { updated_user = user_repository.save(user) }.to change { user_repository.count }.by(0)
113
+
114
+ updated_user.first_name.should == 'Vivian'
115
+ updated_user.driver_license.should == 'LOCOMOTE'
116
+
117
+ persisted_user = user_repository.find(updated_user.id)
118
+
119
+ persisted_user.first_name.should == 'Vivian'
120
+ persisted_user.driver_license.should == 'LOCOMOTE'
121
+ end
122
+
123
+ it "updates existing and new records" do
124
+ user = user_repository.find(1)
64
125
 
65
- user.first_name = 'Vivian'
66
- user.gender = 'female'
67
- user.passport = 'LOCOMOTE'
126
+ user.first_name = 'Vivian'
127
+ user.health_care = 'BATMANCAVE'
68
128
 
69
- updated_user = user_repository.save(user)
70
- updated_user.first_name.must_equal 'Vivian'
71
- updated_user.gender.must_equal 'female'
72
- updated_user.passport.must_equal 'LOCOMOTE'
129
+ updated_user = nil
73
130
 
74
- persisted_user = user_repository.find(user.id)
75
- persisted_user.first_name.must_equal 'Vivian'
76
- persisted_user.gender.must_equal 'female'
77
- persisted_user.passport.must_equal 'LOCOMOTE'
131
+ expect { updated_user = user_repository.save(user) }.to change { user_repository.count }.by(0)
78
132
 
79
- user_repository.count.must_equal 1
133
+ updated_user.first_name.should == 'Vivian'
134
+ updated_user.health_care.should == 'BATMANCAVE'
135
+
136
+ persisted_user = user_repository.find(updated_user.id)
137
+
138
+ persisted_user.first_name.should == 'Vivian'
139
+ persisted_user.health_care.should == 'BATMANCAVE'
140
+ end
141
+ end
80
142
  end
81
143
 
82
- it "#destroy via id" do
83
- has_db_user
144
+ describe "#destroy" do
145
+ describe "resource" do
146
+ let!(:user) { user_repository.save(new_valid_user) }
84
147
 
85
- user_repository.destroy!(1)
86
- user_repository.count.must_equal 0
148
+ it "via id" do
149
+ expect { user_repository.destroy!(user.id) }.to change { user_repository.count }.by(-1)
150
+ end
151
+
152
+ it "via entity" do
153
+ expect { user_repository.destroy!(user) }.to change { user_repository.count }.by(-1)
154
+ end
155
+ end
156
+
157
+ describe "collection" do
158
+ let!(:users) { user_repository.save([new_valid_user, new_valid_user2]) }
159
+
160
+ it "via id" do
161
+ expect { user_repository.destroy!(users.map(&:id)) }.to change { user_repository.count }.by(-2)
162
+ end
163
+
164
+ it "via entity" do
165
+ expect { user_repository.destroy!(users) }.to change { user_repository.count }.by(-2)
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ describe Datamappify::Repository do
172
+ DATA_PROVIDERS.each do |data_provider|
173
+ it_behaves_like "repository persistence", data_provider
87
174
  end
88
175
 
89
- it "#destroy via entity" do
90
- has_db_user
176
+ describe "entity composed from multiple data providers" do
177
+ let!(:hero_repository) { HeroUserRepository.instance }
178
+ let!(:hero) { HeroUser.new :first_name => 'Aaron', :last_name => 'Patterson' }
91
179
 
92
- user_repository.destroy!(user)
93
- user_repository.count.must_equal 0
180
+ it "#find" do
181
+ saved_hero = nil
182
+
183
+ expect { saved_hero = hero_repository.save!(hero) }.to change { hero_repository.count }.by(1)
184
+
185
+ saved_hero.first_name.should == 'Aaron'
186
+ saved_hero.last_name.should == 'Patterson'
187
+ saved_hero.nickname = 'unsaved nickname'
188
+
189
+ persisted_hero = hero_repository.find(saved_hero.id)
190
+ persisted_hero.first_name.should == 'Aaron'
191
+ persisted_hero.last_name.should == 'Patterson'
192
+ persisted_hero.nickname.should be_nil
193
+ end
94
194
  end
95
195
  end
@@ -1,40 +1,17 @@
1
1
  require_relative 'spec_helper'
2
2
 
3
- describe Datamappify::Repository do
4
- let(:user_repository) { UserRepository.instance }
5
- let(:comment_repository) { CommentRepository.instance }
6
- let(:role_repository) { RoleRepository.instance }
7
- let(:group_repository) { GroupRepository.instance }
3
+ shared_examples_for "a repository" do |data_provider|
4
+ let(:data_provider_module) { "Datamappify::Data::#{data_provider}".constantize }
5
+ let!(:user_repository) { "UserRepository#{data_provider}".constantize.instance }
6
+ subject { data_provider_module }
8
7
 
9
- before do
10
- user_repository
11
- comment_repository
12
- role_repository
13
- group_repository
8
+ it "defines the data class after the repository is initialised" do
9
+ subject.const_defined?(:User, false).should == true
14
10
  end
11
+ end
15
12
 
16
- describe "ActiveRecord data objects" do
17
- it "defines the Data::User class after the repository is initialised" do
18
- Datamappify::Data.const_defined?(:User, false).must_equal true
19
- end
20
-
21
- describe "data objects" do
22
- subject { Datamappify::Data::User }
23
-
24
- it "inherites from Datamappify::Data::Base" do
25
- subject.superclass.must_equal Datamappify::Data::Base
26
- subject.ancestors.must_include ActiveRecord::Base
27
- end
28
-
29
- it "has 'users' as the table name" do
30
- subject.table_name.must_equal 'users'
31
- end
32
- end
33
-
34
- def assert_correct_associated_data_class_name(klass, association_name, data_class_name)
35
- klass.class.reflect_on_all_associations.find { |a|
36
- a.name == association_name
37
- }.klass.name.must_equal data_class_name
38
- end
13
+ describe Datamappify::Repository do
14
+ DATA_PROVIDERS.each do |data_provider|
15
+ it_behaves_like "a repository", data_provider
39
16
  end
40
17
  end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,13 @@
1
+ require 'coveralls'
1
2
  require 'simplecov'
2
3
  require 'pry'
3
- require 'minitest/autorun'
4
- require 'minitest/spec'
5
- require 'minitest/colorize'
4
+ require 'rspec/autorun'
6
5
  require 'database_cleaner'
7
6
 
8
- SimpleCov.start
7
+ case ENV['COV'].to_i
8
+ when 1 then SimpleCov.start
9
+ when 2 then Coveralls.wear!
10
+ end
9
11
 
10
12
  SimpleCov.configure do
11
13
  add_filter "/spec/"
@@ -13,12 +15,16 @@ end
13
15
 
14
16
  require File.expand_path('../../lib/datamappify', __FILE__)
15
17
 
16
- Dir[File.expand_path('../support/**/*.rb', __FILE__)].each { |f| require f }
18
+ %w{tables entities repositories}.each do |sub_dir|
19
+ Dir[File.expand_path("../support/#{sub_dir}/**/*.rb", __FILE__)].each { |f| require f }
20
+ end
21
+
22
+ DATA_PROVIDERS = %w{ActiveRecord Sequel}
17
23
 
18
- DatabaseCleaner.strategy = :truncation
24
+ RSpec.configure do |config|
25
+ DatabaseCleaner.strategy = :truncation
19
26
 
20
- class MiniTest::Spec
21
- before do
27
+ config.before do
22
28
  DatabaseCleaner.clean
23
29
  end
24
30
  end
@@ -0,0 +1,11 @@
1
+ class HeroUser
2
+ include Datamappify::Entity
3
+
4
+ attribute :first_name, String
5
+ attribute :last_name, String
6
+ attribute :nickname, String
7
+
8
+ def full_name
9
+ "#{first_name} #{last_name}"
10
+ end
11
+ end
@@ -3,15 +3,15 @@ class User
3
3
 
4
4
  attribute :first_name, String
5
5
  attribute :last_name, String
6
- attribute :gender, String
7
6
  attribute :age, Integer
8
7
  attribute :passport, String
9
8
  attribute :driver_license, String
9
+ attribute :health_care, String
10
10
 
11
- validates :first_name, :presence => true,
12
- :length => { :minimum => 2 }
13
- validates :passport, :presence => true,
14
- :length => { :minimum => 8 }
11
+ validates :first_name, :presence => true,
12
+ :length => { :minimum => 2 }
13
+ validates :driver_license, :presence => true,
14
+ :length => { :minimum => 8 }
15
15
 
16
16
  def full_name
17
17
  "#{first_name} #{last_name}"
@@ -0,0 +1,6 @@
1
+ class CommentRepositoryActiveRecord
2
+ include Datamappify::Repository
3
+
4
+ for_entity Comment
5
+ default_provider :ActiveRecord
6
+ end
@@ -0,0 +1,6 @@
1
+ class GroupRepositoryActiveRecord
2
+ include Datamappify::Repository
3
+
4
+ for_entity Group
5
+ default_provider :ActiveRecord
6
+ end
@@ -0,0 +1,6 @@
1
+ class RoleRepositoryActiveRecord
2
+ include Datamappify::Repository
3
+
4
+ for_entity Role
5
+ default_provider :ActiveRecord
6
+ end
@@ -0,0 +1,11 @@
1
+ class UserRepositoryActiveRecord
2
+ include Datamappify::Repository
3
+
4
+ for_entity User
5
+ default_provider :ActiveRecord
6
+
7
+ map_attribute :last_name, 'ActiveRecord::User#surname'
8
+ map_attribute :driver_license, 'ActiveRecord::UserDriverLicense#number'
9
+ map_attribute :passport, 'ActiveRecord::UserPassport#number'
10
+ map_attribute :health_care, 'ActiveRecord::UserHealthCare#number'
11
+ end
@@ -0,0 +1,9 @@
1
+ class HeroUserRepository
2
+ include Datamappify::Repository
3
+
4
+ for_entity HeroUser
5
+ default_provider :ActiveRecord
6
+
7
+ map_attribute :first_name, 'ActiveRecord::HeroUser#first_name'
8
+ map_attribute :last_name, 'Sequel::HeroUserLastName#last_name'
9
+ end
@@ -0,0 +1,6 @@
1
+ class CommentRepositorySequel
2
+ include Datamappify::Repository
3
+
4
+ for_entity Comment
5
+ default_provider :Sequel
6
+ end
@@ -0,0 +1,6 @@
1
+ class GroupRepositorySequel
2
+ include Datamappify::Repository
3
+
4
+ for_entity Group
5
+ default_provider :Sequel
6
+ end
@@ -0,0 +1,6 @@
1
+ class RoleRepositorySequel
2
+ include Datamappify::Repository
3
+
4
+ for_entity Role
5
+ default_provider :Sequel
6
+ end
@@ -0,0 +1,11 @@
1
+ class UserRepositorySequel
2
+ include Datamappify::Repository
3
+
4
+ for_entity User
5
+ default_provider :Sequel
6
+
7
+ map_attribute :last_name, 'Sequel::User#surname'
8
+ map_attribute :driver_license, 'Sequel::UserDriverLicense#number'
9
+ map_attribute :passport, 'Sequel::UserPassport#number'
10
+ map_attribute :health_care, 'Sequel::UserHealthCare#number'
11
+ end