mm-versionable 0.2.2 → 0.2.3

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/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
-