peace_love 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/examples/collections.eg.rb +0 -0
- data/examples/documents.eg.rb +0 -0
- data/examples/eg.helper.rb +1 -0
- data/examples/readme.eg.rb +58 -0
- data/examples/usage.eg.rb +81 -55
- data/lib/peace_love/document.rb +22 -14
- data/peace_love.gemspec +9 -3
- metadata +20 -3
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
File without changes
|
File without changes
|
data/examples/eg.helper.rb
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'eg.helper'
|
2
|
+
require 'peace_love'
|
3
|
+
|
4
|
+
PeaceLove.db = $db
|
5
|
+
|
6
|
+
eg.setup do
|
7
|
+
PeaceLove['beans'].remove
|
8
|
+
end
|
9
|
+
|
10
|
+
module Bean
|
11
|
+
include PeaceLove::Doc
|
12
|
+
mongo_collection 'beans'
|
13
|
+
|
14
|
+
def is_a_bean?; true end
|
15
|
+
end
|
16
|
+
|
17
|
+
eg 'arthur' do
|
18
|
+
lima_bean = { :name => 'lima' }
|
19
|
+
human_bean = { :name => 'Arthur', :prefered_drinks => %w[tea] }
|
20
|
+
|
21
|
+
PeaceLove['beans'].insert(lima_bean)
|
22
|
+
PeaceLove['beans'].insert(human_bean)
|
23
|
+
|
24
|
+
arthur = PeaceLove['beans'].find_one(:name => 'Arthur')
|
25
|
+
|
26
|
+
Show(arthur)
|
27
|
+
|
28
|
+
Show( arthur.prefered_drinks ) #=> [ 'tea' ]
|
29
|
+
Show( arthur.is_a_bean? ) #=> true
|
30
|
+
|
31
|
+
Show(arthur.is_a? Hash)
|
32
|
+
Show(arthur.class)
|
33
|
+
|
34
|
+
PeaceLove['beans'].update({:name => 'Arthur'}, '$push' => {'prefered_drinks' => 'pan-galactic gargle blaster'})
|
35
|
+
arthur = PeaceLove['beans'].find_one(:name => 'Arthur')
|
36
|
+
|
37
|
+
Show( arthur.prefered_drinks )
|
38
|
+
end
|
39
|
+
|
40
|
+
eg 'chaos taste' do
|
41
|
+
module Taste
|
42
|
+
def zesty?
|
43
|
+
spicy? && sour?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module Bean2
|
48
|
+
include PeaceLove::Doc
|
49
|
+
mongo_collection 'beans'
|
50
|
+
|
51
|
+
sub_doc :taste, Taste
|
52
|
+
end
|
53
|
+
|
54
|
+
PeaceLove['beans'].mixin = Bean2
|
55
|
+
|
56
|
+
chaos = PeaceLove['beans'].build(:name => 'chaos', :taste => {:sour => true, :spicy => true})
|
57
|
+
Show( chaos.taste.zesty? ) #=> true
|
58
|
+
end
|
data/examples/usage.eg.rb
CHANGED
@@ -3,118 +3,144 @@ require 'angry_hash'
|
|
3
3
|
require 'peace_love'
|
4
4
|
|
5
5
|
|
6
|
+
|
7
|
+
## Fixtures
|
8
|
+
# Here are a couple of modules we're going to mix into hashes from Mongo.
|
9
|
+
|
10
|
+
# Note that `PeaceLove.db` needs to be set before `mongo_collection` is called.
|
11
|
+
# This will be fixed in the future.
|
12
|
+
PeaceLove.db = $db
|
13
|
+
|
6
14
|
module Kind
|
7
|
-
def
|
15
|
+
def healthy; "healthy" end
|
8
16
|
|
9
|
-
def
|
10
|
-
fictional?
|
17
|
+
def kids_love?
|
18
|
+
fictional?
|
11
19
|
end
|
12
20
|
end
|
13
21
|
|
14
|
-
module
|
22
|
+
module Bean
|
15
23
|
include PeaceLove::Doc
|
16
|
-
sub_doc :kind, Kind
|
17
|
-
sub_col :
|
24
|
+
sub_doc :kind , Kind
|
25
|
+
sub_col :examples, Bean
|
18
26
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
27
|
+
mongo_collection 'beans'
|
28
|
+
|
29
|
+
def texture; super.upcase end
|
23
30
|
end
|
24
31
|
|
25
32
|
eg.setup do
|
26
|
-
PeaceLove.db = $db
|
27
33
|
|
28
|
-
@
|
29
|
-
@
|
34
|
+
@mongo_beans = $db['beans']
|
35
|
+
@mongo_beans.remove()
|
30
36
|
|
31
|
-
|
32
|
-
@plbears = PeaceLove['bears']
|
37
|
+
@peace_love_beans = PeaceLove['beans']
|
33
38
|
end
|
39
|
+
|
34
40
|
eg.helpers do
|
35
|
-
attr_reader :
|
41
|
+
attr_reader :mongo_beans, :peace_love_beans
|
36
42
|
end
|
37
43
|
|
38
44
|
|
39
|
-
eg 'loading a document
|
40
|
-
|
45
|
+
eg 'loading a document' do
|
46
|
+
mongo_beans.insert(:name => 'lima',
|
47
|
+
:texture => 'crunchy',
|
48
|
+
:colours => %w[green white],
|
49
|
+
:kind => {:grown => true,
|
50
|
+
:fictional => false
|
51
|
+
}
|
52
|
+
)
|
53
|
+
|
54
|
+
lima = peace_love_beans.find_one(:name => 'lima')
|
41
55
|
|
42
|
-
|
56
|
+
# attributes on the document
|
57
|
+
Assert( lima.name == 'lima' )
|
58
|
+
Assert( lima.colours == %w[green white] )
|
43
59
|
|
44
|
-
|
45
|
-
Assert(
|
46
|
-
|
60
|
+
# methods on a document
|
61
|
+
Assert( lima.texture == 'CRUNCHY' )
|
62
|
+
|
63
|
+
# sub-document
|
64
|
+
Assert( lima.kind.grown? )
|
65
|
+
|
66
|
+
# methods on a sub-doc
|
67
|
+
Assert( lima.kind.healthy == 'healthy' )
|
68
|
+
Assert( ! lima.kind.kids_love? )
|
47
69
|
|
48
|
-
Assert( yogi.liver == 'PURE' )
|
49
|
-
Assert( yogi.kind.for_kids? )
|
50
70
|
end
|
51
71
|
|
52
72
|
|
53
|
-
eg 'loading a non-existent
|
54
|
-
b =
|
73
|
+
eg 'loading a non-existent documents' do
|
74
|
+
b = peace_love_beans.find_one(:name => 'delicious')
|
55
75
|
|
56
76
|
Assert( b.nil? )
|
57
77
|
end
|
58
78
|
|
59
79
|
|
60
|
-
eg 'wrapping the mongo cursor' do
|
61
|
-
mbears.insert(:name => 'yogi' , :liver => 'pure', :kind => {:fictional => true, :cartoon => true})
|
62
|
-
mbears.insert(:name => 'humphrey', :liver => 'cihrrotic', :kind => {:fictional => true, :cartoon => false})
|
63
80
|
|
64
|
-
|
81
|
+
eg 'loading a list of documents' do
|
82
|
+
mongo_beans.insert(:name => 'baked' , :texture => 'Mushy' , :kind => {:fictional => false })
|
83
|
+
mongo_beans.insert(:name => 'magical', :texture => 'sparkly', :kind => {:fictional => true })
|
84
|
+
|
65
85
|
i = 0
|
66
|
-
|
86
|
+
peace_love_beans.find.each {|b|
|
67
87
|
|
68
88
|
case i
|
69
89
|
when 0
|
70
|
-
Assert( b.
|
71
|
-
Assert( b.
|
90
|
+
Assert( b.name == 'baked' )
|
91
|
+
Assert( ! b.kind.kids_love? )
|
92
|
+
Assert( b.texture == 'MUSHY' )
|
72
93
|
when 1
|
73
|
-
Assert( b.
|
74
|
-
Assert( b.
|
94
|
+
Assert( b.name == 'magical' )
|
95
|
+
Assert( b.kind.kids_love? )
|
96
|
+
Assert( b.texture == 'SPARKLY' )
|
75
97
|
end
|
76
98
|
|
77
99
|
i += 1
|
78
100
|
}
|
79
101
|
end
|
80
102
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
{:name => 'mrs. yogi', :liver => 'donated'}, {:name => 'yogi paw', :liver => 'jaundiced'}
|
103
|
+
eg 'looking into an array sub collection' do
|
104
|
+
mongo_beans.insert(:name => 'jelly', :texture => 'wibbly', :kind => {:fictional => false},
|
105
|
+
:examples => [
|
106
|
+
{:name => 'red' , :texture => 'raspberry'},
|
107
|
+
{:name => 'black', :texture => 'shunned' }
|
87
108
|
])
|
109
|
+
|
88
110
|
|
89
|
-
|
111
|
+
jelly = peace_love_beans.find_one(:name => 'jelly')
|
90
112
|
|
91
|
-
Assert(
|
92
|
-
Assert(
|
113
|
+
Assert( jelly.examples[0].texture == 'RASPBERRY' )
|
114
|
+
Assert( jelly.examples[1].texture == 'SHUNNED' )
|
93
115
|
end
|
94
116
|
|
95
117
|
|
96
|
-
eg 'building a blank
|
97
|
-
|
118
|
+
eg 'building a blank document' do
|
119
|
+
bean = peace_love_beans.build
|
98
120
|
|
99
|
-
Assert(
|
100
|
-
Assert(
|
121
|
+
Assert( bean.nothing.nil? )
|
122
|
+
Assert( bean.kind.healthy == 'healthy' )
|
101
123
|
end
|
102
124
|
|
103
125
|
|
104
126
|
eg 'saving a hash' do
|
105
|
-
h
|
106
|
-
id =
|
127
|
+
h = { :some_key => 'some value' }
|
128
|
+
id = peace_love_beans.insert( h )
|
107
129
|
|
108
|
-
Assert(
|
130
|
+
Assert( peace_love_beans.find_one(id).some_key == 'some value' )
|
109
131
|
end
|
110
132
|
|
111
133
|
|
112
134
|
eg 'the id accessor works in ruby 1.8 & 1.9' do
|
113
|
-
Assert(
|
135
|
+
Assert( Bean.build(:id => 'abc').id == 'abc' )
|
114
136
|
end
|
115
137
|
|
138
|
+
__END__
|
139
|
+
|
140
|
+
eg 'looking into a hash sub collection' do
|
141
|
+
end
|
116
142
|
|
117
143
|
# TODO
|
118
|
-
|
119
|
-
|
120
|
-
|
144
|
+
eg 'setting the mixin on the collection' do
|
145
|
+
PeaceLove['beans'].mixin = Bear
|
146
|
+
end
|
data/lib/peace_love/document.rb
CHANGED
@@ -15,10 +15,14 @@ module PeaceLove
|
|
15
15
|
|
16
16
|
|
17
17
|
def object_extensions
|
18
|
-
@object_extensions ||=
|
18
|
+
@object_extensions ||= {}
|
19
19
|
end
|
20
|
+
|
20
21
|
def mark_extension(obj,with)
|
21
|
-
object_extensions[obj.__id__]
|
22
|
+
if (previously_with = object_extensions[obj.__id__]) && previously_with != with
|
23
|
+
raise "object #{obj} has already been extended by a different PeaceLove::Doc (was: #{previously_with}, now: #{with})"
|
24
|
+
end
|
25
|
+
object_extensions[obj.__id__] = with
|
22
26
|
end
|
23
27
|
|
24
28
|
def mixin_registry
|
@@ -28,6 +32,7 @@ module PeaceLove
|
|
28
32
|
def register_mixin(target_class,field,mod,options)
|
29
33
|
mixin_registry[target_class][field.to_s] = [:single, mod, options]
|
30
34
|
end
|
35
|
+
|
31
36
|
def register_mixin_array(target_class, field, mod, options)
|
32
37
|
mixin_registry[target_class][field.to_s] = [:array, mod, options]
|
33
38
|
end
|
@@ -39,12 +44,11 @@ module PeaceLove
|
|
39
44
|
end
|
40
45
|
|
41
46
|
def mixin_to(parent_obj,field,obj)
|
42
|
-
|
43
|
-
extensions = object_extensions[parent_obj.__id__]
|
47
|
+
extension = object_extensions[parent_obj.__id__]
|
44
48
|
|
45
|
-
|
49
|
+
if mixin = mixin_registry[extension][field.to_s]
|
50
|
+
kind,mod,options = *mixin
|
46
51
|
|
47
|
-
mixins.each {|(kind,mod,options)|
|
48
52
|
if options.key?(:default) && obj.nil?
|
49
53
|
obj = options[:default]
|
50
54
|
end
|
@@ -52,15 +56,15 @@ module PeaceLove
|
|
52
56
|
# XXX - what happens when obj is nil
|
53
57
|
|
54
58
|
case kind
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
when :single
|
60
|
+
extend_doc(obj,mod,parent_obj)
|
61
|
+
when :array
|
62
|
+
# XXX - this is ok for now... we really need to typecheck, perhaps wrap in a smart-array
|
59
63
|
|
60
64
|
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
obj.map! {|elt| extend_doc elt, mod, parent_obj}
|
66
|
+
end
|
67
|
+
end
|
64
68
|
|
65
69
|
obj
|
66
70
|
end
|
@@ -77,6 +81,7 @@ module PeaceLove
|
|
77
81
|
def __source_collection=(col)
|
78
82
|
@source_collection = col
|
79
83
|
end
|
84
|
+
|
80
85
|
def __parent_doc(doc)
|
81
86
|
self.__source_collection = doc.__source_collection if doc.respond_to?(:__source_collection)
|
82
87
|
@parent_doc = doc
|
@@ -95,8 +100,11 @@ module PeaceLove
|
|
95
100
|
@collection = PeaceLove[collection_name]
|
96
101
|
@collection.set_mixin(self)
|
97
102
|
end
|
103
|
+
alias mongo_collection collection=
|
98
104
|
|
99
|
-
def collection
|
105
|
+
def collection
|
106
|
+
@collection
|
107
|
+
end
|
100
108
|
|
101
109
|
def sub_document(field,mod,options={})
|
102
110
|
Doc.register_mixin(self,field,mod,options)
|
data/peace_love.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{peace_love}
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Lachie Cox"]
|
12
|
-
s.date = %q{2010-07-
|
12
|
+
s.date = %q{2010-07-18}
|
13
13
|
s.description = %q{A simple mixin layer for enhancing hashes retrieved from MongoDB. It eschews the normal 'mapping' compulsion of mongo libraries.}
|
14
14
|
s.email = %q{lachie@smartbomb.com.au}
|
15
15
|
s.files = [
|
@@ -32,7 +32,10 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.rubygems_version = %q{1.3.6}
|
33
33
|
s.summary = %q{Peace, Love and Mongo.}
|
34
34
|
s.test_files = [
|
35
|
-
"examples/eg.
|
35
|
+
"examples/collections.eg.rb",
|
36
|
+
"examples/documents.eg.rb",
|
37
|
+
"examples/eg.helper.rb",
|
38
|
+
"examples/readme.eg.rb",
|
36
39
|
"examples/usage.eg.rb"
|
37
40
|
]
|
38
41
|
|
@@ -42,11 +45,14 @@ Gem::Specification.new do |s|
|
|
42
45
|
|
43
46
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
44
47
|
s.add_runtime_dependency(%q<mongo>, ["~> 1.0.0"])
|
48
|
+
s.add_runtime_dependency(%q<angry_hash>, ["= 0.0.5"])
|
45
49
|
else
|
46
50
|
s.add_dependency(%q<mongo>, ["~> 1.0.0"])
|
51
|
+
s.add_dependency(%q<angry_hash>, ["= 0.0.5"])
|
47
52
|
end
|
48
53
|
else
|
49
54
|
s.add_dependency(%q<mongo>, ["~> 1.0.0"])
|
55
|
+
s.add_dependency(%q<angry_hash>, ["= 0.0.5"])
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.5
|
9
|
+
version: 0.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Lachie Cox
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-07-
|
17
|
+
date: 2010-07-18 00:00:00 +10:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -31,6 +31,20 @@ dependencies:
|
|
31
31
|
version: 1.0.0
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: angry_hash
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 0
|
44
|
+
- 5
|
45
|
+
version: 0.0.5
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
34
48
|
description: A simple mixin layer for enhancing hashes retrieved from MongoDB. It eschews the normal 'mapping' compulsion of mongo libraries.
|
35
49
|
email: lachie@smartbomb.com.au
|
36
50
|
executables: []
|
@@ -83,5 +97,8 @@ signing_key:
|
|
83
97
|
specification_version: 3
|
84
98
|
summary: Peace, Love and Mongo.
|
85
99
|
test_files:
|
100
|
+
- examples/collections.eg.rb
|
101
|
+
- examples/documents.eg.rb
|
86
102
|
- examples/eg.helper.rb
|
103
|
+
- examples/readme.eg.rb
|
87
104
|
- examples/usage.eg.rb
|