mm-draft 0.1.5

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/Gemfile ADDED
@@ -0,0 +1,20 @@
1
+ source :rubygems
2
+
3
+ gem 'rake'
4
+ gem 'bson_ext', '>= 1.6.4'
5
+ gem 'multi_json', '>= 1.3.6'
6
+
7
+ group :test do
8
+ gem 'jnunemaker-matchy', '>= 0.4', :require => 'matchy'
9
+ gem 'shoulda', '>= 3.1.1'
10
+ gem 'mocha', '>= 0.12.3'
11
+ gem 'database_cleaner', '>= 0.8.0'
12
+ end
13
+
14
+ group :development do
15
+ gem "wirble"
16
+ gem "hirb"
17
+ gem "awesome_print"
18
+ end
19
+
20
+ gemspec
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # MongoMapper Draft plugin
2
+
3
+ Plugin for MongoMapper to have draft/published option on models.
4
+
5
+ Works with ramdiv-mongo_mapper_acts_as_tree.
6
+
7
+ NOTE: Since ramdiv-mongo_mapper_acts_as_tree hasn't been updated in a while, I will change this to support Oktavilla/mongo_mapper_tree instead (http://github.com/ramdiv/mongo_mapper_acts_as_tree)
8
+
9
+ ##Instance methods
10
+ <pre>
11
+ .draft? - true/false
12
+ .published? - true/false
13
+ .published_record - returns the published record) (or nil, if the document never has been published)
14
+ .draft_record - returns the draft record for a published record
15
+ </pre>
16
+
17
+ *draft_record* will return self if the draft? returns true
18
+ *published_record* will return self if draft? returns false
19
+
20
+ ## Usage:
21
+ Create record as normal.
22
+
23
+ *.save* - Saves draft (with normal validation)
24
+
25
+ *.publish* - Saves the current record as draft, creates a new published record (returns true/false, depending on validation of draft record)
26
+
27
+ Validation is skipped on the published record, as the draft record should be checked for validations when saving.
28
+
29
+ All records will be duplicated (draft + published) in the DB instead of beeing embedded documents, as embedding would limit the size to half of what MongoDB is capable of.
30
+
31
+ Duplicating the records also gives the benefit of working directly on the published record. (although this isn't recommended, as it kind of breaks the draft/published structure)
32
+
33
+ ## Example
34
+
35
+ ### Model
36
+ <pre>
37
+ class Monkey
38
+ include MongoMapper::Document
39
+ plugin MongoMapper::Draft
40
+
41
+ key :name, String, :default => "test"
42
+ end
43
+ </pre>
44
+ ### Usage of model
45
+ <pre>
46
+ m = Monkey.new
47
+ m.name = "Leif"
48
+ m.save
49
+
50
+ m.is_published? (will return false)
51
+ m.publish (will return true/false)
52
+
53
+ m.name = "Artn"
54
+ m.save
55
+
56
+ m.name # returns "Artn"
57
+
58
+ m.published_model.name # returns "Leif"
59
+ </pre>
60
+
61
+
62
+ Copyright (c) 2011 Leif Ringstad, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ require File.join(File.dirname(__FILE__), 'lib', 'mongo_mapper', 'plugins', 'draft', 'version')
5
+
6
+ require 'rake/testtask'
7
+ namespace :test do
8
+ Rake::TestTask.new(:units) do |test|
9
+ test.libs << 'test'
10
+ test.ruby_opts << '-rubygems'
11
+ test.pattern = 'test/unit/**/test_*.rb'
12
+ test.verbose = true
13
+ end
14
+
15
+ #TODO Add performance
16
+ Rake::TestTask.new(:performance) do |test|
17
+ test.libs << 'test'
18
+ test.ruby_opts << '-rubygems'
19
+ test.pattern = 'test/performance/test/**/*.rb'
20
+ test.verbose = true
21
+ end
22
+ end
23
+
24
+ task :default => 'test:units'
25
+
26
+ desc 'Builds the gem'
27
+ task :build do
28
+ sh 'gem build mm-draft.gemspec'
29
+ Dir.mkdir('pkg') unless File.directory?('pkg')
30
+ sh "mv mm-draft-#{MongoMapper::Draft::VERSION}.gem pkg/mm-draft-#{MongoMapper::Draft::VERSION}.gem"
31
+ end
32
+
33
+ desc 'Builds and Installs the gem'
34
+ task :install => :build do
35
+ sh "gem install pkg/mm-draft-#{MongoMapper::Draft::VERSION}.gem"
36
+ end
data/lib/draft.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'mongo_mapper'
2
+ require File.join(File.dirname(__FILE__), 'mongo_mapper/plugins/draft/draft')
data/lib/locale/en.yml ADDED
@@ -0,0 +1,6 @@
1
+ en:
2
+ mongo_mapper:
3
+ errors:
4
+ messages:
5
+ draft:
6
+ todo: "TODO"
@@ -0,0 +1,12 @@
1
+ module MongoMapper
2
+ module Plugins
3
+ module Draft
4
+ module Callbacks
5
+ extend ActiveSupport::Concern
6
+ included do
7
+ before_destroy :unpublish
8
+ end # included_do
9
+ end
10
+ end # Versioned
11
+ end # Module plugins
12
+ end # module MongoMapper
@@ -0,0 +1,129 @@
1
+ require File.join(File.dirname(__FILE__), 'callbacks')
2
+ require File.join(File.dirname(__FILE__), 'keys')
3
+ # I18n.load_path << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'locale', 'en.yml'), __FILE__)
4
+
5
+ module MongoMapper
6
+ module Plugins
7
+ module Draft
8
+
9
+ extend ActiveSupport::Concern
10
+
11
+ include MongoMapper::Plugins::Draft::Callbacks
12
+ include MongoMapper::Plugins::Draft::Keys
13
+
14
+ def draft?
15
+ self.draft
16
+ end
17
+
18
+ def published?
19
+ if draft?
20
+ return false if self.draft_record_published_id == nil # save a query and return false
21
+ return true if (self.class.find(self.draft_record_published_id) != nil)
22
+ else
23
+ return true
24
+ end
25
+ false
26
+ end
27
+
28
+ def publish
29
+ if (draft? == false) # don't publish non-drafts...
30
+ return false
31
+ end
32
+
33
+ if (self.changed?) # save any changes, in case publish is called directly instead of save
34
+ return false if (self.save == false)
35
+ end
36
+
37
+
38
+ # if already published, keep some old data to update instead of insert
39
+ if (self.published?)
40
+ old_published_record = self.published_record
41
+ # support for mm-tree
42
+ # remove parents from previous published record
43
+ if (self.respond_to?("parent_id_field") && self.respond_to?("path_field") && self.respond_to?("depth_field"))
44
+ old_published_record.parent = nil
45
+ old_published_record.save
46
+ end
47
+ live_record = self.clone
48
+ live_record._id = self.published_record_id
49
+ live_record.created_at = old_published_record.created_at if self.respond_to?("created_at")
50
+ else
51
+ live_record = self.clone
52
+ live_record.created_at = Time.now.utc if self.respond_to?("created_at")
53
+ end
54
+
55
+ self.draft_record_published_id = live_record._id
56
+ self.class.skip_callback(:save, :before, :update_timestamps ) if self.respond_to?("updated_at")
57
+ self.save!
58
+ self.class.set_callback(:save, :before, :update_timestamps ) if self.respond_to?("updated_at")
59
+
60
+ if (self.respond_to?("parent_id_field") && self.respond_to?("path_field") && self.respond_to?("depth_field"))
61
+ # if so, remove the current parent (should have already been don)
62
+ # set parent to nil for live_record before setting "real" parent.
63
+ # live_record.parent = nil
64
+
65
+ if (self.parent != nil)
66
+ # no need to copy order value, as it's copied in the clone process
67
+ # check draft.parent.published_record != nil, and set as parent
68
+ if (self.parent != nil)
69
+ if (self.parent.published_record != nil)
70
+ live_record.parent = self.parent.published_record
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ live_record.draft = false;
77
+ live_record.updated_at = Time.now.utc if self.respond_to?("updated_at")
78
+ live_record.save!
79
+ return true
80
+ end
81
+
82
+ def published_record
83
+ if draft?
84
+ return nil if self.draft_record_published_id == nil # save a query and return nil of draft_record_published_id == nil
85
+ self.class.find(self.draft_record_published_id)
86
+ else
87
+ self
88
+ end
89
+ end
90
+
91
+ def published_record_id
92
+ if draft?
93
+ self.draft_record_published_id
94
+ else
95
+ self._id
96
+ end
97
+ end
98
+
99
+ def draft_record
100
+ if draft?
101
+ self
102
+ else
103
+ self.class.all(:conditions => { :draft => true, :draft_record_published_id => self._id }).first
104
+ end
105
+ end
106
+
107
+ def unpublish
108
+ published_rec = self.published_record
109
+ draft_rec = self.draft_record
110
+
111
+ self.class.skip_callback(:destroy, :before, :unpublish)
112
+ published_rec.destroy if published_rec != nil # destroy published record
113
+ self.class.set_callback(:destroy, :before, :unpublish)
114
+
115
+ draft_rec.draft_record_published_id = nil if draft_rec != nil # update draft record
116
+ draft_rec.save! if draft_rec != nil
117
+ # if draft?
118
+ # published = self.class.find(self.draft_record_published_id)
119
+ # published.destroy if (published != nil)
120
+ # self.draft_record_published_id = nil
121
+ # self.save! # remove draft_record_published_id
122
+ # else
123
+ # self.draft_record.unpublish
124
+ # end
125
+ end
126
+
127
+ end # Module Draft
128
+ end # Module plugins
129
+ end # module MongoMapper
@@ -0,0 +1,13 @@
1
+ module MongoMapper
2
+ module Plugins
3
+ module Draft
4
+ module Keys
5
+ extend ActiveSupport::Concern
6
+ included do
7
+ key :draft, Boolean, :default => true
8
+ key :draft_record_published_id, ObjectId # points to the live page version if draft == true. else NIL
9
+ end # included_do
10
+ end # Keys
11
+ end # Versioned
12
+ end # Module plugins
13
+ end # module MongoMapper
@@ -0,0 +1,5 @@
1
+ module MongoMapper
2
+ module Draft
3
+ VERSION = '0.1.5'
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class Monkey
2
+ include MongoMapper::Document
3
+ plugin MongoMapper::Plugins::Draft
4
+
5
+ attr_accessible :name
6
+
7
+ key :name, String
8
+
9
+ timestamps!
10
+ end
@@ -0,0 +1,9 @@
1
+ class Monkey
2
+ include MongoMapper::Document
3
+ plugin MongoMapper::Plugins::Draft
4
+
5
+ attr_accessible :name, :age
6
+
7
+ key :name, String
8
+ key :age, Integer
9
+ end
@@ -0,0 +1,7 @@
1
+ class MonkeyNoVersion
2
+ include MongoMapper::Document
3
+ attr_accessible :name, :age
4
+
5
+ key :name, String
6
+ key :age, Integer
7
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+ require 'draft'
7
+
8
+ Bundler.require(:default, :test)
9
+
10
+ MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017)
11
+ MongoMapper.database = "mm-draft-performance"
12
+
13
+ Dir["#{File.dirname(__FILE__)}/models/*.rb"].each {|file| require file}
14
+
15
+ DatabaseCleaner.strategy = :truncation
@@ -0,0 +1,28 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'performance_helper'))
2
+
3
+ require 'benchmark'
4
+
5
+ DatabaseCleaner.start
6
+
7
+ Benchmark.bm(22) do |x|
8
+ ids_draft = []
9
+ ids_no_draft = []
10
+
11
+ # Write performance
12
+ x.report("write without draft ") do
13
+ 500.times { |i| ids_no_draft << MonkeyNodraft.create(:name => "Baboo", :age => 12, ).id }
14
+ end
15
+ x.report("write with draft ") do
16
+ 500.times { |i| ids_draft << Monkey.create(:name => "Baboo", :age => 12, ).id }
17
+ end
18
+
19
+ # Read performance
20
+ x.report("read with draft ") do
21
+ ids_draft.each { |id| Monkey.first(:id => id) }
22
+ end
23
+ x.report("read without draft ") do
24
+ ids_no_draft.each { |id| MonkeyNodraft.first(:id => id) }
25
+ end
26
+ end
27
+
28
+ DatabaseCleaner.clean
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+ require 'draft'
7
+
8
+ Bundler.require(:default, :test)
9
+
10
+ MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017)
11
+ MongoMapper.database = "mm-draft-test"
12
+
13
+ Dir["#{File.dirname(__FILE__)}/models/*.rb"].each {|file| require file}
14
+
15
+ DatabaseCleaner.strategy = :truncation
16
+
17
+ class Test::Unit::TestCase
18
+ # Drop all collections after each test case.
19
+ def setup
20
+ DatabaseCleaner.start
21
+ end
22
+
23
+ def teardown
24
+ DatabaseCleaner.clean
25
+ end
26
+
27
+ # Make sure that each test case has a teardown
28
+ # method to clear the db after each test.
29
+ def inherited(base)
30
+ base.define_method setup do
31
+ super
32
+ end
33
+
34
+ base.define_method teardown do
35
+ super
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,194 @@
1
+ require 'test_helper'
2
+
3
+ class DraftTest < Test::Unit::TestCase
4
+ context "draft monkey records" do
5
+ setup do
6
+ @monkey_1 = Monkey.create(:name => "Chip")
7
+ @monkey_2 = Monkey.create(:name => "Unaton")
8
+ @monkey_1.publish
9
+ end
10
+
11
+ should "have same name as draft" do
12
+ @monkey_1.name.should == "Chip"
13
+ @monkey_1.published_record.name.should == "Chip"
14
+ @monkey_1.published_record.name.should == @monkey_1.name
15
+ end
16
+
17
+ should "be published" do
18
+ @monkey_1.published_record.should_not == nil
19
+ end
20
+
21
+ should "not have same created time as draft" do
22
+ @monkey_1.unpublish
23
+ @monkey_1.publish
24
+ @monkey_1.created_at.should_not == @monkey_1.published_record.created_at
25
+ end
26
+
27
+ should "not be published" do
28
+ @monkey_2.published?.should_not == true
29
+ @monkey_2.published_record.should == nil
30
+ end
31
+
32
+ should "not be draft" do
33
+ @monkey_1.published_record.draft?.should_not == true
34
+ end
35
+
36
+ should "be draft" do
37
+ @monkey_2.draft?.should == true
38
+ end
39
+
40
+ should "rename draft only" do
41
+ @monkey_1.name = "Sagofon"
42
+ @monkey_1.published_record.should_not == nil
43
+ @monkey_1.name.should_not == @monkey_1.published_record.name
44
+ end
45
+
46
+ should "rename both draft and published record" do
47
+ @monkey_1.name = "Sagofon"
48
+ @monkey_1.publish
49
+ @monkey_1.published_record.should_not == nil
50
+ @monkey_1.name.should == @monkey_1.published_record.name
51
+ end
52
+
53
+ should "have updated updated_at both published record" do
54
+ @monkey_1.name ="Kake"
55
+ @monkey_1.save
56
+ @monkey_1.publish
57
+ @monkey_1.published_record.updated_at.should_not == @monkey_1.updated_at
58
+ end
59
+
60
+ should "unpublish draft record" do
61
+ @monkey_1.unpublish
62
+ assert !@monkey_1.published?
63
+ @monkey_1.published_record_id.should == nil
64
+ @monkey_1.published_record.should == nil
65
+ end
66
+
67
+ should "unpublish published record directly" do
68
+ # It is recommended to unpublish a draft record instead of unpublising a published record
69
+ @monkey_1.publish # publish record again...
70
+ @monkey_1.published_record.unpublish
71
+ # reload monkey_1
72
+ @monkey_1.reload
73
+ @monkey_1.published?.should_not == true
74
+ @monkey_1.published_record_id.should == nil
75
+ @monkey_1.published_record.should == nil
76
+ end
77
+
78
+ should "destroy published record only" do
79
+ @monkey_2.publish
80
+ tmp_id = @monkey_2.published_record_id
81
+ @monkey_2.published_record.destroy
82
+ @monkey_2.reload
83
+ @monkey_2.published_record_id.should == nil
84
+ @monkey_2.published_record.should == nil
85
+ @monkey_2.name.should == "Unaton" # make sure we didn't loose the draft
86
+ @monkey_2.published?.should_not == true
87
+ @monkey_2.draft?.should == true
88
+ Monkey.find(tmp_id).should == nil
89
+ end
90
+
91
+ should "destroy draft and published record" do
92
+ @monkey_2.publish # publish record again...
93
+ tmp_draft_id = @monkey_2._id
94
+ tmp_published_id = @monkey_2.published_record_id
95
+ @monkey_2.destroy
96
+ # keep ID's in order to check that they are destroyed!
97
+ Monkey.find(tmp_draft_id).should == nil
98
+ Monkey.find(tmp_published_id).should == nil
99
+ end
100
+
101
+ end # context "draft monkey records" do
102
+
103
+ # context "tree-record" do
104
+ # setup do
105
+ # @root_1 = Dog.create(:name => "Atmel")
106
+ # @child_1 = Dog.create(:name => "ATmega644P", :parent => @root_1)
107
+ # @child_2 = Dog.create(:name => "ATmega2561", :parent => @root_1)
108
+ # @child_2_1 = Dog.create(:name => "ATtiny24", :parent => @child_2)
109
+
110
+ # @root_2 = Dog.create(:name => "ST Ericsson")
111
+ # @child_3 = Dog.create(:name => "ISP1181B", :parent => @root_2)
112
+
113
+ # @root_1.publish
114
+ # @child_1.publish
115
+ # @child_2.publish
116
+ # @child_2_1.publish
117
+ # @root_2.publish
118
+ # end
119
+
120
+ # should "test draft record parents" do
121
+ # assert_equal(@root_2, @child_3.parent)
122
+ # assert_equal(@child_2, @child_2_1.parent)
123
+ # end
124
+
125
+ # should "test parents for published records" do
126
+ # assert_equal(@root_1.published_record, @child_1.published_record.parent)
127
+ # assert_equal(@root_1.published_record, @child_2.published_record.parent)
128
+ # assert_equal(@child_2.published_record, @child_2_1.published_record.parent)
129
+ # end
130
+
131
+ # should "move draft record to new parent, but keep published at old parent" do
132
+ # @child_2.parent = @root_2
133
+
134
+ # assert !@root_2.is_or_is_ancestor_of?(@child_2_1)
135
+ # assert !@child_2_1.is_or_is_descendant_of?(@root_2)
136
+ # assert !@root_2.descendants.include?(@child_2_1)
137
+
138
+ # @child_2.save
139
+ # @child_2_1.reload
140
+
141
+ # assert @root_2.is_or_is_ancestor_of?(@child_2_1)
142
+ # assert @child_2_1.is_or_is_descendant_of?(@root_2)
143
+ # assert @root_2.descendants.include?(@child_2_1)
144
+
145
+ # # test published against root_1
146
+ # assert @root_1.published_record.is_or_is_ancestor_of?(@child_2_1.published_record)
147
+ # assert @child_2_1.published_record.is_or_is_descendant_of?(@root_1.published_record)
148
+ # assert @root_1.published_record.descendants.include?(@child_2_1.published_record)
149
+ # end
150
+
151
+ # should "move both draft and published record to new parent" do
152
+ # @child_2.parent = @root_2
153
+
154
+ # assert !@root_2.is_or_is_ancestor_of?(@child_2_1)
155
+ # assert !@child_2_1.is_or_is_descendant_of?(@root_2)
156
+ # assert !@root_2.descendants.include?(@child_2_1)
157
+
158
+ # # can only test published after saving and publishing
159
+ # @child_2.save
160
+ # @child_2.publish # will also save
161
+ # @child_2.reload
162
+ # @child_2_1.reload
163
+
164
+ # assert @root_2.is_or_is_ancestor_of?(@child_2_1)
165
+ # assert @child_2_1.is_or_is_descendant_of?(@root_2)
166
+ # assert @root_2.descendants.include?(@child_2_1)
167
+
168
+ # assert @root_2.published_record.is_or_is_ancestor_of?(@child_2_1.published_record)
169
+ # assert @child_2_1.published_record.is_or_is_descendant_of?(@root_2.published_record)
170
+ # assert @root_2.published_record.descendants.include?(@child_2_1.published_record)
171
+ # end
172
+
173
+ # should "set a record as a root and check for ancestor" do
174
+ # @child_2.parent = nil
175
+
176
+ # assert !@root_2.is_or_is_ancestor_of?(@child_2_1)
177
+ # assert !@child_2_1.is_or_is_descendant_of?(@root_2)
178
+ # assert !@root_2.descendants.include?(@child_2_1)
179
+
180
+ # # can only test published after saving and publishing
181
+ # @child_2.save
182
+ # @child_2.publish # will also save
183
+ # @child_2.reload
184
+ # @child_2_1.reload
185
+
186
+ # assert @child_2.root?
187
+ # assert @child_2.published_record.root?
188
+ # assert @child_2_1.is_or_is_descendant_of?(@child_2)
189
+
190
+ # assert !@root_1.published_record.is_or_is_ancestor_of?(@child_2_1.published_record)
191
+ # assert !@child_2_1.published_record.is_or_is_descendant_of?(@root_1.published_record)
192
+ # assert !@root_1.published_record.descendants.include?(@child_2_1.published_record)
193
+ # end
194
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mm-draft
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Leif Ringstad
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: i18n
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: mongo_mapper
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.12.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.12.0
46
+ description:
47
+ email:
48
+ - leifcr@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - lib/draft.rb
54
+ - lib/locale/en.yml
55
+ - lib/mongo_mapper/plugins/draft/callbacks.rb
56
+ - lib/mongo_mapper/plugins/draft/draft.rb
57
+ - lib/mongo_mapper/plugins/draft/keys.rb
58
+ - lib/mongo_mapper/plugins/draft/version.rb
59
+ - Gemfile
60
+ - Rakefile
61
+ - README.md
62
+ - test/models/monkey.rb
63
+ - test/performance/models/monkey.rb
64
+ - test/performance/models/monkey_no_draft.rb
65
+ - test/performance/performance_helper.rb
66
+ - test/performance/test/read_write.rb
67
+ - test/test_helper.rb
68
+ - test/unit/test_draft.rb
69
+ homepage: http://github.com/leifcr/mm-draft
70
+ licenses: []
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 1.8.24
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: A MongoMapper extension adding draft/publishing support
93
+ test_files:
94
+ - test/models/monkey.rb
95
+ - test/performance/models/monkey.rb
96
+ - test/performance/models/monkey_no_draft.rb
97
+ - test/performance/performance_helper.rb
98
+ - test/performance/test/read_write.rb
99
+ - test/test_helper.rb
100
+ - test/unit/test_draft.rb