mm-versioning 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.DS_Store +0 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +39 -0
- data/README.md +32 -0
- data/Rakefile +7 -0
- data/lib/mongo_mapper/plugins/versioning.rb +52 -0
- data/lib/mongo_mapper/plugins/versioning/version.rb +7 -0
- data/log/test.log +100 -0
- data/mm-versioning.gemspec +19 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/versioning_spec.rb +56 -0
- metadata +61 -0
data/.DS_Store
ADDED
Binary file
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -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
|
data/README.md
ADDED
@@ -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.
|
data/Rakefile
ADDED
@@ -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
|
data/log/test.log
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|