active_repository 0.1.0 → 0.2.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.
- data/README.md +29 -6
- data/lib/active_repository/associations.rb +2 -2
- data/lib/active_repository/base.rb +38 -9
- data/lib/active_repository/finders.rb +5 -3
- data/lib/active_repository/version.rb +1 -1
- data/lib/active_repository/write_support.rb +9 -3
- data/lib/active_repository/writers.rb +32 -23
- data/spec/support/shared_examples.rb +4 -11
- metadata +2 -2
data/README.md
CHANGED
@@ -46,20 +46,43 @@ Or install it yourself as:
|
|
46
46
|
|
47
47
|
## Usage
|
48
48
|
|
49
|
-
|
49
|
+
To use it you should inherit ActiveRepository::Base:
|
50
50
|
|
51
|
-
class User <
|
52
|
-
|
53
|
-
|
51
|
+
class User < ActiveRepository::Base
|
52
|
+
end
|
53
|
+
|
54
|
+
ActiveRepository::Base has two class attributes to help it identify where it is going to persist data
|
55
|
+
|
56
|
+
###model_class
|
57
|
+
|
58
|
+
This attribute is used to identify the class responsible for persisting data, it should be the ActiveRecord model or the Mongoid Document.
|
59
|
+
|
60
|
+
###save_in_memory
|
61
|
+
|
62
|
+
This attribute is used to persist data directly into memory. When set to true, it ignores the model_class attribute value and save in the memory, if set to false it user model_class to persist data.
|
63
|
+
|
64
|
+
P.S.: Just be careful, the set_save_in_memory method should always be called after set_model_class method.
|
54
65
|
|
66
|
+
class User < ActiveRepository::Base
|
55
67
|
# Defines the class responsible for persisting data
|
56
|
-
set_model_class(
|
68
|
+
set_model_class(UserModel)
|
57
69
|
|
58
70
|
# Set this to true in order to ignore model_class attribute and persist in memory
|
59
71
|
set_save_in_memory(true)
|
60
72
|
end
|
61
73
|
|
62
|
-
Then
|
74
|
+
Then, you have only to set the fields it is going to use:
|
75
|
+
|
76
|
+
class User < ActiveRepository::Base
|
77
|
+
# Defines the fields of the class
|
78
|
+
fields :name, :email, :birthdate
|
79
|
+
|
80
|
+
set_model_class(UserModel)
|
81
|
+
|
82
|
+
set_save_in_memory(true)
|
83
|
+
end
|
84
|
+
|
85
|
+
Now you are all set and ready to go. It is just using ActiveRepository as if it was your ActiveRecord model or Mongoid Document.
|
63
86
|
|
64
87
|
## Contributing
|
65
88
|
|
@@ -80,7 +80,6 @@ module ActiveRepository
|
|
80
80
|
|
81
81
|
# Defines "belongs to" type relation between ActiveRepository objects
|
82
82
|
def belongs_to(association_id, options = {})
|
83
|
-
|
84
83
|
options = {
|
85
84
|
:class_name => association_id.to_s.classify,
|
86
85
|
:foreign_key => association_id.to_s.foreign_key
|
@@ -100,7 +99,8 @@ module ActiveRepository
|
|
100
99
|
end
|
101
100
|
|
102
101
|
define_method("#{association_id}=") do |new_value|
|
103
|
-
attributes
|
102
|
+
attributes.delete(association_id.to_sym)
|
103
|
+
send("#{options[:foreign_key]}=", (new_value.try(:id) ? new_value.id : new_value))
|
104
104
|
end
|
105
105
|
|
106
106
|
end
|
@@ -5,6 +5,18 @@ require 'active_repository/sql_query_executor'
|
|
5
5
|
require 'active_repository/finders'
|
6
6
|
require 'active_repository/writers'
|
7
7
|
|
8
|
+
begin
|
9
|
+
klass = Module.const_get(Mongoid::Document)
|
10
|
+
unless klass.is_a?(Class)
|
11
|
+
raise "Not defined"
|
12
|
+
end
|
13
|
+
rescue
|
14
|
+
module Mongoid
|
15
|
+
module Document
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
8
20
|
module ActiveRepository
|
9
21
|
|
10
22
|
# Base class for ActiveRepository gem.
|
@@ -54,6 +66,8 @@ module ActiveRepository
|
|
54
66
|
|
55
67
|
fields :created_at, :updated_at
|
56
68
|
|
69
|
+
self.save_in_memory = true if self.save_in_memory == nil
|
70
|
+
|
57
71
|
# Returns all persisted objects
|
58
72
|
def self.all
|
59
73
|
self == get_model_class ? super : get_model_class.all.map { |object| serialize!(object.attributes) }
|
@@ -84,7 +98,7 @@ module ActiveRepository
|
|
84
98
|
|
85
99
|
# Returns the Class responsible for persisting the objects
|
86
100
|
def self.get_model_class
|
87
|
-
return self if self.
|
101
|
+
return self if self.model_class.nil? || self.save_in_memory?
|
88
102
|
save_in_memory? ? self : self.model_class
|
89
103
|
end
|
90
104
|
|
@@ -107,6 +121,8 @@ module ActiveRepository
|
|
107
121
|
def self.set_model_class(value)
|
108
122
|
self.model_class = value if model_class.nil?
|
109
123
|
|
124
|
+
self.set_save_in_memory(self.model_class == self)
|
125
|
+
|
110
126
|
field_names.each do |field_name|
|
111
127
|
define_custom_find_by_field(field_name)
|
112
128
|
define_custom_find_all_by_field(field_name)
|
@@ -116,7 +132,7 @@ module ActiveRepository
|
|
116
132
|
# Sets the class attribute save_in_memory, set it to true to ignore model_class attribute
|
117
133
|
# and persist objects in memory
|
118
134
|
def self.set_save_in_memory(value)
|
119
|
-
self.save_in_memory = value
|
135
|
+
self.save_in_memory = value
|
120
136
|
end
|
121
137
|
|
122
138
|
# Searches persisted objects that matches the criterias in the parameters.
|
@@ -146,18 +162,31 @@ module ActiveRepository
|
|
146
162
|
# is saved in memory.
|
147
163
|
def persist
|
148
164
|
if self.valid?
|
149
|
-
save_in_memory? ? save : self.convert
|
165
|
+
save_in_memory? ? save : self.convert.present?
|
150
166
|
end
|
151
167
|
end
|
152
168
|
|
153
169
|
# Gathers the persisted object from database and updates self with it's attributes.
|
154
170
|
def reload
|
155
|
-
|
171
|
+
object = self.class.get_model_class.find(self.id)
|
172
|
+
|
173
|
+
serialize! (self.class.get_model_class.find(self.id) || self).attributes
|
156
174
|
end
|
157
175
|
|
158
|
-
|
159
|
-
|
160
|
-
|
176
|
+
def save(force=false)
|
177
|
+
if self.class == self.class.get_model_class
|
178
|
+
object = self.class.get_model_class.find(self.id)
|
179
|
+
|
180
|
+
if force || self.id.nil?
|
181
|
+
self.id = nil if self.id.nil?
|
182
|
+
super
|
183
|
+
else
|
184
|
+
object.save(true)
|
185
|
+
end
|
186
|
+
true
|
187
|
+
else
|
188
|
+
self.persist
|
189
|
+
end
|
161
190
|
end
|
162
191
|
|
163
192
|
# Updates attributes from self with the attributes from the parameters
|
@@ -166,7 +195,7 @@ module ActiveRepository
|
|
166
195
|
self.attributes = attributes
|
167
196
|
end
|
168
197
|
|
169
|
-
self
|
198
|
+
self.dup
|
170
199
|
end
|
171
200
|
|
172
201
|
protected
|
@@ -175,7 +204,7 @@ module ActiveRepository
|
|
175
204
|
def convert(attribute="id")
|
176
205
|
klass = self.class.get_model_class
|
177
206
|
object = klass.where(attribute.to_sym => self.send(attribute)).first
|
178
|
-
|
207
|
+
|
179
208
|
object ||= self.class.get_model_class.new
|
180
209
|
|
181
210
|
attributes = self.attributes
|
@@ -67,13 +67,15 @@ module ActiveRepository #:nodoc:
|
|
67
67
|
|
68
68
|
# Searches first object that matches #field_name field with the #args value(s)
|
69
69
|
def find_by_field(field_name, args)
|
70
|
-
self.find_all_by_field(field_name, args).first
|
70
|
+
self.find_all_by_field(field_name, args).first.dup
|
71
71
|
end
|
72
72
|
|
73
73
|
# Searches for an object that has id with #id value, if none is found returns nil
|
74
74
|
def find_by_id(id)
|
75
75
|
if self == get_model_class
|
76
|
-
super(id)
|
76
|
+
object = super(id)
|
77
|
+
|
78
|
+
object.nil? ? nil : object.dup
|
77
79
|
else
|
78
80
|
object = nil
|
79
81
|
|
@@ -101,7 +103,7 @@ module ActiveRepository #:nodoc:
|
|
101
103
|
# Returns the object in the position specified in #position
|
102
104
|
def get(position)
|
103
105
|
object = get_model_class.send(position)
|
104
|
-
serialize!
|
106
|
+
object.present? ? serialize!(object.attributes) : nil
|
105
107
|
end
|
106
108
|
end
|
107
109
|
end
|
@@ -57,10 +57,16 @@ module ActiveHash
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def save(*args)
|
60
|
-
|
60
|
+
if self.valid?
|
61
|
+
record = self.class.find_by_id(self.id)
|
61
62
|
|
62
|
-
|
63
|
-
|
63
|
+
self.class.insert(self) if record.nil? && record != self
|
64
|
+
|
65
|
+
self.id = self.class.last.id if self.id.nil?
|
66
|
+
true
|
67
|
+
else
|
68
|
+
false
|
69
|
+
end
|
64
70
|
end
|
65
71
|
|
66
72
|
def to_param
|
@@ -1,20 +1,20 @@
|
|
1
|
-
# Module containing writing
|
1
|
+
# Module containing methods responsible for writing attributes of the ActiveRepository::Base class
|
2
2
|
module ActiveRepository
|
3
3
|
module Writers
|
4
4
|
# Creates an object and persists it.
|
5
5
|
def create(attributes={})
|
6
6
|
object = get_model_class.new(attributes)
|
7
7
|
|
8
|
-
object.id = nil
|
8
|
+
object.id = nil unless exists?(object.id)
|
9
9
|
|
10
10
|
if get_model_class == self
|
11
11
|
object.save
|
12
12
|
else
|
13
13
|
repository = serialize!(object.attributes)
|
14
|
-
repository.valid? ?
|
14
|
+
object = repository.valid? ? get_model_class.create(attributes) : repository
|
15
15
|
end
|
16
16
|
|
17
|
-
serialize!(object.attributes)
|
17
|
+
object.valid? ? serialize!(object.reload.attributes) : object
|
18
18
|
end
|
19
19
|
|
20
20
|
# Searches for an object that matches the attributes on the parameter, if none is found
|
@@ -22,7 +22,7 @@ module ActiveRepository
|
|
22
22
|
def find_or_create(attributes)
|
23
23
|
object = get_model_class.where(attributes).first
|
24
24
|
|
25
|
-
object =
|
25
|
+
object = get_model_class.create(attributes) if object.nil?
|
26
26
|
|
27
27
|
serialize!(object.attributes)
|
28
28
|
end
|
@@ -38,37 +38,46 @@ module ActiveRepository
|
|
38
38
|
|
39
39
|
# Updates #key attribute with #value value.
|
40
40
|
def update_attribute(key, value)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
object = self.class.get_model_class.find(self.id)
|
41
|
+
ret = self.valid?
|
42
|
+
|
43
|
+
if ret
|
44
|
+
object = (self.id.nil? ? self.class.get_model_class.new : self.class.get_model_class.find(self.id))
|
45
|
+
|
46
|
+
if self.class == self.class.get_model_class
|
47
|
+
self.send("#{key}=", value)
|
48
|
+
|
49
|
+
ret = save
|
50
|
+
else
|
51
|
+
key = (key.to_s == 'id' ? '_id' : key.to_s) if mongoid?
|
45
52
|
|
46
|
-
|
47
|
-
super(key,value)
|
48
|
-
key = key.to_s == 'id' ? '_id' : key.to_s
|
53
|
+
ret = object.update_attribute(key,value)
|
49
54
|
end
|
50
55
|
|
51
|
-
|
52
|
-
object.save
|
56
|
+
reload
|
53
57
|
end
|
54
58
|
|
55
|
-
|
59
|
+
ret
|
56
60
|
end
|
57
61
|
|
58
62
|
# Updates attributes in self with the attributes in the parameter
|
59
63
|
def update_attributes(attributes)
|
60
|
-
|
61
|
-
|
62
|
-
|
64
|
+
ret = true
|
65
|
+
klass = self.class
|
66
|
+
model_class = self.class.get_model_class
|
67
|
+
|
68
|
+
if klass == model_class
|
69
|
+
attributes.each do |key, value|
|
70
|
+
self.send("#{key}=", value) unless key == :id
|
71
|
+
end
|
72
|
+
save
|
63
73
|
else
|
64
|
-
object = self.
|
65
|
-
end
|
74
|
+
object = self.id.nil? ? model_class.new : model_class.find(self.id)
|
66
75
|
|
67
|
-
|
68
|
-
object.update_attribute("#{k.to_s}", v) unless k == :id
|
76
|
+
ret = object.update_attributes(attributes)
|
69
77
|
end
|
70
78
|
|
71
|
-
|
79
|
+
reload
|
80
|
+
ret
|
72
81
|
end
|
73
82
|
end
|
74
83
|
end
|
@@ -63,7 +63,7 @@ shared_examples ".where" do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it "if id exists, use auto increment id" do
|
66
|
-
country = Country.create(:
|
66
|
+
country = Country.create(:name => "Russia", :language => 'Russian')
|
67
67
|
|
68
68
|
country.id.should_not == 1
|
69
69
|
end
|
@@ -472,7 +472,7 @@ shared_examples "#save" do
|
|
472
472
|
|
473
473
|
it "adds the new object to the data collection" do
|
474
474
|
Country.all.should be_empty
|
475
|
-
country = Country.new :
|
475
|
+
country = Country.new :name => "foo", :monarch => nil, :language => nil
|
476
476
|
country.persist.should be_true
|
477
477
|
country.reload
|
478
478
|
|
@@ -526,17 +526,10 @@ shared_examples ".create" do
|
|
526
526
|
it "adds an auto-incrementing id if the id is nil" do
|
527
527
|
country1 = Country.new :name => "foo"
|
528
528
|
country1.save
|
529
|
-
country1.id.should == 1
|
530
529
|
|
531
|
-
country2 = Country.new :name => "bar"
|
530
|
+
country2 = Country.new :name => "bar"
|
532
531
|
country2.save
|
533
|
-
country2.id.should ==
|
534
|
-
end
|
535
|
-
|
536
|
-
it "does not add auto-incrementing id if the id is present" do
|
537
|
-
country1 = Country.new :id => 456, :name => "foo"
|
538
|
-
country1.save
|
539
|
-
country1.id.should == 456
|
532
|
+
country2.id.should == country1.id + 1
|
540
533
|
end
|
541
534
|
|
542
535
|
it "adds the new object to the data collection" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_repository
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: active_hash
|