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,17 +5,15 @@ ActiveRecord::Migration.suppress_messages do
5
5
  )
6
6
 
7
7
  ActiveRecord::Schema.define(:version => 0) do
8
- begin
9
- drop_table :users
10
- drop_table :comments
11
- drop_table :roles
12
- rescue
8
+ create_table :hero_users do |t|
9
+ t.string :first_name, :null => false
10
+ t.string :nickname
11
+ t.timestamps
13
12
  end
14
13
 
15
14
  create_table :users do |t|
16
15
  t.string :first_name, :null => false
17
- t.string :last_name
18
- t.string :sex, :null => false
16
+ t.string :surname
19
17
  t.integer :age
20
18
  t.references :role
21
19
  t.timestamps
@@ -42,17 +40,25 @@ ActiveRecord::Migration.suppress_messages do
42
40
  t.belongs_to :group
43
41
  end
44
42
 
45
- create_table :user_passports do |t|
43
+ create_table :user_driver_licenses do |t|
46
44
  t.string :number
45
+ t.string :expiry
47
46
  t.belongs_to :user
48
47
  t.timestamps
49
48
  end
50
49
 
51
- create_table :user_driver_licenses do |t|
50
+ create_table :user_passports do |t|
52
51
  t.string :number
53
52
  t.string :expiry, :null => false
54
53
  t.belongs_to :user
55
54
  t.timestamps
56
55
  end
56
+
57
+ create_table :user_health_cares do |t|
58
+ t.string :number
59
+ t.string :expiry
60
+ t.belongs_to :user
61
+ t.timestamps
62
+ end
57
63
  end
58
64
  end
@@ -0,0 +1,76 @@
1
+ require 'sequel'
2
+
3
+ DB = Sequel.sqlite
4
+
5
+ DB.create_table :hero_user_last_names do
6
+ primary_key :id
7
+ String :last_name, :null => false
8
+ Integer :hero_user_id
9
+ DateTime :created_at
10
+ DateTime :updated_at
11
+ end
12
+
13
+ DB.create_table :users do
14
+ primary_key :id
15
+ String :first_name, :null => false
16
+ String :surname
17
+ Integer :age
18
+ foreign_key :role_id
19
+ DateTime :created_at
20
+ DateTime :updated_at
21
+ end
22
+
23
+ DB.create_table :comments do
24
+ primary_key :id
25
+ String :content
26
+ foreign_key :user_id
27
+ DateTime :created_at
28
+ DateTime :updated_at
29
+ end
30
+
31
+ DB.create_table :roles do
32
+ primary_key :id
33
+ String :name
34
+ DateTime :created_at
35
+ DateTime :updated_at
36
+ end
37
+
38
+ DB.create_table :groups do
39
+ primary_key :id
40
+ String :name
41
+ DateTime :created_at
42
+ DateTime :updated_at
43
+ end
44
+
45
+ DB.create_table :groups_users do
46
+ primary_key :id
47
+ foreign_key :user_id
48
+ foreign_key :group_id
49
+ end
50
+
51
+ DB.create_table :user_driver_licenses do
52
+ primary_key :id
53
+ String :number
54
+ String :expiry
55
+ foreign_key :user_id
56
+ DateTime :created_at
57
+ DateTime :updated_at
58
+ end
59
+
60
+ DB.create_table :user_passports do
61
+ primary_key :id
62
+ String :number
63
+ String :expiry, :null => false
64
+ foreign_key :user_id
65
+ DateTime :created_at
66
+ DateTime :updated_at
67
+ end
68
+
69
+ DB.create_table :user_health_cares do
70
+ primary_key :id
71
+ String :number
72
+ String :expiry
73
+ foreign_key :user_id
74
+ DateTime :created_at
75
+ DateTime :updated_at
76
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datamappify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Wu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-16 00:00:00.000000000 Z
11
+ date: 2013-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: virtus
@@ -44,26 +44,6 @@ dependencies:
44
44
  - - <
45
45
  - !ruby/object:Gem::Version
46
46
  version: '5'
47
- - !ruby/object:Gem::Dependency
48
- name: activerecord
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - '>='
52
- - !ruby/object:Gem::Version
53
- version: 4.0.0.beta1
54
- - - <
55
- - !ruby/object:Gem::Version
56
- version: '5'
57
- type: :runtime
58
- prerelease: false
59
- version_requirements: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - '>='
62
- - !ruby/object:Gem::Version
63
- version: 4.0.0.beta1
64
- - - <
65
- - !ruby/object:Gem::Version
66
- version: '5'
67
47
  - !ruby/object:Gem::Dependency
68
48
  name: bundler
69
49
  requirement: !ruby/object:Gem::Requirement
@@ -93,7 +73,7 @@ dependencies:
93
73
  - !ruby/object:Gem::Version
94
74
  version: '0'
95
75
  - !ruby/object:Gem::Dependency
96
- name: minitest
76
+ name: rspec
97
77
  requirement: !ruby/object:Gem::Requirement
98
78
  requirements:
99
79
  - - '>='
@@ -107,7 +87,7 @@ dependencies:
107
87
  - !ruby/object:Gem::Version
108
88
  version: '0'
109
89
  - !ruby/object:Gem::Dependency
110
- name: minitest-colorize
90
+ name: pry
111
91
  requirement: !ruby/object:Gem::Requirement
112
92
  requirements:
113
93
  - - '>='
@@ -121,7 +101,7 @@ dependencies:
121
101
  - !ruby/object:Gem::Version
122
102
  version: '0'
123
103
  - !ruby/object:Gem::Dependency
124
- name: testrbl
104
+ name: simplecov
125
105
  requirement: !ruby/object:Gem::Requirement
126
106
  requirements:
127
107
  - - '>='
@@ -135,7 +115,7 @@ dependencies:
135
115
  - !ruby/object:Gem::Version
136
116
  version: '0'
137
117
  - !ruby/object:Gem::Dependency
138
- name: pry
118
+ name: cane
139
119
  requirement: !ruby/object:Gem::Requirement
140
120
  requirements:
141
121
  - - '>='
@@ -149,7 +129,7 @@ dependencies:
149
129
  - !ruby/object:Gem::Version
150
130
  version: '0'
151
131
  - !ruby/object:Gem::Dependency
152
- name: simplecov
132
+ name: coveralls
153
133
  requirement: !ruby/object:Gem::Requirement
154
134
  requirements:
155
135
  - - '>='
@@ -163,7 +143,7 @@ dependencies:
163
143
  - !ruby/object:Gem::Version
164
144
  version: '0'
165
145
  - !ruby/object:Gem::Dependency
166
- name: cane
146
+ name: sqlite3
167
147
  requirement: !ruby/object:Gem::Requirement
168
148
  requirements:
169
149
  - - '>='
@@ -177,7 +157,7 @@ dependencies:
177
157
  - !ruby/object:Gem::Version
178
158
  version: '0'
179
159
  - !ruby/object:Gem::Dependency
180
- name: sqlite3
160
+ name: sequel
181
161
  requirement: !ruby/object:Gem::Requirement
182
162
  requirements:
183
163
  - - '>='
@@ -190,6 +170,26 @@ dependencies:
190
170
  - - '>='
191
171
  - !ruby/object:Gem::Version
192
172
  version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: activerecord
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - '>='
178
+ - !ruby/object:Gem::Version
179
+ version: 4.0.0.beta1
180
+ - - <
181
+ - !ruby/object:Gem::Version
182
+ version: '5'
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - '>='
188
+ - !ruby/object:Gem::Version
189
+ version: 4.0.0.beta1
190
+ - - <
191
+ - !ruby/object:Gem::Version
192
+ version: '5'
193
193
  - !ruby/object:Gem::Dependency
194
194
  name: database_cleaner
195
195
  requirement: !ruby/object:Gem::Requirement
@@ -218,6 +218,7 @@ extensions: []
218
218
  extra_rdoc_files: []
219
219
  files:
220
220
  - .gitignore
221
+ - .rspec
221
222
  - .travis.yml
222
223
  - CHANGELOG.md
223
224
  - Gemfile
@@ -226,28 +227,43 @@ files:
226
227
  - datamappify.gemspec
227
228
  - lib/datamappify.rb
228
229
  - lib/datamappify/data.rb
229
- - lib/datamappify/data/base.rb
230
230
  - lib/datamappify/data/errors.rb
231
+ - lib/datamappify/data/provider/active_record.rb
232
+ - lib/datamappify/data/provider/active_record/persistence.rb
233
+ - lib/datamappify/data/provider/common/persistence.rb
234
+ - lib/datamappify/data/provider/common/relational/persistence.rb
235
+ - lib/datamappify/data/provider/common/relational/record/mapper.rb
236
+ - lib/datamappify/data/provider/common/relational/record/writer.rb
237
+ - lib/datamappify/data/provider/sequel.rb
238
+ - lib/datamappify/data/provider/sequel/persistence.rb
231
239
  - lib/datamappify/entity.rb
232
240
  - lib/datamappify/repository.rb
233
241
  - lib/datamappify/repository/attribute_source_data_class_builder.rb
234
242
  - lib/datamappify/repository/attributes_mapper.rb
235
243
  - lib/datamappify/repository/dsl.rb
236
- - lib/datamappify/repository/persistence.rb
244
+ - lib/datamappify/repository/mapping_hash.rb
245
+ - lib/datamappify/util.rb
237
246
  - lib/datamappify/version.rb
238
247
  - spec/entity_spec.rb
239
248
  - spec/repository/persistence_spec.rb
240
249
  - spec/repository_spec.rb
241
250
  - spec/spec_helper.rb
242
- - spec/support/active_record_tables.rb
243
251
  - spec/support/entities/comment.rb
244
252
  - spec/support/entities/group.rb
253
+ - spec/support/entities/hero_user.rb
245
254
  - spec/support/entities/role.rb
246
255
  - spec/support/entities/user.rb
247
- - spec/support/repositories/comment_repository.rb
248
- - spec/support/repositories/group_repository.rb
249
- - spec/support/repositories/role_repository.rb
250
- - spec/support/repositories/user_repository.rb
256
+ - spec/support/repositories/active_record/comment_repository.rb
257
+ - spec/support/repositories/active_record/group_repository.rb
258
+ - spec/support/repositories/active_record/role_repository.rb
259
+ - spec/support/repositories/active_record/user_repository.rb
260
+ - spec/support/repositories/hero_user_repository.rb
261
+ - spec/support/repositories/sequel/comment_repository.rb
262
+ - spec/support/repositories/sequel/group_repository.rb
263
+ - spec/support/repositories/sequel/role_repository.rb
264
+ - spec/support/repositories/sequel/user_repository.rb
265
+ - spec/support/tables/active_record.rb
266
+ - spec/support/tables/sequel.rb
251
267
  homepage: https://github.com/fredwu/datamappify
252
268
  licenses:
253
269
  - MIT
@@ -277,12 +293,19 @@ test_files:
277
293
  - spec/repository/persistence_spec.rb
278
294
  - spec/repository_spec.rb
279
295
  - spec/spec_helper.rb
280
- - spec/support/active_record_tables.rb
281
296
  - spec/support/entities/comment.rb
282
297
  - spec/support/entities/group.rb
298
+ - spec/support/entities/hero_user.rb
283
299
  - spec/support/entities/role.rb
284
300
  - spec/support/entities/user.rb
285
- - spec/support/repositories/comment_repository.rb
286
- - spec/support/repositories/group_repository.rb
287
- - spec/support/repositories/role_repository.rb
288
- - spec/support/repositories/user_repository.rb
301
+ - spec/support/repositories/active_record/comment_repository.rb
302
+ - spec/support/repositories/active_record/group_repository.rb
303
+ - spec/support/repositories/active_record/role_repository.rb
304
+ - spec/support/repositories/active_record/user_repository.rb
305
+ - spec/support/repositories/hero_user_repository.rb
306
+ - spec/support/repositories/sequel/comment_repository.rb
307
+ - spec/support/repositories/sequel/group_repository.rb
308
+ - spec/support/repositories/sequel/role_repository.rb
309
+ - spec/support/repositories/sequel/user_repository.rb
310
+ - spec/support/tables/active_record.rb
311
+ - spec/support/tables/sequel.rb
@@ -1,7 +0,0 @@
1
- module Datamappify
2
- module Data
3
- class Base < ActiveRecord::Base
4
- self.abstract_class = true
5
- end
6
- end
7
- end
@@ -1,137 +0,0 @@
1
- module Datamappify
2
- module Repository
3
- module Persistence
4
- def find(id_or_ids)
5
- if id_or_ids.is_a?(Array)
6
- find_many(id_or_ids)
7
- else
8
- find_one(id_or_ids)
9
- end
10
- end
11
-
12
- def save(entity)
13
- create_or_update(entity)
14
- rescue Datamappify::Data::EntityInvalid
15
- false
16
- end
17
-
18
- def save!(entity)
19
- save(entity) || raise(Datamappify::Data::EntityNotSaved)
20
- end
21
-
22
- def destroy(id_or_entity)
23
- default_data_class.send :destroy, extract_entity_id(id_or_entity)
24
- end
25
-
26
- def destroy!(id_or_entity)
27
- destroy(id_or_entity) || raise(Datamappify::Data::EntityNotDestroyed)
28
- end
29
-
30
- def method_missing(symbol, *args)
31
- default_data_class.send symbol, *args
32
- end
33
-
34
- private
35
-
36
- def find_many(ids)
37
- ids.map { |id| find_one(id) }.compact
38
- end
39
-
40
- def find_one(id)
41
- exists?(id) ? entity_class.new(data_mapping_walker(data_mapping, id)) : nil
42
- end
43
-
44
- def create_or_update(entity)
45
- raise Datamappify::Data::EntityInvalid.new(entity) if entity.invalid?
46
-
47
- entity.id ? update(entity) : create(entity)
48
- end
49
-
50
- def create(entity)
51
- entity_class.new data_mapping_walker(data_mapping, nil, entity.attributes)
52
- end
53
-
54
- def update(entity)
55
- entity_class.new data_mapping_walker(data_mapping, entity.id, entity.attributes)
56
- end
57
-
58
- def data_mapping_walker(data_mapping, main_object_id, updated_attributes = nil)
59
- composed_attributes = {}
60
-
61
- default_data_class.transaction do
62
-
63
- data_mapping.each do |data_class_name, data_fields_mapping|
64
- values = extract_data_field_values(
65
- data_class_name, main_object_id, updated_attributes, data_fields_mapping
66
- )
67
-
68
- data_fields_with_values = {}
69
-
70
- data_fields_mapping.each_with_index do |(data_field_name, attribute_name), index|
71
- composed_attributes[attribute_name] = data_fields_with_values[data_field_name] = values[index]
72
- end
73
-
74
- if updated_attributes && data_fields_need_updating?(data_fields_with_values)
75
- create_or_update_data_object(data_class_name, main_object_id, data_fields_with_values)
76
- end
77
- end
78
-
79
- end
80
-
81
- composed_attributes
82
- end
83
-
84
- def default_data_class
85
- data_class(entity_class.name)
86
- end
87
-
88
- def data_class(data_class_name)
89
- "Datamappify::Data::#{data_class_name}".constantize
90
- end
91
-
92
- def key_field_name(data_class_name)
93
- entity_class.name == data_class_name ? :id : foreign_key_field_name
94
- end
95
-
96
- def foreign_key_field_name
97
- "#{entity_class.name.underscore}_id".to_sym
98
- end
99
-
100
- def extract_data_field_values(data_class_name, id, updated_attributes, data_fields_mapping)
101
- if updated_attributes.nil?
102
- find_data_field_values_from_db(data_class_name, id, data_fields_mapping.keys)
103
- else
104
- find_data_field_values_from_attributes(updated_attributes, data_fields_mapping.values)
105
- end
106
- end
107
-
108
- def find_data_field_values_from_db(data_class_name, id, data_field_names)
109
- data_class(data_class_name).where(:id => id).pluck(*data_field_names).flatten
110
- end
111
-
112
- def find_data_field_values_from_attributes(attributes, attribute_names)
113
- attribute_names.map { |name| attributes[name] }
114
- end
115
-
116
- def data_fields_need_updating?(data_fields_with_values)
117
- data_fields_with_values.values.compact.any?
118
- end
119
-
120
- def create_or_update_data_object(data_class_name, main_object_id, data_fields_with_values)
121
- unless entity_class.name == data_class_name
122
- data_fields_with_values[foreign_key_field_name] = main_object_id
123
- end
124
-
125
- data_object = data_class(data_class_name).find_or_initialize_by(
126
- key_field_name(data_class_name) => main_object_id
127
- )
128
-
129
- data_object.update_attributes data_fields_with_values
130
- end
131
-
132
- def extract_entity_id(id_or_entity)
133
- id_or_entity.is_a?(Integer) ? id_or_entity : id_or_entity.id
134
- end
135
- end
136
- end
137
- end
@@ -1,7 +0,0 @@
1
- require_relative '../entities/comment'
2
-
3
- class CommentRepository
4
- include Datamappify::Repository
5
-
6
- for_entity Comment
7
- end
@@ -1,7 +0,0 @@
1
- require_relative '../entities/group'
2
-
3
- class GroupRepository
4
- include Datamappify::Repository
5
-
6
- for_entity Group
7
- end
@@ -1,7 +0,0 @@
1
- require_relative '../entities/role'
2
-
3
- class RoleRepository
4
- include Datamappify::Repository
5
-
6
- for_entity Role
7
- end
@@ -1,11 +0,0 @@
1
- require_relative '../entities/user'
2
-
3
- class UserRepository
4
- include Datamappify::Repository
5
-
6
- for_entity User
7
-
8
- map_attribute :gender, 'User#sex'
9
- map_attribute :passport, 'UserPassport#number'
10
- map_attribute :driver_license, 'UserDriverLicense#number'
11
- end