datamappify 0.10.1 → 0.20.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 (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