mongo_mapper_acts_as_versioned 0.1.0 → 0.3.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c49bf4f793bea61d5a8867b53f06bbb9a2da305e
4
+ data.tar.gz: 22854f1a7dad3d65dc35bb97ceecab1234c18041
5
+ SHA512:
6
+ metadata.gz: 3f1066c0eedbb1eb1c3b1feb3d276c4cd0a30b69d37d7424812707aaf997413025824733e8a1be03948af062e5c686d9399a4a22dffc9f103ca275ba9360486c
7
+ data.tar.gz: f6c2ec523dfcf6caa2ae7b3d35c520937ffc104009395c3bfbc82ddf2dd7903d8a2736234149b70454579f01e3039600a800eff79e79e7be09fa5449a28a4370
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # ActsAsVersioned for [MongoMapper](http://github.com/jnunemaker/mongomapper)
1
+ # ActsAsVersioned for [MongoMapper](http://github.com/mongomapper/mongomapper)
2
2
 
3
- Basic MongoMapper port of technoweenie's [acts_as_versioned](http://github.com/technoweenie/acts_as_versioned). Stores changed attributes in a Hash key inside an Embedded Document instead of copying all keys from the original model.
3
+ Basic MongoMapper port of technoweenie's [acts_as_versioned](http://github.com/technoweenie/acts_as_versioned).
4
+ Stores changed attributes in a single collection using a general Hash key.
4
5
 
5
- *Note:* This plugin is intended for MongoMapper 0.8.6. The plugin architecture must be slightly changed for it to work on 0.9+.
6
6
 
7
7
  ## Usage
8
8
 
@@ -51,17 +51,20 @@ Default ignored keys are:
51
51
 
52
52
  ### Ignoring additional keys
53
53
 
54
- Simply add `self.non_versioned_keys << 'new_skipped_key'` somewhere in your model.
54
+ Simply add `do_not_version 'new_skipped_key', 'another_skipped_key'` somewhere in your model.
55
55
 
56
56
  ## Tested with
57
57
 
58
- * MongoMapper 0.8.3
59
- * Ruby 1.9.2
58
+ * MongoMapper 0.11.1, 0.13.1, 0.14.0
59
+ * Ruby 1.9.2 up to 2.4.0
60
60
 
61
- ## TODO
61
+ ## Older MongoMapper versions
62
62
 
63
- * Add loads more options
64
- * Properly document those options
63
+ * For MongoMapper <= 0.8.6, see the master branch of this repository.
64
+
65
+ ## Older embedded document versions
66
+
67
+ * See the next branch of this repository.
65
68
 
66
69
  ## Bundler note
67
70
 
@@ -69,4 +72,4 @@ Make sure to specify `:require => 'acts_as_versioned'` in your Gemfile.
69
72
 
70
73
  ## Copyright
71
74
 
72
- Copyright (c) 2010 Gigamo &lt;gigamo@gmail.com&gt;. See LICENSE for details.
75
+ See LICENSE.
@@ -1,133 +1,157 @@
1
+ require 'active_support/concern'
2
+ require "active_model"
3
+ if ActiveSupport.version >= Gem::Version.new("5.0.0")
4
+ begin
5
+ require "activemodel-serializers-xml"
6
+ rescue LoadError
7
+ warn "Couldn't load AM serializers. Things might break."
8
+ end
9
+ end
10
+ require "mongo_mapper"
11
+
1
12
  module MongoMapper
2
13
  module Acts
3
14
  module Versioned
4
- VERSION = '0.1.0'
5
- CALLBACKS = [:save_version, :clear_old_versions]
15
+ class DocumentVersion
16
+ include MongoMapper::Document
6
17
 
7
- def self.configure(model)
8
- model.class_eval do
9
- cattr_accessor :versioned_class_name,
10
- :non_versioned_keys, :max_version_limit
18
+ set_collection_name "document_versions"
11
19
 
12
- self.versioned_class_name = :Version
13
- self.max_version_limit = 0
14
- self.non_versioned_keys = %w[
15
- _id _type created_at updated_at
16
- creator_id updater_id version
17
- ]
20
+ key :modified, Hash
21
+ key :version, Integer
22
+ key :entity_id, ObjectId
23
+ key :entity_type, String
24
+ timestamps!
18
25
 
19
- const_set(versioned_class_name, Class.new).class_eval do
20
- include MongoMapper::EmbeddedDocument
26
+ belongs_to :entity, polymorphic: true
27
+ end
21
28
 
22
- key :version, Integer
23
- key :modified, Hash
24
- end
29
+ extend ActiveSupport::Concern
25
30
 
26
- class_name = "#{self}::#{versioned_class_name}"
27
- many :versions, :class => class_name.constantize do
28
- def [](version)
29
- detect { |doc| doc.version.to_s == version.to_s }
30
- end
31
- end
31
+ VERSION = '0.3.1'
32
+ CALLBACKS = [:save_version, :clear_old_versions]
32
33
 
33
- key :version, Integer
34
- before_save :save_version
35
- before_save :clear_old_versions
36
- end
37
- end
34
+ included do
35
+ class_attribute :non_versioned_keys, :max_version_limit
38
36
 
39
- module InstanceMethods
40
- def save_version
41
- if new_record? || save_version?
42
- self.version = next_version
37
+ self.max_version_limit = 0
38
+ self.non_versioned_keys = %w(
39
+ _id _type created_at updated_at
40
+ creator_id updater_id version
41
+ )
43
42
 
44
- rev = self.class.versioned_class.new
45
- clone_attributes(self, rev)
46
- rev.version = version
43
+ key :version, Integer
44
+ before_save :save_version
45
+ before_save :clear_old_versions
46
+ end
47
47
 
48
- self.versions << rev
49
- end
50
- end
48
+ def versions
49
+ MongoMapper::Acts::Versioned::DocumentVersion.where(
50
+ entity_type: self.class.name, entity_id: self.id
51
+ )
52
+ end
51
53
 
52
- def clear_old_versions
53
- return if self.class.max_version_limit == 0
54
- excess_bagage = version.to_i - self.class.max_version_limit
54
+ def document_version(given_version)
55
+ versions.where(version: given_version).first
56
+ end
55
57
 
56
- if excess_bagage > 0
57
- versions.reject! { |v| v.version.to_i <= excess_bagage }
58
- end
59
- end
58
+ def current_document_version
59
+ document_version(version)
60
+ end
60
61
 
61
- def revert_to(rev)
62
- if rev.is_a?(self.class.versioned_class)
63
- return false if rev.new_record?
64
- else
65
- return false unless rev = versions[rev]
66
- end
62
+ def save_version
63
+ if new_record? || save_version?
64
+ self.version = next_version
67
65
 
68
- clone_attributes(rev, self)
69
- self.version = rev.version
66
+ rev = MongoMapper::Acts::Versioned::DocumentVersion.new
67
+ rev.entity_type = self.class.name
68
+ rev.entity_id = id
69
+ rev.version = version
70
70
 
71
- true
72
- end
71
+ clone_attributes(self, rev)
73
72
 
74
- def revert_to!(rev)
75
- revert_to(rev) and save_without_revision or false
73
+ rev.save
76
74
  end
75
+ end
76
+
77
+ def clear_old_versions
78
+ return if self.class.max_version_limit == 0
79
+ excess_bagage = version.to_i - self.class.max_version_limit
77
80
 
78
- def save_without_revision
79
- save_without_revision!
80
- true
81
- rescue
82
- false
81
+ if excess_bagage > 0
82
+ versions.select { |v| v.version.to_i <= excess_bagage }.map(&:delete)
83
83
  end
84
+ end
84
85
 
85
- def save_without_revision!
86
- without_revision { save! }
86
+ def revert_to(rev)
87
+ if rev.is_a?(MongoMapper::Acts::Versioned::DocumentVersion)
88
+ return false if rev.new_record?
89
+ else
90
+ return false unless rev = document_version(rev)
87
91
  end
88
92
 
89
- def clone_attributes(orig_model, new_model)
90
- if orig_model.is_a?(self.class.versioned_class)
91
- orig_model = orig_model.modified
92
- elsif new_model.is_a?(self.class.versioned_class)
93
- new_model = new_model.modified
94
- end
93
+ clone_attributes(rev, self)
94
+ self.version = rev.version
95
95
 
96
- self.class.versioned_keys.each do |attribute|
97
- new_model[attribute] = orig_model[attribute]
98
- end
99
- end
96
+ true
97
+ end
100
98
 
101
- def save_version?
102
- (self.class.versioned_keys & changed).any?
103
- end
99
+ def revert_to!(rev)
100
+ revert_to(rev) and save_without_revision or false
101
+ end
104
102
 
105
- def without_revision(&block)
106
- self.class.without_revision(&block)
103
+ def save_without_revision
104
+ save_without_revision!
105
+ true
106
+ rescue
107
+ false
108
+ end
109
+
110
+ def save_without_revision!
111
+ without_revision { save! }
112
+ end
113
+
114
+ def clone_attributes(orig_model, new_model)
115
+ if orig_model.is_a?(MongoMapper::Acts::Versioned::DocumentVersion)
116
+ orig_model = orig_model.modified
117
+ elsif new_model.is_a?(MongoMapper::Acts::Versioned::DocumentVersion)
118
+ new_model = new_model.modified
107
119
  end
108
120
 
109
- def empty_callback
121
+ self.class.versioned_keys.each do |attribute|
122
+ new_model[attribute] = orig_model[attribute]
110
123
  end
124
+ end
125
+
126
+ def save_version?
127
+ (self.class.versioned_keys & changed).any?
128
+ end
111
129
 
112
- protected
130
+ def without_revision(&block)
131
+ self.class.without_revision(&block)
132
+ end
113
133
 
114
- def next_version
115
- new_record? || versions.empty? ?
116
- 1 : versions.map(&:version).max.next
117
- end
118
- end # InstanceMethods
134
+ def empty_callback
135
+ end
119
136
 
120
- module ClassMethods
121
- def versioned_class
122
- const_get versioned_class_name
123
- end
137
+ protected
124
138
 
139
+ def next_version
140
+ new_record? || versions.count == 0 ?
141
+ 1 : versions.fields(:version).map(&:version).max.next
142
+ end
143
+
144
+ module ClassMethods
125
145
  def versioned_keys
126
146
  keys.keys - non_versioned_keys
127
147
  end
128
148
 
129
149
  def do_not_version(*args)
130
- self.non_versioned_keys = non_versioned_keys | args
150
+ self.non_versioned_keys |= args
151
+ end
152
+
153
+ def max_versions(amount)
154
+ self.max_version_limit = amount
131
155
  end
132
156
 
133
157
  def without_revision
@@ -19,17 +19,12 @@ describe MongoMapper::Acts::Versioned do
19
19
  end
20
20
  end
21
21
 
22
- it 'should set the correct properties on the version class' do
23
- Landmark.versioned_class.should == Landmark::Version
24
- Sublandmark.versioned_class.should == Landmark::Version
25
- end
26
-
27
22
  it 'should save a versioned copy' do
28
23
  l = Landmark.create(:title => 'title')
29
- l.new_record?.should be_false
24
+ l.new_record?.should be_falsy
30
25
  l.versions.size.should == 1
31
26
  l.version.should == 1
32
- l.versions.first.should be_a(Landmark.versioned_class)
27
+ l.versions.first.should be_a(MongoMapper::Acts::Versioned::DocumentVersion)
33
28
  end
34
29
 
35
30
  it 'should clear old versions when a limit is set' do
@@ -80,7 +75,7 @@ describe MongoMapper::Acts::Versioned do
80
75
  l.versions.size.should == 10
81
76
  l.title.should == 'title10'
82
77
 
83
- l.revert_to!(7).should be_true
78
+ l.revert_to!(7).should be_truthy
84
79
  l = l.reload
85
80
  l.version.should == 7
86
81
  l.versions.size.should == 10
@@ -99,7 +94,7 @@ describe MongoMapper::Acts::Versioned do
99
94
  l.versions.size.should == 10
100
95
  l.title.should == 'title10'
101
96
 
102
- l.revert_to!(l.versions[7]).should be_true
97
+ l.revert_to!(l.document_version(7)).should be_truthy
103
98
  l = l.reload
104
99
  l.version.should == 7
105
100
  l.versions.size.should == 10
@@ -114,7 +109,7 @@ describe MongoMapper::Acts::Versioned do
114
109
  end
115
110
 
116
111
  l_version = l.reload.versions.last
117
- l_version._root_document.should == l.reload
112
+ l_version.entity.should == l.reload
118
113
  end
119
114
 
120
115
  it 'should not create new versions for skipped keys' do
@@ -157,20 +152,25 @@ describe MongoMapper::Acts::Versioned do
157
152
 
158
153
  it 'should store changes in a hash' do
159
154
  l = Landmark.create(:title => 'title')
160
- l.versions[1].modified.should == {'title' => 'title'}
155
+ l.document_version(1).modified.should == {'title' => 'title'}
161
156
 
162
157
  l.update_attributes(:title => 'changed title', :depth => 1)
163
- l.reload.versions[2].modified.should == {'title' => 'changed title'}
158
+ l.reload.document_version(2).modified.should == {'title' => 'changed title'}
159
+ end
160
+
161
+ it 'should save when a version was created' do
162
+ l = Landmark.create(:title => 'title')
163
+ l.document_version(1).created_at.should be_instance_of(Time)
164
164
  end
165
165
 
166
166
  it 'should save a versioned class with sci' do
167
167
  s = Sublandmark.create!(:title => 'first title')
168
- s.new_record?.should be_false
168
+ s.new_record?.should be_falsy
169
169
  s.version.should == 1
170
170
 
171
171
  s.versions.size.should == 1
172
- s.versions.first.should be_a(Landmark.versioned_class)
173
- s.versions.first._root_document.should == s
172
+ s.versions.first.should be_a(MongoMapper::Acts::Versioned::DocumentVersion)
173
+ s.versions.first.entity_type.should == "Sublandmark"
174
174
  end
175
175
 
176
176
  it 'should rollback with sci' do
@@ -184,7 +184,7 @@ describe MongoMapper::Acts::Versioned do
184
184
  l.version.should == 5
185
185
  l.versions.size.should == 5
186
186
  l.title.should == 'other title5'
187
- l.revert_to!(3).should be_true
187
+ l.revert_to!(3).should be_truthy
188
188
  l = l.reload
189
189
  l.version.should == 3
190
190
  l.versions.size.should == 5
@@ -201,7 +201,7 @@ describe MongoMapper::Acts::Versioned do
201
201
  s.version.should == 5
202
202
  s.versions.size.should == 5
203
203
  s.title.should == 'title5'
204
- s.revert_to!(3).should be_true
204
+ s.revert_to!(3).should be_truthy
205
205
  s = s.reload
206
206
  s.version.should == 3
207
207
  s.versions.size.should == 5
@@ -8,7 +8,7 @@ MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017)
8
8
  MongoMapper.database = 'test'
9
9
  MongoMapper.database.collections.each {|c| c.drop_indexes }
10
10
 
11
- Rspec.configure do |config|
11
+ RSpec.configure do |config|
12
12
  config.after :each do
13
13
  MongoMapper.database.collections.each do |collection|
14
14
  collection.remove unless collection.name =~ /(.*\.)?system\..*/
metadata CHANGED
@@ -1,71 +1,105 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mongo_mapper_acts_as_versioned
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Gigamo
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2011-10-28 00:00:00 +02:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: rspec
11
+ date: 2017-05-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mongo_mapper
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
18
35
  prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
20
- none: false
21
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
22
38
  - - ">="
23
- - !ruby/object:Gem::Version
24
- version: "0"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
25
48
  type: :development
26
- version_requirements: *id001
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
27
69
  description: Basic MongoMapper port of technoweenie's acts_as_versioned
28
- email:
29
- - gigamo@gmail.com
70
+ email:
71
+ - kdwinter@protonmail.com
30
72
  executables: []
31
-
32
73
  extensions: []
33
-
34
74
  extra_rdoc_files: []
35
-
36
- files:
75
+ files:
76
+ - LICENSE
77
+ - README.md
37
78
  - lib/acts_as_versioned.rb
38
79
  - spec/acts_as_versioned_spec.rb
39
80
  - spec/spec_helper.rb
40
- - LICENSE
41
- - README.md
42
- has_rdoc: true
43
81
  homepage: http://github.com/gigamo/mongo_mapper_acts_as_versioned
44
- licenses: []
45
-
82
+ licenses:
83
+ - MIT
84
+ metadata: {}
46
85
  post_install_message:
47
86
  rdoc_options: []
48
-
49
- require_paths:
87
+ require_paths:
50
88
  - lib
51
- required_ruby_version: !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
54
91
  - - ">="
55
- - !ruby/object:Gem::Version
56
- version: "0"
57
- required_rubygems_version: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
60
96
  - - ">="
61
- - !ruby/object:Gem::Version
97
+ - !ruby/object:Gem::Version
62
98
  version: 1.3.6
63
99
  requirements: []
64
-
65
100
  rubyforge_project: mongo_mapper_acts_as_versioned
66
- rubygems_version: 1.5.0
101
+ rubygems_version: 2.6.11
67
102
  signing_key:
68
- specification_version: 3
103
+ specification_version: 4
69
104
  summary: Basic MongoMapper port of technoweenie's acts_as_versioned
70
105
  test_files: []
71
-