peace_love 0.1.3 → 0.2.1
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/Gemfile +1 -1
- data/Gemfile.lock +18 -0
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/examples/eg.helper.rb +4 -2
- data/examples/usage.eg.rb +4 -3
- data/lib/peace_love/collection.rb +3 -13
- data/lib/peace_love/db.rb +18 -0
- data/lib/peace_love/document.rb +18 -146
- data/lib/peace_love.rb +28 -13
- data/peace_love.gemspec +10 -8
- metadata +10 -8
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
angry_hash (0.2.2)
|
5
|
+
bson (1.0.9)
|
6
|
+
bson_ext (1.0.9)
|
7
|
+
exemplor (3000.3.0)
|
8
|
+
mongo (1.0.9)
|
9
|
+
bson (>= 1.0.5)
|
10
|
+
|
11
|
+
PLATFORMS
|
12
|
+
ruby
|
13
|
+
|
14
|
+
DEPENDENCIES
|
15
|
+
angry_hash (~> 0.2.0)
|
16
|
+
bson_ext
|
17
|
+
exemplor
|
18
|
+
mongo
|
data/Rakefile
CHANGED
@@ -10,8 +10,8 @@ begin
|
|
10
10
|
|
11
11
|
gemspec.test_files = []
|
12
12
|
|
13
|
-
gemspec.add_dependency("mongo", ['~>1.
|
14
|
-
gemspec.add_dependency("angry_hash", ['~>0.
|
13
|
+
gemspec.add_dependency("mongo", ['~>1.1.0'])
|
14
|
+
gemspec.add_dependency("angry_hash", ['~>0.3.2'])
|
15
15
|
end
|
16
16
|
rescue LoadError
|
17
17
|
puts "Jeweler not available. Install it with: gem install jeweler"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
data/examples/eg.helper.rb
CHANGED
@@ -6,7 +6,8 @@ require 'exemplor'
|
|
6
6
|
require 'pp'
|
7
7
|
|
8
8
|
require 'pathname'
|
9
|
-
|
9
|
+
|
10
|
+
here = Pathname('..').expand_path(__FILE__)
|
10
11
|
$LOAD_PATH << here << (here+'../lib')
|
11
12
|
|
12
13
|
class Object
|
@@ -28,4 +29,5 @@ class BSON::ObjectID
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
|
-
$
|
32
|
+
$mongo = Mongo::Connection.new
|
33
|
+
$db = $mongo.db('sample-db')
|
data/examples/usage.eg.rb
CHANGED
@@ -9,7 +9,8 @@ require 'peace_love'
|
|
9
9
|
|
10
10
|
# Note that `PeaceLove.db` needs to be set before `mongo_collection` is called.
|
11
11
|
# This will be fixed in the future.
|
12
|
-
PeaceLove.
|
12
|
+
PeaceLove.mongo = $mongo
|
13
|
+
PeaceLove.default_db = $db
|
13
14
|
|
14
15
|
module Kind
|
15
16
|
include PeaceLove::Doc
|
@@ -28,7 +29,7 @@ module Bean
|
|
28
29
|
sub_col :examples, Bean
|
29
30
|
sub_hash :examples_hash, Bean
|
30
31
|
|
31
|
-
|
32
|
+
mongo :collection => 'beans'
|
32
33
|
|
33
34
|
defaults :ham => {:sandwich => 'golly yes!'}
|
34
35
|
|
@@ -40,7 +41,7 @@ eg.setup do
|
|
40
41
|
@mongo_beans = $db['beans']
|
41
42
|
@mongo_beans.remove()
|
42
43
|
|
43
|
-
@peace_love_beans = PeaceLove['beans']
|
44
|
+
@peace_love_beans = PeaceLove[]['beans']
|
44
45
|
end
|
45
46
|
|
46
47
|
eg.helpers do
|
@@ -1,18 +1,11 @@
|
|
1
1
|
module PeaceLove
|
2
2
|
class Collection
|
3
|
-
attr_reader :mongo_collection
|
3
|
+
attr_reader :mongo_collection, :mixin
|
4
4
|
|
5
|
-
def initialize(collection)
|
5
|
+
def initialize(collection, mixin)
|
6
6
|
@collection = @mongo_collection = collection
|
7
|
-
end
|
8
|
-
|
9
|
-
def mixin=(mixin)
|
10
|
-
mixin.collection = @mongo_collection.name
|
11
|
-
end
|
12
|
-
def set_mixin(mixin)
|
13
7
|
@mixin = mixin
|
14
8
|
end
|
15
|
-
attr_reader :mixin
|
16
9
|
|
17
10
|
def build(seed={})
|
18
11
|
__wrap( seed )
|
@@ -38,9 +31,7 @@ module PeaceLove
|
|
38
31
|
|
39
32
|
def __wrap(hash)
|
40
33
|
return nil unless hash.respond_to?(:to_hash)
|
41
|
-
|
42
|
-
hash = __extend( AngryHash[ hash ] )
|
43
|
-
hash
|
34
|
+
__extend( AngryHash[ hash ] )
|
44
35
|
end
|
45
36
|
|
46
37
|
def __extend(doc)
|
@@ -57,5 +48,4 @@ module PeaceLove
|
|
57
48
|
class_eval "def #{name}(*args,&block); @collection.#{name}(*args,&block) end" unless method_defined?(name)
|
58
49
|
end
|
59
50
|
end
|
60
|
-
|
61
51
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module PeaceLove
|
2
|
+
class Db
|
3
|
+
attr_reader :db,:mixins
|
4
|
+
|
5
|
+
def initialize(db,mixins)
|
6
|
+
@db = db || raise("#{self} requires a non-nil db")
|
7
|
+
@mixins = mixins
|
8
|
+
end
|
9
|
+
|
10
|
+
def collections
|
11
|
+
@collections ||= {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](collection_name)
|
15
|
+
collections[collection_name] ||= PeaceLove::Collection.new( db[collection_name], mixins[collection_name] )
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/peace_love/document.rb
CHANGED
@@ -1,174 +1,46 @@
|
|
1
|
+
require 'angry_hash/extension'
|
1
2
|
|
2
3
|
module PeaceLove
|
3
4
|
module Doc
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
base.module_eval do
|
9
|
-
def self.extend_object(obj)
|
10
|
-
super
|
11
|
-
Doc.mark_extension(obj,self)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def mark_extension(doc,mod)
|
17
|
-
#puts "mark_extension doc=#{doc.class} mod=#{mod}"
|
18
|
-
|
19
|
-
# TODO store extension on the doc!
|
20
|
-
if (previous_mod = doc.__peace_love_extension) && previous_mod != mod
|
21
|
-
raise "doc #{doc} has already been extended by a different PeaceLove::Doc (was: #{previous_mod}, now: #{mod})"
|
22
|
-
end
|
23
|
-
doc.__peace_love_extension = mod
|
24
|
-
|
25
|
-
setup_extended_doc(doc,mod)
|
26
|
-
end
|
27
|
-
|
28
|
-
def mixin_registry
|
29
|
-
@mixin_registry ||= Hash.new {|h,k| h[k] = {}}
|
30
|
-
end
|
31
|
-
|
32
|
-
def register_mixin(target_class,field,mod,options)
|
33
|
-
mixin_registry[target_class][field.to_s] = [:single, mod, options]
|
34
|
-
end
|
35
|
-
|
36
|
-
def register_mixin_array(target_class, field, mod, options)
|
37
|
-
mixin_registry[target_class][field.to_s] = [:array, mod, options]
|
38
|
-
end
|
39
|
-
|
40
|
-
def register_mixin_hash(target_class, field, mod, options)
|
41
|
-
mixin_registry[target_class][field.to_s] = [:hash, mod, options]
|
42
|
-
end
|
43
|
-
|
44
|
-
def extend_doc(doc,mod,parent_doc)
|
45
|
-
# puts "extend_doc doc=#{doc.class} mod=#{mod} parent_obj=#{parent_obj.class}"
|
46
|
-
|
47
|
-
if !parent_doc.nil? && doc.nil?
|
48
|
-
doc = AngryHash.new
|
49
|
-
end
|
50
|
-
|
51
|
-
doc.extend mod
|
52
|
-
|
53
|
-
doc.__parent_doc = parent_doc if doc.respond_to?(:__parent_doc=)
|
54
|
-
doc
|
55
|
-
end
|
56
|
-
|
57
|
-
def setup_extended_doc(doc,mod)
|
58
|
-
mod.fill_in_defaults(doc) if mod.respond_to?(:fill_in_defaults)
|
59
|
-
doc
|
60
|
-
end
|
61
|
-
|
62
|
-
def mixin_to(parent_obj,field,obj)
|
63
|
-
# puts "mixin_to field=#{field}"
|
64
|
-
|
65
|
-
extension = parent_obj.__peace_love_extension
|
66
|
-
# puts "found extension=#{extension.inspect}"
|
67
|
-
|
68
|
-
if mixin = mixin_registry[extension][field.to_s]
|
69
|
-
kind,mod,options = *mixin
|
70
|
-
|
71
|
-
if options.key?(:default) && obj.nil?
|
72
|
-
obj = options[:default]
|
73
|
-
end
|
74
|
-
|
75
|
-
case kind
|
76
|
-
when :single
|
77
|
-
obj = extend_doc(obj,mod,parent_obj)
|
78
|
-
when :array
|
79
|
-
# XXX - this is ok for now... we really need to typecheck, perhaps wrap in a smart-array
|
80
|
-
obj ||= []
|
81
|
-
obj = obj.map {|elt| extend_doc(elt, mod, parent_obj)}
|
82
|
-
when :hash
|
83
|
-
obj ||= {}
|
84
|
-
obj = obj.inject(AngryHash.new) do |h,(k,elt)|
|
85
|
-
h[k] = extend_doc(elt,mod,parent_obj)
|
86
|
-
h
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
obj
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def [](key)
|
96
|
-
Doc.mixin_to(self,key,super)
|
97
|
-
end
|
98
|
-
|
99
|
-
def id
|
100
|
-
self['id']
|
5
|
+
def self.included(base)
|
6
|
+
base.send :include, AngryHash::Extension
|
7
|
+
base.extend ClassMethods
|
101
8
|
end
|
102
9
|
|
103
10
|
def __collection=(col)
|
104
11
|
@collection = col
|
105
12
|
end
|
106
13
|
|
107
|
-
def
|
14
|
+
def __parent_hash=(doc)
|
108
15
|
self.__collection = doc.__collection if doc.respond_to?(:__collection)
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
def __parent_doc
|
113
|
-
@parent_doc
|
16
|
+
super
|
114
17
|
end
|
115
18
|
|
116
19
|
def __collection
|
117
20
|
@collection
|
118
21
|
end
|
119
22
|
|
120
|
-
def __peace_love_extension=(mod)
|
121
|
-
@__peace_love_extension = mod
|
122
|
-
end
|
123
|
-
|
124
|
-
def __peace_love_extension
|
125
|
-
@__peace_love_extension
|
126
|
-
end
|
127
|
-
|
128
23
|
module ClassMethods
|
129
|
-
def
|
130
|
-
|
131
|
-
|
24
|
+
def mongo(options)
|
25
|
+
PeaceLove.mixin_config[options[:db]][options[:collection]] = self
|
26
|
+
end
|
27
|
+
def mongo_collection(collection_name)
|
28
|
+
PeaceLove.mixin_config[nil][collection_name] = self
|
132
29
|
end
|
133
|
-
alias mongo_collection collection=
|
134
30
|
|
135
31
|
def collection
|
136
|
-
@collection
|
32
|
+
@collection ||= PeaceLove.collection_for_mixin(self)
|
137
33
|
end
|
138
34
|
|
139
|
-
|
140
|
-
if default_form
|
141
|
-
@default_form = default_form
|
142
|
-
end
|
143
|
-
@default_form
|
144
|
-
end
|
35
|
+
include AngryHash::Extension::ClassMethods
|
145
36
|
|
146
|
-
|
147
|
-
|
148
|
-
doc.reverse_deep_update(defaults)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def sub_document(field,mod,options={})
|
153
|
-
Doc.register_mixin(self,field,mod,options)
|
154
|
-
end
|
155
|
-
alias_method :sub_doc, :sub_document
|
37
|
+
alias_method :sub_document, :extend_value
|
38
|
+
alias_method :sub_doc, :extend_value
|
156
39
|
|
157
|
-
|
158
|
-
|
159
|
-
end
|
160
|
-
alias_method :sub_col, :sub_collection
|
40
|
+
alias_method :sub_document, :extend_array
|
41
|
+
alias_method :sub_col, :extend_array
|
161
42
|
|
162
|
-
|
163
|
-
Doc.register_mixin_hash(self,field,mod,options)
|
164
|
-
end
|
165
|
-
|
166
|
-
def build(seed={})
|
167
|
-
doc = AngryHash[ seed ]
|
168
|
-
self.fill_in_defaults(doc)
|
169
|
-
doc.extend self
|
170
|
-
doc
|
171
|
-
end
|
43
|
+
alias_method :sub_hash, :extend_hash
|
172
44
|
end
|
173
45
|
end
|
174
46
|
end
|
data/lib/peace_love.rb
CHANGED
@@ -2,22 +2,38 @@ require 'mongo'
|
|
2
2
|
require 'angry_hash'
|
3
3
|
|
4
4
|
module PeaceLove
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require 'peace_love/cursor'
|
5
|
+
autoload :Db, 'peace_love/db'
|
6
|
+
autoload :Doc, 'peace_love/document'
|
7
|
+
autoload :Collection, 'peace_love/collection'
|
8
|
+
autoload :Cursor, 'peace_love/cursor'
|
10
9
|
|
11
|
-
module PeaceLove
|
12
10
|
class << self
|
13
|
-
attr_accessor :
|
11
|
+
attr_accessor :default_db, :mongo, :connection
|
14
12
|
|
15
|
-
def
|
16
|
-
@
|
13
|
+
def dbs
|
14
|
+
@dbs ||= {}
|
17
15
|
end
|
18
16
|
|
19
|
-
def [](
|
20
|
-
|
17
|
+
def [](*db_name)
|
18
|
+
if db_name = db_name.flatten.compact.pop
|
19
|
+
dbs[db_name.to_s] ||= PeaceLove::Db.new( mongo[db_name], mixin_config[db_name] )
|
20
|
+
else
|
21
|
+
@wrapped_default_db ||= PeaceLove::Db.new( default_db, mixin_config[nil] )
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def mixin_config
|
26
|
+
@mixin_config ||= Hash.new {|h,k| h[k] = {}}
|
27
|
+
end
|
28
|
+
|
29
|
+
def collection_for_mixin(mixin)
|
30
|
+
mixin_config.each do |db,db_mixins|
|
31
|
+
db_mixins.each do |col,col_mixin|
|
32
|
+
if col_mixin == mixin
|
33
|
+
return self[db][col]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
21
37
|
end
|
22
38
|
|
23
39
|
def connect(options)
|
@@ -29,9 +45,8 @@ module PeaceLove
|
|
29
45
|
|
30
46
|
options.delete('adapter') # XXX check?
|
31
47
|
|
32
|
-
# TODO - support paired servers
|
33
48
|
self.connection = Mongo::Connection.new(options.delete('host'), options.delete('port'), options)
|
34
|
-
self.
|
49
|
+
self.default_db = connection.db(options.database)
|
35
50
|
end
|
36
51
|
end
|
37
52
|
end
|
data/peace_love.gemspec
CHANGED
@@ -5,16 +5,17 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{peace_love}
|
8
|
-
s.version = "0.1
|
8
|
+
s.version = "0.2.1"
|
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-
|
12
|
+
s.date = %q{2010-10-24}
|
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 = [
|
16
16
|
".gitignore",
|
17
17
|
"Gemfile",
|
18
|
+
"Gemfile.lock",
|
18
19
|
"License",
|
19
20
|
"Rakefile",
|
20
21
|
"Readme.md",
|
@@ -24,6 +25,7 @@ Gem::Specification.new do |s|
|
|
24
25
|
"lib/peace_love.rb",
|
25
26
|
"lib/peace_love/collection.rb",
|
26
27
|
"lib/peace_love/cursor.rb",
|
28
|
+
"lib/peace_love/db.rb",
|
27
29
|
"lib/peace_love/document.rb",
|
28
30
|
"lib/peace_love/railtie.rb",
|
29
31
|
"peace_love.gemspec"
|
@@ -39,15 +41,15 @@ Gem::Specification.new do |s|
|
|
39
41
|
s.specification_version = 3
|
40
42
|
|
41
43
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
42
|
-
s.add_runtime_dependency(%q<mongo>, ["~> 1.
|
43
|
-
s.add_runtime_dependency(%q<angry_hash>, ["~> 0.
|
44
|
+
s.add_runtime_dependency(%q<mongo>, ["~> 1.1.0"])
|
45
|
+
s.add_runtime_dependency(%q<angry_hash>, ["~> 0.3.2"])
|
44
46
|
else
|
45
|
-
s.add_dependency(%q<mongo>, ["~> 1.
|
46
|
-
s.add_dependency(%q<angry_hash>, ["~> 0.
|
47
|
+
s.add_dependency(%q<mongo>, ["~> 1.1.0"])
|
48
|
+
s.add_dependency(%q<angry_hash>, ["~> 0.3.2"])
|
47
49
|
end
|
48
50
|
else
|
49
|
-
s.add_dependency(%q<mongo>, ["~> 1.
|
50
|
-
s.add_dependency(%q<angry_hash>, ["~> 0.
|
51
|
+
s.add_dependency(%q<mongo>, ["~> 1.1.0"])
|
52
|
+
s.add_dependency(%q<angry_hash>, ["~> 0.3.2"])
|
51
53
|
end
|
52
54
|
end
|
53
55
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 2
|
7
8
|
- 1
|
8
|
-
|
9
|
-
version: 0.1.3
|
9
|
+
version: 0.2.1
|
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-
|
17
|
+
date: 2010-10-24 00:00:00 +11:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,9 +26,9 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
28
|
- 1
|
29
|
+
- 1
|
29
30
|
- 0
|
30
|
-
|
31
|
-
version: 1.0.0
|
31
|
+
version: 1.1.0
|
32
32
|
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
@@ -40,9 +40,9 @@ dependencies:
|
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
segments:
|
42
42
|
- 0
|
43
|
-
-
|
44
|
-
-
|
45
|
-
version: 0.
|
43
|
+
- 3
|
44
|
+
- 2
|
45
|
+
version: 0.3.2
|
46
46
|
type: :runtime
|
47
47
|
version_requirements: *id002
|
48
48
|
description: A simple mixin layer for enhancing hashes retrieved from MongoDB. It eschews the normal 'mapping' compulsion of mongo libraries.
|
@@ -56,6 +56,7 @@ extra_rdoc_files: []
|
|
56
56
|
files:
|
57
57
|
- .gitignore
|
58
58
|
- Gemfile
|
59
|
+
- Gemfile.lock
|
59
60
|
- License
|
60
61
|
- Rakefile
|
61
62
|
- Readme.md
|
@@ -65,6 +66,7 @@ files:
|
|
65
66
|
- lib/peace_love.rb
|
66
67
|
- lib/peace_love/collection.rb
|
67
68
|
- lib/peace_love/cursor.rb
|
69
|
+
- lib/peace_love/db.rb
|
68
70
|
- lib/peace_love/document.rb
|
69
71
|
- lib/peace_love/railtie.rb
|
70
72
|
- peace_love.gemspec
|