active_repository 0.2.0 → 0.2.1
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.
- checksums.yaml +15 -0
- data/README.md +3 -1
- data/active_repository.gemspec +1 -0
- data/lib/active_repository/adapters/active_hash_adapter.rb +20 -0
- data/lib/active_repository/adapters/default_adapter.rb +51 -0
- data/lib/active_repository/adapters/mongoid_adapter.rb +53 -0
- data/lib/active_repository/adapters/persistence_adapter.rb +64 -0
- data/lib/active_repository/base.rb +27 -23
- data/lib/active_repository/finders.rb +22 -19
- data/lib/active_repository/version.rb +1 -1
- data/lib/active_repository/write_support.rb +1 -1
- data/lib/active_repository/writers.rb +38 -17
- data/spec/active_repository/associations_spec.rb +1 -0
- data/spec/active_repository/base_spec.rb +3 -3
- data/spec/active_repository/sql_query_executor_spec.rb +0 -2
- data/spec/support/shared_examples.rb +55 -29
- data/spec/support/sql_query_shared_examples.rb +3 -2
- metadata +23 -21
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ODc4ODk0M2JiZTk5ZGE4ODZiYzM4OGRmNzNiZmYxODVlZjk1Yzg2Yg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NDM4YjY5YjIyY2JhZTUxOWVjNzdkY2ZkYWFkMWYzZmI3YjQ2NzNkMQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YWRmMTRiYzEwMjMwMjE2ZDg0YzJiZWE1MzEzZWI5MDViY2Q2ZDdjMDEyY2Rj
|
10
|
+
MjVmNTI0MWYwODNhNzM2NzkzMzIzZTZiYzllYjg2ODA5NDgyMjM0OTgxNTQx
|
11
|
+
N2U0NDI0MGRkZTk5OTNiOGZmYzYwNjY2MGNmMDhmZmY2MWI2YjQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjYzN2E1ZTdlOTI2ODMxYWVlZjlkYmM3NzgwNGRmZWQ0ODJlNDA0NjgyNmFj
|
14
|
+
ZTM5MjRiODkzZTJmMWNhMmMzNjRiZjFkNjhjMmJkZDZlMDMxNDJhODQ5NThk
|
15
|
+
OWI1N2RhNWM5ODA1NzU2ODhlMGQ2YzdmMWM5MTM5YjJlMmJlYmI=
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# ActiveRepository
|
2
2
|
|
3
|
-
[](http://travis-ci.org/efreesen/active_repository)[](https://gemnasium.com/efreesen/active_repository) [](http://travis-ci.org/efreesen/active_repository)[](https://gemnasium.com/efreesen/active_repository) [](https://codeclimate.com/github/efreesen/active_repository)
|
4
4
|
|
5
5
|
ActiveRepository was designed so you can build your Business Models without depending on any ORM. It by default saves your data in memory using ActiveHash (https://github.com/zilkey/active_hash). Then when you decide which ORM you want to use you only have to connect ActiveRepository with it.
|
6
6
|
|
@@ -84,6 +84,8 @@ Then, you have only to set the fields it is going to use:
|
|
84
84
|
|
85
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.
|
86
86
|
|
87
|
+
You can check an example project here: https://github.com/efreesen/sports_betting_engine
|
88
|
+
|
87
89
|
## Contributing
|
88
90
|
|
89
91
|
1. Fork it
|
data/active_repository.gemspec
CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |gem|
|
|
35
35
|
gem.add_development_dependency(%q<rspec>, [">= 2.2.0"])
|
36
36
|
gem.add_development_dependency(%q<activerecord>)
|
37
37
|
gem.add_development_dependency(%q<mongoid>)
|
38
|
+
gem.add_development_dependency(%q<mongo_mapper>)
|
38
39
|
gem.add_development_dependency('rake')
|
39
40
|
gem.add_development_dependency(%q<sqlite3>) unless RUBY_PLATFORM == 'java'
|
40
41
|
gem.add_development_dependency(%q<jdbc-sqlite3>) if RUBY_PLATFORM == 'java'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class ActiveHashAdapter
|
2
|
+
class << self
|
3
|
+
def all(klass)
|
4
|
+
klass.superclass.superclass.all
|
5
|
+
end
|
6
|
+
|
7
|
+
def delete_all
|
8
|
+
@klass.superclass.delete_all
|
9
|
+
end
|
10
|
+
|
11
|
+
def exists?(id)
|
12
|
+
@klass.find_by_id(id).present?
|
13
|
+
end
|
14
|
+
|
15
|
+
def where(*args)
|
16
|
+
query = ActiveHash::SQLQueryExecutor.args_to_query(args)
|
17
|
+
@klass.where(query)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class DefaultAdapter
|
2
|
+
class << self
|
3
|
+
def all(klass)
|
4
|
+
klass.get_model_class.all
|
5
|
+
end
|
6
|
+
|
7
|
+
def delete_all(klass)
|
8
|
+
klass.get_model_class.delete_all
|
9
|
+
end
|
10
|
+
|
11
|
+
def exists?(klass, id)
|
12
|
+
klass.get_model_class.exists?(id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def find(klass, id)
|
16
|
+
klass.get_model_class.find(id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def first(klass)
|
20
|
+
klass.get_model_class.first
|
21
|
+
end
|
22
|
+
|
23
|
+
def last(klass)
|
24
|
+
klass.get_model_class.last
|
25
|
+
end
|
26
|
+
|
27
|
+
def create(klass, attributes)
|
28
|
+
object = klass.get_model_class.create(attributes)
|
29
|
+
end
|
30
|
+
|
31
|
+
def update_attribute(klass, id, key, value)
|
32
|
+
object = id.nil? ? klass.get_model_class.new(key.to_sym => value) : klass.get_model_class.find(id)
|
33
|
+
|
34
|
+
ret = object.update_attribute(key, value)
|
35
|
+
|
36
|
+
[ret, object]
|
37
|
+
end
|
38
|
+
|
39
|
+
def update_attributes(klass, id, attributes)
|
40
|
+
object = id.nil? ? klass.get_model_class.new : klass.get_model_class.find(id)
|
41
|
+
|
42
|
+
ret = object.update_attributes(attributes)
|
43
|
+
|
44
|
+
[ret, object]
|
45
|
+
end
|
46
|
+
|
47
|
+
def where(klass, args)
|
48
|
+
klass.get_model_class.where(args)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'active_repository/adapters/default_adapter'
|
2
|
+
|
3
|
+
class MongoidAdapter < DefaultAdapter
|
4
|
+
class << self
|
5
|
+
# def all(klass)
|
6
|
+
# klass.all
|
7
|
+
# end
|
8
|
+
|
9
|
+
# def delete_all(klass)
|
10
|
+
# klass.delete_all
|
11
|
+
# end
|
12
|
+
|
13
|
+
def exists?(klass, id)
|
14
|
+
klass.get_model_class.where(:id => id).present?
|
15
|
+
end
|
16
|
+
|
17
|
+
# def find(klass, id)
|
18
|
+
# klass.find(id)
|
19
|
+
# end
|
20
|
+
|
21
|
+
# def first(klass)
|
22
|
+
# klass.first
|
23
|
+
# end
|
24
|
+
|
25
|
+
# def last(klass)
|
26
|
+
# klass.last
|
27
|
+
# end
|
28
|
+
|
29
|
+
# def create(klass, attributes)
|
30
|
+
# klass.create(attributes)
|
31
|
+
# end
|
32
|
+
|
33
|
+
# def update_attribute(klass, id, key, value)
|
34
|
+
# object = id.nil? ? klass.new(key.to_sym => value) : klass.find(id)
|
35
|
+
|
36
|
+
# ret = object.update_attribute(key, value)
|
37
|
+
|
38
|
+
# [ret, object]
|
39
|
+
# end
|
40
|
+
|
41
|
+
# def update_attributes(klass, id, attributes)
|
42
|
+
# object = id.nil? ? klass.new : klass.find(id)
|
43
|
+
|
44
|
+
# ret = object.update_attributes(attributes)
|
45
|
+
|
46
|
+
# [ret, object]
|
47
|
+
# end
|
48
|
+
|
49
|
+
# def where(klass, args)
|
50
|
+
# klass.where(args)
|
51
|
+
# end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'active_repository/adapters/active_hash_adapter'
|
2
|
+
require 'active_repository/adapters/default_adapter'
|
3
|
+
require 'active_repository/adapters/mongoid_adapter'
|
4
|
+
|
5
|
+
class PersistenceAdapter
|
6
|
+
class << self
|
7
|
+
def get_adapter(klass)
|
8
|
+
modules = klass.get_model_class.included_modules.map(&:to_s)
|
9
|
+
if modules.include?("Mongoid::Document")
|
10
|
+
MongoidAdapter
|
11
|
+
elsif modules.map(&:to_s).include?("DataMapper::Resource")
|
12
|
+
DataMapperAdapter
|
13
|
+
# elsif modules.map(&:to_s).include?("MongoMapper::Document")
|
14
|
+
# MongoMapperAdapter
|
15
|
+
else
|
16
|
+
DefaultAdapter
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def all(klass)
|
21
|
+
get_adapter(klass).all(klass)
|
22
|
+
end
|
23
|
+
|
24
|
+
def create(klass, attributes)
|
25
|
+
get_adapter(klass).create(klass, attributes)
|
26
|
+
end
|
27
|
+
|
28
|
+
def delete_all(klass)
|
29
|
+
get_adapter(klass).delete_all(klass)
|
30
|
+
end
|
31
|
+
|
32
|
+
def exists?(klass, id)
|
33
|
+
get_adapter(klass).exists?(klass, id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def find(klass, id)
|
37
|
+
get_adapter(klass).find(klass, id)
|
38
|
+
end
|
39
|
+
|
40
|
+
def first(klass)
|
41
|
+
get_adapter(klass).first(klass)
|
42
|
+
end
|
43
|
+
|
44
|
+
def last(klass)
|
45
|
+
get_adapter(klass).last(klass)
|
46
|
+
end
|
47
|
+
|
48
|
+
def update_attribute(klass, id, key, value)
|
49
|
+
get_adapter(klass).update_attribute(klass, id, key, value)
|
50
|
+
end
|
51
|
+
|
52
|
+
def update_attributes(klass, id, attributes)
|
53
|
+
get_adapter(klass).update_attributes(klass, id, attributes)
|
54
|
+
end
|
55
|
+
|
56
|
+
def where(klass, args)
|
57
|
+
get_adapter(klass).where(klass, args)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def method_missing(sym, *args, &block)
|
62
|
+
get_adapter(args.first).send(sym, args)
|
63
|
+
end
|
64
|
+
end
|
@@ -4,6 +4,7 @@ require 'active_repository/write_support'
|
|
4
4
|
require 'active_repository/sql_query_executor'
|
5
5
|
require 'active_repository/finders'
|
6
6
|
require 'active_repository/writers'
|
7
|
+
require 'active_repository/adapters/persistence_adapter'
|
7
8
|
|
8
9
|
begin
|
9
10
|
klass = Module.const_get(Mongoid::Document)
|
@@ -49,7 +50,7 @@ module ActiveRepository
|
|
49
50
|
# SaveInORMOrODMTest.set_save_in_memory(false)
|
50
51
|
# end
|
51
52
|
#
|
52
|
-
# Author:: Caio Torres
|
53
|
+
# Author:: Caio Torres (mailto:efreesen@gmail.com)
|
53
54
|
# License:: MIT
|
54
55
|
class Base < ActiveHash::Base
|
55
56
|
extend ActiveModel::Callbacks
|
@@ -62,15 +63,14 @@ module ActiveRepository
|
|
62
63
|
|
63
64
|
class_attribute :model_class, :save_in_memory, :instance_writer => false
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
fields :created_at, :updated_at
|
66
|
+
after_validation :set_timestamps
|
68
67
|
|
69
68
|
self.save_in_memory = true if self.save_in_memory == nil
|
70
69
|
|
71
70
|
# Returns all persisted objects
|
72
71
|
def self.all
|
73
|
-
self == get_model_class ? super :
|
72
|
+
(self == get_model_class ? super : PersistenceAdapter.all(self).map { |object| serialize!(object.attributes) })
|
73
|
+
# self == get_model_class ? super : get_model_class.all.map { |object| serialize!(object.attributes) }
|
74
74
|
end
|
75
75
|
|
76
76
|
# Constantize class name
|
@@ -80,20 +80,21 @@ module ActiveRepository
|
|
80
80
|
|
81
81
|
# Deletes all persisted objects
|
82
82
|
def self.delete_all
|
83
|
-
self == get_model_class ? super :
|
83
|
+
self == get_model_class ? super : PersistenceAdapter.delete_all(self)
|
84
84
|
end
|
85
85
|
|
86
86
|
# Checks the existence of a persisted object with the specified id
|
87
87
|
def self.exists?(id)
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
88
|
+
self == get_model_class ? find_by_id(id).present? : PersistenceAdapter.exists?(self, id)
|
89
|
+
# if self == get_model_class
|
90
|
+
# !find_by_id(id).nil?
|
91
|
+
# else
|
92
|
+
# if mongoid?
|
93
|
+
# find_by_id(id).present?
|
94
|
+
# else
|
95
|
+
# get_model_class.exists?(id)
|
96
|
+
# end
|
97
|
+
# end
|
97
98
|
end
|
98
99
|
|
99
100
|
# Returns the Class responsible for persisting the objects
|
@@ -105,9 +106,9 @@ module ActiveRepository
|
|
105
106
|
# Converts Persisted object(s) to it's ActiveRepository counterpart
|
106
107
|
def self.serialize!(other)
|
107
108
|
case other.class.to_s
|
108
|
-
when "Hash" then self.new.serialize!(other)
|
109
|
-
when "Array"
|
110
|
-
when "Moped::BSON::Document"
|
109
|
+
when "Hash", "ActiveSupport::HashWithIndifferentAccess" then self.new.serialize!(other)
|
110
|
+
when "Array" then other.map { |o| serialize!(o.attributes) }
|
111
|
+
when "Moped::BSON::Document" then self.new.serialize!(other)
|
111
112
|
else self.new.serialize!(other.attributes)
|
112
113
|
end
|
113
114
|
end
|
@@ -150,7 +151,8 @@ module ActiveRepository
|
|
150
151
|
else
|
151
152
|
objects = []
|
152
153
|
args = args.first.is_a?(Hash) ? args.first : args
|
153
|
-
|
154
|
+
|
155
|
+
PersistenceAdapter.where(self, args).each do |object|
|
154
156
|
objects << self.serialize!(object.attributes)
|
155
157
|
end
|
156
158
|
|
@@ -168,9 +170,9 @@ module ActiveRepository
|
|
168
170
|
|
169
171
|
# Gathers the persisted object from database and updates self with it's attributes.
|
170
172
|
def reload
|
171
|
-
object = self.class.get_model_class.find(self.id)
|
173
|
+
object = self.id.present? ? self.class.get_model_class.find(self.id) : self
|
172
174
|
|
173
|
-
serialize!
|
175
|
+
serialize! object.attributes
|
174
176
|
end
|
175
177
|
|
176
178
|
def save(force=false)
|
@@ -238,8 +240,10 @@ module ActiveRepository
|
|
238
240
|
|
239
241
|
# Updates created_at and updated_at
|
240
242
|
def set_timestamps
|
241
|
-
|
242
|
-
|
243
|
+
if self.errors.empty?
|
244
|
+
self.created_at = DateTime.now.utc if self.respond_to?(:created_at=) && self.created_at.nil?
|
245
|
+
self.updated_at = DateTime.now.utc if self.respond_to?(:updated_at=)
|
246
|
+
end
|
243
247
|
end
|
244
248
|
end
|
245
249
|
end
|
@@ -3,12 +3,12 @@ module ActiveRepository #:nodoc:
|
|
3
3
|
module Finders #:nodoc:
|
4
4
|
# Defines fiend_by_field methods for the Class
|
5
5
|
def define_custom_find_by_field(field_name)
|
6
|
-
method_name = :"
|
6
|
+
method_name = :"find_by_#{field_name}"
|
7
7
|
the_meta_class.instance_eval do
|
8
8
|
define_method(method_name) do |*args|
|
9
9
|
object = nil
|
10
10
|
|
11
|
-
object = self.
|
11
|
+
object = self.where(field_name.to_sym => args).first
|
12
12
|
|
13
13
|
object.nil? ? nil : serialize!(object.attributes)
|
14
14
|
end
|
@@ -35,7 +35,7 @@ module ActiveRepository #:nodoc:
|
|
35
35
|
if self == get_model_class
|
36
36
|
super(id)
|
37
37
|
else
|
38
|
-
object = (id == :all) ? all :
|
38
|
+
object = (id == :all) ? all : PersistenceAdapter.find(self, id)
|
39
39
|
|
40
40
|
serialize!(object)
|
41
41
|
end
|
@@ -51,24 +51,27 @@ module ActiveRepository #:nodoc:
|
|
51
51
|
def find_all_by_field(field_name, args)
|
52
52
|
objects = []
|
53
53
|
|
54
|
+
# raise "field: #{field_name}; values: #{args.first.inspect}; all: #{get_model_class.all.inspect}"
|
55
|
+
|
54
56
|
if self == get_model_class
|
55
57
|
objects = self.where(field_name.to_sym => args.first)
|
56
58
|
else
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
59
|
+
objects = PersistenceAdapter.where(self, field_name.to_sym => args.first)
|
60
|
+
# if mongoid?
|
61
|
+
# objects = get_model_class.where(field_name.to_sym => args.first)
|
62
|
+
# else
|
63
|
+
# method_name = :"find_all_by_#{field_name}"
|
64
|
+
# objects = get_model_class.send(method_name, args)
|
65
|
+
# end
|
63
66
|
end
|
64
67
|
|
65
68
|
objects
|
66
69
|
end
|
67
70
|
|
68
71
|
# Searches first object that matches #field_name field with the #args value(s)
|
69
|
-
def find_by_field(field_name, args)
|
70
|
-
|
71
|
-
end
|
72
|
+
# def find_by_field(field_name, args)
|
73
|
+
# self.find_all_by_field(field_name, args).first.dup
|
74
|
+
# end
|
72
75
|
|
73
76
|
# Searches for an object that has id with #id value, if none is found returns nil
|
74
77
|
def find_by_id(id)
|
@@ -77,13 +80,13 @@ module ActiveRepository #:nodoc:
|
|
77
80
|
|
78
81
|
object.nil? ? nil : object.dup
|
79
82
|
else
|
80
|
-
object =
|
83
|
+
object = PersistenceAdapter.where(self, :id => id).first
|
81
84
|
|
82
|
-
if mongoid?
|
83
|
-
|
84
|
-
else
|
85
|
-
|
86
|
-
end
|
85
|
+
# if mongoid?
|
86
|
+
# object = get_model_class.where(:id => id).entries.first
|
87
|
+
# else
|
88
|
+
# object = get_model_class.find_by_id(id)
|
89
|
+
# end
|
87
90
|
|
88
91
|
object.nil? ? nil : serialize!(object.attributes)
|
89
92
|
end
|
@@ -102,7 +105,7 @@ module ActiveRepository #:nodoc:
|
|
102
105
|
private
|
103
106
|
# Returns the object in the position specified in #position
|
104
107
|
def get(position)
|
105
|
-
object =
|
108
|
+
object = PersistenceAdapter.send(position, self)
|
106
109
|
object.present? ? serialize!(object.attributes) : nil
|
107
110
|
end
|
108
111
|
end
|
@@ -79,7 +79,7 @@ module ActiveHash
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def eql?(other)
|
82
|
-
(other.instance_of?(self.class) || other.instance_of?(self.class.get_model_class)) && id.present? && (id == other.id) && (created_at == other.created_at)
|
82
|
+
(other.instance_of?(self.class) || other.instance_of?(self.class.get_model_class)) && id.present? && (id == other.id) && (!self.respond_to?(:created_at) || (created_at == other.created_at))
|
83
83
|
end
|
84
84
|
|
85
85
|
alias == eql?
|
@@ -3,26 +3,40 @@ module ActiveRepository
|
|
3
3
|
module Writers
|
4
4
|
# Creates an object and persists it.
|
5
5
|
def create(attributes={})
|
6
|
-
object =
|
6
|
+
object = self.new(attributes)
|
7
7
|
|
8
|
-
object.
|
8
|
+
if object.present? && object.valid?
|
9
|
+
if get_model_class == self
|
10
|
+
object.id = nil unless exists?(object.id)
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
object = repository.valid? ? get_model_class.create(attributes) : repository
|
12
|
+
object.save
|
13
|
+
else
|
14
|
+
object = PersistenceAdapter.create(self, object.attributes)
|
15
|
+
end
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
new_object = serialize!(object.reload.attributes)
|
19
|
+
|
20
|
+
new_object.valid?
|
21
|
+
|
22
|
+
new_object
|
18
23
|
end
|
19
24
|
|
20
25
|
# Searches for an object that matches the attributes on the parameter, if none is found
|
21
26
|
# it creates one with the defined attributes.
|
22
27
|
def find_or_create(attributes)
|
23
|
-
object =
|
28
|
+
object = where(attributes).first
|
29
|
+
|
30
|
+
object.nil? ? create(attributes) : object
|
31
|
+
end
|
24
32
|
|
25
|
-
|
33
|
+
def find_or_initialize(attributes)
|
34
|
+
object = where(attributes).first
|
35
|
+
object = self.new(attributes) if object.nil?
|
36
|
+
|
37
|
+
attributes.each do |key, value|
|
38
|
+
object.send("#{key.to_sym}=", value)
|
39
|
+
end
|
26
40
|
|
27
41
|
serialize!(object.attributes)
|
28
42
|
end
|
@@ -38,19 +52,22 @@ module ActiveRepository
|
|
38
52
|
|
39
53
|
# Updates #key attribute with #value value.
|
40
54
|
def update_attribute(key, value)
|
41
|
-
ret
|
55
|
+
ret = self.valid?
|
42
56
|
|
43
57
|
if ret
|
44
|
-
object = (self.id.nil? ? self.class.get_model_class.new : self.class.get_model_class.find(self.id))
|
45
|
-
|
46
58
|
if self.class == self.class.get_model_class
|
59
|
+
object = self.class.find_or_initialize(:id => self.id)
|
60
|
+
|
47
61
|
self.send("#{key}=", value)
|
48
62
|
|
49
63
|
ret = save
|
50
64
|
else
|
51
|
-
key = (key.to_s == 'id' ? '_id' : key.to_s) if mongoid?
|
65
|
+
# key = (key.to_s == 'id' ? '_id' : key.to_s) if mongoid?
|
66
|
+
|
67
|
+
ret, object = PersistenceAdapter.update_attribute(self.class, self.id, key, value)
|
52
68
|
|
53
|
-
|
69
|
+
self.attributes = object.attributes
|
70
|
+
# object.update_attribute(key,value)
|
54
71
|
end
|
55
72
|
|
56
73
|
reload
|
@@ -71,9 +88,13 @@ module ActiveRepository
|
|
71
88
|
end
|
72
89
|
save
|
73
90
|
else
|
74
|
-
|
91
|
+
attributes = self.attributes.merge(attributes)
|
92
|
+
ret, object = PersistenceAdapter.update_attributes(self.class, self.id, attributes)
|
93
|
+
|
94
|
+
self.attributes = object.attributes
|
95
|
+
# object = self.id.nil? ? model_class.new : model_class.find(self.id)
|
75
96
|
|
76
|
-
ret = object.update_attributes(attributes)
|
97
|
+
# ret = object.update_attributes(attributes)
|
77
98
|
end
|
78
99
|
|
79
100
|
reload
|
@@ -18,7 +18,7 @@ describe ActiveRepository, "Base" do
|
|
18
18
|
|
19
19
|
context "in_memory" do
|
20
20
|
before do
|
21
|
-
Country.fields :name, :monarch, :language
|
21
|
+
Country.fields :name, :monarch, :language, :created_at, :updated_at
|
22
22
|
Country.set_model_class(Country)
|
23
23
|
Country.set_save_in_memory(true)
|
24
24
|
|
@@ -62,7 +62,7 @@ describe ActiveRepository, "Base" do
|
|
62
62
|
|
63
63
|
context "active_record" do
|
64
64
|
before do
|
65
|
-
Country.fields :name, :monarch, :language
|
65
|
+
Country.fields :name, :monarch, :language, :created_at, :updated_at
|
66
66
|
|
67
67
|
class CountryModel < ActiveRecord::Base
|
68
68
|
self.table_name = 'countries'
|
@@ -123,7 +123,7 @@ describe ActiveRepository, "Base" do
|
|
123
123
|
|
124
124
|
context "mongoid" do
|
125
125
|
before do
|
126
|
-
Country.fields :name, :monarch, :language
|
126
|
+
Country.fields :name, :monarch, :language, :created_at, :updated_at
|
127
127
|
|
128
128
|
Mongoid.load!("support/mongoid.yml", :development)
|
129
129
|
|
@@ -2,14 +2,16 @@ require 'set'
|
|
2
2
|
|
3
3
|
shared_examples ".update_attributes" do
|
4
4
|
it "updates records" do
|
5
|
-
|
5
|
+
id = Country.first.id
|
6
|
+
country = Country.find(id)
|
6
7
|
country.update_attributes(:name => "Italy")
|
7
8
|
|
8
9
|
Country.first.name.should == "Italy"
|
9
10
|
end
|
10
11
|
|
11
12
|
it "must not update id" do
|
12
|
-
|
13
|
+
id = Country.first.id
|
14
|
+
country = Country.find(id)
|
13
15
|
|
14
16
|
country.update_attributes(:id => 45, :name => "Russia")
|
15
17
|
|
@@ -48,24 +50,30 @@ shared_examples ".where" do
|
|
48
50
|
end
|
49
51
|
|
50
52
|
it "populates the data correctly" do
|
53
|
+
first_id = Country.first.id
|
54
|
+
last_id = Country.all[3].id
|
55
|
+
|
51
56
|
records = Country.where(:language => 'English')
|
52
|
-
records.first.id.should ==
|
57
|
+
records.first.id.should == first_id
|
53
58
|
records.first.name.should == "US"
|
54
|
-
records.last.id.should ==
|
59
|
+
records.last.id.should == last_id
|
55
60
|
records.last.name.should == "UK"
|
56
61
|
end
|
57
62
|
|
58
63
|
it "filters the records from a AR-like conditions hash" do
|
64
|
+
first_id = Country.first.id
|
65
|
+
|
59
66
|
record = Country.where(:name => 'US')
|
60
67
|
record.count.should == 1
|
61
|
-
record.first.id.should ==
|
68
|
+
record.first.id.should == first_id
|
62
69
|
record.first.name.should == 'US'
|
63
70
|
end
|
64
71
|
|
65
72
|
it "if id exists, use auto increment id" do
|
73
|
+
first_id = Country.first.id
|
66
74
|
country = Country.create(:name => "Russia", :language => 'Russian')
|
67
75
|
|
68
|
-
country.id.should_not ==
|
76
|
+
country.id.should_not == first_id
|
69
77
|
end
|
70
78
|
end
|
71
79
|
|
@@ -91,24 +99,31 @@ end
|
|
91
99
|
|
92
100
|
shared_examples ".first" do
|
93
101
|
it "returns the first object" do
|
94
|
-
|
102
|
+
first = Country.first
|
103
|
+
|
104
|
+
first.should == Country.find(first.id)
|
95
105
|
end
|
96
106
|
end
|
97
107
|
|
98
108
|
shared_examples ".last" do
|
99
109
|
it "returns the last object" do
|
100
|
-
|
110
|
+
last = Country.last
|
111
|
+
|
112
|
+
last.should == Country.find(last.id)
|
101
113
|
end
|
102
114
|
end
|
103
115
|
|
104
116
|
shared_examples ".find" do
|
105
117
|
context "with an id" do
|
106
118
|
it "finds the record with the specified id" do
|
107
|
-
Country.
|
119
|
+
second_id = Country.all[1].id
|
120
|
+
Country.find(second_id).id.should == second_id
|
108
121
|
end
|
109
122
|
|
110
123
|
it "finds the record with the specified id as a string" do
|
111
|
-
Country.
|
124
|
+
second_id = Country.all[1].id
|
125
|
+
|
126
|
+
Country.find(second_id.to_s).id.should == second_id
|
112
127
|
end
|
113
128
|
|
114
129
|
it "raises ActiveHash::RecordNotFound when id not found" do
|
@@ -130,7 +145,9 @@ shared_examples ".find" do
|
|
130
145
|
|
131
146
|
context "with an array of ids" do
|
132
147
|
it "returns all matching ids" do
|
133
|
-
|
148
|
+
countries = Country.all
|
149
|
+
ids = [countries[0].id, countries[2].id]
|
150
|
+
Country.find(ids).should == [Country.find(ids.first), Country.find(ids.last)]
|
134
151
|
end
|
135
152
|
|
136
153
|
it "raises ActiveHash::RecordNotFound when id not found" do
|
@@ -144,11 +161,13 @@ end
|
|
144
161
|
shared_examples ".find_by_id" do
|
145
162
|
context "with an id" do
|
146
163
|
it "finds the record with the specified id" do
|
147
|
-
Country.
|
164
|
+
id = Country.all[1].id
|
165
|
+
Country.find_by_id(id).id.should == id
|
148
166
|
end
|
149
167
|
|
150
168
|
it "finds the record with the specified id as a string" do
|
151
|
-
Country.
|
169
|
+
id = Country.all[1].id
|
170
|
+
Country.find_by_id(id.to_s).id.should == id
|
152
171
|
end
|
153
172
|
end
|
154
173
|
|
@@ -170,13 +189,15 @@ shared_examples "custom finders" do
|
|
170
189
|
describe "with a match" do
|
171
190
|
context "for a non-nil argument" do
|
172
191
|
it "returns the first matching record" do
|
173
|
-
Country.
|
192
|
+
id = Country.first.id
|
193
|
+
Country.where(:name => "US").first.id.should == id
|
174
194
|
end
|
175
195
|
end
|
176
196
|
|
177
197
|
context "for a nil argument" do
|
178
198
|
it "returns the first matching record" do
|
179
|
-
Country.
|
199
|
+
id = Country.all[2].id
|
200
|
+
Country.where(:language => 'Spanish').first.id.should == id
|
180
201
|
end
|
181
202
|
end
|
182
203
|
end
|
@@ -216,14 +237,16 @@ shared_examples "custom finders" do
|
|
216
237
|
describe "find_by_<field_one>_and_<field_two>" do
|
217
238
|
describe "with a match" do
|
218
239
|
it "returns the first matching record" do
|
219
|
-
Country.
|
220
|
-
Country.
|
240
|
+
id = Country.all[1].id
|
241
|
+
Country.find_by_name_and_language("Canada", "English").id.should == id
|
242
|
+
Country.find_by_language_and_name("English", "Canada").id.should == id
|
221
243
|
end
|
222
244
|
end
|
223
245
|
|
224
246
|
describe "with a match based on to_s" do
|
225
247
|
it "returns the first matching record" do
|
226
|
-
Country.
|
248
|
+
id = Country.all[1].id
|
249
|
+
Country.find_by_name_and_id("Canada", id.to_s).id.should == id
|
227
250
|
end
|
228
251
|
end
|
229
252
|
|
@@ -351,8 +374,8 @@ end
|
|
351
374
|
|
352
375
|
shared_examples "#to_param" do
|
353
376
|
it "should return id as a string" do
|
354
|
-
|
355
|
-
|
377
|
+
country = Country.create
|
378
|
+
country.to_param.should == country.id.to_s
|
356
379
|
end
|
357
380
|
end
|
358
381
|
|
@@ -431,7 +454,9 @@ shared_examples "#readonly?" do
|
|
431
454
|
end
|
432
455
|
|
433
456
|
it "updates a record" do
|
434
|
-
|
457
|
+
id = Country.first.id
|
458
|
+
|
459
|
+
country = Country.find(id)
|
435
460
|
|
436
461
|
country.name = "Germany"
|
437
462
|
|
@@ -440,7 +465,7 @@ shared_examples "#readonly?" do
|
|
440
465
|
Country.all.size.should == 5
|
441
466
|
country.should be_valid
|
442
467
|
country.name.should == "Germany"
|
443
|
-
country.id.should ==
|
468
|
+
country.id.should == id
|
444
469
|
end
|
445
470
|
end
|
446
471
|
|
@@ -452,9 +477,10 @@ shared_examples "#cache_key" do
|
|
452
477
|
it 'should use the record\'s updated_at if present' do
|
453
478
|
country = Country.create(:name => "foo")
|
454
479
|
|
455
|
-
|
480
|
+
country.reload
|
456
481
|
|
457
482
|
date_string = country.updated_at.nil? ? "" : "-#{country.updated_at.to_s(:number)}"
|
483
|
+
id = country.id
|
458
484
|
|
459
485
|
Country.first.cache_key.should == "countries/#{id}#{date_string}"
|
460
486
|
end
|
@@ -472,15 +498,15 @@ shared_examples "#save" do
|
|
472
498
|
|
473
499
|
it "adds the new object to the data collection" do
|
474
500
|
Country.all.should be_empty
|
475
|
-
country = Country.new :name => "foo", :monarch =>
|
476
|
-
country.
|
501
|
+
country = Country.new :name => "foo", :monarch => "King", :language => "bar"
|
502
|
+
country.save.should be_true
|
477
503
|
country.reload
|
478
504
|
|
479
|
-
countries_attributes = Country.
|
505
|
+
countries_attributes = Country.first.attributes
|
480
506
|
countries_attributes.delete(:created_at)
|
481
507
|
countries_attributes.delete(:updated_at)
|
482
508
|
|
483
|
-
expected_attributes =
|
509
|
+
expected_attributes = country.attributes
|
484
510
|
expected_attributes.delete(:created_at)
|
485
511
|
expected_attributes.delete(:updated_at)
|
486
512
|
|
@@ -523,13 +549,13 @@ shared_examples ".create" do
|
|
523
549
|
countries_attributes.should == expected_attributes
|
524
550
|
end
|
525
551
|
|
526
|
-
it "adds an auto-incrementing id if the id is nil" do
|
552
|
+
it "adds an auto-incrementing id if the id is nil and not MongoMapper" do
|
527
553
|
country1 = Country.new :name => "foo"
|
528
554
|
country1.save
|
529
555
|
|
530
556
|
country2 = Country.new :name => "bar"
|
531
557
|
country2.save
|
532
|
-
country2.id.should == country1.id + 1
|
558
|
+
country2.id.should == ((country1.id.class.name == "BSON::ObjectId") ? country2.id : country1.id + 1)
|
533
559
|
end
|
534
560
|
|
535
561
|
it "adds the new object to the data collection" do
|
@@ -291,10 +291,11 @@ shared_examples "is" do
|
|
291
291
|
end
|
292
292
|
|
293
293
|
it "attribute is not condition" do
|
294
|
+
id = Country.last.id
|
294
295
|
records = Country.where("founded_at is not null")
|
295
296
|
records.count.should == 1
|
296
|
-
records.first.id.should ==
|
297
|
-
records.should == [Country.find(
|
297
|
+
records.first.id.should == id
|
298
|
+
records.should == [Country.find(id)]
|
298
299
|
end
|
299
300
|
end
|
300
301
|
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_repository
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Caio Torres
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-03-23 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: active_hash
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: activemodel
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: activerecord
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: mongoid
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,20 @@ dependencies:
|
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mongo_mapper
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
93
|
requirements:
|
91
94
|
- - ! '>='
|
92
95
|
- !ruby/object:Gem::Version
|
@@ -94,7 +97,6 @@ dependencies:
|
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
98
|
name: rake
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
101
|
- - ! '>='
|
100
102
|
- !ruby/object:Gem::Version
|
@@ -102,7 +104,6 @@ dependencies:
|
|
102
104
|
type: :development
|
103
105
|
prerelease: false
|
104
106
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
107
|
requirements:
|
107
108
|
- - ! '>='
|
108
109
|
- !ruby/object:Gem::Version
|
@@ -110,7 +111,6 @@ dependencies:
|
|
110
111
|
- !ruby/object:Gem::Dependency
|
111
112
|
name: sqlite3
|
112
113
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
114
|
requirements:
|
115
115
|
- - ! '>='
|
116
116
|
- !ruby/object:Gem::Version
|
@@ -118,7 +118,6 @@ dependencies:
|
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
121
|
requirements:
|
123
122
|
- - ! '>='
|
124
123
|
- !ruby/object:Gem::Version
|
@@ -133,6 +132,10 @@ files:
|
|
133
132
|
- LICENSE
|
134
133
|
- README.md
|
135
134
|
- active_repository.gemspec
|
135
|
+
- lib/active_repository/adapters/active_hash_adapter.rb
|
136
|
+
- lib/active_repository/adapters/default_adapter.rb
|
137
|
+
- lib/active_repository/adapters/mongoid_adapter.rb
|
138
|
+
- lib/active_repository/adapters/persistence_adapter.rb
|
136
139
|
- lib/active_repository/associations.rb
|
137
140
|
- lib/active_repository/base.rb
|
138
141
|
- lib/active_repository/finders.rb
|
@@ -152,27 +155,26 @@ files:
|
|
152
155
|
homepage: http://github.com/efreesen/active_repository
|
153
156
|
licenses:
|
154
157
|
- MIT
|
158
|
+
metadata: {}
|
155
159
|
post_install_message:
|
156
160
|
rdoc_options: []
|
157
161
|
require_paths:
|
158
162
|
- lib
|
159
163
|
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
-
none: false
|
161
164
|
requirements:
|
162
165
|
- - ! '>='
|
163
166
|
- !ruby/object:Gem::Version
|
164
167
|
version: '0'
|
165
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
|
-
none: false
|
167
169
|
requirements:
|
168
170
|
- - ! '>='
|
169
171
|
- !ruby/object:Gem::Version
|
170
172
|
version: '0'
|
171
173
|
requirements: []
|
172
174
|
rubyforge_project:
|
173
|
-
rubygems_version:
|
175
|
+
rubygems_version: 2.0.3
|
174
176
|
signing_key:
|
175
|
-
specification_version:
|
177
|
+
specification_version: 4
|
176
178
|
summary: An implementation of repository pattern that can connect with any ORM
|
177
179
|
test_files:
|
178
180
|
- Gemfile
|