couch_publish 0.0.1
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/lib/couch_publish/couch_publish.rb +59 -0
- data/lib/couch_publish.rb +2 -0
- data/spec/lib/couch_publish_spec.rb +189 -0
- data/spec/spec_helper.rb +22 -0
- metadata +86 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
module CouchPublish
|
2
|
+
def self.included(base)
|
3
|
+
base.send :include, Memories unless base.ancestors.include? Memories
|
4
|
+
end
|
5
|
+
|
6
|
+
def publish!(&block)
|
7
|
+
self.milestone! &block
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns true if this version is published
|
11
|
+
def published?
|
12
|
+
self.milestone? or self.milestone_commit?
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns true if this version has not been published
|
16
|
+
def draft?
|
17
|
+
not self.published?
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns the latest version of the document that was published
|
21
|
+
def last_published_version
|
22
|
+
self.milestones.empty? ? nil : self.milestones.last.instance
|
23
|
+
end
|
24
|
+
|
25
|
+
# Has any of version of this document ever been published?
|
26
|
+
def previously_published?
|
27
|
+
not self.milestones.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
# Discard the working draft, and revert the document
|
31
|
+
# back to the last published version
|
32
|
+
def discard_draft!(&block)
|
33
|
+
discard_draft_exception_check
|
34
|
+
self.rollback_to_latest_milestone!
|
35
|
+
self.publish! &block
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
# Discard the working draft, and revert the document
|
40
|
+
# back to the last published state, but don't save.
|
41
|
+
# Note that if you save the document after calling this method,
|
42
|
+
# you would still have to call the publish! method
|
43
|
+
# if you want the revert to be published
|
44
|
+
def discard_draft
|
45
|
+
discard_draft_exception_check
|
46
|
+
self.rollback_to_latest_milestone
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def published_versions
|
51
|
+
self.milestones
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def discard_draft_exception_check
|
56
|
+
raise "The current version of the document is published. There is no working draft to discard!" if self.published?
|
57
|
+
raise "This document has never been published. If we discard the current draft, then we'd end up in an existential conundrum." unless self.previously_published?
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CouchPublish do
|
4
|
+
context "given a document instance that includes CouchPublish" do
|
5
|
+
|
6
|
+
describe "#publish!" do
|
7
|
+
before do
|
8
|
+
@doc = Article.create :title => 'test', :body => 'test test'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should create a milestone" do
|
12
|
+
@doc.milestones.length.should == 0
|
13
|
+
@doc.publish!
|
14
|
+
@doc.milestones.length.should == 1
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#published_versions" do
|
19
|
+
before do
|
20
|
+
@doc = Article.create :title => 'test', :body => 'test test'
|
21
|
+
@doc.publish!
|
22
|
+
@doc.title = 'test 2'
|
23
|
+
@doc.save
|
24
|
+
@doc.title = 'test 3'
|
25
|
+
@doc.save
|
26
|
+
@doc.publish!
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return all milestones" do
|
30
|
+
@doc.published_versions.should == @doc.milestones
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
describe "#draft?" do
|
36
|
+
context "given a new document" do
|
37
|
+
before do
|
38
|
+
@doc = Article.create :title => 't', :body => 't'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return true" do
|
42
|
+
@doc.draft?.should be_true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "given a document that was just published" do
|
47
|
+
before do
|
48
|
+
@doc = Article.create :title => 't', :body => 't'
|
49
|
+
@doc.publish!
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return false" do
|
53
|
+
@doc.draft?.should be_false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#published?" do
|
59
|
+
context "given a document that has been published" do
|
60
|
+
before do
|
61
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
62
|
+
@doc.publish!
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should return true" do
|
66
|
+
@doc.published?.should be_true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "given a document that has never been published" do
|
71
|
+
before do
|
72
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should return false" do
|
76
|
+
@doc.published?.should be_false
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#last_published_version" do
|
82
|
+
context "given a document that has been published" do
|
83
|
+
before do
|
84
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
85
|
+
@doc.publish!
|
86
|
+
@doc.title = 'test 2'
|
87
|
+
@doc.save
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should return the latest milestone" do
|
91
|
+
@doc.last_published_version.should == @doc.milestones.last.instance
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "given a document that has never been published" do
|
96
|
+
before do
|
97
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should return nil" do
|
101
|
+
@doc.last_published_version.should be_nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "#discard_draft!" do
|
107
|
+
context "given a document whose current version is published" do
|
108
|
+
before do
|
109
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
110
|
+
@doc.publish!
|
111
|
+
@doc.title = 'test 2'
|
112
|
+
@doc.save
|
113
|
+
@doc.publish!
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should raise an exception" do
|
117
|
+
proc {@doc.discard_draft!}.should raise_exception("The current version of the document is published. There is no working draft to discard!")
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "given a document that has never been published" do
|
122
|
+
before do
|
123
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should raise an exception" do
|
127
|
+
proc {@doc.discard_draft!}.should raise_exception("This document has never been published. If we discard the current draft, then we'd end up in an existential conundrum.")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "given a document whose current version is not published, but has previous published versions" do
|
132
|
+
before do
|
133
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
134
|
+
@doc.publish!
|
135
|
+
@doc.title = 'test 2'
|
136
|
+
@doc.save
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should revert the current document to the previous publish state" do
|
140
|
+
@doc.discard_draft!.title.should == "test"
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should mark the newly reverted version as published" do
|
144
|
+
@doc.discard_draft!.published?.should be_true
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "#discard_draft" do
|
150
|
+
context "given a document whose current version is published" do
|
151
|
+
before do
|
152
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
153
|
+
@doc.publish!
|
154
|
+
@doc.title = 'test 2'
|
155
|
+
@doc.save
|
156
|
+
@doc.publish!
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should raise an exception" do
|
160
|
+
proc {@doc.discard_draft}.should raise_exception("The current version of the document is published. There is no working draft to discard!")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context "given a document that has never been published" do
|
165
|
+
before do
|
166
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should raise an exception" do
|
170
|
+
proc {@doc.discard_draft}.should raise_exception("This document has never been published. If we discard the current draft, then we'd end up in an existential conundrum.")
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
context "given a document whose current version is not published, but has previous published versions" do
|
175
|
+
before do
|
176
|
+
@doc = Article.create :title => 'test', :body => 'test'
|
177
|
+
@doc.publish!
|
178
|
+
@doc.title = 'test 2'
|
179
|
+
@doc.save
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should revert the current document to the previous publish state" do
|
183
|
+
@doc.discard_draft.title.should == "test"
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
$LOAD_PATH.unshift './lib'
|
2
|
+
require 'rspec'
|
3
|
+
require 'couch_publish'
|
4
|
+
|
5
|
+
COUCHDB_SERVER = CouchRest.new "http://admin:password@localhost:5984"
|
6
|
+
COUCH_PUBLISH_TEST_DB = COUCHDB_SERVER.database!('couch_publish_test')
|
7
|
+
|
8
|
+
class Article < CouchRest::Model::Base
|
9
|
+
use_database COUCH_PUBLISH_TEST_DB
|
10
|
+
include CouchPublish
|
11
|
+
|
12
|
+
property :title
|
13
|
+
property :body
|
14
|
+
end
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
config.mock_with :rspec
|
18
|
+
|
19
|
+
config.before(:each) do
|
20
|
+
COUCH_PUBLISH_TEST_DB.recreate!
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: couch_publish
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Matt Parker
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-15 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: memories
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 3
|
33
|
+
- 2
|
34
|
+
version: 0.3.2
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
description: Rides on top of the `memories` gem to add simple publishing functionality with rollback and preview support.
|
38
|
+
email: moonmaster9000@gmail.com
|
39
|
+
executables: []
|
40
|
+
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files: []
|
44
|
+
|
45
|
+
files:
|
46
|
+
- lib/couch_publish.rb
|
47
|
+
- lib/couch_publish/couch_publish.rb
|
48
|
+
- spec/lib/couch_publish_spec.rb
|
49
|
+
- spec/spec_helper.rb
|
50
|
+
has_rdoc: true
|
51
|
+
homepage: http://github.com/moonmaster9000/couch_publish
|
52
|
+
licenses: []
|
53
|
+
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options: []
|
56
|
+
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 3
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
version: "0"
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.3.7
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Publishing functionality for couchdb documents.
|
84
|
+
test_files:
|
85
|
+
- spec/lib/couch_publish_spec.rb
|
86
|
+
- spec/spec_helper.rb
|