Skip to content

Commit

Permalink
Fix versioning of localized fields.
Browse files Browse the repository at this point in the history
[ fix #2483 ]
  • Loading branch information
durran committed Oct 21, 2012
1 parent 1d36fca commit a1c77d7
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 117 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -112,6 +112,8 @@ For instructions on upgrading to newer versions, visit

* \#2485 Removing indexes now always uses strong consistency.

* \#2483 Versioning now handles localized fields. (Lawrence Curtis)

* \#2482 Store find parameters in the `DocumentNotFound` error.

* \#2481 Map/reduce aggregations now properly handle Mongo's batching of
Expand Down
24 changes: 22 additions & 2 deletions lib/mongoid/versioning.rb
Expand Up @@ -173,12 +173,32 @@ def versionless?
def only_versioned_attributes(hash)
versioned = {}
hash.except("versions").each_pair do |name, value|
field = fields[name]
versioned[name] = value if !field || field.versioned?
add_versioned_attribute(versioned, name, value)
end
versioned
end

# Add the versioned attribute. Will work now for localized fields.
#
# @api private
#
# @example Add the versioned attribute.
# model.add_versioned_attribute({}, "name", "test")
#
# @param [ Hash ] versioned The versioned attributes.
# @param [ String ] name The name of the field.
# @param [ Object ] value The value for the field.
#
# @since 3.0.10
def add_versioned_attribute(versioned, name, value)
field = fields[name]
if field && field.localized?
versioned["#{name}_translations"] = value
else
versioned[name] = value if !field || field.versioned?
end
end

module ClassMethods

# Sets the maximum number of versions to store.
Expand Down
1 change: 1 addition & 0 deletions spec/app/models/wiki_page.rb
Expand Up @@ -6,6 +6,7 @@ class WikiPage
field :title, type: String
field :transient_property, type: String, versioned: false
field :author, type: String
field :description, type: String, localize: true
max_versions 5

attr_protected :author
Expand Down
234 changes: 119 additions & 115 deletions spec/mongoid/versioning_spec.rb
Expand Up @@ -35,160 +35,160 @@
end
end

# describe "#version" do
describe "#version" do

# context "when there is no default scope" do
context "when there is no default scope" do

# context "when the document is new" do
context "when the document is new" do

# it "returns 1" do
# WikiPage.new.version.should eq(1)
# end
# end
it "returns 1" do
WikiPage.new.version.should eq(1)
end
end

# context "when the document is persisted once" do
context "when the document is persisted once" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# it "returns 1" do
# page.version.should eq(1)
# end
# end
it "returns 1" do
page.version.should eq(1)
end
end

# context "when the document is persisted more than once" do
context "when the document is persisted more than once" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# before do
# 3.times { |n| page.update_attribute(:title, "#{n}") }
# end
before do
3.times { |n| page.update_attribute(:title, "#{n}") }
end

# it "returns the number of versions" do
# page.version.should eq(4)
# end
# end
it "returns the number of versions" do
page.version.should eq(4)
end
end

# context "when maximum versions is defined" do
context "when maximum versions is defined" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# context "when saving over the max versions limit" do
context "when saving over the max versions limit" do

# before do
# 10.times { |n| page.update_attribute(:title, "#{n}") }
# end
before do
10.times { |n| page.update_attribute(:title, "#{n}") }
end

# it "returns the number of versions" do
# page.version.should eq(11)
# end
# end
# end
it "returns the number of versions" do
page.version.should eq(11)
end
end
end

# context "when performing versionless saves" do
context "when performing versionless saves" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# before do
# 10.times do |n|
# page.versionless { |doc| doc.update_attribute(:title, "#{n}") }
# end
# end
before do
10.times do |n|
page.versionless { |doc| doc.update_attribute(:title, "#{n}") }
end
end

# it "does not increment the version number" do
# page.version.should eq(1)
# end
# end
# end
it "does not increment the version number" do
page.version.should eq(1)
end
end
end

# context "when there is a default scope" do
context "when there is a default scope" do

# before :all do
# class WikiPage
# default_scope where(author: "Jim")
# end
# end
before :all do
class WikiPage
default_scope where(author: "Jim")
end
end

# after :all do
# WikiPage.default_scoping.clear
# end
after :all do
WikiPage.default_scoping = nil
end

# context "when the document is new" do
context "when the document is new" do

# it "returns 1" do
# WikiPage.new.version.should eq(1)
# end
# end
it "returns 1" do
WikiPage.new.version.should eq(1)
end
end

# context "when the document is persisted once" do
context "when the document is persisted once" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# it "returns 1" do
# page.version.should eq(1)
# end
# end
it "returns 1" do
page.version.should eq(1)
end
end

# context "when the document is persisted more than once" do
context "when the document is persisted more than once" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# before do
# 3.times { |n| page.update_attribute(:title, "#{n}") }
# end
before do
3.times { |n| page.update_attribute(:title, "#{n}") }
end

# it "returns the number of versions" do
# page.version.should eq(4)
# end
# end
it "returns the number of versions" do
page.version.should eq(4)
end
end

# context "when maximum versions is defined" do
context "when maximum versions is defined" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# context "when saving over the max versions limit" do
context "when saving over the max versions limit" do

# before do
# 10.times { |n| page.update_attribute(:title, "#{n}") }
# end
before do
10.times { |n| page.update_attribute(:title, "#{n}") }
end

# it "returns the number of versions" do
# page.version.should eq(11)
# end
# end
# end
it "returns the number of versions" do
page.version.should eq(11)
end
end
end

# context "when performing versionless saves" do
context "when performing versionless saves" do

# let(:page) do
# WikiPage.create(title: "1")
# end
let(:page) do
WikiPage.create(title: "1")
end

# before do
# 10.times do |n|
# page.versionless { |doc| doc.update_attribute(:title, "#{n}") }
# end
# end
before do
10.times do |n|
page.versionless { |doc| doc.update_attribute(:title, "#{n}") }
end
end

# it "does not increment the version number" do
# page.version.should eq(1)
# end
# end
# end
# end
it "does not increment the version number" do
page.version.should eq(1)
end
end
end
end

describe "#versionless" do

Expand Down Expand Up @@ -217,7 +217,7 @@
describe "#versions" do

let(:page) do
WikiPage.create(title: "1") do |wiki|
WikiPage.create(title: "1", description: "test") do |wiki|
wiki.author = "woodchuck"
end
end
Expand All @@ -238,6 +238,10 @@
version.title.should eq("1")
end

it "properly versions the localized fields" do
version.description.should eq("test")
end

it "only creates 1 new version" do
page.versions.count.should eq(1)
end
Expand Down

0 comments on commit a1c77d7

Please sign in to comment.