datamappify 0.20.1 → 0.30.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.yardopts +1 -0
  4. data/CHANGELOG.md +10 -4
  5. data/README.md +28 -33
  6. data/datamappify.gemspec +3 -1
  7. data/lib/datamappify/data/criteria/active_record/count.rb +12 -0
  8. data/lib/datamappify/data/criteria/active_record/destroy.rb +17 -0
  9. data/lib/datamappify/data/criteria/active_record/exists.rb +13 -0
  10. data/lib/datamappify/data/criteria/active_record/find.rb +12 -0
  11. data/lib/datamappify/data/criteria/active_record/find_by_key.rb +12 -0
  12. data/lib/datamappify/data/criteria/active_record/save.rb +23 -0
  13. data/lib/datamappify/data/criteria/active_record/save_by_key.rb +14 -0
  14. data/lib/datamappify/data/criteria/active_record/transaction.rb +13 -0
  15. data/lib/datamappify/data/criteria/common.rb +96 -0
  16. data/lib/datamappify/data/criteria/relational/count.rb +13 -0
  17. data/lib/datamappify/data/criteria/relational/find.rb +23 -0
  18. data/lib/datamappify/data/criteria/relational/find_by_key.rb +17 -0
  19. data/lib/datamappify/data/criteria/relational/save.rb +26 -0
  20. data/lib/datamappify/data/criteria/relational/save_by_key.rb +15 -0
  21. data/lib/datamappify/data/criteria/sequel/count.rb +12 -0
  22. data/lib/datamappify/data/criteria/sequel/destroy.rb +17 -0
  23. data/lib/datamappify/data/criteria/sequel/exists.rb +13 -0
  24. data/lib/datamappify/data/criteria/sequel/find.rb +12 -0
  25. data/lib/datamappify/data/criteria/sequel/find_by_key.rb +12 -0
  26. data/lib/datamappify/data/criteria/sequel/save.rb +23 -0
  27. data/lib/datamappify/data/criteria/sequel/save_by_key.rb +14 -0
  28. data/lib/datamappify/data/criteria/sequel/transaction.rb +13 -0
  29. data/lib/datamappify/data/criteria.rb +8 -0
  30. data/lib/datamappify/data/errors.rb +1 -0
  31. data/lib/datamappify/data/mapper/attribute.rb +52 -0
  32. data/lib/datamappify/data/mapper.rb +95 -0
  33. data/lib/datamappify/data/provider/active_record.rb +7 -7
  34. data/lib/datamappify/data/provider/common_provider.rb +67 -0
  35. data/lib/datamappify/data/provider/sequel.rb +9 -9
  36. data/lib/datamappify/data/provider.rb +12 -0
  37. data/lib/datamappify/data/record.rb +13 -0
  38. data/lib/datamappify/data.rb +4 -0
  39. data/lib/datamappify/repository/mapping_dsl.rb +28 -0
  40. data/lib/datamappify/repository/query_method/count.rb +12 -0
  41. data/lib/datamappify/repository/query_method/destroy.rb +25 -0
  42. data/lib/datamappify/repository/query_method/find.rb +41 -0
  43. data/lib/datamappify/repository/query_method/method.rb +73 -0
  44. data/lib/datamappify/repository/query_method/save.rb +42 -0
  45. data/lib/datamappify/repository/query_method/transaction.rb +18 -0
  46. data/lib/datamappify/repository/query_method.rb +3 -0
  47. data/lib/datamappify/repository.rb +58 -92
  48. data/lib/datamappify/version.rb +1 -1
  49. data/lib/datamappify.rb +10 -5
  50. data/spec/repository/persistence_spec.rb +15 -23
  51. data/spec/repository_spec.rb +9 -5
  52. metadata +70 -15
  53. data/lib/datamappify/data/provider/active_record/persistence.rb +0 -31
  54. data/lib/datamappify/data/provider/common/persistence.rb +0 -57
  55. data/lib/datamappify/data/provider/common/relational/persistence.rb +0 -85
  56. data/lib/datamappify/data/provider/common/relational/record/mapper.rb +0 -24
  57. data/lib/datamappify/data/provider/common/relational/record/writer.rb +0 -67
  58. data/lib/datamappify/data/provider/sequel/persistence.rb +0 -31
  59. data/lib/datamappify/repository/attribute_source_data_class_builder.rb +0 -28
  60. data/lib/datamappify/repository/attributes_mapper.rb +0 -55
  61. data/lib/datamappify/repository/dsl.rb +0 -22
  62. data/lib/datamappify/repository/mapping_hash.rb +0 -8
  63. data/lib/datamappify/util.rb +0 -13
@@ -1,118 +1,84 @@
1
- require 'singleton'
2
- require 'datamappify/util'
3
- require 'datamappify/repository/mapping_hash'
4
- require 'datamappify/repository/dsl'
5
- require 'datamappify/repository/attributes_mapper'
1
+ require 'datamappify/repository/mapping_dsl'
2
+ require 'datamappify/repository/query_method'
3
+ require 'datamappify/data'
6
4
 
7
5
  module Datamappify
8
6
  module Repository
9
7
  def self.included(klass)
10
8
  klass.class_eval do
11
- mattr_accessor :entity_class
12
- mattr_accessor :default_provider_class_name
13
- mattr_accessor :default_data_class_name
14
- mattr_accessor :custom_attributes_mapping
15
- mattr_accessor :data_mapping
16
-
17
- klass.custom_attributes_mapping = {}
18
- klass.data_mapping = {}
19
-
20
9
  include Singleton
21
- extend DSL
22
- end
23
- end
10
+ extend SingletonWrapper
24
11
 
25
- def initialize
26
- AttributesMapper.new(self).build_data_classes
27
- self
28
- end
12
+ cattr_accessor :data_mapper
29
13
 
30
- def find(id_or_ids)
31
- entities = Array.wrap(id_or_ids).map { |id| entity_class.new(:id => id) }
14
+ self.data_mapper = Data::Mapper.new
32
15
 
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)
16
+ extend MappingDSL
17
+ include InstanceMethods
37
18
  end
38
-
39
- id_or_ids.is_a?(Array) ? entities : entities[0]
40
19
  end
41
20
 
42
- def save(entity_or_entities)
43
- Array.wrap(entity_or_entities).each do |entity|
44
- create_or_update(entity)
21
+ module InstanceMethods
22
+ # @param id_or_ids [Integer, Array<Integer>]
23
+ # an entity id or a collection of entity ids
24
+ #
25
+ # @return [Entity, Array<Entity>, nil]
26
+ def find(id_or_ids)
27
+ QueryMethod::Find.new(data_mapper, id_or_ids).result
45
28
  end
46
29
 
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)
30
+ # @param entity_or_entities [Entity, Array<Entity>]
31
+ # an entity or a collection of entities
32
+ #
33
+ # @return [Entity, Array<Entity>, false]
34
+ def save(entity_or_entities)
35
+ QueryMethod::Save.new(data_mapper, entity_or_entities).result
59
36
  end
60
37
 
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)
38
+ # @param (see #save)
39
+ #
40
+ # @raise [Data::EntityNotSaved]
41
+ #
42
+ # @return [Entity, Array<Entity>]
43
+ def save!(entity_or_entities)
44
+ save(entity_or_entities) || raise(Data::EntityNotSaved)
95
45
  end
96
46
 
97
- entity
98
- end
47
+ # @param id_or_ids_or_entity_or_entities [Entity, Array<Entity>]
48
+ # an entity or a collection of ids or entities
49
+ #
50
+ # @return [void, false]
51
+ def destroy(id_or_ids_or_entity_or_entities)
52
+ QueryMethod::Destroy.new(data_mapper, id_or_ids_or_entity_or_entities).result
53
+ end
99
54
 
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)
55
+ # @param (see #destroy)
56
+ #
57
+ # @raise [Data::EntityNotDestroyed]
58
+ #
59
+ # @return [void]
60
+ def destroy!(id_or_ids_or_entity_or_entities)
61
+ destroy(id_or_ids_or_entity_or_entities) || raise(Data::EntityNotDestroyed)
105
62
  end
106
63
 
107
- entity
64
+ # @return [Integer]
65
+ def count
66
+ QueryMethod::Count.new(data_mapper).result
67
+ end
108
68
  end
109
69
 
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
70
+ # Wraps a ruby Singleton class so that calling `instance` is no longer necessary.
71
+ #
72
+ # @example With `instance`
73
+ # UserRepository.instance.count
74
+ #
75
+ # @example Without `instance`
76
+ # UserRepository.count
77
+ module SingletonWrapper
78
+ def self.extended(klass)
79
+ class << klass
80
+ extend Forwardable
81
+ def_delegators :instance, *InstanceMethods.instance_methods
116
82
  end
117
83
  end
118
84
  end
@@ -1,3 +1,3 @@
1
1
  module Datamappify
2
- VERSION = '0.20.1'
2
+ VERSION = '0.30.0'
3
3
  end
data/lib/datamappify.rb CHANGED
@@ -1,8 +1,13 @@
1
- require "active_support/inflector"
2
- require "datamappify/version"
3
- require "datamappify/entity"
4
- require "datamappify/data"
5
- require "datamappify/repository"
1
+ require 'active_support'
2
+ require 'datamappify/version'
6
3
 
7
4
  module Datamappify
5
+ # @return [Pathname]
6
+ def self.root
7
+ Pathname.new("#{File.dirname(__FILE__)}/datamappify")
8
+ end
8
9
  end
10
+
11
+ require 'datamappify/entity'
12
+ require 'datamappify/data'
13
+ require 'datamappify/repository'
@@ -1,22 +1,20 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
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') }
4
+ let!(:user_repository) { "UserRepository#{data_provider}".constantize }
5
+ let(:existing_user) { user_repository.save(User.new(:first_name => 'Fred', :driver_license => 'FREDWU42')) }
6
6
  let(:new_valid_user) { User.new(:first_name => 'Batman', :driver_license => 'ARKHAMCITY') }
7
7
  let(:new_valid_user2) { User.new(:first_name => 'Ironman', :driver_license => 'NEWYORKCITY') }
8
8
  let(:new_invalid_user) { User.new(:first_name => 'a') }
9
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 }
10
+ let(:data_passports) { "Datamappify::Data::Record::#{data_provider}::UserPassport".constantize }
11
+ let(:data_driver_licenses) { "Datamappify::Data::Record::#{data_provider}::UserDriverLicense".constantize }
12
12
 
13
13
  describe "#find" do
14
14
  describe "resource" do
15
- let!(:user) { user_repository.save(existing_user) }
16
-
17
15
  it "found" do
18
- user_repository.find(user.id).should == existing_user
19
- user_repository.find([user.id]).should == [existing_user]
16
+ user_repository.find(existing_user.id).should == existing_user
17
+ user_repository.find([existing_user.id]).should == [existing_user]
20
18
  end
21
19
 
22
20
  it "not found" do
@@ -25,14 +23,12 @@ shared_examples_for "repository persistence" do |data_provider|
25
23
  end
26
24
 
27
25
  describe "collection" do
28
- let!(:user) { user_repository.save(existing_user) }
29
-
30
26
  it "found" do
31
- user_repository.find([user.id]).should == [existing_user]
27
+ user_repository.find([existing_user.id]).should == [existing_user]
32
28
  end
33
29
 
34
30
  it "partial found" do
35
- user_repository.find([user.id, 42]).should == [existing_user]
31
+ user_repository.find([existing_user.id, 42]).should == [existing_user]
36
32
  end
37
33
 
38
34
  it "not found" do
@@ -98,14 +94,12 @@ shared_examples_for "repository persistence" do |data_provider|
98
94
 
99
95
  describe "update an existing entity" do
100
96
  it "updates existing records" do
101
- user = user_repository.save(existing_user)
102
-
103
- user.first_name = 'Vivian'
104
- user.driver_license = 'LOCOMOTE'
97
+ existing_user.first_name = 'Vivian'
98
+ existing_user.driver_license = 'LOCOMOTE'
105
99
 
106
100
  updated_user = nil
107
101
 
108
- expect { updated_user = user_repository.save(user) }.to change { user_repository.count }.by(0)
102
+ expect { updated_user = user_repository.save(existing_user) }.to change { user_repository.count }.by(0)
109
103
 
110
104
  updated_user.first_name.should == 'Vivian'
111
105
  updated_user.driver_license.should == 'LOCOMOTE'
@@ -117,14 +111,12 @@ shared_examples_for "repository persistence" do |data_provider|
117
111
  end
118
112
 
119
113
  it "updates existing and new records" do
120
- user = user_repository.save(existing_user)
121
-
122
- user.first_name = 'Vivian'
123
- user.health_care = 'BATMANCAVE'
114
+ existing_user.first_name = 'Vivian'
115
+ existing_user.health_care = 'BATMANCAVE'
124
116
 
125
117
  updated_user = nil
126
118
 
127
- expect { updated_user = user_repository.save(user) }.to change { user_repository.count }.by(0)
119
+ expect { updated_user = user_repository.save(existing_user) }.to change { user_repository.count }.by(0)
128
120
 
129
121
  updated_user.first_name.should == 'Vivian'
130
122
  updated_user.health_care.should == 'BATMANCAVE'
@@ -170,7 +162,7 @@ describe Datamappify::Repository do
170
162
  end
171
163
 
172
164
  describe "entity composed from multiple data providers" do
173
- let!(:hero_repository) { HeroUserRepository.instance }
165
+ let!(:hero_repository) { HeroUserRepository }
174
166
  let!(:hero) { HeroUser.new :first_name => 'Aaron', :last_name => 'Patterson' }
175
167
 
176
168
  it "#find" do
@@ -1,12 +1,16 @@
1
1
  require_relative 'spec_helper'
2
2
 
3
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 }
4
+ let(:namespace) { "Datamappify::Data::Record::#{data_provider}".constantize }
5
+ let(:user_repository) { "UserRepository#{data_provider}".constantize.instance }
7
6
 
8
- it "defines the data class after the repository is initialised" do
9
- subject.const_defined?(:User, false).should == true
7
+ it "defines the data class" do
8
+ user_repository.data_mapper.default_source_class
9
+ namespace.const_defined?(:User, false).should == true
10
+ end
11
+
12
+ it "delegates methods to the instance singleton" do
13
+ expect { "UserRepository#{data_provider}".constantize.find(1) }.to_not raise_error
10
14
  end
11
15
  end
12
16
 
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.20.1
4
+ version: 0.30.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-19 00:00:00.000000000 Z
11
+ date: 2013-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: virtus
@@ -72,6 +72,34 @@ dependencies:
72
72
  - - '>='
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: redcarpet
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: yard
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
75
103
  - !ruby/object:Gem::Dependency
76
104
  name: rspec
77
105
  requirement: !ruby/object:Gem::Requirement
@@ -210,7 +238,7 @@ dependencies:
210
238
  - - <
211
239
  - !ruby/object:Gem::Version
212
240
  version: '2'
213
- description: Separate domain logic from data persistence.
241
+ description: Compose and manage domain logic and data persistence separately and intelligently.
214
242
  email:
215
243
  - ifredwu@gmail.com
216
244
  executables: []
@@ -220,6 +248,7 @@ files:
220
248
  - .gitignore
221
249
  - .rspec
222
250
  - .travis.yml
251
+ - .yardopts
223
252
  - CHANGELOG.md
224
253
  - Gemfile
225
254
  - README.md
@@ -227,22 +256,47 @@ files:
227
256
  - datamappify.gemspec
228
257
  - lib/datamappify.rb
229
258
  - lib/datamappify/data.rb
259
+ - lib/datamappify/data/criteria.rb
260
+ - lib/datamappify/data/criteria/active_record/count.rb
261
+ - lib/datamappify/data/criteria/active_record/destroy.rb
262
+ - lib/datamappify/data/criteria/active_record/exists.rb
263
+ - lib/datamappify/data/criteria/active_record/find.rb
264
+ - lib/datamappify/data/criteria/active_record/find_by_key.rb
265
+ - lib/datamappify/data/criteria/active_record/save.rb
266
+ - lib/datamappify/data/criteria/active_record/save_by_key.rb
267
+ - lib/datamappify/data/criteria/active_record/transaction.rb
268
+ - lib/datamappify/data/criteria/common.rb
269
+ - lib/datamappify/data/criteria/relational/count.rb
270
+ - lib/datamappify/data/criteria/relational/find.rb
271
+ - lib/datamappify/data/criteria/relational/find_by_key.rb
272
+ - lib/datamappify/data/criteria/relational/save.rb
273
+ - lib/datamappify/data/criteria/relational/save_by_key.rb
274
+ - lib/datamappify/data/criteria/sequel/count.rb
275
+ - lib/datamappify/data/criteria/sequel/destroy.rb
276
+ - lib/datamappify/data/criteria/sequel/exists.rb
277
+ - lib/datamappify/data/criteria/sequel/find.rb
278
+ - lib/datamappify/data/criteria/sequel/find_by_key.rb
279
+ - lib/datamappify/data/criteria/sequel/save.rb
280
+ - lib/datamappify/data/criteria/sequel/save_by_key.rb
281
+ - lib/datamappify/data/criteria/sequel/transaction.rb
230
282
  - lib/datamappify/data/errors.rb
283
+ - lib/datamappify/data/mapper.rb
284
+ - lib/datamappify/data/mapper/attribute.rb
285
+ - lib/datamappify/data/provider.rb
231
286
  - 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
287
+ - lib/datamappify/data/provider/common_provider.rb
237
288
  - lib/datamappify/data/provider/sequel.rb
238
- - lib/datamappify/data/provider/sequel/persistence.rb
289
+ - lib/datamappify/data/record.rb
239
290
  - lib/datamappify/entity.rb
240
291
  - lib/datamappify/repository.rb
241
- - lib/datamappify/repository/attribute_source_data_class_builder.rb
242
- - lib/datamappify/repository/attributes_mapper.rb
243
- - lib/datamappify/repository/dsl.rb
244
- - lib/datamappify/repository/mapping_hash.rb
245
- - lib/datamappify/util.rb
292
+ - lib/datamappify/repository/mapping_dsl.rb
293
+ - lib/datamappify/repository/query_method.rb
294
+ - lib/datamappify/repository/query_method/count.rb
295
+ - lib/datamappify/repository/query_method/destroy.rb
296
+ - lib/datamappify/repository/query_method/find.rb
297
+ - lib/datamappify/repository/query_method/method.rb
298
+ - lib/datamappify/repository/query_method/save.rb
299
+ - lib/datamappify/repository/query_method/transaction.rb
246
300
  - lib/datamappify/version.rb
247
301
  - spec/entity_spec.rb
248
302
  - spec/repository/persistence_spec.rb
@@ -287,7 +341,7 @@ rubyforge_project:
287
341
  rubygems_version: 2.0.0
288
342
  signing_key:
289
343
  specification_version: 4
290
- summary: Separate domain logic from data persistence.
344
+ summary: Compose and manage domain logic and data persistence separately and intelligently.
291
345
  test_files:
292
346
  - spec/entity_spec.rb
293
347
  - spec/repository/persistence_spec.rb
@@ -309,3 +363,4 @@ test_files:
309
363
  - spec/support/repositories/sequel/user_repository.rb
310
364
  - spec/support/tables/active_record.rb
311
365
  - spec/support/tables/sequel.rb
366
+ has_rdoc:
@@ -1,31 +0,0 @@
1
- require 'datamappify/data/provider/common/relational/persistence'
2
- require 'datamappify/data/provider/common/relational/record/mapper'
3
- require 'datamappify/data/provider/common/relational/record/writer'
4
-
5
- module Datamappify
6
- module Data
7
- module Provider
8
- module ActiveRecord
9
- class Persistence < Data::Provider::Common::Relational::Persistence
10
- def destroy(ids)
11
- data_class.destroy(ids)
12
- end
13
-
14
- def exists?(id)
15
- data_class.exists?(id)
16
- end
17
-
18
- def transaction(&block)
19
- data_class.transaction(&block)
20
- end
21
-
22
- private
23
-
24
- def record_attributes_method
25
- :attributes
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,57 +0,0 @@
1
- module Datamappify
2
- module Data
3
- module Provider
4
- module Common
5
- class Persistence
6
- def initialize(provider_class_name, entities, data_class_name)
7
- @provider_class_name = provider_class_name
8
- @entities = entities
9
- @data_class_name = data_class_name
10
- end
11
-
12
- def find(data_fields_mapping)
13
- raise Data::MethodNotImplemented
14
- end
15
-
16
- def create(data_fields_mapping)
17
- raise Data::MethodNotImplemented
18
- end
19
-
20
- def update(data_fields_mapping)
21
- raise Data::MethodNotImplemented
22
- end
23
-
24
- def destroy(id_or_entity)
25
- raise Data::MethodNotImplemented
26
- end
27
-
28
- def exists?(id)
29
- raise Data::MethodNotImplemented
30
- end
31
-
32
- def transaction(&block)
33
- raise Data::MethodNotImplemented
34
- end
35
-
36
- def method_missing(symbol, *args)
37
- data_class.send symbol, *args
38
- end
39
-
40
- private
41
-
42
- def data_class
43
- "Datamappify::Data::#{@provider_class_name}::#{@data_class_name}".constantize
44
- end
45
-
46
- def entity_class_name
47
- @entities[0].class.name
48
- end
49
-
50
- def is_entity_class?
51
- @data_class_name == entity_class_name
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,85 +0,0 @@
1
- require 'datamappify/data/provider/common/persistence'
2
-
3
- module Datamappify
4
- module Data
5
- module Provider
6
- module Common
7
- module Relational
8
- class Persistence < Data::Provider::Common::Persistence
9
- def find(data_fields_mapping)
10
- records = find_records(data_fields_mapping)
11
-
12
- entities_walker do |entity|
13
- if record = find_record_for_entity(entity, records)
14
- Common::Relational::RecordMapper.new(
15
- entity, record.send(record_attributes_method)
16
- ).map_attributes(data_fields_mapping)
17
- end
18
- end
19
- end
20
-
21
- def create(data_fields_mapping)
22
- entities_walker do |entity|
23
- if has_data_to_insert?(entity, data_fields_mapping)
24
- Common::Relational::RecordWriter.new(
25
- entity, data_class, key_field_name
26
- ).insert_record(data_fields_mapping)
27
- end
28
- end
29
- end
30
-
31
- def update(data_fields_mapping)
32
- records = find_records(data_fields_mapping)
33
-
34
- entities_walker do |entity|
35
- record_writer = Common::Relational::RecordWriter.new(entity, data_class, key_field_name)
36
-
37
- if record = find_record_for_entity(entity, records)
38
- record_writer.update_record(record, data_fields_mapping)
39
- elsif has_data_to_insert?(entity, data_fields_mapping)
40
- record_writer.insert_record(data_fields_mapping)
41
- end
42
- end
43
- end
44
-
45
- private
46
-
47
- def find_record_for_entity(entity, records)
48
- records.find { |r| r.send(key_field_name) == entity.id }
49
- end
50
-
51
- def find_records(data_fields_mapping)
52
- data_class.select(
53
- *field_names(data_fields_mapping)
54
- ).where(
55
- key_field_name => @entities.map(&:id)
56
- )
57
- end
58
-
59
- def entities_walker
60
- walker_method = is_entity_class? ? :keep_if : :each
61
-
62
- @entities.send(walker_method) do |entity|
63
- yield(entity)
64
- end
65
- end
66
-
67
- def key_field_name
68
- is_entity_class? ? :id : "#{entity_class_name.underscore}_id".to_sym
69
- end
70
-
71
- def field_names(data_fields_mapping)
72
- (data_fields_mapping.field_names << key_field_name << :id).uniq
73
- end
74
-
75
- def has_data_to_insert?(entity, data_fields_mapping)
76
- attribute_names = entity.attributes.keys & data_fields_mapping.attribute_names
77
-
78
- attribute_names.any? && Util.attributes_filtered_by(entity, attribute_names).values.compact.any?
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
85
- end
@@ -1,24 +0,0 @@
1
- module Datamappify
2
- module Data
3
- module Provider
4
- module Common
5
- module Relational
6
- class RecordMapper
7
- def initialize(entity, record_attributes)
8
- @entity = entity
9
- @record_attributes = record_attributes
10
- end
11
-
12
- def map_attributes(data_fields_mapping)
13
- @record_attributes.each do |name, value|
14
- return unless data_fields_mapping.has_key?(name.to_sym)
15
-
16
- @entity.send(:"#{data_fields_mapping[name.to_sym]}=", value)
17
- end
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end