dock 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +89 -0
- data/Rakefile +2 -0
- data/dock.gemspec +35 -0
- data/lib/dock.rb +12 -0
- data/lib/dock/adapters/active_record.rb +117 -0
- data/lib/dock/adapters/cequel.rb +124 -0
- data/lib/dock/adapters/couchbase.rb +177 -0
- data/lib/dock/adapters/couchdb.rb +73 -0
- data/lib/dock/adapters/datamapper.rb +88 -0
- data/lib/dock/adapters/mongoid.rb +98 -0
- data/lib/dock/adapters/mongomapper.rb +91 -0
- data/lib/dock/adapters/nobrainer.rb +81 -0
- data/lib/dock/adapters/sequel.rb +127 -0
- data/lib/dock/adapters/sinatra_ar.rb +119 -0
- data/lib/dock/aliases.rb +13 -0
- data/lib/dock/base.rb +80 -0
- data/lib/dock/env.rb +43 -0
- data/lib/dock/version.rb +3 -0
- data/spec/dock/adapters/activerecord_spec.rb +0 -0
- data/spec/dock/adapters/cequel_spec.rb +0 -0
- data/spec/dock/adapters/couchbase_spec.rb +0 -0
- data/spec/dock/adapters/couchdb_spec.rb +0 -0
- data/spec/dock/adapters/datamapper_spec.rb +0 -0
- data/spec/dock/adapters/mongoid_spec.rb +0 -0
- data/spec/dock/adapters/mongomapper_spec.rb +0 -0
- data/spec/dock/adapters/nobrainer_spec.rb +0 -0
- data/spec/dock/adapters/sequel_spec.rb +0 -0
- data/spec/dock/adapters/sinatra_ar_spec.rb +0 -0
- data/spec/dock/base_spec.rb +0 -0
- data/spec/dock/example_app.rb +0 -0
- data/spec/dock_spec.rb +12 -0
- data/spec/spec_helper.rb +13 -0
- metadata +261 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'couchrest'
|
2
|
+
|
3
|
+
module Dock
|
4
|
+
class Couchdb < Base
|
5
|
+
def create(attributes = {})
|
6
|
+
|
7
|
+
end
|
8
|
+
def find(id)
|
9
|
+
|
10
|
+
end
|
11
|
+
def find!(id)
|
12
|
+
|
13
|
+
end
|
14
|
+
def all(options = {})
|
15
|
+
conditions, order, limit, offset = extract_conditions!(options)
|
16
|
+
opts = { :conditions => conditions, :order => order_clause(order) }
|
17
|
+
opts = opts.merge({ :limit => limit }) unless limit.nil?
|
18
|
+
opts = opts.merge({ :offset => offset }) unless offset.nil?
|
19
|
+
model.all opts
|
20
|
+
end
|
21
|
+
def first(options = {})
|
22
|
+
conditions, order = extract_conditions!(options)
|
23
|
+
model.first :conditions => conditions, :order => order_clause(order)
|
24
|
+
end
|
25
|
+
def id()
|
26
|
+
|
27
|
+
end
|
28
|
+
def update(search_key, find_by, update_key, by_value)
|
29
|
+
#2 zoo.attributes = { :name => 'The Glue Factory', :inception => Time.now }
|
30
|
+
#3 zoo.save
|
31
|
+
end
|
32
|
+
def destroy(object)
|
33
|
+
object.destroy if valid_object?(object)
|
34
|
+
end
|
35
|
+
def associations()
|
36
|
+
|
37
|
+
end
|
38
|
+
def model_name()
|
39
|
+
model.class.name
|
40
|
+
end
|
41
|
+
def column_names()
|
42
|
+
model.properties.map(&:name)
|
43
|
+
end
|
44
|
+
# Checked
|
45
|
+
def count(options = {})
|
46
|
+
all(options).count
|
47
|
+
end
|
48
|
+
def encoding()
|
49
|
+
|
50
|
+
end
|
51
|
+
def belongs_to()
|
52
|
+
|
53
|
+
end
|
54
|
+
def has_many()
|
55
|
+
|
56
|
+
end
|
57
|
+
def scoped?()
|
58
|
+
|
59
|
+
end
|
60
|
+
def embedded?()
|
61
|
+
|
62
|
+
end
|
63
|
+
def cyclic?()
|
64
|
+
|
65
|
+
end
|
66
|
+
def supports_joins?()
|
67
|
+
false
|
68
|
+
end
|
69
|
+
def properties()
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'dm-core'
|
2
|
+
|
3
|
+
module Dock
|
4
|
+
class DataMapper < Base
|
5
|
+
# Checked
|
6
|
+
def create(attributes = {})
|
7
|
+
model.create(attributes)
|
8
|
+
end
|
9
|
+
# Checked
|
10
|
+
def find(id)
|
11
|
+
model.get(id)
|
12
|
+
end
|
13
|
+
# Checked
|
14
|
+
def find!(id)
|
15
|
+
model.get!(id)
|
16
|
+
end
|
17
|
+
# Checked
|
18
|
+
def all(options = {})
|
19
|
+
conditions, order, limit, offset = extract_conditions!(options)
|
20
|
+
opts = { :conditions => conditions, :order => order_clause(order) }
|
21
|
+
opts = opts.merge({ :limit => limit }) unless limit.nil?
|
22
|
+
opts = opts.merge({ :offset => offset }) unless offset.nil?
|
23
|
+
model.all opts
|
24
|
+
end
|
25
|
+
# Checked
|
26
|
+
def first(options = {})
|
27
|
+
conditions, order = extract_conditions!(options)
|
28
|
+
model.first :conditions => conditions, :order => order_clause(order)
|
29
|
+
end
|
30
|
+
# Checked
|
31
|
+
def id
|
32
|
+
# not supported?
|
33
|
+
end
|
34
|
+
def update(search_key, find_by, update_key, by_value)
|
35
|
+
entry = all(search_key find_by)
|
36
|
+
entry.attributes = {update_key => by_value}
|
37
|
+
entry.save
|
38
|
+
end
|
39
|
+
# Checked
|
40
|
+
def destroy(object)
|
41
|
+
object.destroy if valid_object?(object)
|
42
|
+
end
|
43
|
+
def associations()
|
44
|
+
|
45
|
+
end
|
46
|
+
def model_name
|
47
|
+
model.class.name
|
48
|
+
end
|
49
|
+
# Checked
|
50
|
+
def column_names
|
51
|
+
model.properties.map(&:name)
|
52
|
+
end
|
53
|
+
# Checked
|
54
|
+
def count(options = {})
|
55
|
+
all(options).count
|
56
|
+
end
|
57
|
+
def encoding
|
58
|
+
'UTF-8'
|
59
|
+
end
|
60
|
+
def belongs_to()
|
61
|
+
|
62
|
+
end
|
63
|
+
def has_many()
|
64
|
+
|
65
|
+
end
|
66
|
+
def scoped?
|
67
|
+
true
|
68
|
+
end
|
69
|
+
def embedded?
|
70
|
+
true
|
71
|
+
end
|
72
|
+
def cyclic?
|
73
|
+
false
|
74
|
+
end
|
75
|
+
def supports_joins?
|
76
|
+
false
|
77
|
+
end
|
78
|
+
|
79
|
+
def properties()
|
80
|
+
|
81
|
+
end
|
82
|
+
protected
|
83
|
+
|
84
|
+
def order_clause(order)
|
85
|
+
order.map {|pair| pair.first.send(pair.last)}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'mongoid'
|
2
|
+
|
3
|
+
module Dock
|
4
|
+
class Mongoid < Base
|
5
|
+
# Checked
|
6
|
+
def create(attributes = {})
|
7
|
+
model.create!(attributes)
|
8
|
+
end
|
9
|
+
# Checked
|
10
|
+
def find(id)
|
11
|
+
model.find(wrap_key(id))
|
12
|
+
end
|
13
|
+
# Checked
|
14
|
+
def find!(id)
|
15
|
+
model.where(:_id => wrap_key(id)).first
|
16
|
+
end
|
17
|
+
# Checked
|
18
|
+
def all(options = {})
|
19
|
+
conditions, order, limit, offset = extract_conditions!(options)
|
20
|
+
model.where(conditions_to_fields(conditions)).order_by(order).limit(limit).offset(offset)
|
21
|
+
end
|
22
|
+
# Checked
|
23
|
+
def first(options = {})
|
24
|
+
conditions, order = extract_conditions!(options)
|
25
|
+
model.limit(1).where(conditions_to_fields(conditions)).order_by(order).first
|
26
|
+
end
|
27
|
+
# Checked
|
28
|
+
def id
|
29
|
+
'_id'
|
30
|
+
end
|
31
|
+
# Checked
|
32
|
+
def update(search_key, find_by, update_key, by_value)
|
33
|
+
entry = model.where(search_key, find_by)
|
34
|
+
entry.update_attributes!(update_key, by_value)
|
35
|
+
end
|
36
|
+
# Checked
|
37
|
+
def destroy(object)
|
38
|
+
object.destroy if valid_object?(object)
|
39
|
+
end
|
40
|
+
def associations()
|
41
|
+
|
42
|
+
end
|
43
|
+
# Checked
|
44
|
+
def model_name
|
45
|
+
model.class.name
|
46
|
+
end
|
47
|
+
# Checked
|
48
|
+
def column_names
|
49
|
+
model.fields.keys
|
50
|
+
end
|
51
|
+
# Checked
|
52
|
+
def count(options = {})
|
53
|
+
all(options).count
|
54
|
+
end
|
55
|
+
# Checked
|
56
|
+
def encoding
|
57
|
+
'UTF-8'
|
58
|
+
end
|
59
|
+
def belongs_to()
|
60
|
+
|
61
|
+
end
|
62
|
+
def has_many()
|
63
|
+
|
64
|
+
end
|
65
|
+
# Checked
|
66
|
+
def scoped?
|
67
|
+
model.scoped
|
68
|
+
end
|
69
|
+
# Checked
|
70
|
+
def embedded?
|
71
|
+
model.relations.values.detect { |a| a.macro.to_sym == :embedded_in }
|
72
|
+
end
|
73
|
+
# Checked
|
74
|
+
def cyclic?
|
75
|
+
model.cyclic?
|
76
|
+
end
|
77
|
+
# Checked
|
78
|
+
def supports_joins
|
79
|
+
false
|
80
|
+
end
|
81
|
+
def properties()
|
82
|
+
|
83
|
+
end
|
84
|
+
protected
|
85
|
+
# converts and documents to ids
|
86
|
+
def conditions_to_fields(conditions)
|
87
|
+
conditions.inject({}) do |fields, (key, value)|
|
88
|
+
if value.is_a?(Mongoid::Document) && model.fields.keys.include?("#{key}_id")
|
89
|
+
fields.merge("#{key}_id" => value.id)
|
90
|
+
elsif key.to_s == 'id'
|
91
|
+
fields.merge('_id' => value)
|
92
|
+
else
|
93
|
+
fields.merge(key => value)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'mongo_mapper'
|
2
|
+
|
3
|
+
module Dock
|
4
|
+
class MongoMapper < Base
|
5
|
+
def create(attributes = {})
|
6
|
+
model.create!(attributes)
|
7
|
+
end
|
8
|
+
def find(id)
|
9
|
+
model.find!(wrap_key(id))
|
10
|
+
end
|
11
|
+
def find!(id)
|
12
|
+
model.first({ :id => wrap_key(id) })
|
13
|
+
end
|
14
|
+
def all(conditions = {})
|
15
|
+
conditions, order, limit, offset = extract_conditions!(conditions)
|
16
|
+
conditions = conditions.merge(:sort => order) unless order.nil?
|
17
|
+
conditions = conditions.merge(:limit => limit) unless limit.nil?
|
18
|
+
conditions = conditions.merge(:offset => offset) unless limit.nil? || offset.nil?
|
19
|
+
model.all(conditions_to_fields(conditions))
|
20
|
+
end
|
21
|
+
def first(conditions = {})
|
22
|
+
conditions, order = extract_conditions!(conditions)
|
23
|
+
conditions = conditions.merge(:sort => order) unless order.nil?
|
24
|
+
model.first(conditions_to_fields(conditions))
|
25
|
+
end
|
26
|
+
def id
|
27
|
+
'_id'
|
28
|
+
end
|
29
|
+
def update(search_key, find_by, update_key, by_value)
|
30
|
+
entry = model.where(search_key find_by)
|
31
|
+
entry.set(update_key => by_value)
|
32
|
+
entry.reload
|
33
|
+
end
|
34
|
+
def destroy(object)
|
35
|
+
object.destroy if valid_object?(object)
|
36
|
+
end
|
37
|
+
def associations()
|
38
|
+
|
39
|
+
end
|
40
|
+
def model_name
|
41
|
+
model.class.name
|
42
|
+
end
|
43
|
+
def column_names
|
44
|
+
model.fields.keys
|
45
|
+
end
|
46
|
+
# Checked
|
47
|
+
def count(conditions = {})
|
48
|
+
all(options).count
|
49
|
+
end
|
50
|
+
def encoding
|
51
|
+
'UTF-8'
|
52
|
+
end
|
53
|
+
def belongs_to()
|
54
|
+
|
55
|
+
end
|
56
|
+
def has_many()
|
57
|
+
|
58
|
+
end
|
59
|
+
# Checked
|
60
|
+
def scoped?
|
61
|
+
model.scoped
|
62
|
+
end
|
63
|
+
# Checked
|
64
|
+
def embedded?
|
65
|
+
model.relations.values.detect { |a| a.macro.to_sym == :embedded_in }
|
66
|
+
end
|
67
|
+
# Checked
|
68
|
+
def cyclic?
|
69
|
+
model.cyclic?
|
70
|
+
end
|
71
|
+
# Checked
|
72
|
+
def supports_joins
|
73
|
+
false
|
74
|
+
end
|
75
|
+
def properties()
|
76
|
+
|
77
|
+
end
|
78
|
+
protected
|
79
|
+
|
80
|
+
# converts and documents to ids
|
81
|
+
def conditions_to_fields(conditions)
|
82
|
+
conditions.inject({}) do |fields, (key, value)|
|
83
|
+
if value.is_a?(MongoMapper::Document) && model.key?("#{key}_id")
|
84
|
+
fields.merge("#{key}_id" => value.id)
|
85
|
+
else
|
86
|
+
fields.merge(key => value)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'nobrainer'
|
2
|
+
|
3
|
+
module Dock
|
4
|
+
class NoBrainer < Base
|
5
|
+
def create(attributes = {})
|
6
|
+
model.create!(attributes)
|
7
|
+
end
|
8
|
+
def find(id)
|
9
|
+
model.find(wrap_key(id))
|
10
|
+
end
|
11
|
+
def find!(id)
|
12
|
+
model.find!(wrap_key(id))
|
13
|
+
end
|
14
|
+
def all(options = {})
|
15
|
+
conditions, order, limit, offset = extract_conditions!(options)
|
16
|
+
model.where(conditions).order_by(order_to_nql(order)).limit(limit).skip(offset)
|
17
|
+
end
|
18
|
+
def first(options = {})
|
19
|
+
conditions, order = extract_conditions!(options)
|
20
|
+
model.where(conditions).order_by(order_to_nql(order)).first
|
21
|
+
end
|
22
|
+
def id
|
23
|
+
'id'
|
24
|
+
end
|
25
|
+
def update(search_key, find_by, update_key, by_value)
|
26
|
+
entry = model.where(search_key => find_by)
|
27
|
+
entry.update_attributes!(update_key => by_value)
|
28
|
+
end
|
29
|
+
def destroy(object)
|
30
|
+
object.destroy if valid_object?(object)
|
31
|
+
end
|
32
|
+
def associations()
|
33
|
+
|
34
|
+
end
|
35
|
+
def model_name
|
36
|
+
model.class.name
|
37
|
+
end
|
38
|
+
def column_names
|
39
|
+
model.fields.keys
|
40
|
+
end
|
41
|
+
# Checked
|
42
|
+
def count(options = {})
|
43
|
+
all(options).count
|
44
|
+
end
|
45
|
+
def encoding
|
46
|
+
'UTF-8'
|
47
|
+
end
|
48
|
+
def belongs_to()
|
49
|
+
|
50
|
+
end
|
51
|
+
def has_many()
|
52
|
+
|
53
|
+
end
|
54
|
+
def scoped
|
55
|
+
true
|
56
|
+
end
|
57
|
+
def embedded?
|
58
|
+
false
|
59
|
+
end
|
60
|
+
def cyclic?
|
61
|
+
false
|
62
|
+
end
|
63
|
+
def supports_joins?
|
64
|
+
false
|
65
|
+
end
|
66
|
+
def properties()
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
protected
|
71
|
+
# NoBrainer does not accept arrays as an `order_by` argument.
|
72
|
+
def order_to_nql(order)
|
73
|
+
if order.empty?
|
74
|
+
nil
|
75
|
+
else
|
76
|
+
order.to_h
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
|
3
|
+
module Dock
|
4
|
+
class Sequel < Base
|
5
|
+
def create()
|
6
|
+
associated_objects = []
|
7
|
+
attrs = {}
|
8
|
+
|
9
|
+
model.db.transaction do
|
10
|
+
attributes.each do |col, value|
|
11
|
+
if model.associations.include?(col)
|
12
|
+
Array(value).each{|v| associated_objects << [association_method(col), v]}
|
13
|
+
else
|
14
|
+
attrs.merge!(col => value) # pass it on
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
obj = model.create(attrs) # create main obj
|
19
|
+
associated_objects.each do |m,o|
|
20
|
+
obj.send(m, o)
|
21
|
+
end
|
22
|
+
obj.save
|
23
|
+
end # transaction
|
24
|
+
end
|
25
|
+
# Checked
|
26
|
+
def find(id)
|
27
|
+
model.find(wrap_key(model.primary_key => id))
|
28
|
+
end
|
29
|
+
# Checked
|
30
|
+
def find!(id)
|
31
|
+
model[wrap_key(id)] || raise(Error, "#{model.name} not found with #{model.primary_key} of #{wrap_key(id)}")
|
32
|
+
end
|
33
|
+
# Checked
|
34
|
+
def all(options = {})
|
35
|
+
conditions, order = extract_conditions!(options)
|
36
|
+
model.filter(conditions_to_hash(conditions)).order(*order_clause(order)).all
|
37
|
+
end
|
38
|
+
# Checked
|
39
|
+
def first(options = {})
|
40
|
+
conditions, order = extract_conditions!(options)
|
41
|
+
model.filter(conditions_to_hash(conditions)).order(*order_clause(order)).first
|
42
|
+
end
|
43
|
+
# Checked
|
44
|
+
def id
|
45
|
+
'primary_key'
|
46
|
+
end
|
47
|
+
def update(search_key, find_by, update_key, by_value)
|
48
|
+
entry = model.where(search_key, find_by)
|
49
|
+
entry.update(update_key by_value)
|
50
|
+
end
|
51
|
+
# Checked
|
52
|
+
def destroy(object)
|
53
|
+
object.destroy && true if valid_object?(object)
|
54
|
+
end
|
55
|
+
def associations()
|
56
|
+
|
57
|
+
end
|
58
|
+
# Checked
|
59
|
+
def model_name
|
60
|
+
model.class.name
|
61
|
+
end
|
62
|
+
# Checked
|
63
|
+
def column_names
|
64
|
+
model.columns
|
65
|
+
end
|
66
|
+
# Checked
|
67
|
+
def count(options = {})
|
68
|
+
all(options).count
|
69
|
+
end
|
70
|
+
def encoding
|
71
|
+
'UTF-8'
|
72
|
+
end
|
73
|
+
def belongs_to()
|
74
|
+
|
75
|
+
end
|
76
|
+
def has_many()
|
77
|
+
|
78
|
+
end
|
79
|
+
def scoped?
|
80
|
+
false
|
81
|
+
end
|
82
|
+
def embedded?
|
83
|
+
false
|
84
|
+
end
|
85
|
+
def cyclic?
|
86
|
+
true
|
87
|
+
end
|
88
|
+
# Checked
|
89
|
+
def supports_joins?
|
90
|
+
true
|
91
|
+
end
|
92
|
+
def properties()
|
93
|
+
|
94
|
+
end
|
95
|
+
protected
|
96
|
+
|
97
|
+
def conditions_to_hash(conditions)
|
98
|
+
conditions.inject({}) do |cond_hash, (col, value)|
|
99
|
+
# make sure the key is a symbol
|
100
|
+
col = col.to_sym
|
101
|
+
|
102
|
+
if value.is_a?(Sequel::Model)
|
103
|
+
# look up the column name for the assoc
|
104
|
+
key = model.association_reflection(col)[:key]
|
105
|
+
cond_hash.merge(key => value.id)
|
106
|
+
else
|
107
|
+
cond_hash.merge(col => value)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def order_clause(order)
|
113
|
+
m = order.map {|pair| pair.first.send(pair.last)}
|
114
|
+
m.empty? ? nil : m
|
115
|
+
end
|
116
|
+
|
117
|
+
def association_method(col)
|
118
|
+
assoc = model.association_reflection(col)
|
119
|
+
case assoc[:type]
|
120
|
+
when :one_to_many, :many_to_many
|
121
|
+
assoc.add_method
|
122
|
+
else # when :many_to_one, :one_to_one
|
123
|
+
assoc.setter_method
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|