peace_love 0.0.5 → 0.1.0
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/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
|