mm-versioning 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|