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 CHANGED
@@ -1,6 +1,6 @@
1
1
  source :rubygems
2
2
 
3
- gem 'angry_hash', '~>0.1.1'
3
+ gem 'angry_hash', '~>0.2.0'
4
4
  gem 'mongo'
5
5
  gem 'bson_ext'
6
6
 
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.0.0'])
14
- gemspec.add_dependency("angry_hash", ['~>0.1.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.3
1
+ 0.2.1
@@ -6,7 +6,8 @@ require 'exemplor'
6
6
  require 'pp'
7
7
 
8
8
  require 'pathname'
9
- here = Pathname(__FILE__).dirname
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
- $db = Mongo::Connection.new.db('sample-db')
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.db = $db
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
- mongo_collection 'beans'
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
@@ -1,174 +1,46 @@
1
+ require 'angry_hash/extension'
1
2
 
2
3
  module PeaceLove
3
4
  module Doc
4
- class << self
5
- def included(base)
6
- base.extend ClassMethods
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 __parent_doc=(doc)
14
+ def __parent_hash=(doc)
108
15
  self.__collection = doc.__collection if doc.respond_to?(:__collection)
109
- @parent_doc = doc
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 collection=(collection_name)
130
- @collection = PeaceLove[collection_name]
131
- @collection.set_mixin(self)
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
- def defaults(default_form=nil)
140
- if default_form
141
- @default_form = default_form
142
- end
143
- @default_form
144
- end
35
+ include AngryHash::Extension::ClassMethods
145
36
 
146
- def fill_in_defaults(doc)
147
- if defaults
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
- def sub_collection(field,mod,options={})
158
- Doc.register_mixin_array(self,field,mod,options)
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
- def sub_hash(field,mod,options={})
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
- end
6
-
7
- require 'peace_love/document'
8
- require 'peace_love/collection'
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 :db, :connection
11
+ attr_accessor :default_db, :mongo, :connection
14
12
 
15
- def collections
16
- @collections ||= {}
13
+ def dbs
14
+ @dbs ||= {}
17
15
  end
18
16
 
19
- def [](collection_name)
20
- collections[collection_name.to_s] ||= PeaceLove::Collection.new( db[collection_name] )
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.db = connection.db(options.database)
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.3"
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-08-23}
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.0.0"])
43
- s.add_runtime_dependency(%q<angry_hash>, ["~> 0.1.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.0.0"])
46
- s.add_dependency(%q<angry_hash>, ["~> 0.1.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.0.0"])
50
- s.add_dependency(%q<angry_hash>, ["~> 0.1.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
- - 3
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-08-23 00:00:00 +10:00
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
- - 0
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
- - 1
44
- - 0
45
- version: 0.1.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