mm-versioning 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Binary file
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :rubygems
2
+ gem "bson_ext", "~> 1.3.1"
3
+ gem "mongo_mapper", "~> 0.9.1"
4
+ group :test do
5
+ gem "rspec"
6
+ gem "timecop"
7
+ end
@@ -0,0 +1,39 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activemodel (3.0.9)
5
+ activesupport (= 3.0.9)
6
+ builder (~> 2.1.2)
7
+ i18n (~> 0.5.0)
8
+ activesupport (3.0.9)
9
+ bson (1.3.1)
10
+ bson_ext (1.3.1)
11
+ builder (2.1.2)
12
+ diff-lcs (1.1.2)
13
+ i18n (0.5.0)
14
+ mongo (1.3.1)
15
+ bson (>= 1.3.1)
16
+ mongo_mapper (0.9.1)
17
+ activemodel (~> 3.0)
18
+ activesupport (~> 3.0)
19
+ plucky (~> 0.3.8)
20
+ plucky (0.3.8)
21
+ mongo (~> 1.3)
22
+ rspec (2.6.0)
23
+ rspec-core (~> 2.6.0)
24
+ rspec-expectations (~> 2.6.0)
25
+ rspec-mocks (~> 2.6.0)
26
+ rspec-core (2.6.4)
27
+ rspec-expectations (2.6.0)
28
+ diff-lcs (~> 1.1.2)
29
+ rspec-mocks (2.6.0)
30
+ timecop (0.3.5)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ bson_ext (~> 1.3.1)
37
+ mongo_mapper (~> 0.9.1)
38
+ rspec
39
+ timecop
@@ -0,0 +1,32 @@
1
+ mm-versioning
2
+ =============
3
+
4
+ Simple versioning for MongoMapper with proper specs.
5
+
6
+ Basic Usage
7
+ -----------
8
+
9
+ ```ruby
10
+ class Versioned do
11
+ include MongoMapper::Document
12
+ include MongoMapper::Plugins::Versioning
13
+ key :title
14
+ versioning
15
+ end
16
+ v = Versioned.new :title => "Alpha"
17
+ v.save!
18
+ v.versions.size # -> 1
19
+ v.update_attribute :title, "Beta"
20
+ v.versions.size # -> 2
21
+ v.versions.first.original.title # -> "Alpha"
22
+ ```
23
+
24
+ Advanced Usage
25
+ --------------
26
+
27
+ See specs.
28
+
29
+ Licence
30
+ -------
31
+
32
+ This gem is released under MIT Licence.
@@ -0,0 +1,7 @@
1
+ require "bundler"
2
+ require "rspec/core/rake_task"
3
+ Bundler::GemHelper.install_tasks
4
+ RSpec::Core::RakeTask.new("spec").tap do |config|
5
+ config.rspec_opts = "--color"
6
+ end
7
+ task :default => :spec
@@ -0,0 +1,52 @@
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Versioning
5
+ extend ActiveSupport::Concern
6
+
7
+ class Version
8
+ include ::MongoMapper::Document
9
+ key :data, Hash
10
+ key :original_class_name, String
11
+ key :versioned_at, Time
12
+ before_create :set_versioned_at
13
+ def original
14
+ original_class_name.constantize.from_mongo data
15
+ end
16
+ private
17
+ def set_versioned_at
18
+ self.versioned_at = Time.current.utc
19
+ end
20
+ end
21
+
22
+ module ClassMethods
23
+ def versioning(scheme=:simple, opts={})
24
+ case scheme
25
+ when :simple
26
+ after_save :version_simple_save
27
+ else
28
+ raise ArgumentError, "unknown versioning scheme #{scheme.inspect}"
29
+ end
30
+ @version_class = opts[:class_name].constantize if opts[:class_name]
31
+ end
32
+
33
+ def version_class
34
+ @version_class ||= ::MongoMapper::Plugins::Versioning::Version
35
+ end
36
+ end
37
+
38
+ module InstanceMethods
39
+ def version_simple_save
40
+ version = self.class.version_class.new :data => attributes.dup
41
+ version.original_class_name = self.class.name
42
+ version.versioned_at = Time.current.utc
43
+ version.save
44
+ end
45
+
46
+ def versions
47
+ self.class.version_class.where("data._id" => id, :original_class_name => self.class.name).order :versioned_at.asc
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,7 @@
1
+ module MongoMapper
2
+ module Plugins
3
+ module Versioning
4
+ VERSION = "0.0.2"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,100 @@
1
+ MongoDB logging. Please note that logging negatively impacts performance and should be disabled for high-performance production apps.
2
+ MONGODB admin['$cmd'].find({:ismaster=>1})
3
+ MONGODB admin['$cmd'].find({:ismaster=>1})
4
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400994dcf5f90d76000001')}, {"_id"=>BSON::ObjectId('4e400994dcf5f90d76000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:06:44 UTC, "updated_at"=>2011-08-08 16:06:44 UTC})
5
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400994dcf5f90d76000003')}, {"_id"=>BSON::ObjectId('4e400994dcf5f90d76000003'), "data"=>{"_id"=>BSON::ObjectId('4e400994dcf5f90d76000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:06:44 UTC, "updated_at"=>2011-08-08 16:06:44 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2011-08-08 16:06:44 UTC})
6
+ MONGODB mm-versioning['$cmd'].find({"count"=>"mongo_mapper.plugins.versioning.versions", "query"=>{:"data._id"=>BSON::ObjectId('4e400994dcf5f90d76000001'), :original_class_name=>"Versioned"}, "fields"=>nil})
7
+ MONGODB mm-versioning['system.namespaces'].find({})
8
+ MONGODB mm-versioning['versioneds'].remove({})
9
+ MONGODB mm-versioning['system.indexes'].remove({})
10
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
11
+ MONGODB mm-versioning['system.namespaces'].find({})
12
+ MONGODB mm-versioning['versioneds'].remove({})
13
+ MONGODB mm-versioning['system.indexes'].remove({})
14
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
15
+ MONGODB mm-versioning['system.namespaces'].find({})
16
+ MONGODB mm-versioning['versioneds'].remove({})
17
+ MONGODB mm-versioning['system.indexes'].remove({})
18
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
19
+ MongoDB logging. Please note that logging negatively impacts performance and should be disabled for high-performance production apps.
20
+ MONGODB admin['$cmd'].find({:ismaster=>1})
21
+ MONGODB admin['$cmd'].find({:ismaster=>1})
22
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e4009ebdcf5f90dcf000001')}, {"_id"=>BSON::ObjectId('4e4009ebdcf5f90dcf000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:08:11 UTC, "updated_at"=>2011-08-08 16:08:11 UTC})
23
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e4009ebdcf5f90dcf000003')}, {"_id"=>BSON::ObjectId('4e4009ebdcf5f90dcf000003'), "data"=>{"_id"=>BSON::ObjectId('4e4009ebdcf5f90dcf000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:08:11 UTC, "updated_at"=>2011-08-08 16:08:11 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2011-08-08 16:08:11 UTC})
24
+ MONGODB mm-versioning['$cmd'].find({"count"=>"mongo_mapper.plugins.versioning.versions", "query"=>{:"data._id"=>BSON::ObjectId('4e4009ebdcf5f90dcf000001'), :original_class_name=>"Versioned"}, "fields"=>nil})
25
+ MONGODB mm-versioning['system.namespaces'].find({})
26
+ MONGODB mm-versioning['versioneds'].remove({})
27
+ MONGODB mm-versioning['system.indexes'].remove({})
28
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
29
+ MONGODB mm-versioning['system.namespaces'].find({})
30
+ MONGODB mm-versioning['versioneds'].remove({})
31
+ MONGODB mm-versioning['system.indexes'].remove({})
32
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
33
+ MONGODB mm-versioning['system.namespaces'].find({})
34
+ MONGODB mm-versioning['versioneds'].remove({})
35
+ MONGODB mm-versioning['system.indexes'].remove({})
36
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
37
+ MongoDB logging. Please note that logging negatively impacts performance and should be disabled for high-performance production apps.
38
+ MONGODB admin['$cmd'].find({:ismaster=>1})
39
+ MONGODB admin['$cmd'].find({:ismaster=>1})
40
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000001')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:08:38 UTC, "updated_at"=>2011-08-08 16:08:38 UTC})
41
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000003')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000003'), "data"=>{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:08:38 UTC, "updated_at"=>2011-08-08 16:08:38 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2011-08-08 16:08:38 UTC})
42
+ MONGODB mm-versioning['$cmd'].find({"count"=>"mongo_mapper.plugins.versioning.versions", "query"=>{:"data._id"=>BSON::ObjectId('4e400a06dcf5f90de7000001'), :original_class_name=>"Versioned"}, "fields"=>nil})
43
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000001')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000001'), "title"=>"Beta", "items"=>[], "created_at"=>2011-08-08 16:08:38 UTC, "updated_at"=>2011-08-08 16:08:38 UTC})
44
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000005')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000005'), "data"=>{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000001'), "title"=>"Beta", "items"=>[], "created_at"=>2011-08-08 16:08:38 UTC, "updated_at"=>2011-08-08 16:08:38 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2011-08-08 16:08:38 UTC})
45
+ MONGODB mm-versioning['$cmd'].find({"count"=>"mongo_mapper.plugins.versioning.versions", "query"=>{:"data._id"=>BSON::ObjectId('4e400a06dcf5f90de7000001'), :original_class_name=>"Versioned"}, "fields"=>nil})
46
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].find({:"data._id"=>BSON::ObjectId('4e400a06dcf5f90de7000001'), :original_class_name=>"Versioned"}).sort([["versioned_at", 1]])
47
+ MONGODB mm-versioning['system.namespaces'].find({})
48
+ MONGODB mm-versioning['versioneds'].remove({})
49
+ MONGODB mm-versioning['system.indexes'].remove({})
50
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
51
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000009')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC})
52
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de700000c')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000c'), "data"=>{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-30 23:00:00 UTC})
53
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000009')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000b')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000e')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC})
54
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de700000f')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000f'), "data"=>{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000b')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de700000e')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-31 23:00:00 UTC})
55
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].find({:"data._id"=>BSON::ObjectId('4e400a06dcf5f90de7000009'), :original_class_name=>"Versioned"}).sort([["versioned_at", 1]])
56
+ MONGODB mm-versioning['system.namespaces'].find({})
57
+ MONGODB mm-versioning['versioneds'].remove({})
58
+ MONGODB mm-versioning['system.indexes'].remove({})
59
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
60
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000016')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000018')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC})
61
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000019')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000019'), "data"=>{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000018')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-30 23:00:00 UTC})
62
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de7000016')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000018')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de700001b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC})
63
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a06dcf5f90de700001c')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de700001c'), "data"=>{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a06dcf5f90de7000018')}, {"_id"=>BSON::ObjectId('4e400a06dcf5f90de700001b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-31 23:00:00 UTC})
64
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].find({:"data._id"=>BSON::ObjectId('4e400a06dcf5f90de7000016'), :original_class_name=>"Versioned", :versioned_at=>{"$lte"=>2010-01-30 23:00:00 UTC}}).sort([["versioned_at", 1]])
65
+ MONGODB mm-versioning['system.namespaces'].find({})
66
+ MONGODB mm-versioning['versioneds'].remove({})
67
+ MONGODB mm-versioning['system.indexes'].remove({})
68
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
69
+ MongoDB logging. Please note that logging negatively impacts performance and should be disabled for high-performance production apps.
70
+ MONGODB admin['$cmd'].find({:ismaster=>1})
71
+ MONGODB admin['$cmd'].find({:ismaster=>1})
72
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000001')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:09:15 UTC, "updated_at"=>2011-08-08 16:09:15 UTC})
73
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000003')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000003'), "data"=>{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000001'), "title"=>"Alpha", "items"=>[], "created_at"=>2011-08-08 16:09:15 UTC, "updated_at"=>2011-08-08 16:09:15 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2011-08-08 16:09:15 UTC})
74
+ MONGODB mm-versioning['$cmd'].find({"count"=>"mongo_mapper.plugins.versioning.versions", "query"=>{:"data._id"=>BSON::ObjectId('4e400a2bdcf5f90e00000001'), :original_class_name=>"Versioned"}, "fields"=>nil})
75
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000001')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000001'), "title"=>"Beta", "items"=>[], "created_at"=>2011-08-08 16:09:15 UTC, "updated_at"=>2011-08-08 16:09:15 UTC})
76
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000005')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000005'), "data"=>{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000001'), "title"=>"Beta", "items"=>[], "created_at"=>2011-08-08 16:09:15 UTC, "updated_at"=>2011-08-08 16:09:15 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2011-08-08 16:09:15 UTC})
77
+ MONGODB mm-versioning['$cmd'].find({"count"=>"mongo_mapper.plugins.versioning.versions", "query"=>{:"data._id"=>BSON::ObjectId('4e400a2bdcf5f90e00000001'), :original_class_name=>"Versioned"}, "fields"=>nil})
78
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].find({:"data._id"=>BSON::ObjectId('4e400a2bdcf5f90e00000001'), :original_class_name=>"Versioned"}).sort([["versioned_at", 1]])
79
+ MONGODB mm-versioning['system.namespaces'].find({})
80
+ MONGODB mm-versioning['versioneds'].remove({})
81
+ MONGODB mm-versioning['system.indexes'].remove({})
82
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
83
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000009')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC})
84
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e0000000c')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000c'), "data"=>{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-30 23:00:00 UTC})
85
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000009')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000b')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000e')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC})
86
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e0000000f')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000f'), "data"=>{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000009'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000b')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000000e')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-31 23:00:00 UTC})
87
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].find({:"data._id"=>BSON::ObjectId('4e400a2bdcf5f90e00000009'), :original_class_name=>"Versioned"}).sort([["versioned_at", 1]])
88
+ MONGODB mm-versioning['system.namespaces'].find({})
89
+ MONGODB mm-versioning['versioneds'].remove({})
90
+ MONGODB mm-versioning['system.indexes'].remove({})
91
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
92
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000016')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000018')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC})
93
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000019')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000019'), "data"=>{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000018')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-30 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-30 23:00:00 UTC})
94
+ MONGODB mm-versioning['versioneds'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e00000016')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000018')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000001b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC})
95
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].update({:_id=>BSON::ObjectId('4e400a2bdcf5f90e0000001c')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000001c'), "data"=>{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000016'), "title"=>"Beta", "items"=>[{"_id"=>BSON::ObjectId('4e400a2bdcf5f90e00000018')}, {"_id"=>BSON::ObjectId('4e400a2bdcf5f90e0000001b')}], "created_at"=>2010-01-30 23:00:00 UTC, "updated_at"=>2010-01-31 23:00:00 UTC}, "original_class_name"=>"Versioned", "versioned_at"=>2010-01-31 23:00:00 UTC})
96
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].find({:"data._id"=>BSON::ObjectId('4e400a2bdcf5f90e00000016'), :original_class_name=>"Versioned", :versioned_at=>{"$lte"=>2010-01-30 23:00:00 UTC}}).sort([["versioned_at", 1]])
97
+ MONGODB mm-versioning['system.namespaces'].find({})
98
+ MONGODB mm-versioning['versioneds'].remove({})
99
+ MONGODB mm-versioning['system.indexes'].remove({})
100
+ MONGODB mm-versioning['mongo_mapper.plugins.versioning.versions'].remove({})
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "mongo_mapper/plugins/versioning/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mm-versioning"
7
+ s.version = MongoMapper::Plugins::Versioning::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Joseph HALTER", "Jonathan TRON"]
10
+ s.email = ["team@openhood.com"]
11
+ s.homepage = "http://github.com/openhood/mm-versioning"
12
+ s.summary = "Simple versioning for MongoMapper with proper specs"
13
+ s.description = "Simple versioning for MongoMapper with proper specs"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+ end
@@ -0,0 +1,16 @@
1
+ ENV["RACK_ENV"] = "test"
2
+ require "bundler/setup"
3
+ Bundler.require :default, :test
4
+
5
+ require "mongo_mapper/plugins/versioning"
6
+
7
+ dir = File.expand_path("../../log", __FILE__)
8
+ Dir.mkdir dir unless File.directory? dir
9
+ file = File.new("#{dir}/test.log", "a")
10
+ file.sync = true
11
+ config = {"test" => {"uri" => "mongodb://localhost/mm-versioning"}}
12
+ MongoMapper.setup config, "test", {:logger => Logger.new(file)}
13
+
14
+ RSpec.configure do |config|
15
+ config.after{ MongoMapper.database.collections.each(&:remove) }
16
+ end
@@ -0,0 +1,56 @@
1
+ require "spec_helper"
2
+
3
+ class VersionedItem
4
+ include MongoMapper::EmbeddedDocument
5
+ end
6
+ class Versioned
7
+ include MongoMapper::Document
8
+ include MongoMapper::Plugins::Versioning
9
+ key :title
10
+ key :items, Array, :typecast => "VersionedItem", :default => []
11
+ timestamps!
12
+ attr_accessible :title
13
+ versioning
14
+ end
15
+ describe Versioned do
16
+ describe "Basic Usage" do
17
+ it do
18
+ v = Versioned.new :title => "Alpha"
19
+ v.save!
20
+ v.versions.should have(1).item
21
+ v.update_attribute :title, "Beta"
22
+ v.versions.should have(2).items
23
+ v.versions.first.original.title.should == "Alpha"
24
+ end
25
+ end
26
+ describe "Advanced Usage" do
27
+ let(:today){ Date.new 2010, 1, 31 }
28
+ let(:item1){ VersionedItem.new }
29
+ let(:item2){ VersionedItem.new }
30
+ let(:beta) do
31
+ v = Versioned.new :title => "Beta"
32
+ v.items << item1
33
+ v.save!
34
+ Timecop.freeze today+1
35
+ v.items << item2
36
+ v.save!
37
+ v
38
+ end
39
+ before{ Timecop.freeze today }
40
+ after{ Timecop.return }
41
+ it "is versioned" do
42
+ versions = beta.versions.all
43
+ versions.should have(2).items
44
+ versions[0].versioned_at.should eql today.to_time.utc
45
+ versions[1].versioned_at.should eql (today+1).to_time.utc
46
+ versions[0].original.should be_kind_of Versioned
47
+ versions[0].original.items.should =~ [item1]
48
+ versions[1].original.items.should =~ [item1, item2]
49
+ end
50
+ it "allows for subquery on versions" do
51
+ specific_versions = beta.versions.where(:versioned_at.lte => today.to_time.utc).all
52
+ specific_versions.should have(1).item
53
+ specific_versions.first.original.items.should =~ [item1]
54
+ end
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mm-versioning
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joseph HALTER
9
+ - Jonathan TRON
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-08-08 00:00:00.000000000 +02:00
14
+ default_executable:
15
+ dependencies: []
16
+ description: Simple versioning for MongoMapper with proper specs
17
+ email:
18
+ - team@openhood.com
19
+ executables: []
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - .DS_Store
24
+ - Gemfile
25
+ - Gemfile.lock
26
+ - README.md
27
+ - Rakefile
28
+ - lib/mongo_mapper/plugins/versioning.rb
29
+ - lib/mongo_mapper/plugins/versioning/version.rb
30
+ - log/test.log
31
+ - mm-versioning.gemspec
32
+ - spec/spec_helper.rb
33
+ - spec/versioning_spec.rb
34
+ has_rdoc: true
35
+ homepage: http://github.com/openhood/mm-versioning
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.6.2
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: Simple versioning for MongoMapper with proper specs
59
+ test_files:
60
+ - spec/spec_helper.rb
61
+ - spec/versioning_spec.rb