mongoid-versioning 0.2.0 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +20 -0
  3. data/CHANGELOG.md +3 -0
  4. data/Gemfile +2 -1
  5. data/README.md +2 -1
  6. data/Rakefile +3 -5
  7. data/gemfiles/mongoid_master.gemfile +8 -0
  8. data/lib/mongoid/config/locales/en.yml +11 -0
  9. data/lib/mongoid/core_ext/errors/versioning_not_on_root.rb +23 -0
  10. data/lib/mongoid/core_ext/fields/standard.rb +17 -0
  11. data/lib/mongoid/core_ext/fields/validators/macro.rb +11 -0
  12. data/lib/mongoid/core_ext/hierarchy.rb +25 -0
  13. data/lib/mongoid/core_ext/relations/bindings/embedded/many.rb +31 -0
  14. data/lib/mongoid/core_ext/relations/cascading.rb +23 -0
  15. data/lib/mongoid/core_ext/relations/embedded/batchable.rb +36 -0
  16. data/lib/mongoid/core_ext/relations/embedded/many.rb +24 -0
  17. data/lib/mongoid/core_ext/relations/macros.rb +39 -0
  18. data/lib/mongoid/core_ext/relations/metadata.rb +63 -0
  19. data/lib/mongoid/core_ext/relations/options.rb +9 -0
  20. data/lib/mongoid/core_ext/threaded/lifecycle.rb +37 -0
  21. data/lib/mongoid/core_ext/versioning.rb +218 -0
  22. data/lib/mongoid/versioning/version.rb +1 -1
  23. data/lib/mongoid/versioning.rb +16 -213
  24. data/mongoid-versioning.gemspec +2 -2
  25. data/spec/app/models/account.rb +0 -4
  26. data/spec/app/models/acolyte.rb +1 -1
  27. data/spec/app/models/address.rb +2 -2
  28. data/spec/app/models/appointment.rb +1 -1
  29. data/spec/app/models/article.rb +0 -3
  30. data/spec/app/models/building.rb +0 -2
  31. data/spec/app/models/building_address.rb +0 -2
  32. data/spec/app/models/contractor.rb +0 -2
  33. data/spec/app/models/dog.rb +1 -1
  34. data/spec/app/models/drug.rb +0 -2
  35. data/spec/app/models/event.rb +1 -1
  36. data/spec/app/models/game.rb +0 -2
  37. data/spec/app/models/house.rb +1 -2
  38. data/spec/app/models/item.rb +0 -4
  39. data/spec/app/models/name.rb +0 -2
  40. data/spec/app/models/paranoid_phone.rb +2 -0
  41. data/spec/app/models/paranoid_post.rb +3 -1
  42. data/spec/app/models/person.rb +3 -5
  43. data/spec/app/models/player.rb +2 -2
  44. data/spec/app/models/post.rb +2 -2
  45. data/spec/app/models/preference.rb +1 -1
  46. data/spec/app/models/quiz.rb +0 -3
  47. data/spec/app/models/registry.rb +1 -1
  48. data/spec/app/models/symptom.rb +1 -1
  49. data/spec/app/models/tree.rb +1 -1
  50. data/spec/app/models/video.rb +1 -5
  51. data/spec/app/models/wiki_page.rb +0 -2
  52. data/spec/config/mongoid.yml +0 -5
  53. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +29 -0
  54. data/spec/mongoid/relations/macros_spec.rb +17 -0
  55. data/spec/mongoid/relations/metadata_spec.rb +50 -0
  56. data/spec/mongoid/versioning_spec.rb +2 -36
  57. data/spec/spec_helper.rb +4 -3
  58. metadata +44 -30
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e909070135c192cc4bbdd0c62416daed6d33d837
4
+ data.tar.gz: 2481913b87525fa8e554283d395ef52f189319af
5
+ SHA512:
6
+ metadata.gz: 1528b23826c4709c66b7ea37649408040d2eb2a3f0748fb03094459a3f2f1ed887d7234822bab9310c6677122b0581913c3b17b4de04f57fe5e6cd29634e3981
7
+ data.tar.gz: fffbba7feefc13c2f2298cc23b7e935c9bbca28059705507d908449c1eb0ebcd5b3e69f79f210b571851ac7526ba38e4a3022659df9f348c76a82dea4431f1e3
data/.travis.yml ADDED
@@ -0,0 +1,20 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - ruby-head
8
+
9
+ gemfile:
10
+ - Gemfile
11
+ - gemfiles/mongoid_master.gemfile
12
+
13
+ branches:
14
+ only:
15
+ - master
16
+
17
+ matrix:
18
+ allow_failures:
19
+ - rvm: ruby-head
20
+ - gemfile: gemfiles/mongoid_master.gemfile
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ # Upcoming
2
+ * Fixes paths for Travis.
3
+
1
4
  # 0.2.0 (May 11, 2013)
2
5
  * Added info.
3
6
  * Fixed dependencies.
data/Gemfile CHANGED
@@ -1,7 +1,8 @@
1
- ruby '1.9.3'
2
1
  source 'https://rubygems.org'
3
2
 
4
3
  gemspec
5
4
 
6
5
  gem 'rspec'
7
6
  gem 'rake'
7
+
8
+ gem 'mongoid-paranoia', '1.0.0.beta1'
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # mongoid-versioning
1
+ # mongoid-versioning [![Build Status](https://travis-ci.org/haihappen/mongoid-versioning.png)](https://travis-ci.org/haihappen/mongoid-versioning)
2
+
2
3
  **Important:** This gem is an extraction of [Mongoid::Versioning](http://mongoid.org/en/mongoid/docs/extras.html#versioning) from the official [mongoid](http://mongoid.org) gem. Since Mongoid::Versioning will be removed in the upcoming `4.0.0` release of mongoid, this gem re-enables the functionality of versioned documents.
3
4
 
4
5
  **Please submit only bug and security fixes**. Neighter I will accept new features nor changes to exiting APIs. Please consider forking the project if you want new features to appear! :)
data/Rakefile CHANGED
@@ -1,7 +1,5 @@
1
- require 'rake/testtask'
1
+ require 'rspec/core/rake_task'
2
2
 
3
- Rake::TestTask.new do |t|
4
- t.test_files = FileList['spec/**/*_spec.rb']
5
- end
3
+ RSpec::Core::RakeTask.new(:spec)
6
4
 
7
- task default: :test
5
+ task default: :spec
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'mongoid', github: 'mongoid/mongoid'
6
+
7
+ gem 'rspec'
8
+ gem 'rake'
@@ -0,0 +1,11 @@
1
+ en:
2
+ mongoid:
3
+ errors:
4
+ messages:
5
+ versioning_not_on_root:
6
+ message: "Versioning not allowed on embedded document: %{klass}."
7
+ summary: "Mongoid::Versioning behaviour is only allowed on documents
8
+ that are the root document in the hierarchy."
9
+ resolution: "Remove the versioning from the embedded %{klass} or
10
+ consider moving it to a root location in the hierarchy if
11
+ versioning is needed."
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Errors
4
+
5
+ # This error is raised when attempting to version an embedded document.
6
+ class VersioningNotOnRoot < MongoidError
7
+
8
+ # Create the new error.
9
+ #
10
+ # @example Create the new error.
11
+ # VersioningNotOnRoot.new(Address)
12
+ #
13
+ # @param [ Class ] klass The embedded class.
14
+ #
15
+ # @since 3.0.0
16
+ def initialize(klass)
17
+ super(
18
+ compose_message("versioning_not_on_root", { klass: klass })
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module Mongoid
2
+ module Fields
3
+ class Standard
4
+ # Is this field included in versioned attributes?
5
+ #
6
+ # @example Is the field versioned?
7
+ # field.versioned?
8
+ #
9
+ # @return [ true, false ] If the field is included in versioning.
10
+ #
11
+ # @since 2.1.0
12
+ def versioned?
13
+ @versioned ||= (options[:versioned].nil? ? true : options[:versioned])
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ module Mongoid
2
+ module Fields
3
+ module Validators
4
+ module Macro
5
+ options = OPTIONS
6
+ send :remove_const, :OPTIONS
7
+ send :const_set, :OPTIONS, options + [:versioned]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ module Mongoid
2
+ module Hierarchy
3
+ # Collect all the children of this document.
4
+ #
5
+ # @example Collect all the children.
6
+ # document.collect_children
7
+ #
8
+ # @return [ Array<Document> ] The children.
9
+ #
10
+ # @since 2.4.0
11
+ def collect_children
12
+ children = []
13
+ embedded_relations.each_pair do |name, metadata|
14
+ without_autobuild do
15
+ child = send(name)
16
+ Array.wrap(child).each do |doc|
17
+ children.push(doc)
18
+ children.concat(doc._children) unless metadata.versioned?
19
+ end if child
20
+ end
21
+ end
22
+ children
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module Mongoid
2
+ module Relations
3
+ module Bindings
4
+ module Embedded
5
+ class Many < Binding
6
+ # Binds a single document with the inverse relation. Used
7
+ # specifically when appending to the proxy.
8
+ #
9
+ # @example Bind one document.
10
+ # person.addresses.bind_one(address)
11
+ #
12
+ # @param [ Document ] doc The single document to bind.
13
+ # @param [ Hash ] options The binding options.
14
+ #
15
+ # @option options [ true, false ] :continue Continue binding the inverse.
16
+ # @option options [ true, false ] :binding Are we in build mode?
17
+ #
18
+ # @since 2.0.0.rc.1
19
+ def bind_one(doc)
20
+ doc.parentize(base)
21
+ binding do
22
+ unless metadata.versioned?
23
+ doc.do_or_do_not(metadata.inverse_setter(target), base)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ module Mongoid
2
+ module Relations
3
+ module Cascading
4
+ # Perform all cascading deletes, destroys, or nullifies. Will delegate to
5
+ # the appropriate strategy to perform the operation.
6
+ #
7
+ # @example Execute cascades.
8
+ # document.cascade!
9
+ #
10
+ # @since 2.0.0.rc.1
11
+ def cascade!
12
+ cascades.each do |name|
13
+ if !relation_metadata || !relation_metadata.versioned?
14
+ if meta = relations[name]
15
+ strategy = meta.cascade_strategy
16
+ strategy.new(self, meta).cascade if strategy
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,36 @@
1
+ module Mongoid
2
+ module Relations
3
+ module Embedded
4
+ module Batchable
5
+ # Pre process the batch removal.
6
+ #
7
+ # @api private
8
+ #
9
+ # @example Pre process the documents.
10
+ # batchable.pre_process_batch_remove(docs, :delete)
11
+ #
12
+ # @param [ Array<Document> ] docs The documents.
13
+ # @param [ Symbol ] method Delete or destroy.
14
+ #
15
+ # @return [ Array<Hash> ] The documents as hashes.
16
+ #
17
+ # @since 3.0.0
18
+ def pre_process_batch_remove(docs, method)
19
+ docs.map do |doc|
20
+ self.path = doc.atomic_path unless path
21
+ execute_callback :before_remove, doc
22
+ if !_assigning? && !metadata.versioned?
23
+ doc.cascade!
24
+ doc.run_before_callbacks(:destroy) if method == :destroy
25
+ end
26
+ target.delete_one(doc)
27
+ _unscoped.delete_one(doc)
28
+ unbind_one(doc)
29
+ execute_callback :after_remove, doc
30
+ doc.as_document
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module Mongoid
2
+ module Relations
3
+ module Embedded
4
+ class Many < Relations::Many
5
+ class << self
6
+ # Get the valid options allowed with this relation.
7
+ #
8
+ # @example Get the valid options.
9
+ # Relation.valid_options
10
+ #
11
+ # @return [ Array<Symbol> ] The valid options.
12
+ #
13
+ # @since 2.1.0
14
+ def valid_options
15
+ [
16
+ :as, :cascade_callbacks, :cyclic, :order, :versioned, :store_as,
17
+ :before_add, :after_add, :before_remove, :after_remove
18
+ ]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,39 @@
1
+ module Mongoid
2
+ module Relations
3
+ module Macros
4
+ module ClassMethods
5
+ # Adds the relation back to the parent document. This macro is
6
+ # necessary to set the references from the child back to the parent
7
+ # document. If a child does not define this relation calling
8
+ # persistence methods on the child object will cause a save to fail.
9
+ #
10
+ # @example Define the relation.
11
+ #
12
+ # class Person
13
+ # include Mongoid::Document
14
+ # embeds_many :addresses
15
+ # end
16
+ #
17
+ # class Address
18
+ # include Mongoid::Document
19
+ # embedded_in :person
20
+ # end
21
+ #
22
+ # @param [ Symbol ] name The name of the relation.
23
+ # @param [ Hash ] options The relation options.
24
+ # @param [ Proc ] block Optional block for defining extensions.
25
+ def embedded_in(name, options = {}, &block)
26
+ if ancestors.include?(Mongoid::Versioning)
27
+ raise Errors::VersioningNotOnRoot.new(self)
28
+ end
29
+ meta = characterize(name, Embedded::In, options, &block)
30
+ self.embedded = true
31
+ relate(name, meta)
32
+ builder(name, meta).creator(name, meta)
33
+ add_counter_cache_callbacks(meta) if meta.counter_cached?
34
+ meta
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,63 @@
1
+ module Mongoid
2
+ module Relations
3
+ class Metadata < Hash
4
+ # Since a lot of the information from the metadata is inferred and not
5
+ # explicitly stored in the hash, the inspection needs to be much more
6
+ # detailed.
7
+ #
8
+ # @example Inspect the metadata.
9
+ # metadata.inspect
10
+ #
11
+ # @return [ String ] Oodles of information in a nice format.
12
+ #
13
+ # @since 2.0.0.rc.1
14
+ def inspect
15
+ %Q{#<Mongoid::Relations::Metadata
16
+ autobuild: #{autobuilding?}
17
+ class_name: #{class_name}
18
+ cyclic: #{cyclic.inspect}
19
+ counter_cache:#{counter_cached?}
20
+ dependent: #{dependent.inspect}
21
+ inverse_of: #{inverse_of.inspect}
22
+ key: #{key}
23
+ macro: #{macro}
24
+ name: #{name}
25
+ order: #{order.inspect}
26
+ polymorphic: #{polymorphic?}
27
+ relation: #{relation}
28
+ setter: #{setter}
29
+ versioned: #{versioned?}>
30
+ }
31
+ end
32
+
33
+ # Is this relation using Mongoid's internal versioning system?
34
+ #
35
+ # @example Is this relation versioned?
36
+ # metadata.versioned?
37
+ #
38
+ # @return [ true, false ] If the relation uses Mongoid versioning.
39
+ #
40
+ # @since 2.1.0
41
+ def versioned?
42
+ !!self[:versioned]
43
+ end
44
+
45
+ # Get the inverse relation candidates.
46
+ #
47
+ # @api private
48
+ #
49
+ # @example Get the inverse relation candidates.
50
+ # metadata.inverse_relation_candidates
51
+ #
52
+ # @return [ Array<Metdata> ] The candidates.
53
+ #
54
+ # @since 3.0.0
55
+ def inverse_relation_candidates
56
+ relations_metadata.select do |meta|
57
+ next if meta.versioned? || meta.name == name
58
+ meta.class_name == inverse_class_name
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,9 @@
1
+ module Mongoid
2
+ module Relations
3
+ module Options
4
+ common = COMMON
5
+ send :remove_const, :COMMON
6
+ send :const_set, :COMMON, common + [:versioned]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ module Mongoid
2
+ module Threaded
3
+ module Lifecycle
4
+ private
5
+ # Execute a block in loading revision mode.
6
+ #
7
+ # @example Execute in loading revision mode.
8
+ # _loading_revision do
9
+ # load_revision
10
+ # end
11
+ #
12
+ # @return [ Object ] The return value of the block.
13
+ #
14
+ # @since 2.3.4
15
+ def _loading_revision
16
+ Threaded.begin_execution("load_revision")
17
+ yield
18
+ ensure
19
+ Threaded.exit_execution("load_revision")
20
+ end
21
+
22
+ module ClassMethods
23
+ # Is the current thread in loading revision mode?
24
+ #
25
+ # @example Is the current thread in loading revision mode?
26
+ # proxy._loading_revision?
27
+ #
28
+ # @return [ true, false ] If the thread is loading a revision.
29
+ #
30
+ # @since 2.3.4
31
+ def _loading_revision?
32
+ Threaded.executing?("load_revision")
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,218 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+
4
+ # Include this module to get automatic versioning of root level documents.
5
+ # This will add a version field to the +Document+ and a has_many association
6
+ # with all the versions contained in it.
7
+ module Versioning
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ field :version, type: Integer, default: 1
12
+
13
+ embeds_many \
14
+ :versions,
15
+ class_name: self.name,
16
+ validate: false,
17
+ cyclic: true,
18
+ inverse_of: nil,
19
+ versioned: true
20
+
21
+ set_callback :save, :before, :revise, if: :revisable?
22
+
23
+ class_attribute :version_max
24
+ self.cyclic = true
25
+ end
26
+
27
+ # Create a new version of the +Document+. This will load the previous
28
+ # document from the database and set it as the next version before saving
29
+ # the current document. It then increments the version number. If a #max_versions
30
+ # limit is set in the model and it's exceeded, the oldest version gets discarded.
31
+ #
32
+ # @example Revise the document.
33
+ # person.revise
34
+ #
35
+ # @since 1.0.0
36
+ def revise
37
+ previous = previous_revision
38
+ if previous && versioned_attributes_changed?
39
+ new_version = versions.build(
40
+ previous.versioned_attributes
41
+ )
42
+ new_version._id = nil
43
+ if version_max.present? && versions.length > version_max
44
+ deleted = versions.first
45
+ if deleted.respond_to?(:paranoid?) && deleted.paranoid?
46
+ versions.delete_one(deleted)
47
+ collection.find(atomic_selector).
48
+ update({ "$pull" => { "versions" => { "version" => deleted.version }}})
49
+ else
50
+ versions.delete(deleted)
51
+ end
52
+ end
53
+ self.version = (version || 1 ) + 1
54
+ end
55
+ end
56
+
57
+ # Forces the creation of a new version of the +Document+, regardless of
58
+ # whether a change was actually made.
59
+ #
60
+ # @example Revise the document.
61
+ # person.revise!
62
+ #
63
+ # @since 2.2.1
64
+ def revise!
65
+ versions.build(
66
+ (previous_revision || self).versioned_attributes
67
+ )
68
+ versions.shift if version_max.present? && versions.length > version_max
69
+ self.version = (version || 1 ) + 1
70
+ save
71
+ end
72
+
73
+ # Filters the results of +changes+ by removing any fields that should
74
+ # not be versioned.
75
+ #
76
+ # @return [ Hash ] A hash of versioned changed attributes.
77
+ #
78
+ # @since 2.1.0
79
+ def versioned_changes
80
+ only_versioned_attributes(changes.except("updated_at"))
81
+ end
82
+
83
+ # Filters the results of +attributes+ by removing any fields that should
84
+ # not be versioned.
85
+ #
86
+ # @return [ Hash ] A hash of versioned attributes.
87
+ #
88
+ # @since 2.1.0
89
+ def versioned_attributes
90
+ only_versioned_attributes(attributes)
91
+ end
92
+
93
+ # Check if any versioned fields have been modified. This is similar
94
+ # to +changed?+, except this method also ignores fields set to be
95
+ # ignored by versioning.
96
+ #
97
+ # @return [ Boolean ] Whether fields that will be versioned have changed.
98
+ #
99
+ # @since 2.1.0
100
+ def versioned_attributes_changed?
101
+ !versioned_changes.empty?
102
+ end
103
+
104
+ # Executes a block that temporarily disables versioning. This is for cases
105
+ # where you do not want to version on every save.
106
+ #
107
+ # @example Execute a save without versioning.
108
+ # person.versionless(&:save)
109
+ #
110
+ # @return [ Object ] The document or result of the block execution.
111
+ #
112
+ # @since 2.0.0
113
+ def versionless
114
+ @versionless = true
115
+ result = yield(self) if block_given?
116
+ @versionless = false
117
+ result || self
118
+ end
119
+
120
+ private
121
+
122
+ # Find the previous version of this document in the database, or if the
123
+ # document had been saved without versioning return the persisted one.
124
+ #
125
+ # @example Find the last version.
126
+ # document.find_last_version
127
+ #
128
+ # @return [ Document, nil ] The previously saved document.
129
+ #
130
+ # @since 2.0.0
131
+ def previous_revision
132
+ _loading_revision do
133
+ self.class.unscoped.
134
+ with(self.mongo_session.options).
135
+ where(_id: id).
136
+ any_of({ version: version }, { version: nil }).first
137
+ end
138
+ end
139
+
140
+ # Is the document able to be revised? This is true if the document has
141
+ # changed and we have not explicitly told it not to version.
142
+ #
143
+ # @example Is the document revisable?
144
+ # document.revisable?
145
+ #
146
+ # @return [ true, false ] If the document is revisable.
147
+ #
148
+ # @since 2.0.0
149
+ def revisable?
150
+ versioned_attributes_changed? && !versionless?
151
+ end
152
+
153
+ # Are we in versionless mode? This is true if in a versionless block on the
154
+ # document.
155
+ #
156
+ # @example Is the document in versionless mode?
157
+ # document.versionless?
158
+ #
159
+ # @return [ true, false ] Is the document not currently versioning.
160
+ #
161
+ # @since 2.0.0
162
+ def versionless?
163
+ @versionless ||= false
164
+ end
165
+
166
+ # Filters fields that should not be versioned out of an attributes hash.
167
+ # Dynamic attributes are always versioned.
168
+ #
169
+ # @param [ Hash ] A hash with field names as keys.
170
+ #
171
+ # @return [ Hash ] The hash without non-versioned columns.
172
+ #
173
+ # @since 2.1.0
174
+ def only_versioned_attributes(hash)
175
+ versioned = {}
176
+ hash.except("versions").each_pair do |name, value|
177
+ add_versioned_attribute(versioned, name, value)
178
+ end
179
+ versioned
180
+ end
181
+
182
+ # Add the versioned attribute. Will work now for localized fields.
183
+ #
184
+ # @api private
185
+ #
186
+ # @example Add the versioned attribute.
187
+ # model.add_versioned_attribute({}, "name", "test")
188
+ #
189
+ # @param [ Hash ] versioned The versioned attributes.
190
+ # @param [ String ] name The name of the field.
191
+ # @param [ Object ] value The value for the field.
192
+ #
193
+ # @since 3.0.10
194
+ def add_versioned_attribute(versioned, name, value)
195
+ field = fields[name]
196
+ if field && field.localized?
197
+ versioned["#{name}_translations"] = value
198
+ else
199
+ versioned[name] = value if !field || field.versioned?
200
+ end
201
+ end
202
+
203
+ module ClassMethods
204
+
205
+ # Sets the maximum number of versions to store.
206
+ #
207
+ # @example Set the maximum.
208
+ # Person.max_versions(5)
209
+ #
210
+ # @param [ Integer ] number The maximum number to store.
211
+ #
212
+ # @return [ Integer ] The max number of versions.
213
+ def max_versions(number)
214
+ self.version_max = number.to_i
215
+ end
216
+ end
217
+ end
218
+ end
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Versioning
3
- VERSION = '0.2.0'
3
+ VERSION = '1.0.0.beta1'
4
4
  end
5
5
  end