orm_adapter 0.0.3 → 0.0.4
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/.gitignore +10 -1
- data/Gemfile +1 -13
- data/{Gemfile.lock → Gemfile.lock.development} +46 -47
- data/History.txt +6 -0
- data/README.rdoc +23 -2
- data/Rakefile +43 -26
- data/lib/orm_adapter/adapters/active_record.rb +15 -9
- data/lib/orm_adapter/adapters/data_mapper.rb +17 -9
- data/lib/orm_adapter/adapters/mongoid.rb +11 -9
- data/lib/orm_adapter/base.rb +46 -4
- data/lib/orm_adapter/version.rb +1 -1
- data/orm_adapter.gemspec +27 -59
- data/spec/orm_adapter/adapters/active_record_spec.rb +1 -2
- data/spec/orm_adapter/adapters/data_mapper_spec.rb +1 -0
- data/spec/orm_adapter/adapters/mongoid_spec.rb +1 -0
- data/spec/orm_adapter/base_spec.rb +56 -0
- data/spec/orm_adapter/example_app_shared.rb +65 -27
- metadata +211 -15
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,15 +1,3 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
group :test do
|
6
|
-
gem "activerecord", "~> 3.0.0"
|
7
|
-
gem "mongoid", "~> 2.0.0.beta.17"
|
8
|
-
gem "rspec", "~> 2.0.0.rc"
|
9
|
-
gem "jeweler"
|
10
|
-
gem "rake"
|
11
|
-
gem "sqlite3-ruby"
|
12
|
-
gem "datamapper"
|
13
|
-
gem "dm-sqlite-adapter"
|
14
|
-
gem "dm-active_model"
|
15
|
-
end
|
3
|
+
gemspec
|
@@ -1,20 +1,25 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
orm_adapter (0.0.4)
|
5
|
+
|
1
6
|
GEM
|
2
7
|
remote: http://rubygems.org/
|
3
8
|
specs:
|
4
|
-
activemodel (3.0.
|
5
|
-
activesupport (= 3.0.
|
9
|
+
activemodel (3.0.3)
|
10
|
+
activesupport (= 3.0.3)
|
6
11
|
builder (~> 2.1.2)
|
7
|
-
i18n (~> 0.4
|
8
|
-
activerecord (3.0.
|
9
|
-
activemodel (= 3.0.
|
10
|
-
activesupport (= 3.0.
|
11
|
-
arel (~>
|
12
|
+
i18n (~> 0.4)
|
13
|
+
activerecord (3.0.3)
|
14
|
+
activemodel (= 3.0.3)
|
15
|
+
activesupport (= 3.0.3)
|
16
|
+
arel (~> 2.0.2)
|
12
17
|
tzinfo (~> 0.3.23)
|
13
|
-
activesupport (3.0.
|
14
|
-
addressable (2.2.
|
15
|
-
arel (
|
16
|
-
|
17
|
-
|
18
|
+
activesupport (3.0.3)
|
19
|
+
addressable (2.2.2)
|
20
|
+
arel (2.0.6)
|
21
|
+
bson (1.1.5)
|
22
|
+
bson_ext (1.1.5)
|
18
23
|
builder (2.1.2)
|
19
24
|
data_objects (0.10.2)
|
20
25
|
addressable (~> 2.1)
|
@@ -29,7 +34,7 @@ GEM
|
|
29
34
|
dm-types (= 1.0.2)
|
30
35
|
dm-validations (= 1.0.2)
|
31
36
|
diff-lcs (1.1.2)
|
32
|
-
dm-active_model (1.0.
|
37
|
+
dm-active_model (1.0.3)
|
33
38
|
activemodel (~> 3.0.0)
|
34
39
|
dm-core (~> 1.0.2)
|
35
40
|
dm-aggregates (1.0.2)
|
@@ -68,52 +73,46 @@ GEM
|
|
68
73
|
data_objects (= 0.10.2)
|
69
74
|
extlib (0.9.15)
|
70
75
|
fastercsv (1.5.3)
|
71
|
-
gemcutter (0.6.1)
|
72
76
|
git (1.2.5)
|
73
|
-
i18n (0.
|
74
|
-
jeweler (1.4.0)
|
75
|
-
gemcutter (>= 0.1.0)
|
76
|
-
git (>= 1.2.5)
|
77
|
-
rubyforge (>= 2.0.0)
|
77
|
+
i18n (0.5.0)
|
78
78
|
json_pure (1.4.6)
|
79
|
-
mongo (1.
|
80
|
-
bson (>= 1.
|
81
|
-
mongoid (2.0.0.beta.
|
79
|
+
mongo (1.1.5)
|
80
|
+
bson (>= 1.1.5)
|
81
|
+
mongoid (2.0.0.beta.20)
|
82
82
|
activemodel (~> 3.0)
|
83
|
-
mongo (
|
83
|
+
mongo (~> 1.1)
|
84
84
|
tzinfo (~> 0.3.22)
|
85
85
|
will_paginate (~> 3.0.pre)
|
86
86
|
rake (0.8.7)
|
87
|
-
rspec (2.
|
88
|
-
rspec-core (
|
89
|
-
rspec-expectations (
|
90
|
-
rspec-mocks (
|
91
|
-
rspec-core (2.
|
92
|
-
rspec-expectations (2.
|
93
|
-
diff-lcs (
|
94
|
-
rspec-mocks (2.
|
95
|
-
|
96
|
-
rspec-expectations (= 2.0.0.rc)
|
97
|
-
rubyforge (2.0.4)
|
98
|
-
json_pure (>= 1.1.7)
|
99
|
-
sqlite3-ruby (1.3.1)
|
87
|
+
rspec (2.4.0)
|
88
|
+
rspec-core (~> 2.4.0)
|
89
|
+
rspec-expectations (~> 2.4.0)
|
90
|
+
rspec-mocks (~> 2.4.0)
|
91
|
+
rspec-core (2.4.0)
|
92
|
+
rspec-expectations (2.4.0)
|
93
|
+
diff-lcs (~> 1.1.2)
|
94
|
+
rspec-mocks (2.4.0)
|
95
|
+
sqlite3-ruby (1.3.2)
|
100
96
|
stringex (1.1.0)
|
101
97
|
tzinfo (0.3.23)
|
102
98
|
uuidtools (2.1.1)
|
103
99
|
will_paginate (3.0.pre2)
|
104
|
-
yard (0.6.
|
100
|
+
yard (0.6.4)
|
105
101
|
|
106
102
|
PLATFORMS
|
107
103
|
ruby
|
108
104
|
|
109
105
|
DEPENDENCIES
|
110
|
-
activerecord (
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
106
|
+
activerecord (>= 3.0.0)
|
107
|
+
bson_ext (>= 1.1.5)
|
108
|
+
bundler (>= 1.0.0)
|
109
|
+
datamapper (>= 1.0)
|
110
|
+
dm-active_model (>= 1.0)
|
111
|
+
dm-sqlite-adapter (>= 1.0)
|
112
|
+
git (>= 1.2.5)
|
113
|
+
mongoid (>= 2.0.0.beta.20)
|
114
|
+
orm_adapter!
|
115
|
+
rake (>= 0.8.7)
|
116
|
+
rspec (>= 2.4.0)
|
117
|
+
sqlite3-ruby (>= 1.3.2)
|
118
|
+
yard (>= 0.6.0)
|
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -15,9 +15,11 @@ Provides a single point of entry for popular ruby ORMs. Its target audience is
|
|
15
15
|
user_model.get!(1) # find a record by id
|
16
16
|
user_model.find_first(:name => 'fred') # find first fred
|
17
17
|
user_model.find_all(:name => 'fred') # find all freds
|
18
|
+
user_model.find_all(:order => :name) # find all freds, ordered by name
|
18
19
|
user_model.create!(:name => 'fred') # create a fred
|
19
|
-
|
20
20
|
|
21
|
+
@see OrmAdapter::Base for more details of the supported API
|
22
|
+
|
21
23
|
== Supported ORMs
|
22
24
|
|
23
25
|
Currently supported ORMs are *ActiveRecord*, *DataMapper* and *MongoId*.
|
@@ -36,6 +38,14 @@ ORM Adapter will support only basic methods, as +get+, +find_first+, <tt>create!
|
|
36
38
|
If you need complex queries, we recommend you to subclass ORM Adapters in your plugin and extend it expressing these query conditions as part of your domain logic.
|
37
39
|
|
38
40
|
|
41
|
+
== Projects using orm_adapter
|
42
|
+
|
43
|
+
* {devise}[http://github.com/plataformatec/devise]
|
44
|
+
* {pickle}[http://github.com/ianwhite/pickle]
|
45
|
+
|
46
|
+
Get in touch if you want your project added to this list
|
47
|
+
|
48
|
+
|
39
49
|
== History
|
40
50
|
|
41
51
|
orm_adapter is an extraction from {pickle}[http://github.com/ianwhite/pickle] by {Ian White}[http://github.com/ianwhite]. Pickle's orm adapter included work by {Daniel Neighman}[http://github.com/hassox], {Josh Bassett}[http://github.com/nullobject], {Marc Lee}[http://github.com/maleko], and {Sebastian Zuchmanski}[http://github.com/sebcioz].
|
@@ -43,6 +53,17 @@ orm_adapter is an extraction from {pickle}[http://github.com/ianwhite/pickle] by
|
|
43
53
|
{José Valim}[http://github.com/josevalim] suggested the extraction, and worked on the first release with Ian.
|
44
54
|
|
45
55
|
|
56
|
+
== Development
|
57
|
+
|
58
|
+
To run the specs, you can start from the last known good set of gem dependencies in Gemfile.lock.development:
|
59
|
+
|
60
|
+
git clone http://github.com/ianwhite/orm_adapter
|
61
|
+
cd orm_adapter
|
62
|
+
cp Gemfile.lock.development Gemfile.lock
|
63
|
+
bundle
|
64
|
+
bundle exec rake spec
|
65
|
+
|
66
|
+
|
46
67
|
== Copyright
|
47
68
|
|
48
|
-
Copyright (c) 2010 Ian White and José Valim. See LICENSE for details.
|
69
|
+
Copyright (c) 2010-2011 Ian White and José Valim. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -2,38 +2,55 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'rspec/core/rake_task'
|
4
4
|
require 'yard'
|
5
|
+
require 'git'
|
6
|
+
$:.push File.expand_path("../lib", __FILE__)
|
7
|
+
require "orm_adapter/version"
|
5
8
|
|
6
|
-
$:.unshift File.expand_path('lib')
|
7
|
-
require 'orm_adapter/version'
|
8
|
-
|
9
|
-
task :spec => :check_dependencies
|
10
9
|
task :default => :spec
|
11
10
|
|
12
|
-
desc "Run the specs"
|
13
11
|
RSpec::Core::RakeTask.new(:spec)
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
13
|
+
YARD::Rake::YardocTask.new(:doc) do |t|
|
14
|
+
t.files = ['lib/**/*.rb', 'README.rdoc']
|
15
|
+
end
|
16
|
+
|
17
|
+
task :build do
|
18
|
+
system "gem build orm_adapter.gemspec"
|
19
|
+
end
|
20
|
+
|
21
|
+
namespace :release do
|
22
|
+
task :rubygems => :pre do
|
23
|
+
system "gem push orm_adapter-#{OrmAdapter::VERSION}.gem"
|
25
24
|
end
|
26
|
-
Jeweler::GemcutterTasks.new
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
task :github => :pre do
|
27
|
+
tag = "v#{OrmAdapter::VERSION}"
|
28
|
+
git = Git.open('.')
|
29
|
+
|
30
|
+
if (git.tag(tag) rescue nil)
|
31
|
+
raise "** repo is already tagged with: #{tag}"
|
32
|
+
end
|
33
|
+
|
34
|
+
git.add_tag(tag)
|
35
|
+
git.push('origin', tag)
|
31
36
|
end
|
32
37
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
38
|
+
task :pre => [:spec, :build] do
|
39
|
+
git = Git.open('.')
|
40
|
+
|
41
|
+
if File.exists?("Gemfile.lock") && File.read("Gemfile.lock") != File.read("Gemfile.lock.development")
|
42
|
+
cp "Gemfile.lock", "Gemfile.lock.development"
|
43
|
+
raise "** Gemfile.lock.development has been updated, please commit these changes."
|
44
|
+
end
|
45
|
+
|
46
|
+
if (git.status.changed + git.status.added + git.status.deleted).any?
|
47
|
+
raise "** repo is not clean, try committing some files"
|
48
|
+
end
|
49
|
+
|
50
|
+
if git.object('HEAD').sha != git.object('origin/master').sha
|
51
|
+
raise "** origin does not match HEAD, have you pushed?"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
task :all => ['release:github', 'release:rubygems']
|
56
|
+
end
|
@@ -35,27 +35,29 @@ class ActiveRecord::Base
|
|
35
35
|
klass.column_names
|
36
36
|
end
|
37
37
|
|
38
|
-
#
|
38
|
+
# @see OrmAdapter::Base#get!
|
39
39
|
def get!(id)
|
40
40
|
klass.find(wrap_key(id))
|
41
41
|
end
|
42
42
|
|
43
|
-
#
|
43
|
+
# @see OrmAdapter::Base#get
|
44
44
|
def get(id)
|
45
45
|
klass.first :conditions => { klass.primary_key => wrap_key(id) }
|
46
46
|
end
|
47
47
|
|
48
|
-
#
|
49
|
-
def find_first(
|
50
|
-
|
48
|
+
# @see OrmAdapter::Base#find_first
|
49
|
+
def find_first(options)
|
50
|
+
conditions, order = extract_conditions_and_order!(options)
|
51
|
+
klass.first :conditions => conditions_to_fields(conditions), :order => order_clause(order)
|
51
52
|
end
|
52
53
|
|
53
|
-
#
|
54
|
-
def find_all(
|
55
|
-
|
54
|
+
# @see OrmAdapter::Base#find_all
|
55
|
+
def find_all(options)
|
56
|
+
conditions, order = extract_conditions_and_order!(options)
|
57
|
+
klass.all :conditions => conditions_to_fields(conditions), :order => order_clause(order)
|
56
58
|
end
|
57
59
|
|
58
|
-
#
|
60
|
+
# @see OrmAdapter::Base#create!
|
59
61
|
def create!(attributes)
|
60
62
|
klass.create!(attributes)
|
61
63
|
end
|
@@ -75,5 +77,9 @@ class ActiveRecord::Base
|
|
75
77
|
end
|
76
78
|
fields
|
77
79
|
end
|
80
|
+
|
81
|
+
def order_clause(order)
|
82
|
+
order.map {|pair| "#{pair[0]} #{pair[1]}"}.join(",")
|
83
|
+
end
|
78
84
|
end
|
79
85
|
end
|
@@ -23,30 +23,38 @@ module DataMapper
|
|
23
23
|
klass.properties.map(&:name)
|
24
24
|
end
|
25
25
|
|
26
|
-
#
|
26
|
+
# @see OrmAdapter::Base#get!
|
27
27
|
def get!(id)
|
28
28
|
klass.get!(id)
|
29
29
|
end
|
30
30
|
|
31
|
-
#
|
31
|
+
# @see OrmAdapter::Base#get
|
32
32
|
def get(id)
|
33
33
|
klass.get(id)
|
34
34
|
end
|
35
35
|
|
36
|
-
#
|
37
|
-
def find_first(
|
38
|
-
|
36
|
+
# @see OrmAdapter::Base#find_first
|
37
|
+
def find_first(options)
|
38
|
+
conditions, order = extract_conditions_and_order!(options)
|
39
|
+
klass.first :conditions => conditions, :order => order_clause(order)
|
39
40
|
end
|
40
41
|
|
41
|
-
#
|
42
|
-
def find_all(
|
43
|
-
|
42
|
+
# @see OrmAdapter::Base#find_all
|
43
|
+
def find_all(options)
|
44
|
+
conditions, order = extract_conditions_and_order!(options)
|
45
|
+
klass.all :conditions => conditions, :order => order_clause(order)
|
44
46
|
end
|
45
47
|
|
46
|
-
#
|
48
|
+
# @see OrmAdapter::Base#create!
|
47
49
|
def create!(attributes)
|
48
50
|
klass.create(attributes)
|
49
51
|
end
|
52
|
+
|
53
|
+
protected
|
54
|
+
|
55
|
+
def order_clause(order)
|
56
|
+
order.map {|pair| pair.first.send(pair.last)}
|
57
|
+
end
|
50
58
|
end
|
51
59
|
end
|
52
60
|
end
|
@@ -22,27 +22,29 @@ module Mongoid
|
|
22
22
|
klass.fields.keys
|
23
23
|
end
|
24
24
|
|
25
|
-
#
|
25
|
+
# @see OrmAdapter::Base#get!
|
26
26
|
def get!(id)
|
27
27
|
klass.find(wrap_key(id))
|
28
28
|
end
|
29
29
|
|
30
|
-
#
|
30
|
+
# @see OrmAdapter::Base#get
|
31
31
|
def get(id)
|
32
32
|
klass.first(:conditions => { :id => wrap_key(id) })
|
33
33
|
end
|
34
34
|
|
35
|
-
#
|
36
|
-
def find_first(
|
37
|
-
|
35
|
+
# @see OrmAdapter::Base#find_first
|
36
|
+
def find_first(options)
|
37
|
+
conditions, order = extract_conditions_and_order!(options)
|
38
|
+
klass.limit(1).where(conditions_to_fields(conditions)).order_by(order).first
|
38
39
|
end
|
39
40
|
|
40
|
-
#
|
41
|
-
def find_all(
|
42
|
-
|
41
|
+
# @see OrmAdapter::Base#find_all
|
42
|
+
def find_all(options)
|
43
|
+
conditions, order = extract_conditions_and_order!(options)
|
44
|
+
klass.where(conditions_to_fields(conditions)).order_by(order)
|
43
45
|
end
|
44
46
|
|
45
|
-
#
|
47
|
+
# @see OrmAdapter::Base#create!
|
46
48
|
def create!(attributes)
|
47
49
|
klass.create!(attributes)
|
48
50
|
end
|
data/lib/orm_adapter/base.rb
CHANGED
@@ -46,13 +46,30 @@ module OrmAdapter
|
|
46
46
|
raise NotSupportedError
|
47
47
|
end
|
48
48
|
|
49
|
-
# Find the first instance matching conditions
|
50
|
-
|
49
|
+
# Find the first instance, optionally matching conditions, and specifying order
|
50
|
+
#
|
51
|
+
# You can call with just conditions, providing a hash
|
52
|
+
#
|
53
|
+
# User.to_adapter.find_first :name => "Fred", :age => 23
|
54
|
+
#
|
55
|
+
# Or you can specify :order, and :conditions as keys
|
56
|
+
#
|
57
|
+
# User.to_adapter.find_first :conditions => {:name => "Fred", :age => 23}
|
58
|
+
# User.to_adapter.find_first :order => [:age, :desc]
|
59
|
+
# User.to_adapter.find_first :order => :name, :conditions => {:age => 18}
|
60
|
+
#
|
61
|
+
# When specifying :order, it may be
|
62
|
+
# * a single arg e.g. <tt>:order => :name</tt>
|
63
|
+
# * a single pair with :asc, or :desc as last, e.g. <tt>:order => [:name, :desc]</tt>
|
64
|
+
# * an array of single args or pairs (with :asc or :desc as last), e.g. <tt>:order => [[:name, :asc], [:age, :desc]]</tt>
|
65
|
+
#
|
66
|
+
def find_first(options)
|
51
67
|
raise NotSupportedError
|
52
68
|
end
|
53
69
|
|
54
|
-
# Find all models matching conditions
|
55
|
-
|
70
|
+
# Find all models, optionally matching conditions, and specifying order
|
71
|
+
# @see OrmAdapter::Base#find_first for how to specify order and conditions
|
72
|
+
def find_all(options)
|
56
73
|
raise NotSupportedError
|
57
74
|
end
|
58
75
|
|
@@ -66,6 +83,31 @@ module OrmAdapter
|
|
66
83
|
def wrap_key(key)
|
67
84
|
key.is_a?(Array) ? key.first : key
|
68
85
|
end
|
86
|
+
|
87
|
+
# given an options hash, with optional :conditions and :order keys, returns conditions and normalized order
|
88
|
+
def extract_conditions_and_order!(options = {})
|
89
|
+
order = normalize_order(options.delete(:order))
|
90
|
+
conditions = options.delete(:conditions) || options
|
91
|
+
[conditions, order]
|
92
|
+
end
|
93
|
+
|
94
|
+
# given an order argument, returns an array of pairs, with each pair containing the attribute, and :asc or :desc
|
95
|
+
def normalize_order(order)
|
96
|
+
order = Array(order)
|
97
|
+
|
98
|
+
if order.length == 2 && !order[0].is_a?(Array) && [:asc, :desc].include?(order[1])
|
99
|
+
order = [order]
|
100
|
+
else
|
101
|
+
order = order.map {|pair| pair.is_a?(Array) ? pair : [pair, :asc] }
|
102
|
+
end
|
103
|
+
|
104
|
+
order.each do |pair|
|
105
|
+
pair.length == 2 or raise ArgumentError, "each order clause must be a pair (unknown clause #{pair.inspect})"
|
106
|
+
[:asc, :desc].include?(pair[1]) or raise ArgumentError, "order must be specified with :asc or :desc (unknown key #{pair[1].inspect})"
|
107
|
+
end
|
108
|
+
|
109
|
+
order
|
110
|
+
end
|
69
111
|
end
|
70
112
|
|
71
113
|
class NotSupportedError < NotImplementedError
|
data/lib/orm_adapter/version.rb
CHANGED
data/orm_adapter.gemspec
CHANGED
@@ -1,66 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require "orm_adapter/version"
|
5
3
|
|
6
4
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version =
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
5
|
+
s.name = "orm_adapter"
|
6
|
+
s.version = OrmAdapter::VERSION.dup
|
7
|
+
s.platform = Gem::Platform::RUBY
|
11
8
|
s.authors = ["Ian White", "Jose Valim"]
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.email =
|
15
|
-
s.
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".gitignore",
|
21
|
-
"Gemfile",
|
22
|
-
"Gemfile.lock",
|
23
|
-
"History.txt",
|
24
|
-
"LICENSE",
|
25
|
-
"README.rdoc",
|
26
|
-
"Rakefile",
|
27
|
-
"lib/orm_adapter.rb",
|
28
|
-
"lib/orm_adapter/adapters/active_record.rb",
|
29
|
-
"lib/orm_adapter/adapters/data_mapper.rb",
|
30
|
-
"lib/orm_adapter/adapters/mongoid.rb",
|
31
|
-
"lib/orm_adapter/base.rb",
|
32
|
-
"lib/orm_adapter/to_adapter.rb",
|
33
|
-
"lib/orm_adapter/version.rb",
|
34
|
-
"orm_adapter.gemspec",
|
35
|
-
"spec/orm_adapter/adapters/active_record_spec.rb",
|
36
|
-
"spec/orm_adapter/adapters/data_mapper_spec.rb",
|
37
|
-
"spec/orm_adapter/adapters/mongoid_spec.rb",
|
38
|
-
"spec/orm_adapter/example_app_shared.rb",
|
39
|
-
"spec/orm_adapter_spec.rb",
|
40
|
-
"spec/spec_helper.rb"
|
41
|
-
]
|
42
|
-
s.homepage = %q{http://github.com/ianwhite/orm_adapter}
|
43
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
44
|
-
s.require_paths = ["lib"]
|
45
|
-
s.rubygems_version = %q{1.3.7}
|
46
|
-
s.summary = %q{Provides a single point of entry for using basic features of ruby ORMs}
|
47
|
-
s.test_files = [
|
48
|
-
"spec/orm_adapter/adapters/active_record_spec.rb",
|
49
|
-
"spec/orm_adapter/adapters/data_mapper_spec.rb",
|
50
|
-
"spec/orm_adapter/adapters/mongoid_spec.rb",
|
51
|
-
"spec/orm_adapter/example_app_shared.rb",
|
52
|
-
"spec/orm_adapter_spec.rb",
|
53
|
-
"spec/spec_helper.rb"
|
54
|
-
]
|
9
|
+
s.description = "Provides a single point of entry for using basic features of ruby ORMs"
|
10
|
+
s.summary = "orm_adapter provides a single point of entry for using basic features of popular ruby ORMs. Its target audience is gem authors who want to support many ruby ORMs."
|
11
|
+
s.email = "ian.w.white@gmail.com"
|
12
|
+
s.homepage = "http://github.com/ianwhite/orm_adapter"
|
55
13
|
|
56
|
-
|
57
|
-
|
58
|
-
s.specification_version = 3
|
14
|
+
s.rubyforge_project = "orm_adapter"
|
15
|
+
s.required_rubygems_version = ">= 1.3.6"
|
59
16
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "bundler", ">= 1.0.0"
|
22
|
+
s.add_development_dependency "git", ">= 1.2.5"
|
23
|
+
s.add_development_dependency "yard", ">= 0.6.0"
|
24
|
+
s.add_development_dependency "rake", ">= 0.8.7"
|
25
|
+
s.add_development_dependency "activerecord", ">= 3.0.0"
|
26
|
+
s.add_development_dependency "mongoid", ">= 2.0.0.beta.20"
|
27
|
+
s.add_development_dependency "bson_ext", ">= 1.1.5"
|
28
|
+
s.add_development_dependency "rspec", ">= 2.4.0"
|
29
|
+
s.add_development_dependency "sqlite3-ruby", ">= 1.3.2"
|
30
|
+
s.add_development_dependency "datamapper", ">= 1.0"
|
31
|
+
s.add_development_dependency "dm-sqlite-adapter", ">= 1.0"
|
32
|
+
s.add_development_dependency "dm-active_model", ">= 1.0"
|
65
33
|
end
|
66
34
|
|
@@ -8,14 +8,13 @@ else
|
|
8
8
|
|
9
9
|
ActiveRecord::Migration.suppress_messages do
|
10
10
|
ActiveRecord::Schema.define(:version => 0) do
|
11
|
-
create_table(:users, :force => true) {|t| t.string :name; t.
|
11
|
+
create_table(:users, :force => true) {|t| t.string :name; t.integer :rating; }
|
12
12
|
create_table(:notes, :force => true) {|t| t.belongs_to :owner, :polymorphic => true }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
module ArOrmSpec
|
17
17
|
class User < ActiveRecord::Base
|
18
|
-
belongs_to :site, :class_name => "ArOrmSpec::Site"
|
19
18
|
has_many :notes, :as => :owner
|
20
19
|
end
|
21
20
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OrmAdapter::Base do
|
4
|
+
subject { OrmAdapter::Base.new(Object) }
|
5
|
+
|
6
|
+
describe "#extract_conditions_and_order!" do
|
7
|
+
let(:conditions) { {:foo => 'bar'} }
|
8
|
+
let(:order) { [[:foo, :asc]] }
|
9
|
+
|
10
|
+
it "(<conditions>) should return [<conditions>, []]" do
|
11
|
+
subject.send(:extract_conditions_and_order!, conditions).should == [conditions, []]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "(:conditions => <conditions>) should return [<conditions>, []]" do
|
15
|
+
subject.send(:extract_conditions_and_order!, :conditions => conditions).should == [conditions, []]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "(:order => <order>) should return [{}, <order>]" do
|
19
|
+
subject.send(:extract_conditions_and_order!, :order => order).should == [{}, order]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "(:conditions => <conditions>, :order => <order>) should return [<conditions>, <order>]" do
|
23
|
+
subject.send(:extract_conditions_and_order!, :conditions => conditions, :order => order).should == [conditions, order]
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#normalize_order" do
|
27
|
+
specify "(nil) returns []" do
|
28
|
+
subject.send(:normalize_order, nil).should == []
|
29
|
+
end
|
30
|
+
|
31
|
+
specify ":foo returns [[:foo, :asc]]" do
|
32
|
+
subject.send(:normalize_order, :foo).should == [[:foo, :asc]]
|
33
|
+
end
|
34
|
+
|
35
|
+
specify "[:foo] returns [[:foo, :asc]]" do
|
36
|
+
subject.send(:normalize_order, [:foo]).should == [[:foo, :asc]]
|
37
|
+
end
|
38
|
+
|
39
|
+
specify "[:foo, :desc] returns [[:foo, :desc]]" do
|
40
|
+
subject.send(:normalize_order, [:foo, :desc]).should == [[:foo, :desc]]
|
41
|
+
end
|
42
|
+
|
43
|
+
specify "[:foo, [:bar, :asc], [:baz, :desc], :bing] returns [[:foo, :asc], [:bar, :asc], [:baz, :desc], [:bing, :asc]]" do
|
44
|
+
subject.send(:normalize_order, [:foo, [:bar, :asc], [:baz, :desc], :bing]).should == [[:foo, :asc], [:bar, :asc], [:baz, :desc], [:bing, :asc]]
|
45
|
+
end
|
46
|
+
|
47
|
+
specify "[[:foo, :wtf]] raises ArgumentError" do
|
48
|
+
lambda { subject.send(:normalize_order, [[:foo, :wtf]]) }.should raise_error(ArgumentError)
|
49
|
+
end
|
50
|
+
|
51
|
+
specify "[[:foo, :asc, :desc]] raises ArgumentError" do
|
52
|
+
lambda { subject.send(:normalize_order, [[:foo, :asc, :desc]]) }.should raise_error(ArgumentError)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -80,43 +80,81 @@ shared_examples_for "example app with orm_adapter" do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
describe "#find_first
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
describe "#find_first" do
|
84
|
+
describe "(conditions)" do
|
85
|
+
it "should return first model matching conditions, if it exists" do
|
86
|
+
user = create_model(user_class, :name => "Fred")
|
87
|
+
user_adapter.find_first(:name => "Fred").should == user
|
88
|
+
end
|
88
89
|
|
89
|
-
|
90
|
-
|
91
|
-
|
90
|
+
it "should return nil if no conditions match" do
|
91
|
+
user_adapter.find_first(:name => "Betty").should == nil
|
92
|
+
end
|
92
93
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
it "when conditions contain associated object, should return first model if it exists" do
|
95
|
+
user = create_model(user_class)
|
96
|
+
note = create_model(note_class, :owner => user)
|
97
|
+
note_adapter.find_first(:owner => user).should == note
|
98
|
+
end
|
97
99
|
end
|
98
|
-
end
|
99
100
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
101
|
+
describe "(:order => <order array>)" do
|
102
|
+
it "should return first model in specified order" do
|
103
|
+
user1 = create_model(user_class, :name => "Fred", :rating => 1)
|
104
|
+
user2 = create_model(user_class, :name => "Fred", :rating => 2)
|
105
|
+
user_adapter.find_first(:order => [:name, [:rating, :desc]]).should == user2
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "(:conditions => <conditions hash>, :order => <order array>)" do
|
110
|
+
it "should return first model matching conditions, in specified order" do
|
111
|
+
user1 = create_model(user_class, :name => "Fred", :rating => 1)
|
112
|
+
user2 = create_model(user_class, :name => "Fred", :rating => 2)
|
113
|
+
user_adapter.find_first(:conditions => {:name => "Fred"}, :order => [:rating, :desc]).should == user2
|
114
|
+
end
|
106
115
|
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "#find_all" do
|
119
|
+
describe "(conditions)" do
|
120
|
+
it "should return only models matching conditions" do
|
121
|
+
user1 = create_model(user_class, :name => "Fred")
|
122
|
+
user2 = create_model(user_class, :name => "Fred")
|
123
|
+
user3 = create_model(user_class, :name => "Betty")
|
124
|
+
user_adapter.find_all(:name => "Fred").should == [user1, user2]
|
125
|
+
end
|
107
126
|
|
108
|
-
|
109
|
-
|
127
|
+
it "should return empty array if no conditions match" do
|
128
|
+
user_adapter.find_all(:name => "Fred").should == []
|
129
|
+
end
|
130
|
+
|
131
|
+
it "when conditions contain associated object, should return first model if it exists" do
|
132
|
+
user1, user2 = create_model(user_class), create_model(user_class)
|
133
|
+
note1 = create_model(note_class, :owner => user1)
|
134
|
+
note2 = create_model(note_class, :owner => user2)
|
135
|
+
note_adapter.find_all(:owner => user2).should == [note2]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "(:order => <order array>)" do
|
140
|
+
it "should return all models in specified order" do
|
141
|
+
user1 = create_model(user_class, :name => "Fred", :rating => 1)
|
142
|
+
user2 = create_model(user_class, :name => "Fred", :rating => 2)
|
143
|
+
user3 = create_model(user_class, :name => "Betty", :rating => 1)
|
144
|
+
user_adapter.find_all(:order => [:name, [:rating, :desc]]).should == [user3, user2, user1]
|
145
|
+
end
|
110
146
|
end
|
111
147
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
148
|
+
describe "(:conditions => <conditions hash>, :order => <order array>)" do
|
149
|
+
it "should return only models matching conditions, in specified order" do
|
150
|
+
user1 = create_model(user_class, :name => "Fred", :rating => 1)
|
151
|
+
user2 = create_model(user_class, :name => "Fred", :rating => 2)
|
152
|
+
user3 = create_model(user_class, :name => "Betty", :rating => 1)
|
153
|
+
user_adapter.find_all(:conditions => {:name => "Fred"}, :order => [:rating, :desc]).should == [user2, user1]
|
154
|
+
end
|
117
155
|
end
|
118
156
|
end
|
119
|
-
|
157
|
+
|
120
158
|
describe "#create!(attributes)" do
|
121
159
|
it "should create a model with the passed attributes" do
|
122
160
|
user = user_adapter.create!(:name => "Fred")
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orm_adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Ian White
|
@@ -15,23 +16,212 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date:
|
19
|
+
date: 2011-01-04 00:00:00 +00:00
|
19
20
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: bundler
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 23
|
31
|
+
segments:
|
32
|
+
- 1
|
33
|
+
- 0
|
34
|
+
- 0
|
35
|
+
version: 1.0.0
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: git
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 21
|
47
|
+
segments:
|
48
|
+
- 1
|
49
|
+
- 2
|
50
|
+
- 5
|
51
|
+
version: 1.2.5
|
52
|
+
type: :development
|
53
|
+
version_requirements: *id002
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: yard
|
56
|
+
prerelease: false
|
57
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
hash: 7
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
- 6
|
66
|
+
- 0
|
67
|
+
version: 0.6.0
|
68
|
+
type: :development
|
69
|
+
version_requirements: *id003
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rake
|
72
|
+
prerelease: false
|
73
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 49
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
- 8
|
82
|
+
- 7
|
83
|
+
version: 0.8.7
|
84
|
+
type: :development
|
85
|
+
version_requirements: *id004
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: activerecord
|
88
|
+
prerelease: false
|
89
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
hash: 7
|
95
|
+
segments:
|
96
|
+
- 3
|
97
|
+
- 0
|
98
|
+
- 0
|
99
|
+
version: 3.0.0
|
100
|
+
type: :development
|
101
|
+
version_requirements: *id005
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: mongoid
|
104
|
+
prerelease: false
|
105
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
hash: 62196427
|
111
|
+
segments:
|
112
|
+
- 2
|
113
|
+
- 0
|
114
|
+
- 0
|
115
|
+
- beta
|
116
|
+
- 20
|
117
|
+
version: 2.0.0.beta.20
|
118
|
+
type: :development
|
119
|
+
version_requirements: *id006
|
120
|
+
- !ruby/object:Gem::Dependency
|
121
|
+
name: bson_ext
|
122
|
+
prerelease: false
|
123
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
hash: 25
|
129
|
+
segments:
|
130
|
+
- 1
|
131
|
+
- 1
|
132
|
+
- 5
|
133
|
+
version: 1.1.5
|
134
|
+
type: :development
|
135
|
+
version_requirements: *id007
|
136
|
+
- !ruby/object:Gem::Dependency
|
137
|
+
name: rspec
|
138
|
+
prerelease: false
|
139
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
hash: 31
|
145
|
+
segments:
|
146
|
+
- 2
|
147
|
+
- 4
|
148
|
+
- 0
|
149
|
+
version: 2.4.0
|
150
|
+
type: :development
|
151
|
+
version_requirements: *id008
|
152
|
+
- !ruby/object:Gem::Dependency
|
153
|
+
name: sqlite3-ruby
|
154
|
+
prerelease: false
|
155
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
hash: 31
|
161
|
+
segments:
|
162
|
+
- 1
|
163
|
+
- 3
|
164
|
+
- 2
|
165
|
+
version: 1.3.2
|
166
|
+
type: :development
|
167
|
+
version_requirements: *id009
|
168
|
+
- !ruby/object:Gem::Dependency
|
169
|
+
name: datamapper
|
170
|
+
prerelease: false
|
171
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
172
|
+
none: false
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
hash: 15
|
177
|
+
segments:
|
178
|
+
- 1
|
179
|
+
- 0
|
180
|
+
version: "1.0"
|
181
|
+
type: :development
|
182
|
+
version_requirements: *id010
|
183
|
+
- !ruby/object:Gem::Dependency
|
184
|
+
name: dm-sqlite-adapter
|
185
|
+
prerelease: false
|
186
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
187
|
+
none: false
|
188
|
+
requirements:
|
189
|
+
- - ">="
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
hash: 15
|
192
|
+
segments:
|
193
|
+
- 1
|
194
|
+
- 0
|
195
|
+
version: "1.0"
|
196
|
+
type: :development
|
197
|
+
version_requirements: *id011
|
198
|
+
- !ruby/object:Gem::Dependency
|
199
|
+
name: dm-active_model
|
200
|
+
prerelease: false
|
201
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
202
|
+
none: false
|
203
|
+
requirements:
|
204
|
+
- - ">="
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
hash: 15
|
207
|
+
segments:
|
208
|
+
- 1
|
209
|
+
- 0
|
210
|
+
version: "1.0"
|
211
|
+
type: :development
|
212
|
+
version_requirements: *id012
|
22
213
|
description: Provides a single point of entry for using basic features of ruby ORMs
|
23
214
|
email: ian.w.white@gmail.com
|
24
215
|
executables: []
|
25
216
|
|
26
217
|
extensions: []
|
27
218
|
|
28
|
-
extra_rdoc_files:
|
29
|
-
|
30
|
-
- README.rdoc
|
219
|
+
extra_rdoc_files: []
|
220
|
+
|
31
221
|
files:
|
32
222
|
- .gitignore
|
33
223
|
- Gemfile
|
34
|
-
- Gemfile.lock
|
224
|
+
- Gemfile.lock.development
|
35
225
|
- History.txt
|
36
226
|
- LICENSE
|
37
227
|
- README.rdoc
|
@@ -47,6 +237,7 @@ files:
|
|
47
237
|
- spec/orm_adapter/adapters/active_record_spec.rb
|
48
238
|
- spec/orm_adapter/adapters/data_mapper_spec.rb
|
49
239
|
- spec/orm_adapter/adapters/mongoid_spec.rb
|
240
|
+
- spec/orm_adapter/base_spec.rb
|
50
241
|
- spec/orm_adapter/example_app_shared.rb
|
51
242
|
- spec/orm_adapter_spec.rb
|
52
243
|
- spec/spec_helper.rb
|
@@ -55,8 +246,8 @@ homepage: http://github.com/ianwhite/orm_adapter
|
|
55
246
|
licenses: []
|
56
247
|
|
57
248
|
post_install_message:
|
58
|
-
rdoc_options:
|
59
|
-
|
249
|
+
rdoc_options: []
|
250
|
+
|
60
251
|
require_paths:
|
61
252
|
- lib
|
62
253
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -64,6 +255,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
255
|
requirements:
|
65
256
|
- - ">="
|
66
257
|
- !ruby/object:Gem::Version
|
258
|
+
hash: 3
|
67
259
|
segments:
|
68
260
|
- 0
|
69
261
|
version: "0"
|
@@ -72,20 +264,24 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
264
|
requirements:
|
73
265
|
- - ">="
|
74
266
|
- !ruby/object:Gem::Version
|
267
|
+
hash: 23
|
75
268
|
segments:
|
76
|
-
-
|
77
|
-
|
269
|
+
- 1
|
270
|
+
- 3
|
271
|
+
- 6
|
272
|
+
version: 1.3.6
|
78
273
|
requirements: []
|
79
274
|
|
80
|
-
rubyforge_project:
|
275
|
+
rubyforge_project: orm_adapter
|
81
276
|
rubygems_version: 1.3.7
|
82
277
|
signing_key:
|
83
278
|
specification_version: 3
|
84
|
-
summary:
|
279
|
+
summary: orm_adapter provides a single point of entry for using basic features of popular ruby ORMs. Its target audience is gem authors who want to support many ruby ORMs.
|
85
280
|
test_files:
|
86
281
|
- spec/orm_adapter/adapters/active_record_spec.rb
|
87
282
|
- spec/orm_adapter/adapters/data_mapper_spec.rb
|
88
283
|
- spec/orm_adapter/adapters/mongoid_spec.rb
|
284
|
+
- spec/orm_adapter/base_spec.rb
|
89
285
|
- spec/orm_adapter/example_app_shared.rb
|
90
286
|
- spec/orm_adapter_spec.rb
|
91
287
|
- spec/spec_helper.rb
|