mongoid-tll 0.0.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/LICENSE +22 -0
- data/README.md +37 -0
- data/lib/mongoid/tll.rb +68 -0
- data/test/mongoid-tll.rb +83 -0
- metadata +81 -0
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2011 Joris van Rooij
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
Mongoid Top Linked List
|
2
|
+
=======================
|
3
|
+
|
4
|
+
A relatively simple module that provides a doubly top linked list for your
|
5
|
+
documents. Every change creates a new document, with a link to the old one.
|
6
|
+
All the documents have a link to the newest document. This setup should
|
7
|
+
provide better performance in applications that usually need the newest
|
8
|
+
version.
|
9
|
+
|
10
|
+
An example:
|
11
|
+
|
12
|
+
class MyDocument
|
13
|
+
include Mongoid::Document
|
14
|
+
include Mongoid::TLL
|
15
|
+
|
16
|
+
field :data
|
17
|
+
end
|
18
|
+
|
19
|
+
@doc = MyDocument.create(data: "first version")
|
20
|
+
@doc.data = "second version"
|
21
|
+
@doc.save
|
22
|
+
|
23
|
+
@doc.data
|
24
|
+
>> "second version"
|
25
|
+
@doc.prev.data
|
26
|
+
>> "first version"
|
27
|
+
|
28
|
+
A default scope is added to only find the newest versions by default. Use
|
29
|
+
the `scopeless` method to circumvent this.
|
30
|
+
|
31
|
+
Other helper methods have been added:
|
32
|
+
|
33
|
+
* `newest` - Returns the newest version of the document.
|
34
|
+
* `newest?` - Is this the newest version?
|
35
|
+
* `oldest?` - Is this the oldest (original) version?
|
36
|
+
* `prev` - Returns the previous version of the document.
|
37
|
+
|
data/lib/mongoid/tll.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
module Mongoid
|
2
|
+
|
3
|
+
# Include this module to have documents automatically cloned when
|
4
|
+
# updated. It constructs a top linked list (like a doubly linked list
|
5
|
+
# with a pointer to the newest version) out of the chain of documents.
|
6
|
+
# Only use this when in 99% of the time only the newest version of a
|
7
|
+
# document is read! Mongoid::Versioning will take care of all the
|
8
|
+
# other usecases.
|
9
|
+
module TLL
|
10
|
+
def self.included(klass)
|
11
|
+
klass.class_exec do
|
12
|
+
|
13
|
+
# The linked list pointers.
|
14
|
+
field :tll_top
|
15
|
+
field :tll_prev
|
16
|
+
|
17
|
+
# By default, get the newest only.
|
18
|
+
default_scope where: {tll_top: nil}
|
19
|
+
|
20
|
+
set_callback :save, :before, :tll_commit
|
21
|
+
attr_protected :tll_top, :tll_prev
|
22
|
+
|
23
|
+
# Function that is called before saving a document.
|
24
|
+
# It's responsible for the versioning.
|
25
|
+
def tll_commit
|
26
|
+
oldself = self.class.unscoped.where(_id: id).first
|
27
|
+
if oldself # We've got a previous saved document.
|
28
|
+
self.class.unscoped.where(tll_top: oldself._id)\
|
29
|
+
.update_all(tll_top: id)
|
30
|
+
oldself = oldself.clone
|
31
|
+
oldself.tll_top = id
|
32
|
+
self.tll_prev = oldself._id
|
33
|
+
oldself.save
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Is this the newest version?
|
38
|
+
def newest?
|
39
|
+
self.tll_top.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
# Return the newest version.
|
43
|
+
def newest
|
44
|
+
unless self.tll_top.nil?
|
45
|
+
return self.class.unscoped.where(_id: self.tll_top).first
|
46
|
+
end
|
47
|
+
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
# Is this the oldest version?
|
52
|
+
def oldest?
|
53
|
+
self.tll_prev.nil?
|
54
|
+
end
|
55
|
+
|
56
|
+
# Return the previous version, if there is any.
|
57
|
+
# Will return nil when #oldest? is true.
|
58
|
+
def prev
|
59
|
+
unless self.tll_prev.nil?
|
60
|
+
return self.class.unscoped.where(_id: self.tll_prev).first
|
61
|
+
end
|
62
|
+
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/test/mongoid-tll.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
#!/usr/bin/env ruby1.9.1
|
2
|
+
|
3
|
+
$: << File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
|
5
|
+
require 'mongoid'
|
6
|
+
require 'mongoid-tll'
|
7
|
+
require 'test/unit'
|
8
|
+
|
9
|
+
Mongoid.configure do |config|
|
10
|
+
config.master = Mongo::Connection.new.db "testing"
|
11
|
+
config.persist_in_safe_mode = false
|
12
|
+
end
|
13
|
+
|
14
|
+
class MyDocument
|
15
|
+
include Mongoid::Document
|
16
|
+
include Mongoid::TLL
|
17
|
+
|
18
|
+
field :content
|
19
|
+
end
|
20
|
+
|
21
|
+
class TestMongoidTLL < Test::Unit::TestCase
|
22
|
+
def setup
|
23
|
+
@doc = MyDocument.create(content: "first version")
|
24
|
+
end
|
25
|
+
|
26
|
+
def teardown
|
27
|
+
MyDocument.delete_all
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_basic_attributes
|
31
|
+
assert_kind_of Mongoid::TLL, @doc
|
32
|
+
assert_respond_to @doc, :content
|
33
|
+
assert_equal "first version", @doc.content
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_extended_attributes
|
37
|
+
assert_respond_to @doc, :newest?
|
38
|
+
assert_respond_to @doc, :newest
|
39
|
+
assert_respond_to @doc, :oldest?
|
40
|
+
assert_respond_to @doc, :prev
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_add_version
|
44
|
+
@doc.content = "second version"
|
45
|
+
@doc.save
|
46
|
+
assert @doc.newest?
|
47
|
+
assert !@doc.oldest?
|
48
|
+
assert_kind_of Mongoid::TLL, @doc.prev
|
49
|
+
assert_equal "first version", @doc.prev.content
|
50
|
+
assert @doc.prev.oldest?
|
51
|
+
assert !@doc.prev.newest?
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_add_version_twice
|
55
|
+
@doc.content = "second version"
|
56
|
+
@doc.save
|
57
|
+
@doc.content = "third version"
|
58
|
+
@doc.save
|
59
|
+
|
60
|
+
assert @doc.newest?
|
61
|
+
assert_equal "second version", @doc.prev.content
|
62
|
+
assert_equal "first version", @doc.prev.prev.content
|
63
|
+
assert_equal "third version", @doc.prev.newest.content
|
64
|
+
assert_equal "third version", @doc.prev.prev.newest.content
|
65
|
+
assert_equal nil, @doc.prev.prev.prev
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_query_only_newest
|
69
|
+
@doc.content = "first document, second version"
|
70
|
+
@doc.save
|
71
|
+
@doc2 = MyDocument.create(content: "second document, first version")
|
72
|
+
@doc2.content = "second document, second version"
|
73
|
+
@doc2.save
|
74
|
+
|
75
|
+
assert_equal 2, MyDocument.count
|
76
|
+
assert_equal 4, MyDocument.unscoped.count
|
77
|
+
|
78
|
+
t = ["first document, second version", "second document, second version"]
|
79
|
+
MyDocument.all.each_with_index do |d, i|
|
80
|
+
assert_equal t[i], d.content
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mongoid-tll
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Joris van Rooij
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-04-09 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: mongoid
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 2
|
30
|
+
- 0
|
31
|
+
- 0
|
32
|
+
version: 2.0.0
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Creates a (doubly) top linked list out of your documents. Every change makes a new revision. Basically a read optimized versioning system.
|
36
|
+
email: jorrizza@jrrzz.net
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- lib/mongoid/tll.rb
|
45
|
+
- LICENSE
|
46
|
+
- README.md
|
47
|
+
- test/mongoid-tll.rb
|
48
|
+
has_rdoc: true
|
49
|
+
homepage: https://github.com/jorrizza/mongoid-tll
|
50
|
+
licenses: []
|
51
|
+
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
requirements: []
|
74
|
+
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 1.3.7
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: Top linked list plugin for Mongoid
|
80
|
+
test_files:
|
81
|
+
- test/mongoid-tll.rb
|