mongoid_revisions 0.0.1 → 0.0.2
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/README.md +38 -3
- data/lib/mongoid_revisions/version.rb +1 -1
- data/lib/mongoid_revisions.rb +63 -35
- data/spec/mongoid/models/milestone.rb +9 -0
- data/spec/mongoid/models/project.rb +2 -0
- data/spec/mongoid_revisions/revisions_spec.rb +101 -74
- metadata +50 -45
data/README.md
CHANGED
@@ -25,12 +25,47 @@ To add support for revisions to a Mongoid documents, include the module to your
|
|
25
25
|
|
26
26
|
This gem adds to your Mongoid document the following attributes:
|
27
27
|
|
28
|
-
- revision
|
28
|
+
- revision (read only)
|
29
29
|
- tag
|
30
|
-
- token
|
30
|
+
- token (read only)
|
31
|
+
|
32
|
+
and the following methods:
|
33
|
+
|
34
|
+
- revisions
|
35
|
+
- tag_version
|
36
|
+
- revise
|
37
|
+
|
38
|
+
Token is a randomly generated string that is common to all revisions of the same document and it is wirte protected to preserve the functionality of this library.
|
39
|
+
|
40
|
+
Simply call the revise method
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
last_comment_revision=@comment.revise
|
44
|
+
```
|
45
|
+
|
46
|
+
to create a new revision for a document. Please note that the original object will be unchanged!
|
47
|
+
|
48
|
+
To access all revisitons for a givent document, use
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
@comment.revisions
|
52
|
+
```
|
53
|
+
|
54
|
+
Lastly, to modify a revision with a given tag, use
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
@comment.revise.tag_version("Beta stage")
|
58
|
+
```
|
59
|
+
|
60
|
+
to change the tag attribute of the document and save it in a single call.
|
61
|
+
|
62
|
+
## Future changes (sort of TODO list)
|
63
|
+
|
64
|
+
- Recursive revision to linked documents
|
65
|
+
- Branching to create a new document at revision a 0 and with a token different from the original
|
31
66
|
|
32
67
|
## Development
|
33
68
|
|
34
69
|
Questions or problems? Please post them on the [issue tracker](https://github.com/emilianodellacasa/mongoid_revisions/issues). You can contribute changes by forking the project and submitting a pull request. You can ensure the tests passing by running `bundle` and `rake`.
|
35
70
|
|
36
|
-
This gem is created by Emiliano Della Casa and is under the MIT License.
|
71
|
+
This gem is created by Emiliano Della Casa and is under the MIT License and it is distributed by courtesy of [Engim srl](http://www.engim.eu/en).
|
data/lib/mongoid_revisions.rb
CHANGED
@@ -1,40 +1,68 @@
|
|
1
1
|
require "mongoid_revisions/version"
|
2
2
|
|
3
3
|
module Mongoid
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
4
|
+
module Revisions
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
field :revision, :type => Integer, :default => 0
|
9
|
+
field :tag, :type => String, :default => "0.0.0"
|
10
|
+
field :token, :type => String
|
11
|
+
|
12
|
+
set_callback :create, :before, :create_unique_token
|
13
|
+
end
|
14
|
+
|
15
|
+
# BLOCK ACCESS TO REVISION ATTRIBUTE
|
16
|
+
def revision=(rev)
|
17
|
+
# DOES NOTHING
|
18
|
+
end
|
19
|
+
|
20
|
+
def token=(tok)
|
21
|
+
end
|
22
|
+
|
23
|
+
# RETURN ALL REVISIONS FOR THIS DOCUMENT
|
24
|
+
def revisions
|
25
|
+
self.class.where(:token=>self.token).order_by([[:revision,:asc]])
|
26
|
+
end
|
27
|
+
|
28
|
+
# ASSIGN A NEW TAG TO THIS REVISION
|
29
|
+
def tag_revision(tag)
|
30
|
+
self.tag=tag
|
31
|
+
self.save
|
32
|
+
end
|
33
|
+
|
34
|
+
# CREATE A NEW REVISION FOR THE DOCUMENT
|
35
|
+
def revise
|
36
|
+
new_revision = self.class.create self.attributes.except("_id")
|
37
|
+
new_revision._token = self.token
|
38
|
+
new_revision._revision = (self.revision || 1) + 1
|
39
|
+
new_revision.tag = "#{new_revision.revision}.0.0"
|
40
|
+
new_revision.save
|
41
|
+
self.relations.each do |relation|
|
42
|
+
metadata = self.class.reflect_on_association(relation[0])
|
43
|
+
metadata.class_name.constantize.where(metadata.foreign_key.to_sym=>self.id).each do |child|
|
44
|
+
new_child = metadata.class_name.constantize.create child.attributes.except("_id")
|
45
|
+
new_child.revision = child.revision+1
|
46
|
+
new_child.tag = "#{new_child.revision}.0.0"
|
47
|
+
new_child[metadata.foreign_key.to_sym]=new_revision.id
|
48
|
+
new_child.save
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
protected
|
54
|
+
|
55
|
+
def _revision=(rev)
|
56
|
+
self[:revision]=rev
|
57
|
+
end
|
58
|
+
|
59
|
+
def _token=(tok)
|
60
|
+
self[:token]=tok
|
61
|
+
end
|
62
|
+
|
63
|
+
# CREATE A UNIQUE ID FOR THE DOCUMENT BUT ONLY IF TOKEN IS EMPTY
|
64
|
+
def create_unique_token
|
65
|
+
self._token=SecureRandom.hex(16) if self.token.nil?
|
66
|
+
end
|
39
67
|
end
|
40
68
|
end
|
@@ -1,83 +1,110 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
3
|
describe Mongoid::Revisions do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
4
|
+
before :all do
|
5
|
+
Project.delete_all
|
6
|
+
@project = Project.create!(:name=>"My first project")
|
7
|
+
@project.milestones.create!(:description=>"First Milestone")
|
8
|
+
end
|
9
|
+
|
10
|
+
context "just created" do
|
11
|
+
it "is at revision 0" do
|
12
|
+
@project.revision.should==0
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has a default tag" do
|
16
|
+
@project.tag.should=="0.0.0"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has a unique token" do
|
20
|
+
@project.token.should_not be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it "has just 1 revision" do
|
24
|
+
@project.revisions.count.should==1
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can have a different tag" do
|
28
|
+
@project.tag_revision("Alpha Stage")
|
29
|
+
@project.tag.should=="Alpha Stage"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has a single milestone" do
|
33
|
+
@project.milestones.count==1
|
34
|
+
end
|
35
|
+
|
36
|
+
it "does not allow modification to its revision" do
|
37
|
+
@project.revision=56
|
38
|
+
@project.revision.should==0
|
39
|
+
end
|
40
|
+
|
41
|
+
it "does not allow modifications to its token" do
|
42
|
+
@project.token="ciccio"
|
43
|
+
@project.token.should_not=="ciccio"
|
44
|
+
end
|
45
|
+
end
|
31
46
|
|
32
47
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
48
|
+
describe "when I do not want a new revision" do
|
49
|
+
before :all do
|
50
|
+
@project.save
|
51
|
+
end
|
52
|
+
|
53
|
+
it "has 1 revisions" do
|
54
|
+
@project.revisions.count.should==1
|
55
|
+
end
|
56
|
+
|
57
|
+
it "it is at revision 0" do
|
58
|
+
@project.revision.should==0
|
59
|
+
end
|
60
|
+
|
61
|
+
it "has a single milestone" do
|
62
|
+
@project.milestones.count==1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "when I want a new revision" do
|
67
|
+
before :all do
|
68
|
+
@project.revise
|
69
|
+
end
|
70
|
+
|
71
|
+
it "has 2 revisions" do
|
72
|
+
@project.revisions.count.should==2
|
73
|
+
end
|
74
|
+
|
75
|
+
it "it is at revision 0" do
|
76
|
+
@project.revision.should==0
|
77
|
+
end
|
78
|
+
|
79
|
+
it "last revision is at revision 1" do
|
80
|
+
@project.revisions.last.revision.should==1
|
81
|
+
end
|
82
|
+
|
83
|
+
it "last revision has the default tag" do
|
84
|
+
@project.revisions.last.tag.should=="1.0.0"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "has 2 revisions" do
|
88
|
+
@project.revisions.count.should==2
|
89
|
+
end
|
90
|
+
|
91
|
+
it "creates a new milestone" do
|
92
|
+
Milestone.count.should==2
|
93
|
+
end
|
94
|
+
|
95
|
+
it "last revision has a single milestone" do
|
96
|
+
#puts @project.revisions.last.inspect
|
97
|
+
@project.revisions.last.milestones.count.should==1
|
70
98
|
end
|
71
99
|
end
|
72
100
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
101
|
+
describe "adding a random number of revisions" do
|
102
|
+
it "should give me the right number of revisions" do
|
103
|
+
count = rand(10)
|
104
|
+
count.times do
|
105
|
+
@project.revise
|
106
|
+
end
|
107
|
+
@project.revisions.count.should==(count+2)
|
108
|
+
end
|
109
|
+
end
|
83
110
|
end
|
metadata
CHANGED
@@ -1,57 +1,60 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_revisions
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Emiliano Della Casa
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2012-02-13 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: rspec
|
16
|
-
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
19
|
none: false
|
18
|
-
requirements:
|
20
|
+
requirements:
|
19
21
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
22
|
+
- !ruby/object:Gem::Version
|
21
23
|
version: 2.8.0
|
22
24
|
type: :development
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
26
27
|
name: mongoid
|
27
|
-
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
30
|
none: false
|
29
|
-
requirements:
|
31
|
+
requirements:
|
30
32
|
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
33
|
+
- !ruby/object:Gem::Version
|
32
34
|
version: 2.4.2
|
33
35
|
type: :development
|
34
|
-
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
37
38
|
name: bson_ext
|
38
|
-
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
41
|
none: false
|
40
|
-
requirements:
|
42
|
+
requirements:
|
41
43
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
44
|
+
- !ruby/object:Gem::Version
|
43
45
|
version: 1.5.2
|
44
46
|
type: :development
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
version of a document every time you change it and replicating all of its associations
|
49
|
-
email:
|
47
|
+
version_requirements: *id003
|
48
|
+
description: Add support for revisions to your Mongoid documents by creating a new version of a document every time you change it and replicating all of its associations
|
49
|
+
email:
|
50
50
|
- e.dellacasa@engim.eu
|
51
51
|
executables: []
|
52
|
+
|
52
53
|
extensions: []
|
54
|
+
|
53
55
|
extra_rdoc_files: []
|
54
|
-
|
56
|
+
|
57
|
+
files:
|
55
58
|
- .gitignore
|
56
59
|
- Gemfile
|
57
60
|
- README.md
|
@@ -60,34 +63,36 @@ files:
|
|
60
63
|
- lib/mongoid_revisions/version.rb
|
61
64
|
- mongoid_revisions.gemspec
|
62
65
|
- spec/.rspec
|
66
|
+
- spec/mongoid/models/milestone.rb
|
63
67
|
- spec/mongoid/models/project.rb
|
64
68
|
- spec/mongoid_revisions/revisions_spec.rb
|
65
69
|
- spec/spec_helper.rb
|
66
|
-
homepage:
|
70
|
+
homepage: ""
|
67
71
|
licenses: []
|
72
|
+
|
68
73
|
post_install_message:
|
69
74
|
rdoc_options: []
|
70
|
-
|
75
|
+
|
76
|
+
require_paths:
|
71
77
|
- lib
|
72
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
79
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version:
|
78
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
85
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version:
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
84
90
|
requirements: []
|
91
|
+
|
85
92
|
rubyforge_project: mongoid_revisions
|
86
|
-
rubygems_version: 1.8.
|
93
|
+
rubygems_version: 1.8.16
|
87
94
|
signing_key:
|
88
95
|
specification_version: 3
|
89
96
|
summary: Add support for revisions to your Mongoid documents
|
90
|
-
test_files:
|
91
|
-
|
92
|
-
- spec/mongoid_revisions/revisions_spec.rb
|
93
|
-
- spec/spec_helper.rb
|
97
|
+
test_files: []
|
98
|
+
|