peace_love 0.1.3 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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