couchrest_model 1.0.0.beta7 → 1.0.0.beta8
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +25 -8
- data/Rakefile +7 -6
- data/THANKS.md +2 -0
- data/history.txt +25 -20
- data/lib/couchrest/model/base.rb +1 -1
- data/lib/couchrest/model/extended_attachments.rb +9 -5
- data/lib/couchrest/model/validations/uniqueness.rb +4 -5
- data/lib/couchrest/model/views.rb +5 -12
- data/lib/couchrest/model.rb +1 -1
- data/lib/couchrest/railtie.rb +11 -0
- data/lib/couchrest_model.rb +10 -5
- data/lib/rails/generators/couchrest_model/model/model_generator.rb +26 -0
- data/lib/rails/generators/couchrest_model/model/templates/model.rb +2 -0
- data/lib/rails/generators/couchrest_model.rb +16 -0
- data/spec/couchrest/assocations_spec.rb +15 -32
- data/spec/couchrest/attachment_spec.rb +35 -7
- data/spec/couchrest/attribute_protection_spec.rb +25 -13
- data/spec/couchrest/inherited_spec.rb +2 -2
- data/spec/couchrest/property_spec.rb +67 -55
- data/spec/couchrest/validations.rb +12 -0
- data/spec/fixtures/more/client.rb +6 -0
- data/spec/fixtures/more/sale_entry.rb +9 -0
- data/spec/fixtures/more/sale_invoice.rb +13 -0
- metadata +36 -15
- data/examples/model/example.rb +0 -144
- data/utils/remap.rb +0 -27
- data/utils/subset.rb +0 -30
data/examples/model/example.rb
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', '..', 'lib', 'couchrest')
|
2
|
-
|
3
|
-
def show obj
|
4
|
-
puts obj.inspect
|
5
|
-
puts
|
6
|
-
end
|
7
|
-
|
8
|
-
SERVER = CouchRest.new
|
9
|
-
SERVER.default_database = 'couchrest-extendeddoc-example'
|
10
|
-
|
11
|
-
class Author < CouchRest::ExtendedDocument
|
12
|
-
use_database SERVER.default_database
|
13
|
-
property :name
|
14
|
-
|
15
|
-
def drink_scotch
|
16
|
-
puts "... glug type glug ... I'm #{name} ... type glug glug ..."
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class Post < CouchRest::ExtendedDocument
|
21
|
-
use_database SERVER.default_database
|
22
|
-
|
23
|
-
property :title
|
24
|
-
property :body
|
25
|
-
property :author, :cast_as => 'Author'
|
26
|
-
|
27
|
-
timestamps!
|
28
|
-
end
|
29
|
-
|
30
|
-
class Comment < CouchRest::ExtendedDocument
|
31
|
-
use_database SERVER.default_database
|
32
|
-
|
33
|
-
property :commenter, :cast_as => 'Author'
|
34
|
-
timestamps!
|
35
|
-
|
36
|
-
def post= post
|
37
|
-
self["post_id"] = post.id
|
38
|
-
end
|
39
|
-
def post
|
40
|
-
Post.get(self['post_id']) if self['post_id']
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
puts "Act I: CRUD"
|
46
|
-
puts
|
47
|
-
puts "(pause for dramatic effect)"
|
48
|
-
puts
|
49
|
-
sleep 2
|
50
|
-
|
51
|
-
puts "Create an author."
|
52
|
-
quentin = Author.new("name" => "Quentin Hazel")
|
53
|
-
show quentin
|
54
|
-
|
55
|
-
puts "Create a new post."
|
56
|
-
post = Post.new(:title => "First Post", :body => "Lorem ipsum dolor sit amet, consectetur adipisicing elit...")
|
57
|
-
show post
|
58
|
-
|
59
|
-
puts "Add the author to the post."
|
60
|
-
post.author = quentin
|
61
|
-
show post
|
62
|
-
|
63
|
-
puts "Save the post."
|
64
|
-
post.save
|
65
|
-
show post
|
66
|
-
|
67
|
-
puts "Load the post."
|
68
|
-
reloaded = Post.get(post.id)
|
69
|
-
show reloaded
|
70
|
-
|
71
|
-
puts "The author of the post is an instance of Author."
|
72
|
-
reloaded.author.drink_scotch
|
73
|
-
|
74
|
-
puts "\nAdd some comments to the post."
|
75
|
-
comment_one = Comment.new :text => "Blah blah blah", :commenter => {:name => "Joe Sixpack"}
|
76
|
-
comment_two = Comment.new :text => "Yeah yeah yeah", :commenter => {:name => "Jane Doe"}
|
77
|
-
comment_three = Comment.new :text => "Whatever...", :commenter => {:name => "John Stewart"}
|
78
|
-
|
79
|
-
# TODO - maybe add some magic here?
|
80
|
-
comment_one.post = post
|
81
|
-
comment_two.post = post
|
82
|
-
comment_three.post = post
|
83
|
-
comment_one.save
|
84
|
-
comment_two.save
|
85
|
-
comment_three.save
|
86
|
-
|
87
|
-
show comment_one
|
88
|
-
show comment_two
|
89
|
-
show comment_three
|
90
|
-
|
91
|
-
puts "We can load a post through its comment (no magic here)."
|
92
|
-
show post = comment_one.post
|
93
|
-
|
94
|
-
puts "Commenters are also authors."
|
95
|
-
comment_two['commenter'].drink_scotch
|
96
|
-
comment_one['commenter'].drink_scotch
|
97
|
-
comment_three['commenter'].drink_scotch
|
98
|
-
|
99
|
-
puts "\nLet's save an author to her own document."
|
100
|
-
jane = comment_two['commenter']
|
101
|
-
jane.save
|
102
|
-
show jane
|
103
|
-
|
104
|
-
puts "Oh, that's neat! Because Ruby passes hash valuee by reference, Jane's new id has been added to the comment she left."
|
105
|
-
show comment_two
|
106
|
-
|
107
|
-
puts "Of course, we'd better remember to save it."
|
108
|
-
comment_two.save
|
109
|
-
show comment_two
|
110
|
-
|
111
|
-
puts "Oooh, denormalized... feel the burn!"
|
112
|
-
puts
|
113
|
-
puts
|
114
|
-
puts
|
115
|
-
puts "Act II: Views"
|
116
|
-
puts
|
117
|
-
puts
|
118
|
-
sleep 2
|
119
|
-
|
120
|
-
puts "Let's find all the comments that go with our post."
|
121
|
-
puts "Our post has id #{post.id}, so lets find all the comments with that post_id."
|
122
|
-
puts
|
123
|
-
|
124
|
-
class Comment
|
125
|
-
view_by :post_id
|
126
|
-
end
|
127
|
-
|
128
|
-
comments = Comment.by_post_id :key => post.id
|
129
|
-
show comments
|
130
|
-
|
131
|
-
puts "That was too easy."
|
132
|
-
puts "We can even wrap it up in a finder on the Post class."
|
133
|
-
puts
|
134
|
-
|
135
|
-
class Post
|
136
|
-
def comments
|
137
|
-
Comment.by_post_id :key => id
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
show post.comments
|
142
|
-
puts "Gimme 5 minutes and I'll roll this into the framework. ;)"
|
143
|
-
puts
|
144
|
-
puts "There is a lot more that can be done with views, but a lot of the interesting stuff is joins, which of course range across types. We'll pick up where we left off, next time."
|
data/utils/remap.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'couchrest'
|
3
|
-
|
4
|
-
# set the source db and map view
|
5
|
-
source = CouchRest.new("http://127.0.0.1:5984").database('source-db')
|
6
|
-
source_view = 'mydesign/view-map'
|
7
|
-
|
8
|
-
# set the target db
|
9
|
-
target = CouchRest.new("http://127.0.0.1:5984").database('target-db')
|
10
|
-
|
11
|
-
|
12
|
-
pager = CouchRest::Pager.new(source)
|
13
|
-
|
14
|
-
# pager will yield once per uniq key in the source view
|
15
|
-
|
16
|
-
pager.key_reduce(source_view, 10000) do |key, values|
|
17
|
-
# create a doc from the key and the values
|
18
|
-
example_doc = {
|
19
|
-
:key => key,
|
20
|
-
:values => values.uniq
|
21
|
-
}
|
22
|
-
|
23
|
-
target.save(example_doc)
|
24
|
-
|
25
|
-
# keep us up to date with progress
|
26
|
-
puts k if (rand > 0.9)
|
27
|
-
end
|
data/utils/subset.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'couchrest'
|
3
|
-
|
4
|
-
# subset.rb replicates a percentage of a database to a fresh database.
|
5
|
-
# use it to create a smaller dataset on which to prototype views.
|
6
|
-
|
7
|
-
# specify the source database
|
8
|
-
source = CouchRest.new("http://127.0.0.1:5984").database('source-db')
|
9
|
-
|
10
|
-
# specify the target database
|
11
|
-
target = CouchRest.new("http://127.0.0.1:5984").database('target-db')
|
12
|
-
|
13
|
-
# pager efficiently yields all view rows
|
14
|
-
pager = CouchRest::Pager.new(source)
|
15
|
-
|
16
|
-
pager.all_docs(1000) do |rows|
|
17
|
-
docs = rows.collect do |r|
|
18
|
-
# the percentage of docs to clone
|
19
|
-
next if rand > 0.1
|
20
|
-
doc = source.get(r['id'])
|
21
|
-
doc.delete('_rev')
|
22
|
-
doc
|
23
|
-
end.compact
|
24
|
-
puts docs.length
|
25
|
-
next if docs.empty?
|
26
|
-
|
27
|
-
puts docs.first['_id']
|
28
|
-
target.bulk_save(docs)
|
29
|
-
end
|
30
|
-
|