splash 0.0.1.alpha → 0.0.1.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -0
- data/lib/splash.rb +22 -26
- data/lib/splash/acts_as_collection.rb +3 -2
- data/lib/splash/acts_as_scope.rb +97 -33
- data/lib/splash/acts_as_scope_root.rb +2 -1
- data/lib/splash/annotated.rb +2 -1
- data/lib/splash/application.rb +2 -1
- data/lib/splash/attribute.rb +39 -21
- data/lib/splash/attributed_struct.rb +2 -1
- data/lib/splash/callbacks.rb +37 -0
- data/lib/splash/collection.rb +14 -11
- data/lib/splash/connection.rb +2 -1
- data/lib/splash/constraint.rb +3 -5
- data/lib/splash/constraint/all.rb +2 -1
- data/lib/splash/constraint/any.rb +2 -1
- data/lib/splash/constraint/in.rb +2 -1
- data/lib/splash/constraint/not_nil.rb +2 -1
- data/lib/splash/created_at.rb +16 -0
- data/lib/splash/document.rb +43 -15
- data/lib/splash/embed.rb +29 -9
- data/lib/splash/has_attributes.rb +68 -37
- data/lib/splash/has_collection.rb +79 -0
- data/lib/splash/has_constraint.rb +2 -1
- data/lib/splash/map_reduce.rb +124 -0
- data/lib/splash/matcher.rb +160 -0
- data/lib/splash/namespace.rb +149 -15
- data/lib/splash/password.rb +2 -1
- data/lib/splash/persister.rb +22 -62
- data/lib/splash/query_interface.rb +28 -6
- data/lib/splash/saveable.rb +5 -104
- data/lib/splash/scope.rb +16 -3
- data/lib/splash/scope/map_reduce_interface.rb +33 -0
- data/lib/splash/scope/options.rb +16 -6
- data/lib/splash/updated_at.rb +15 -0
- data/lib/splash/validates.rb +3 -1
- data/lib/splash/validator.rb +2 -1
- data/lib/splash/writeback.rb +46 -0
- data/lib/standart_extensions/array.rb +9 -0
- data/lib/standart_extensions/bson.rb +122 -0
- data/lib/standart_extensions/class.rb +11 -0
- data/lib/{splash/standart_extensions → standart_extensions}/hash.rb +6 -1
- data/lib/{splash/standart_extensions → standart_extensions}/module.rb +17 -3
- data/lib/standart_extensions/object.rb +13 -0
- data/splash.gemspec +17 -0
- metadata +20 -16
- data/lib/splash/scope_delegator.rb +0 -14
- data/lib/splash/scope_options.rb +0 -31
- data/lib/splash/standart_extensions/object.rb +0 -11
- data/lib/splash/standart_extensions/string.rb +0 -5
- data/spec/helper.rb +0 -15
- data/spec/lib/annotated_spec.rb +0 -87
- data/spec/lib/collection_spec.rb +0 -64
- data/spec/lib/has_attributes_spec.rb +0 -43
- data/spec/lib/has_constraints_spec.rb +0 -53
- data/spec/lib/inheritance_spec.rb +0 -69
data/lib/splash/connection.rb
CHANGED
data/lib/splash/constraint.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module Splash::Constraint
|
2
3
|
|
3
4
|
attr_reader :description
|
4
5
|
|
5
|
-
|
6
|
-
autoload :All, File.join( File.dirname(__FILE__), 'constraint/all' )
|
7
|
-
autoload :NotNil, File.join( File.dirname(__FILE__), 'constraint/not_nil' )
|
8
|
-
autoload :In, File.join( File.dirname(__FILE__), 'constraint/in' )
|
6
|
+
autoload_all File.join(File.dirname(__FILE__),'constraint')
|
9
7
|
|
10
8
|
class Simple
|
11
9
|
|
@@ -59,4 +57,4 @@ module Splash::Constraint
|
|
59
57
|
|
60
58
|
alias_method :to_s, :description
|
61
59
|
|
62
|
-
end
|
60
|
+
end
|
data/lib/splash/constraint/in.rb
CHANGED
data/lib/splash/document.rb
CHANGED
@@ -1,38 +1,66 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module Splash::Document
|
2
3
|
|
4
|
+
class Persister
|
5
|
+
def to_saveable(value)
|
6
|
+
return nil if value.nil?
|
7
|
+
return BSON::DBRef.new( value.class.collection.name , value._id )
|
8
|
+
end
|
9
|
+
|
10
|
+
def from_saveable(value)
|
11
|
+
return nil if value.nil?
|
12
|
+
|
13
|
+
if value.kind_of? BSON::DBRef
|
14
|
+
found_class = @namespace.class_for(value.namespace)
|
15
|
+
unless found_class <= @class
|
16
|
+
warn "Trying to fetch an object of type #{found_class} from #{@class}."
|
17
|
+
return nil
|
18
|
+
end
|
19
|
+
return found_class.conditions('_id'=>value.object_id).first
|
20
|
+
end
|
21
|
+
raise "No idea how to fetch #{value}."
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(ns,klass = Object )
|
25
|
+
@namespace, @class = ns, klass
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
3
30
|
include Splash::Saveable
|
4
31
|
include Splash::HasAttributes
|
32
|
+
include Splash::HasCollection
|
5
33
|
include Splash::Validates
|
6
34
|
|
7
35
|
class << self
|
8
36
|
def included(base)
|
37
|
+
|
9
38
|
included_modules.each do |mod|
|
10
|
-
|
39
|
+
begin
|
40
|
+
mod.included(base)
|
41
|
+
rescue NoMethodError
|
42
|
+
end
|
11
43
|
end
|
12
44
|
|
13
|
-
|
45
|
+
super(base)
|
14
46
|
|
15
47
|
base.instance_eval do
|
16
|
-
include Splash::ActsAsCollection.of(base)
|
48
|
+
#include Splash::ActsAsCollection.of(base)
|
17
49
|
extend Splash::ActsAsScopeRoot
|
18
50
|
|
19
51
|
def included(base)
|
20
52
|
Splash::Document.included(base)
|
21
53
|
super(base)
|
22
54
|
end
|
55
|
+
|
56
|
+
def persister
|
57
|
+
Splash::Document::Persister.new(self.namespace,self)
|
58
|
+
end
|
59
|
+
|
60
|
+
extend_scoped! Splash::ActsAsScope::ArraylikeAccess
|
61
|
+
|
23
62
|
end
|
24
63
|
end
|
25
|
-
|
26
|
-
def persister
|
27
|
-
Splash::Saveable::MultiPersister
|
28
|
-
end
|
29
64
|
end
|
30
65
|
|
31
|
-
|
32
|
-
self.attributes.load(args)
|
33
|
-
end
|
34
|
-
|
35
|
-
def to_saveable
|
36
|
-
attributes.raw
|
37
|
-
end
|
38
|
-
end
|
66
|
+
end
|
data/lib/splash/embed.rb
CHANGED
@@ -1,13 +1,35 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module Splash::Embed
|
2
3
|
|
4
|
+
class Persister
|
5
|
+
def to_saveable(value)
|
6
|
+
return nil if value.nil?
|
7
|
+
return Splash::Saveable.wrap(value)
|
8
|
+
end
|
9
|
+
|
10
|
+
def from_saveable(value)
|
11
|
+
return nil if value.nil?
|
12
|
+
return Splash::Saveable.load(value,@base_class)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(klass)
|
16
|
+
@base_class = klass
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
3
21
|
include Splash::HasAttributes
|
22
|
+
include Splash::Saveable
|
4
23
|
include Splash::Validates
|
5
24
|
|
6
25
|
class << self
|
7
26
|
def included(base)
|
8
27
|
base.extend(ClassMethods)
|
9
28
|
included_modules.each do |mod|
|
10
|
-
|
29
|
+
begin
|
30
|
+
mod.included(base)
|
31
|
+
rescue NoMethodError
|
32
|
+
end
|
11
33
|
end
|
12
34
|
end
|
13
35
|
|
@@ -20,18 +42,16 @@ module Splash::Embed
|
|
20
42
|
c.class_eval(&block)
|
21
43
|
c
|
22
44
|
end
|
45
|
+
|
46
|
+
def persister
|
47
|
+
Splash::Embed::Persister.new(self.define{})
|
48
|
+
end
|
23
49
|
end
|
24
50
|
|
25
51
|
module ClassMethods
|
26
52
|
def persister
|
27
|
-
Splash::
|
53
|
+
Splash::Embed::Persister.new(self)
|
28
54
|
end
|
29
55
|
end
|
30
56
|
|
31
|
-
|
32
|
-
self.attributes.load(args)
|
33
|
-
end
|
34
|
-
def to_saveable
|
35
|
-
attributes.raw
|
36
|
-
end
|
37
|
-
end
|
57
|
+
end
|
@@ -1,26 +1,21 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module Splash
|
2
3
|
module HasAttributes
|
3
4
|
|
4
5
|
class Attributes < Hash
|
6
|
+
|
7
|
+
alias_method :write, :[]=
|
8
|
+
|
5
9
|
def load(raw)
|
6
10
|
raw.each do |key,value|
|
7
|
-
key=
|
8
|
-
|
9
|
-
|
10
|
-
if value.kind_of? type(key).persisted_class
|
11
|
-
self[key]=value
|
12
|
-
elsif Splash::Persister.raw? value
|
13
|
-
@raw[key]=value
|
14
|
-
else
|
15
|
-
|
16
|
-
puts value.class
|
17
|
-
puts type(key).persisted_class
|
18
|
-
raise "Don't know what to do with #{key}= #{value.inspect}"
|
19
|
-
end
|
11
|
+
self[key]=value
|
20
12
|
end
|
21
13
|
end
|
22
14
|
|
23
15
|
def load_raw(raw)
|
16
|
+
raw.keys.each do |k|
|
17
|
+
self.delete k
|
18
|
+
end
|
24
19
|
@raw.update(raw)
|
25
20
|
end
|
26
21
|
|
@@ -32,13 +27,28 @@ module Splash
|
|
32
27
|
else
|
33
28
|
value = t.default
|
34
29
|
end
|
35
|
-
|
30
|
+
self.write(key,value)
|
31
|
+
return value
|
32
|
+
end
|
33
|
+
|
34
|
+
def []=(key,value)
|
35
|
+
return if ::NotGiven == value
|
36
|
+
key=key.to_s
|
37
|
+
if value.kind_of? type(key).type
|
38
|
+
self.write(key,value)
|
39
|
+
elsif Splash::Persister.raw? value
|
40
|
+
@raw[key]=value
|
41
|
+
self.delete(key)
|
42
|
+
else
|
43
|
+
raise "Don't know what to do with #{key}= #{value.inspect}"
|
44
|
+
end
|
36
45
|
end
|
37
46
|
|
38
47
|
def initialize(klass)
|
39
48
|
super()
|
40
49
|
@class = klass
|
41
50
|
@raw = {}
|
51
|
+
complete!
|
42
52
|
end
|
43
53
|
|
44
54
|
def raw
|
@@ -51,6 +61,20 @@ module Splash
|
|
51
61
|
end
|
52
62
|
|
53
63
|
protected
|
64
|
+
def complete!
|
65
|
+
keys = Set.new
|
66
|
+
@class.each_attributes do |attrs|
|
67
|
+
attrs.each do |k,v|
|
68
|
+
unless keys.include?(k)
|
69
|
+
keys << k
|
70
|
+
self[k]=v.initial_value
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
return self
|
76
|
+
end
|
77
|
+
|
54
78
|
def write_back!
|
55
79
|
self.each do |key,value|
|
56
80
|
@raw[key]=type(key).write(value)
|
@@ -65,19 +89,6 @@ module Splash
|
|
65
89
|
merged_inheritable_attr :attributes,{}
|
66
90
|
end
|
67
91
|
end
|
68
|
-
|
69
|
-
def get_persister(*args,&block)
|
70
|
-
klass = Object
|
71
|
-
if args.length > 0
|
72
|
-
if args.first.respond_to? :persister
|
73
|
-
klass = args.shift
|
74
|
-
end
|
75
|
-
end
|
76
|
-
type = (klass).persister
|
77
|
-
result=type.new(*args,&block)
|
78
|
-
result.persist_class(klass)
|
79
|
-
return result
|
80
|
-
end
|
81
92
|
end
|
82
93
|
|
83
94
|
def attributes
|
@@ -95,10 +106,10 @@ module Splash
|
|
95
106
|
end
|
96
107
|
|
97
108
|
def inspect
|
98
|
-
"#{self.class.to_s}{#{attributes.inspect}}"
|
109
|
+
"#{self.class.to_s}{#{attributes.raw.inspect}}"
|
99
110
|
end
|
100
111
|
|
101
|
-
def
|
112
|
+
def to_raw
|
102
113
|
attributes.raw
|
103
114
|
end
|
104
115
|
|
@@ -114,6 +125,11 @@ module Splash
|
|
114
125
|
super
|
115
126
|
end
|
116
127
|
|
128
|
+
def initialize(attr={})
|
129
|
+
self.attributes.load(attr)
|
130
|
+
super()
|
131
|
+
end
|
132
|
+
|
117
133
|
module ClassMethods
|
118
134
|
|
119
135
|
def attribute_accessor(name)
|
@@ -123,24 +139,39 @@ def #{name.to_s}=(value) return attributes[#{name.to_s.inspect}] = value end
|
|
123
139
|
CODE
|
124
140
|
end
|
125
141
|
|
126
|
-
def
|
142
|
+
def attribute(name,*args,&block)
|
127
143
|
name = name.to_s
|
144
|
+
each_attributes do |attrs|
|
145
|
+
if attrs.key? name
|
146
|
+
if args.size > 0 || block
|
147
|
+
warn "trying to add the existing attribute #{name} of #{self}"
|
148
|
+
break
|
149
|
+
end
|
150
|
+
return attrs[name]
|
151
|
+
end
|
152
|
+
end
|
128
153
|
attr=attributes[name]=Splash::Attribute.new(*args, &block)
|
129
154
|
attribute_accessor(name)
|
130
155
|
return attr
|
131
156
|
end
|
132
157
|
|
133
|
-
|
158
|
+
alias def_attribute attribute
|
159
|
+
|
160
|
+
def attribute?(name)
|
134
161
|
name = name.to_s
|
135
162
|
each_attributes do |attr|
|
136
|
-
return
|
137
|
-
end
|
138
|
-
if create
|
139
|
-
return def_attribute(name)
|
163
|
+
return true if attr.key? name
|
140
164
|
end
|
141
|
-
return
|
165
|
+
return false
|
166
|
+
end
|
167
|
+
|
168
|
+
def from_raw(data)
|
169
|
+
c = self.new()
|
170
|
+
c
|
171
|
+
c.attributes.load_raw(data)
|
172
|
+
return c
|
142
173
|
end
|
143
174
|
|
144
175
|
end
|
145
176
|
end
|
146
|
-
end
|
177
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Splash
|
2
|
+
|
3
|
+
module HasCollection
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
super(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
base.instance_variable_set('@is_collection_base',true)
|
9
|
+
end
|
10
|
+
|
11
|
+
def store!
|
12
|
+
self._id=self.class.store!(self)
|
13
|
+
return self
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove!
|
17
|
+
return self.class.collection.remove('_id'=>self._id)
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(*args)
|
21
|
+
self._id = self.class.collection.pk_factory.new
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_self
|
26
|
+
self.class.with_id(self._id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def ==(other)
|
30
|
+
return ( other.kind_of?(Splash::HasCollection) and self.class.namespace == other.class.namespace and self._id == other._id )
|
31
|
+
end
|
32
|
+
|
33
|
+
alias eq? ==
|
34
|
+
|
35
|
+
module ClassMethods
|
36
|
+
|
37
|
+
def <<(obj)
|
38
|
+
obj.store!
|
39
|
+
end
|
40
|
+
|
41
|
+
def store!(object)
|
42
|
+
return self.collection.save(
|
43
|
+
Saveable.wrap(object)
|
44
|
+
);
|
45
|
+
end
|
46
|
+
|
47
|
+
def namespace(*args)
|
48
|
+
if args.any?
|
49
|
+
self.namespace=args.first
|
50
|
+
end
|
51
|
+
return (@namespace || Splash::Namespace.default)
|
52
|
+
end
|
53
|
+
|
54
|
+
def namespace=(arg)
|
55
|
+
if arg.kind_of? Splash::Namespace
|
56
|
+
@namespace = arg
|
57
|
+
@collection = nil
|
58
|
+
else
|
59
|
+
@namespace = Splash::Namespace::NAMESPACES[arg]
|
60
|
+
@collection = nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def collection(*args)
|
65
|
+
if args.any?
|
66
|
+
self.collection= args.first
|
67
|
+
end
|
68
|
+
return (@collection ||= namespace.collection_for(self))
|
69
|
+
end
|
70
|
+
|
71
|
+
def collection=(arg)
|
72
|
+
@collection = arg
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|