mm-versionable 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -41,7 +41,7 @@ The following example should demonstrate how to use versioning well :
41
41
  #example :
42
42
  #thing.save :updater_id => "4cef9936f61aa33717000001"
43
43
 
44
- #Also you can now pass :updater_id to update_attrubytes
44
+ #Also you can now pass :updater_id to update_attributes
45
45
  #example :
46
46
  #thing.update_attributes(:updater_id => "4cef9936f61aa33717000001", params[:thing])
47
47
 
@@ -49,44 +49,44 @@ The following example should demonstrate how to use versioning well :
49
49
  #=> 2
50
50
 
51
51
  thing.versions
52
- #=> [#<Version _id: BSON::ObjectId('4cef96c4f61aa33621000002'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Dhruva Sagar", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 0, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>, #<Version _id: BSON::ObjectId('4cef96c4f61aa33621000003'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Change Thing", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 1, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>]
52
+ #=> [#<Version _id: BSON::ObjectId('4cef96c4f61aa33621000002'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Dhruva Sagar", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 0, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>, #<Version _id: BSON::ObjectId('4cef96c4f61aa33621000003'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Change Thing", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 1, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>]
53
53
 
54
54
  thing.all_versions
55
- #=&gt; #&lt;Plucky::Query doc_id: &quot;4cef96c4f61aa33621000001&quot;, sort: [[&quot;pos&quot;, -1]]&gt;
55
+ #=> #<Plucky::Query doc_id: "4cef96c4f61aa33621000001", sort: [["pos", -1]]>
56
56
 
57
57
  thing.rollback(:first)
58
- #=&gt; #&lt;Thing _id: BSON::ObjectId('4cef96c4f61aa33621000001'), version_message: nil, version_number: 0, name: &quot;Dhruva Sagar&quot;, date: 2010-11-26 11:15:16 UTC&gt;
58
+ #=> #<Thing _id: BSON::ObjectId('4cef96c4f61aa33621000001'), version_message: nil, version_number: 0, name: "Dhruva Sagar", date: 2010-11-26 11:15:16 UTC>
59
59
 
60
60
  thing.rollback(:last)
61
- #=&gt; #&lt;Thing _id: BSON::ObjectId('4cef96c4f61aa33621000001'), version_message: nil, version_number: 0, name: &quot;Dhruva Sagar&quot;, date: 2010-11-26 11:15:16 UTC&gt;
61
+ #=> #<Thing _id: BSON::ObjectId('4cef96c4f61aa33621000001'), version_message: nil, version_number: 0, name: "Dhruva Sagar", date: 2010-11-26 11:15:16 UTC>
62
62
 
63
63
  thing.rollback!(:latest)
64
- #=&gt; #&lt;Thing _id: BSON::ObjectId('4cef96c4f61aa33621000001'), version_message: nil, version_number: 1, name: &quot;Change Thing&quot;, date: 2010-11-26 11:15:16 UTC&gt;
64
+ #=> #<Thing _id: BSON::ObjectId('4cef96c4f61aa33621000001'), version_message: nil, version_number: 1, name: "Change Thing", date: 2010-11-26 11:15:16 UTC>
65
65
  #rollback! saves the document as well
66
66
 
67
67
  thing.diff(:name, 0, 1)
68
- #=&gt; &quot;&lt;del class=\&quot;differ\&quot;&gt;Change&lt;/del&gt;&lt;ins class=\&quot;differ\&quot;&gt;Dhruva&lt;/ins&gt; &lt;del class=\&quot;differ\&quot;&gt;Thing&lt;/del&gt;&lt;ins class=\&quot;differ\&quot;&gt;Sagar&lt;/ins&gt;&quot;
68
+ #=> "<del class=\"differ\">Change</del><ins class=\"differ\">Dhruva</ins> <del class=\"differ\">Thing</del><ins class=\"differ\">Sagar</ins>"
69
69
 
70
70
  thing.diff(:name, 0, 1, :ascii)
71
- #=&gt; &quot;{\&quot;Change\&quot; &gt;&gt; \&quot;Dhruva\&quot;} {\&quot;Thing\&quot; &gt;&gt; \&quot;Sagar\&quot;}&quot;
71
+ #=> "{\"Change\" >> \"Dhruva\"} {\"Thing\" >> \"Sagar\"}"
72
72
 
73
73
  thing.diff(:name, 0, 1, :color)
74
- #=&gt; &quot;\e[31mChange\e[0m\e[32mDhruva\e[0m \e[31mThing\e[0m\e[32mSagar\e[0m&quot;
74
+ #=> "\e[31mChange\e[0m\e[32mDhruva\e[0m \e[31mThing\e[0m\e[32mSagar\e[0m"
75
75
 
76
76
  thing.current_version
77
- #=&gt; #&lt;Version _id: BSON::ObjectId('4cf03822f61aa30fd8000004'), data: {&quot;_id&quot;=&gt;BSON::ObjectId('4cf03816f61aa30fd8000001'), &quot;version_message&quot;=&gt;nil, &quot;version_number&quot;=&gt;nil, &quot;name&quot;=&gt;&quot;Change Thing&quot;, &quot;date&quot;=&gt;2010-11-26 22:43:34 UTC}, date: 2010-11-26 22:43:46 UTC, pos: nil, doc_id: &quot;4cf03816f61aa30fd8000001&quot;, message: nil, updater_id: nil&gt;
77
+ #=> #<Version _id: BSON::ObjectId('4cf03822f61aa30fd8000004'), data: {"_id"=>BSON::ObjectId('4cf03816f61aa30fd8000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Change Thing", "date"=>2010-11-26 22:43:34 UTC}, date: 2010-11-26 22:43:46 UTC, pos: nil, doc_id: "4cf03816f61aa30fd8000001", message: nil, updater_id: nil>
78
78
 
79
79
  thing.version_at(:first)
80
- #=&gt; #&lt;Version _id: BSON::ObjectId('4cef96c4f61aa33621000002'), data: {&quot;_id&quot;=&gt;BSON::ObjectId('4cef96c4f61aa33621000001'), &quot;version_message&quot;=&gt;nil, &quot;version_number&quot;=&gt;nil, &quot;name&quot;=&gt;&quot;Dhruva Sagar&quot;, &quot;date&quot;=&gt;2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 0, doc_id: &quot;4cef96c4f61aa33621000001&quot;, message: nil, updater_id: nil&gt;
80
+ #=> #<Version _id: BSON::ObjectId('4cef96c4f61aa33621000002'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Dhruva Sagar", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 0, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>
81
81
 
82
82
  thing.version_at(:current)
83
- #=&gt; #&lt;Version _id: BSON::ObjectId('4cef986df61aa33621000004'), data: {&quot;_id&quot;=&gt;BSON::ObjectId('4cef96c4f61aa33621000001'), &quot;version_message&quot;=&gt;nil, &quot;version_number&quot;=&gt;1, &quot;name&quot;=&gt;&quot;Change Thing&quot;, &quot;date&quot;=&gt;2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:22:21 UTC, pos: nil, doc_id: &quot;4cef96c4f61aa33621000001&quot;, message: nil, updater_id: nil&gt;
83
+ #=> #<Version _id: BSON::ObjectId('4cef986df61aa33621000004'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>1, "name"=>"Change Thing", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:22:21 UTC, pos: nil, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>
84
84
 
85
85
  thing.version_at(:last)
86
- #=&gt; #&lt;Version _id: BSON::ObjectId('4cef96c4f61aa33621000002'), data: {&quot;_id&quot;=&gt;BSON::ObjectId('4cef96c4f61aa33621000001'), &quot;version_message&quot;=&gt;nil, &quot;version_number&quot;=&gt;nil, &quot;name&quot;=&gt;&quot;Dhruva Sagar&quot;, &quot;date&quot;=&gt;2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 0, doc_id: &quot;4cef96c4f61aa33621000001&quot;, message: nil, updater_id: nil&gt;
86
+ #=> #<Version _id: BSON::ObjectId('4cef96c4f61aa33621000002'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Dhruva Sagar", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 0, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>
87
87
 
88
88
  thing.version_at(:latest)
89
- #=&gt; #&lt;Version _id: BSON::ObjectId('4cef96c4f61aa33621000003'), data: {&quot;_id&quot;=&gt;BSON::ObjectId('4cef96c4f61aa33621000001'), &quot;version_message&quot;=&gt;nil, &quot;version_number&quot;=&gt;nil, &quot;name&quot;=&gt;&quot;Change Thing&quot;, &quot;date&quot;=&gt;2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 1, doc_id: &quot;4cef96c4f61aa33621000001&quot;, message: nil, updater_id: nil&gt;
89
+ #=> #<Version _id: BSON::ObjectId('4cef96c4f61aa33621000003'), data: {"_id"=>BSON::ObjectId('4cef96c4f61aa33621000001'), "version_message"=>nil, "version_number"=>nil, "name"=>"Change Thing", "date"=>2010-11-26 11:15:16 UTC}, date: 2010-11-26 11:15:16 UTC, pos: 1, doc_id: "4cef96c4f61aa33621000001", message: nil, updater_id: nil>
90
90
 
91
91
  thing.version_at(10)
92
92
  #=> nil
@@ -3,40 +3,38 @@ autoload :Version, 'versionable/models/version'
3
3
  module Versionable
4
4
  extend ActiveSupport::Concern
5
5
 
6
- module InstanceMethods
7
- def update_attributes(attrs={})
8
- updater_id = attrs.delete(:updater_id)
9
- assign(attrs)
10
- save_version(updater_id) if self.respond_to?(:rolling_back) && !rolling_back
11
- end
6
+ def update_attributes(attrs={})
7
+ updater_id = attrs.delete(:updater_id)
8
+ self.attributes = attrs
9
+ save(:updater_id => updater_id)
10
+ end
12
11
 
13
- def save(options={})
14
- save_version(options.delete(:updater_id)) if self.respond_to?(:rolling_back) && !rolling_back
15
- super
16
- end
12
+ def save(options={})
13
+ save_version(options.delete(:updater_id)) if self.respond_to?(:rolling_back) && !rolling_back
14
+ super
15
+ end
16
+
17
+ def save_version(updater_id=nil)
18
+ if self.respond_to?(:versions)
19
+ version = self.current_version
20
+ version.message = self.version_message
21
+ if self.versions.empty?
22
+ version.pos = 0
23
+ else
24
+ version.pos = self.versions.last.pos + 1
25
+ end
26
+ if self.version_at(self.version_number).try(:data) != version.data
27
+ version.updater_id = updater_id
28
+ version.save
17
29
 
18
- def save_version(updater_id=nil)
19
- if self.respond_to?(:versions)
20
- version = self.current_version
21
- version.message = self.version_message
22
- if self.versions.empty?
23
- version.pos = 0
30
+ self.versions.shift if self.versions.count >= @limit
31
+ self.versions << version
32
+ self.version_number = version.pos
33
+
34
+ if @versions_count
35
+ @versions_count = @versions_count + 1
24
36
  else
25
- version.pos = self.versions.last.pos + 1
26
- end
27
- if self.version_at(self.version_number).try(:data) != version.data
28
- version.updater_id = updater_id
29
- version.save
30
-
31
- self.versions.shift if self.versions.count >= @limit
32
- self.versions << version
33
- self.version_number = version.pos
34
-
35
- if @versions_count
36
- @versions_count = @versions_count + 1
37
- else
38
- @versions_count = Version.count(:doc_id => self._id.to_s)
39
- end
37
+ @versions_count = Version.count(:doc_id => self._id.to_s)
40
38
  end
41
39
  end
42
40
  end
@@ -76,7 +74,9 @@ module Versionable
76
74
  version = self.version_at(pos)
77
75
 
78
76
  if version
79
- self.attributes = version.data
77
+ self.attributes.keys.each do |key|
78
+ self.send(:"#{key}=", version.data[key])
79
+ end
80
80
  end
81
81
 
82
82
  self.version_number = version.pos
@@ -132,3 +132,4 @@ module Versionable
132
132
  end
133
133
  end
134
134
  end
135
+
@@ -1,3 +1,3 @@
1
1
  module Versionable
2
- VERSION = '0.2.6'
2
+ VERSION = '0.2.7'
3
3
  end
data/test/models/user.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  class User
2
2
  include MongoMapper::Document
3
3
 
4
+ attr_accessible :fname, :lname, :email
5
+
4
6
  enable_versioning :limit => 20
5
7
 
6
8
  key :fname, String
@@ -106,6 +106,13 @@ class VersioningTest < Test::Unit::TestCase
106
106
  user.reload
107
107
  assert_equal initial_version_number, user.version_number
108
108
  end
109
+ should "allow protected attributes to be changed" do
110
+ user = User.create :fname => 'Dave', :lname => 'Smiggins'
111
+ user.address = "123 Main St"
112
+ user.save
113
+ user.rollback!(:first)
114
+ assert_equal nil, user.address
115
+ end
109
116
  end
110
117
 
111
118
  context 'Versioning with update_attributes' do
@@ -115,6 +122,8 @@ class VersioningTest < Test::Unit::TestCase
115
122
  should 'create a new version for changes' do
116
123
  versions_count = @user.versions_count
117
124
  @user.update_attributes(:fname => 'Dave')
125
+ @user.reload
126
+ assert_equal @user.fname, 'Dave'
118
127
  assert_equal @user.versions_count, (versions_count + 1)
119
128
  end
120
129
  should 'not create a new version without changes' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mm-versionable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-29 00:00:00.000000000Z
12
+ date: 2012-04-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
16
- requirement: &14826060 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *14826060
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: differ
27
- requirement: &14825500 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *14825500
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: builder
38
- requirement: &14824920 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *14824920
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
- name: bson_ext
49
- requirement: &14824300 !ruby/object:Gem::Requirement
63
+ name: bson
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *14824300
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: mongo_mapper
60
- requirement: &14823660 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: 0.9.0
66
86
  type: :runtime
67
87
  prerelease: false
68
- version_requirements: *14823660
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 0.9.0
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: rake
71
- requirement: &14823140 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *14823140
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: shoulda
82
- requirement: &14822620 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *14822620
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: ruby-debug19
93
- requirement: &14822100 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,28 +133,33 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *14822100
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  description:
103
143
  email: dhruva.sagar@gmail.com
104
144
  executables: []
105
145
  extensions: []
106
146
  extra_rdoc_files: []
107
147
  files:
108
- - lib/versionable.rb
109
- - lib/versionable/version.rb
110
148
  - lib/versionable/models/version.rb
111
149
  - lib/versionable/plugins/versionable.rb
150
+ - lib/versionable/version.rb
151
+ - lib/versionable.rb
112
152
  - config.ru
113
153
  - Gemfile
114
154
  - Rakefile
115
155
  - README.md
116
156
  - test/config/config.rb
117
157
  - test/config/database.yml
118
- - test/models/user.rb
119
158
  - test/models/post.rb
120
- - test/unit/test_versioning.rb
159
+ - test/models/user.rb
121
160
  - test/performance/read_write.rb
122
161
  - test/test_helper.rb
162
+ - test/unit/test_versioning.rb
123
163
  homepage: http://github.com/dhruvasagar/mm-versionable
124
164
  licenses: []
125
165
  post_install_message:
@@ -132,23 +172,29 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
172
  - - ! '>='
133
173
  - !ruby/object:Gem::Version
134
174
  version: '0'
175
+ segments:
176
+ - 0
177
+ hash: 3591903220904652982
135
178
  required_rubygems_version: !ruby/object:Gem::Requirement
136
179
  none: false
137
180
  requirements:
138
181
  - - ! '>='
139
182
  - !ruby/object:Gem::Version
140
183
  version: '0'
184
+ segments:
185
+ - 0
186
+ hash: 3591903220904652982
141
187
  requirements: []
142
188
  rubyforge_project:
143
- rubygems_version: 1.8.6
189
+ rubygems_version: 1.8.21
144
190
  signing_key:
145
191
  specification_version: 3
146
192
  summary: A MongoMapper extension adding Versioning
147
193
  test_files:
148
194
  - test/config/config.rb
149
195
  - test/config/database.yml
150
- - test/models/user.rb
151
196
  - test/models/post.rb
152
- - test/unit/test_versioning.rb
197
+ - test/models/user.rb
153
198
  - test/performance/read_write.rb
154
199
  - test/test_helper.rb
200
+ - test/unit/test_versioning.rb