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 CHANGED
@@ -46,20 +46,43 @@ Or install it yourself as:
46
46
 
47
47
  ## Usage
48
48
 
49
- Firstly you must inherit ActiveRepository::Base:
49
+ To use it you should inherit ActiveRepository::Base:
50
50
 
51
- class User < ActiveHash::Base
52
- # Defines the fields of the class
53
- fields :name, :email, :birthdate
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(Country)
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 it is just using it as if it was your ActiveRecord model or Mongoid Document.
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[options[:foreign_key].to_sym] = new_value ? new_value.id : nil
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.save_in_memory.nil?
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 if save_in_memory.nil?
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
- serialize! self.class.get_model_class.find(self.id).attributes
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
- # Returns the value of the save_in_memory class attribute
159
- def save_in_memory?
160
- self.save_in_memory.nil? ? true : save_in_memory
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! object.attributes
106
+ object.present? ? serialize!(object.attributes) : nil
105
107
  end
106
108
  end
107
109
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveRepository
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -57,10 +57,16 @@ module ActiveHash
57
57
  end
58
58
 
59
59
  def save(*args)
60
- record = self.class.find_by_id(self.id)
60
+ if self.valid?
61
+ record = self.class.find_by_id(self.id)
61
62
 
62
- self.class.insert(self) if record.nil? && record != self
63
- true
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 methods of the ActiveRepository::Base class
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 if exists?(object.id)
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? ? (object = get_model_class.create(attributes)) : false
14
+ object = repository.valid? ? get_model_class.create(attributes) : repository
15
15
  end
16
16
 
17
- serialize!(object.attributes) unless object.class.name == self
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 = model_class.create(attributes) if object.nil?
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
- if self.class == self.class.get_model_class
42
- super(key,value)
43
- else
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
- if mongoid?
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
- object.update_attribute(key, value)
52
- object.save
56
+ reload
53
57
  end
54
58
 
55
- self.reload
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
- object = nil
61
- if mongoid?
62
- object = self.class.get_model_class.find(self.id)
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.class.get_model_class.find(self.id)
65
- end
74
+ object = self.id.nil? ? model_class.new : model_class.find(self.id)
66
75
 
67
- attributes.each do |k,v|
68
- object.update_attribute("#{k.to_s}", v) unless k == :id
76
+ ret = object.update_attributes(attributes)
69
77
  end
70
78
 
71
- self.reload
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(:id => 1, :name => "Russia", :language => 'Russian')
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 :id => 1, :name => "foo", :monarch => nil, :language => nil
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", :id => 2
530
+ country2 = Country.new :name => "bar"
532
531
  country2.save
533
- country2.id.should == 2
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.1.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: 2012-12-15 00:00:00.000000000 Z
12
+ date: 2013-02-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: active_hash