mongo-hashie 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README.rdoc +48 -2
- data/VERSION +1 -1
- data/lib/mongo-hashie/base.rb +42 -34
- data/lib/mongo-hashie/meta_data.rb +48 -0
- data/lib/mongo-hashie/rails.rb +33 -0
- data/lib/mongo-hashie.rb +3 -1
- data/mongo-hashie.gemspec +4 -2
- data/test/helper.rb +2 -0
- data/test/test_mongo-hashie.rb +71 -4
- metadata +4 -2
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,52 @@
|
|
1
1
|
= mongo-hashie
|
2
2
|
|
3
|
-
|
3
|
+
mongo-hashie is a mongodb library that aims to be simple and effective. No need to explicitly define properties. Getters and setters are created through the underlying Mash class from hashie.
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
$ gem install mongo-hashie
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
class Document < MongoHashie::Base
|
12
|
+
end
|
13
|
+
|
14
|
+
Simply add new properties by calling the setter.
|
15
|
+
|
16
|
+
Basic CRUD operations
|
17
|
+
|
18
|
+
$ document = Document.new(:author => "Oliver Kiessler")
|
19
|
+
$ document.name = "test attribute"
|
20
|
+
$ document.save # create
|
21
|
+
$ puts document._id # Mongo ObjectID String represenation
|
22
|
+
|
23
|
+
$ document.name = "simple change"
|
24
|
+
$ document.save # update
|
25
|
+
|
26
|
+
$ document.destroy
|
27
|
+
|
28
|
+
$ document2 = Document.create(:author => "Oliver Kiessler", :name => "Great Document Name")
|
29
|
+
|
30
|
+
$ Document.destroy_all
|
31
|
+
|
32
|
+
Find operations
|
33
|
+
|
34
|
+
$ Document.first
|
35
|
+
$ Document.find("4b3f4bd4c1d7110513000001") # Mongo ObjectID String represenation
|
36
|
+
|
37
|
+
$ Document.all
|
38
|
+
$ Document.all(:author => "Oliver Kiessler")
|
39
|
+
$ Document.find(:author => "Oliver Kiessler", :name => "Great Document Name")
|
40
|
+
|
41
|
+
$ Document.count
|
42
|
+
|
43
|
+
Meta Data
|
44
|
+
|
45
|
+
$ document1 = Document.create(:author => "Oliver Kiessler", :name => "Great Document Name", :prop1 => "Test")
|
46
|
+
$ document2 = Document.create(:author => "Oliver Kiessler", :name => "Great Document Name", :prop2 => "Test")
|
47
|
+
$ document3 = Document.create(:author => "Oliver Kiessler", :name => "Great Document Name", :prop3 => "Test")
|
48
|
+
|
49
|
+
$ puts Document.properties_used.inspect
|
4
50
|
|
5
51
|
== Note on Patches/Pull Requests
|
6
52
|
|
@@ -14,4 +60,4 @@ Description goes here.
|
|
14
60
|
|
15
61
|
== Copyright
|
16
62
|
|
17
|
-
Copyright (c) 2009 Oliver Kiessler. See LICENSE for details.
|
63
|
+
Copyright (c) 2009/2010 Oliver Kiessler. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/lib/mongo-hashie/base.rb
CHANGED
@@ -2,8 +2,11 @@ module MongoHashie
|
|
2
2
|
def self.included(base)
|
3
3
|
base.class_eval do
|
4
4
|
extend ClassMethods
|
5
|
-
|
5
|
+
extend Rails
|
6
|
+
extend MetaData::ClassMethods
|
6
7
|
include Mongo
|
8
|
+
include InstanceMethods
|
9
|
+
include MetaData::InstanceMethods
|
7
10
|
end
|
8
11
|
end
|
9
12
|
|
@@ -13,12 +16,13 @@ module MongoHashie
|
|
13
16
|
end
|
14
17
|
|
15
18
|
def save
|
16
|
-
if self._id.
|
19
|
+
if self._id.nil?
|
17
20
|
self._id = Mongo::ObjectID.new
|
18
21
|
collection.insert(self)
|
19
22
|
else
|
20
23
|
collection.update({'_id' => self._id}, self)
|
21
24
|
end
|
25
|
+
update_keys if MongoHashie::Configuration.create_meta_data and not self.is_a?(MetaDataProperties)
|
22
26
|
self
|
23
27
|
end
|
24
28
|
|
@@ -28,46 +32,50 @@ module MongoHashie
|
|
28
32
|
end
|
29
33
|
|
30
34
|
module ClassMethods
|
31
|
-
def database
|
32
|
-
@@database ||= "mongohashie"
|
33
|
-
end
|
34
|
-
def database=(value); @@database = value; end
|
35
|
-
|
36
35
|
def connection
|
37
|
-
Mongo::Connection.new(
|
36
|
+
Mongo::Connection.new(MongoHashie::Configuration.host, MongoHashie::Configuration.port,
|
37
|
+
:pool_size => MongoHashie::Configuration.pool_size, :timeout => MongoHashie::Configuration.timeout)
|
38
38
|
end
|
39
39
|
|
40
|
-
def db; @@db ||= connection.db(database); end
|
41
|
-
|
40
|
+
def db; @@db ||= connection.db(MongoHashie::Configuration.database); end
|
41
|
+
end
|
42
|
+
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
class MongoHashie::Base < Hashie::Mash
|
45
|
+
include MongoHashie
|
46
|
+
end
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
end
|
48
|
+
class MongoHashie::MetaDataProperties < MongoHashie::Base
|
49
|
+
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
result.count == 1 ? result.collect {|doc| self.new(doc)}.first : result.collect {|doc| self.new(doc)}
|
58
|
-
end
|
51
|
+
class MongoHashie::Configuration
|
52
|
+
def self.database
|
53
|
+
@@database ||= 'mongohashie'
|
54
|
+
end
|
55
|
+
def self.database=(value); @@database = value; end
|
59
56
|
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
def self.host
|
58
|
+
@@host ||= 'localhost'
|
59
|
+
end
|
60
|
+
def self.host=(value); @@host = value; end
|
63
61
|
|
64
|
-
|
65
|
-
|
66
|
-
end
|
62
|
+
def self.port
|
63
|
+
@@port ||= 27017
|
67
64
|
end
|
68
|
-
end
|
65
|
+
def self.port=(value); @@port = value; end
|
69
66
|
|
70
|
-
|
71
|
-
|
72
|
-
end
|
67
|
+
def self.pool_size
|
68
|
+
@@pool_size ||= 5
|
69
|
+
end
|
70
|
+
def self.pool_size=(value); @@pool_size = value; end
|
73
71
|
|
72
|
+
def self.timeout
|
73
|
+
@@timeout ||= 5
|
74
|
+
end
|
75
|
+
def self.timeout=(value); @@timeout = value; end
|
76
|
+
|
77
|
+
def self.create_meta_data
|
78
|
+
@@create_meta_data ||= true
|
79
|
+
end
|
80
|
+
def self.create_meta_data=(value); @@create_meta_data = value; end
|
81
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module MongoHashie
|
2
|
+
module MetaData
|
3
|
+
module InstanceMethods
|
4
|
+
def update_keys
|
5
|
+
meta_data_wrapper = MetaDataProperties.first(:class_name => self.class.name)
|
6
|
+
if meta_data_wrapper
|
7
|
+
updated = false
|
8
|
+
keys.each do |key|
|
9
|
+
if not MetaDataProperties.ignored_keys.include?(key) and not meta_data_wrapper.key?(key)
|
10
|
+
meta_data_wrapper.send("#{key.to_sym}=", self.send(key.to_sym).class.name)
|
11
|
+
updated = true
|
12
|
+
end
|
13
|
+
meta_data_wrapper.save if updated
|
14
|
+
end
|
15
|
+
else
|
16
|
+
properties_used = {:class_name => self.class.name}
|
17
|
+
keys.each do |key|
|
18
|
+
properties_used[key] = self.send(key.to_sym).class.name unless MetaDataProperties.ignored_keys.include?(key)
|
19
|
+
end
|
20
|
+
MetaDataProperties.create(properties_used)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def reset_keys
|
25
|
+
meta_data_wrapper = MetaDataProperties.first(:class_name => self.class.name)
|
26
|
+
meta_data_wrapper.destroy if meta_data_wrapper
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
def properties_used
|
32
|
+
meta_data_properties = MetaDataProperties.first(:class_name => name)
|
33
|
+
meta_data_properties_pairs = {}
|
34
|
+
if meta_data_properties
|
35
|
+
properties = meta_data_properties.keys.select {|k| k unless ignored_keys.include?(k)}
|
36
|
+
properties.each do |key|
|
37
|
+
meta_data_properties_pairs[key] = meta_data_properties.send(key.to_sym)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
meta_data_properties_pairs
|
41
|
+
end
|
42
|
+
|
43
|
+
def ignored_keys
|
44
|
+
['_id', 'class_name']
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module MongoHashie
|
2
|
+
module Rails
|
3
|
+
def create(hash = {}); self.new(hash).save; end
|
4
|
+
|
5
|
+
def all(options = {})
|
6
|
+
self.new.collection.find.collect {|doc| self.new(doc)}
|
7
|
+
end
|
8
|
+
|
9
|
+
def first(options = {})
|
10
|
+
result = self.new.collection.find_one(options)
|
11
|
+
self.new(result) if result
|
12
|
+
end
|
13
|
+
|
14
|
+
def find(*args)
|
15
|
+
if args.first.is_a?(Hash)
|
16
|
+
result = self.new.collection.find(args.first)
|
17
|
+
else
|
18
|
+
result = self.new.collection.find('_id' => Mongo::ObjectID.from_string(args.first))
|
19
|
+
end
|
20
|
+
result.count == 1 ? result.collect {|doc| self.new(doc)}.first : result.collect {|doc| self.new(doc)}
|
21
|
+
end
|
22
|
+
|
23
|
+
def count
|
24
|
+
self.new.collection.count
|
25
|
+
end
|
26
|
+
|
27
|
+
def destroy_all
|
28
|
+
target = self.new
|
29
|
+
target.collection.remove
|
30
|
+
target.reset_keys
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/mongo-hashie.rb
CHANGED
data/mongo-hashie.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongo-hashie}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Oliver Kiessler"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-01-02}
|
13
13
|
s.description = %q{Simple MongoDB Object Wrapper based on Hashie}
|
14
14
|
s.email = %q{kiessler@inceedo.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,6 +25,8 @@ Gem::Specification.new do |s|
|
|
25
25
|
"VERSION",
|
26
26
|
"lib/mongo-hashie.rb",
|
27
27
|
"lib/mongo-hashie/base.rb",
|
28
|
+
"lib/mongo-hashie/meta_data.rb",
|
29
|
+
"lib/mongo-hashie/rails.rb",
|
28
30
|
"mongo-hashie.gemspec",
|
29
31
|
"test/helper.rb",
|
30
32
|
"test/test_mongo-hashie.rb"
|
data/test/helper.rb
CHANGED
data/test/test_mongo-hashie.rb
CHANGED
@@ -1,9 +1,76 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
+
class BlogPost < MongoHashie::Base
|
4
|
+
end
|
5
|
+
|
3
6
|
class TestMongoHashie < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
+
def setup
|
8
|
+
BlogPost.destroy_all; MongoHashie::MetaDataProperties.destroy_all
|
9
|
+
@blog_post_hash = {:title => 'Test Title', :text => 'Bodytext', :author => 'Oliver Kiessler', :views => 1,
|
10
|
+
:tags => ['test1', 'test2', 'test3']}
|
7
11
|
end
|
8
|
-
|
12
|
+
|
13
|
+
context "basic operations" do
|
14
|
+
should "have a connection and database set" do
|
15
|
+
assert_equal MongoHashie::Configuration.database, 'mongo-hashie-testdb'
|
16
|
+
assert_not_nil BlogPost.connection
|
17
|
+
assert_not_nil BlogPost.db
|
18
|
+
end
|
19
|
+
|
20
|
+
should "create a new object" do
|
21
|
+
blog_post = BlogPost.new(@blog_post_hash)
|
22
|
+
assert_equal BlogPost.count, 0
|
23
|
+
blog_post.save
|
24
|
+
assert_not_nil blog_post._id
|
25
|
+
assert_equal BlogPost.count, 1
|
26
|
+
end
|
27
|
+
|
28
|
+
should "destroy object" do
|
29
|
+
blog_post = BlogPost.new(@blog_post_hash)
|
30
|
+
blog_post.save
|
31
|
+
assert_equal BlogPost.count, 1
|
32
|
+
blog_post.destroy
|
33
|
+
assert_equal BlogPost.count, 0
|
34
|
+
end
|
9
35
|
|
36
|
+
should "create object by passing a hash" do
|
37
|
+
assert_equal BlogPost.count, 0
|
38
|
+
blog_post = BlogPost.create(@blog_post_hash)
|
39
|
+
assert_equal BlogPost.count, 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "meta data" do
|
44
|
+
should "have meta data properties" do
|
45
|
+
assert_equal BlogPost.count, 0
|
46
|
+
assert_equal MongoHashie::MetaDataProperties.count, 0
|
47
|
+
blog_post = BlogPost.create(@blog_post_hash)
|
48
|
+
assert_equal BlogPost.count, 1
|
49
|
+
assert_equal MongoHashie::MetaDataProperties.count, 1
|
50
|
+
end
|
51
|
+
|
52
|
+
should "include all keys in the meta data properties" do
|
53
|
+
blog_post = BlogPost.create(@blog_post_hash)
|
54
|
+
assert_equal BlogPost.properties_used.keys.size, 5
|
55
|
+
assert BlogPost.properties_used.keys.include?('title')
|
56
|
+
assert BlogPost.properties_used.keys.include?('text')
|
57
|
+
assert BlogPost.properties_used.keys.include?('author')
|
58
|
+
assert BlogPost.properties_used.keys.include?('views')
|
59
|
+
assert BlogPost.properties_used.keys.include?('tags')
|
60
|
+
end
|
61
|
+
|
62
|
+
should "update keys in the meta data properties" do
|
63
|
+
BlogPost.create(@blog_post_hash)
|
64
|
+
assert_equal BlogPost.properties_used.keys.size, 5
|
65
|
+
BlogPost.create(@blog_post_hash.merge(:likes => 2))
|
66
|
+
assert_equal BlogPost.properties_used.keys.size, 6
|
67
|
+
end
|
68
|
+
|
69
|
+
should "reset keys in the meta data properties when destroy_all is called" do
|
70
|
+
2.times {BlogPost.create(@blog_post_hash)}
|
71
|
+
assert_not_nil MongoHashie::MetaDataProperties.first(:class_name => 'BlogPost')
|
72
|
+
BlogPost.destroy_all
|
73
|
+
assert_nil MongoHashie::MetaDataProperties.first(:class_name => 'BlogPost')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo-hashie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oliver Kiessler
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-02 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -60,6 +60,8 @@ files:
|
|
60
60
|
- VERSION
|
61
61
|
- lib/mongo-hashie.rb
|
62
62
|
- lib/mongo-hashie/base.rb
|
63
|
+
- lib/mongo-hashie/meta_data.rb
|
64
|
+
- lib/mongo-hashie/rails.rb
|
63
65
|
- mongo-hashie.gemspec
|
64
66
|
- test/helper.rb
|
65
67
|
- test/test_mongo-hashie.rb
|