mm-versionable 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
- require 'jeweler'
4
3
 
5
4
  require File.join(File.dirname(__FILE__), '/lib/versionable/version')
6
5
 
@@ -23,17 +22,14 @@ end
23
22
 
24
23
  task :default => 'test:units'
25
24
 
26
- Jeweler::Tasks.new do |gem|
27
- gem.name = 'mm-versionable'
28
- gem.summary = 'A MongoMapper extension for document versioning'
29
- gem.description = 'A MongoMapper extension that enables document versionable'
30
- gem.email = 'dhruva.sagar@gmail.com'
31
- gem.homepage = 'https://github.com/artha42/mm-versionable/'
32
- gem.authors = ['Dhruva Sagar']
33
- gem.version = Versionable::Version
34
-
35
- gem.add_dependency('differ')
36
- gem.add_dependency('mongo_mapper')
25
+ desc 'Builds the gem'
26
+ task :build do
27
+ sh 'gem build mm-versionable.gemspec'
28
+ Dir.mkdir('pkg') unless File.directory?('pkg')
29
+ sh "mv mm-versionable-#{Versionable::Version}.gem pkg/mm-versionable-#{Versionable::Version}.gem"
37
30
  end
38
31
 
39
- Jeweler::GemcutterTasks.new
32
+ desc 'Builds and Installs the gem'
33
+ task :install => :build do
34
+ sh "gem install pkg/mm-versionable-#{Versionable::Version}.gem"
35
+ end
@@ -1,38 +1,43 @@
1
1
  require 'versionable/models/version'
2
2
 
3
3
  module Versionable
4
+ extend ActiveSupport::Concern
5
+
4
6
  module InstanceMethods
7
+ # Save new versions but only if the data changes
5
8
  def save(options={})
6
9
  save_version(options.delete(:updater_id)) if self.respond_to?(:rolling_back) && !rolling_back
7
10
  super
8
11
  end
9
12
 
10
- private
11
- def save_version(updater_id=nil)
12
- if self.respond_to?(:versions)
13
- version = self.current_version
14
- version.message = self.version_message
15
- if self.versions.empty?
16
- version.pos = 0
17
- else
18
- version.pos = self.versions.last.pos + 1
19
- end
13
+ def save_version(updater_id=nil)
14
+ if self.respond_to?(:versions)
15
+ version = self.current_version
16
+ version.message = self.version_message
17
+ if self.versions.empty?
18
+ version.pos = 0
19
+ else
20
+ version.pos = self.versions.last.pos + 1
21
+ end
22
+ if self.version_at(self.version_number).try(:data) != version.data
20
23
  version.updater_id = updater_id
21
24
  version.save
22
25
 
23
26
  self.versions.shift if self.versions.count >= @limit
24
27
  self.versions << version
28
+ self.version_number = version.pos
25
29
 
26
30
  @versions_count = @versions_count.to_i + 1
27
31
  end
28
32
  end
33
+ end
29
34
  end
30
35
 
31
36
  module ClassMethods
32
37
  def enable_versioning(opts={})
33
38
  attr_accessor :rolling_back
34
39
 
35
- key :version_number, Integer
40
+ key :version_number, Integer, :default => 0
36
41
 
37
42
  define_method(:version_message) do
38
43
  @version_message
@@ -55,7 +60,8 @@ module Versionable
55
60
  Version.where(:doc_id => self._id.to_s).sort(:pos.desc)
56
61
  end
57
62
 
58
- define_method(:rollback) do |pos = nil|
63
+ define_method(:rollback) do |*args|
64
+ pos = args.first #workaround for optional args in ruby1.8
59
65
  #The last version is always same as the current version, so -2 instead of -1
60
66
  pos = self.versions.count-2 if pos.nil?
61
67
  version = self.version_at(pos)
@@ -67,8 +73,9 @@ module Versionable
67
73
  self.version_number = version.pos
68
74
  self
69
75
  end
70
-
71
- define_method(:rollback!) do |pos = nil|
76
+
77
+ define_method(:rollback!) do |*args|
78
+ pos = args.first #workaround for optional args in ruby1.8
72
79
  self.rollback(pos)
73
80
 
74
81
  @rolling_back = true
@@ -78,7 +85,8 @@ module Versionable
78
85
  self
79
86
  end
80
87
 
81
- define_method(:diff) do |key, pos1, pos2, format = :html|
88
+ define_method(:diff) do |key, pos1, pos2, *optional_format|
89
+ format = optional_format.first || :html #workaround for optional args in ruby1.8
82
90
  version1 = self.version_at(pos1)
83
91
  version2 = self.version_at(pos2)
84
92
 
@@ -86,7 +94,9 @@ module Versionable
86
94
  end
87
95
 
88
96
  define_method(:current_version) do
89
- Version.new(:data => self.attributes, :date => Time.now, :doc_id => self._id.to_s)
97
+ data = self.attributes
98
+ data.delete(:version_number)
99
+ Version.new(:data => data, :date => Time.now, :doc_id => self._id.to_s)
90
100
  end
91
101
 
92
102
  define_method(:version_at) do |pos|
@@ -107,7 +117,7 @@ module Versionable
107
117
  index = self.versions.index {|v| v.pos == pos}
108
118
  version = self.versions[index] if index
109
119
  version ||= Version.first(:user_id => self._id.to_s, :pos => pos)
110
- version
120
+ version
111
121
  end
112
122
  end
113
123
  end
@@ -1,3 +1,3 @@
1
1
  module Versionable
2
- Version = '0.2.2'
2
+ Version = '0.2.3'
3
3
  end
data/lib/versionable.rb CHANGED
@@ -2,10 +2,4 @@ require 'differ'
2
2
  require 'mongo_mapper'
3
3
  require 'versionable/plugins/versionable'
4
4
 
5
- module VersionablePlugin
6
- def self.included(model)
7
- model.plugin Versionable
8
- end
9
- end
10
-
11
- MongoMapper::Document.append_inclusions(VersionablePlugin)
5
+ MongoMapper::Document.plugin(Versionable)
@@ -35,6 +35,9 @@ class VersioningTest < Test::Unit::TestCase
35
35
  should 'respond to method version_at' do
36
36
  assert @user.respond_to?(:version_at)
37
37
  end
38
+ should 'respond to method save_version' do
39
+ assert @user.respond_to?(:save_version)
40
+ end
38
41
  end
39
42
 
40
43
  context 'Version manipulations' do
@@ -77,11 +80,32 @@ class VersioningTest < Test::Unit::TestCase
77
80
  assert @user.posts.empty?
78
81
  assert @user.version_number == (@user.versions_count - 2)
79
82
  end
83
+ should 'revert to last version on rollback! without args' do
84
+ @user.rollback!
85
+ assert @user.fname == 'Dhruva'
86
+ assert @user.posts.empty?
87
+ assert @user.version_number == (@user.versions_count - 2)
88
+ end
89
+ should 'only create a new version when the data changes' do
90
+ versions_count = @user.versions_count
91
+ @user.save
92
+ assert_equal versions_count, @user.versions_count
93
+ end
80
94
  should 'revert to latest version on rollback!' do
81
95
  @user.rollback!(:latest)
82
96
  assert @user.fname == 'Dhruva'
83
97
  assert !@user.posts.empty?
84
98
  assert @user.version_number == (@user.versions_count - 1)
85
99
  end
100
+ should 'create a new version without saving' do
101
+ user = User.create :fname => 'Dave', :lname => 'Smiggins'
102
+ initial_version_number = user.version_number
103
+ user.fname = 'Steve'
104
+ user.save_version
105
+ assert_equal user.version_number, user.versions.last.pos
106
+ user.reload
107
+ assert_equal initial_version_number, user.version_number
108
+ end
109
+
86
110
  end
87
111
  end
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mm-versionable
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 2
8
- - 2
9
- version: 0.2.2
4
+ prerelease:
5
+ version: 0.2.3
10
6
  platform: ruby
11
7
  authors:
12
8
  - Dhruva Sagar
@@ -14,63 +10,123 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-01-18 00:00:00 +05:30
13
+ date: 2011-06-04 00:00:00 +05:30
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
21
- name: differ
17
+ name: i18n
22
18
  prerelease: false
23
19
  requirement: &id001 !ruby/object:Gem::Requirement
24
20
  none: false
25
21
  requirements:
26
22
  - - ">="
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
24
  version: "0"
31
25
  type: :runtime
32
26
  version_requirements: *id001
33
27
  - !ruby/object:Gem::Dependency
34
- name: mongo_mapper
28
+ name: differ
35
29
  prerelease: false
36
30
  requirement: &id002 !ruby/object:Gem::Requirement
37
31
  none: false
38
32
  requirements:
39
33
  - - ">="
40
34
  - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
35
  version: "0"
44
36
  type: :runtime
45
37
  version_requirements: *id002
46
- description: A MongoMapper extension that enables document versionable
38
+ - !ruby/object:Gem::Dependency
39
+ name: builder
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: bson_ext
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: mongo_mapper
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ type: :runtime
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rake
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ type: :development
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: shoulda
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ type: :development
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: ruby-debug19
95
+ prerelease: false
96
+ requirement: &id008 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: "0"
102
+ type: :development
103
+ version_requirements: *id008
104
+ description:
47
105
  email: dhruva.sagar@gmail.com
48
106
  executables: []
49
107
 
50
108
  extensions: []
51
109
 
52
- extra_rdoc_files:
53
- - LICENSE
54
- - README.md
110
+ extra_rdoc_files: []
111
+
55
112
  files:
56
- - LICENSE
57
- - README.md
58
- - Rakefile
59
- - config.ru
60
113
  - lib/versionable.rb
61
114
  - lib/versionable/models/version.rb
62
115
  - lib/versionable/plugins/versionable.rb
63
116
  - lib/versionable/version.rb
64
- - mm-versionable.gemspec
65
- - test/config/config.rb
66
- - test/config/database.yml
67
- - test/models/post.rb
117
+ - config.ru
118
+ - Gemfile
119
+ - Rakefile
120
+ - README.md
121
+ - test/unit/test_versioning.rb
68
122
  - test/models/user.rb
123
+ - test/models/post.rb
69
124
  - test/performance/read_write.rb
125
+ - test/config/database.yml
126
+ - test/config/config.rb
70
127
  - test/test_helper.rb
71
- - test/unit/test_versioning.rb
72
128
  has_rdoc: true
73
- homepage: https://github.com/artha42/mm-versionable/
129
+ homepage: http://github.com/dhruvasagar/mm-versionable
74
130
  licenses: []
75
131
 
76
132
  post_install_message:
@@ -83,28 +139,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
139
  requirements:
84
140
  - - ">="
85
141
  - !ruby/object:Gem::Version
86
- segments:
87
- - 0
88
142
  version: "0"
89
143
  required_rubygems_version: !ruby/object:Gem::Requirement
90
144
  none: false
91
145
  requirements:
92
146
  - - ">="
93
147
  - !ruby/object:Gem::Version
94
- segments:
95
- - 0
96
148
  version: "0"
97
149
  requirements: []
98
150
 
99
151
  rubyforge_project:
100
- rubygems_version: 1.3.7
152
+ rubygems_version: 1.6.2
101
153
  signing_key:
102
154
  specification_version: 3
103
- summary: A MongoMapper extension for document versioning
155
+ summary: A MongoMapper extension adding Versioning
104
156
  test_files:
105
- - test/config/config.rb
106
- - test/models/post.rb
157
+ - test/unit/test_versioning.rb
107
158
  - test/models/user.rb
159
+ - test/models/post.rb
108
160
  - test/performance/read_write.rb
161
+ - test/config/database.yml
162
+ - test/config/config.rb
109
163
  - test/test_helper.rb
110
- - test/unit/test_versioning.rb
data/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- Copyright (c) 2010 Dhruva Sagar
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,66 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{mm-versionable}
8
- s.version = "0.2.2"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Dhruva Sagar"]
12
- s.date = %q{2011-01-18}
13
- s.description = %q{A MongoMapper extension that enables document versionable}
14
- s.email = %q{dhruva.sagar@gmail.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.md"
18
- ]
19
- s.files = [
20
- "LICENSE",
21
- "README.md",
22
- "Rakefile",
23
- "config.ru",
24
- "lib/versionable.rb",
25
- "lib/versionable/models/version.rb",
26
- "lib/versionable/plugins/versionable.rb",
27
- "lib/versionable/version.rb",
28
- "mm-versionable.gemspec",
29
- "test/config/config.rb",
30
- "test/config/database.yml",
31
- "test/models/post.rb",
32
- "test/models/user.rb",
33
- "test/performance/read_write.rb",
34
- "test/test_helper.rb",
35
- "test/unit/test_versioning.rb"
36
- ]
37
- s.homepage = %q{https://github.com/artha42/mm-versionable/}
38
- s.require_paths = ["lib"]
39
- s.rubygems_version = %q{1.3.7}
40
- s.summary = %q{A MongoMapper extension for document versioning}
41
- s.test_files = [
42
- "test/config/config.rb",
43
- "test/models/post.rb",
44
- "test/models/user.rb",
45
- "test/performance/read_write.rb",
46
- "test/test_helper.rb",
47
- "test/unit/test_versioning.rb"
48
- ]
49
-
50
- if s.respond_to? :specification_version then
51
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
- s.specification_version = 3
53
-
54
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
- s.add_runtime_dependency(%q<differ>, [">= 0"])
56
- s.add_runtime_dependency(%q<mongo_mapper>, [">= 0"])
57
- else
58
- s.add_dependency(%q<differ>, [">= 0"])
59
- s.add_dependency(%q<mongo_mapper>, [">= 0"])
60
- end
61
- else
62
- s.add_dependency(%q<differ>, [">= 0"])
63
- s.add_dependency(%q<mongo_mapper>, [">= 0"])
64
- end
65
- end
66
-