mongo_mapper_acts_as_versioned 0.1.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
-