copycouch 0.0.0
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/README.markdown +47 -0
- data/lib/copycouch.rb +2 -0
- data/lib/copycouch/copycouch.rb +45 -0
- metadata +85 -0
data/README.markdown
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# Introduction
|
2
|
+
|
3
|
+
A mixin for adding per-document replication to your CouchRest::Model::Base objects.
|
4
|
+
|
5
|
+
# Installation
|
6
|
+
|
7
|
+
$ gem install copycouch
|
8
|
+
|
9
|
+
# Usage
|
10
|
+
|
11
|
+
First, mix CopyCouch into your CouchRest::Model::Base derived class:
|
12
|
+
|
13
|
+
COUCH_SERVER = CouchRest.new "http://my.cms.couch.instance"
|
14
|
+
CMS_DATABASE = COUCH_SERVER.database! 'library'
|
15
|
+
|
16
|
+
class Book < CouchRest::Model::Base
|
17
|
+
include CopyCouch
|
18
|
+
use CMS_DATABASE
|
19
|
+
|
20
|
+
property :name
|
21
|
+
property :is_published, TrueClass
|
22
|
+
end
|
23
|
+
|
24
|
+
Next, create a document.
|
25
|
+
|
26
|
+
@book = Book.create :name => "2001: A Space Odyssey"
|
27
|
+
|
28
|
+
Next, replicte it!
|
29
|
+
|
30
|
+
PRODUCTION_COUCH_SERVER = CouchRest.new "http://my.production.couch.instance"
|
31
|
+
PRODUCTION_DATABASE = PRODUCTION_COUCH_SERVER.database! 'library'
|
32
|
+
|
33
|
+
@book.replicate PRODUCTION_DATABASE
|
34
|
+
|
35
|
+
Now it's replicated. After replication, CopyCouch logged some stuff in your document.
|
36
|
+
|
37
|
+
puts @book.last_replicated_to #==> "http://my.production.couch.instance/library"
|
38
|
+
puts @book.last_replicated_revision #==> 1-jkfdlsau94302894032840293
|
39
|
+
puts @book.last_replicated_on #==> Sun Aug 22 18:41:57 -0400 2010
|
40
|
+
|
41
|
+
You could also find that information under `@book.copycouch_log`
|
42
|
+
|
43
|
+
If you'd like to set and save some properties on your document right after replication, you can do the following
|
44
|
+
|
45
|
+
@book.replicate(PRODUCTION_DATABASE) do |b|
|
46
|
+
b.is_published = true
|
47
|
+
end
|
data/lib/copycouch.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module CopyCouch
|
2
|
+
def self.included(base)
|
3
|
+
base.property :copycouch_log do |replication_metadata|
|
4
|
+
replication_metadata.property :replicated_on, Time
|
5
|
+
replication_metadata.property :replicated_to, String
|
6
|
+
replication_metadata.property :replicated_revision, String
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def replicated?
|
11
|
+
!self.copycouch_log.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
def last_replicated_revision
|
15
|
+
self.copycouch_log.last.replicated_revision
|
16
|
+
end
|
17
|
+
|
18
|
+
def last_replicated_to
|
19
|
+
self.copycouch_log.last.replicated_to
|
20
|
+
end
|
21
|
+
|
22
|
+
def last_replicated_on
|
23
|
+
self.copycouch_log.last.replicated_on
|
24
|
+
end
|
25
|
+
|
26
|
+
def replicate(target, create_target = false, &updates_after_replication)
|
27
|
+
raise StandardError, "You may not replicate new (unsaved) documents" if self.new?
|
28
|
+
|
29
|
+
RestClient.post(
|
30
|
+
"#{self.database.server.uri}/_replicate",
|
31
|
+
{
|
32
|
+
:source => self.database.name,
|
33
|
+
:target => target.root,
|
34
|
+
:create_target => create_target,
|
35
|
+
:doc_ids => [self.id]
|
36
|
+
}.to_json,
|
37
|
+
:content_type => :json,
|
38
|
+
:accept => :json
|
39
|
+
)
|
40
|
+
|
41
|
+
self.copycouch_log << {:replicated_on => Time.now, :replicated_to => target.root.gsub(%r{http://[^:]*:[^\@]*\@}, ""), :replicated_revision => self.rev}
|
42
|
+
updates_after_replication.call(self) if updates_after_replication
|
43
|
+
self.save!
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: copycouch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 0.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Matt Parker
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-22 00:00:00 -04:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: couchrest_model
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: -1848230057
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
- beta7
|
35
|
+
version: 1.0.0.beta7
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
description: Facilitates the creation of push-publishing content management systems.
|
39
|
+
email: moonmaster9000@gmail.com
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files:
|
45
|
+
- README.markdown
|
46
|
+
files:
|
47
|
+
- README.markdown
|
48
|
+
- lib/copycouch.rb
|
49
|
+
- lib/copycouch/copycouch.rb
|
50
|
+
has_rdoc: true
|
51
|
+
homepage: http://github.com/moonmaster9000/copycouch
|
52
|
+
licenses: []
|
53
|
+
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options:
|
56
|
+
- --charset=UTF-8
|
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: A mixin for CouchRest::Model::Base objects for simple single-document replication.
|
84
|
+
test_files: []
|
85
|
+
|