dolly 0.5.7 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dolly/document.rb +3 -1
- data/lib/dolly/name_space.rb +4 -3
- data/lib/dolly/query.rb +17 -11
- data/lib/dolly/request.rb +5 -0
- data/lib/dolly/version.rb +1 -1
- data/lib/tasks/db.rake +1 -23
- data/test/document_test.rb +29 -14
- data/test/dummy/log/test.log +11508 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f310bb10ff18ec990f101c2f6ad8470ba4ecfe24
|
4
|
+
data.tar.gz: 25ac2e2e160160ddb1fbab3ec95d0554772fe4c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 190ec76bedcb882c2ca6e66e4f791861ad66773308f3994d664b9e3af301751924cb551c89bee17ac123984a45ebcd4e1aac3f88a8f2ff24b216efe10d590092
|
7
|
+
data.tar.gz: 54397eca72bcd6f50ab064e94cde974f48f6d5b5348a8e8eebe22b22aa92b8c225908444203ff041c13453306394b8c562584b15c67f2c513f222d40a7571c85
|
data/lib/dolly/document.rb
CHANGED
@@ -93,7 +93,8 @@ module Dolly
|
|
93
93
|
property = Property.new(options)
|
94
94
|
|
95
95
|
define_method(name) do
|
96
|
-
|
96
|
+
key = name.to_s
|
97
|
+
property.value = @doc.has_key?(key) ? @doc[key] : default_value
|
97
98
|
property.value
|
98
99
|
end
|
99
100
|
|
@@ -115,6 +116,7 @@ module Dolly
|
|
115
116
|
end
|
116
117
|
|
117
118
|
def init_properties options = {}
|
119
|
+
raise Dolly::ResourceNotFound if options['error'] == 'not_found'
|
118
120
|
#TODO: right now not listed properties will be ignored
|
119
121
|
options.each do |k, v|
|
120
122
|
next unless respond_to? :"#{k}="
|
data/lib/dolly/name_space.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "active_model/naming"
|
2
2
|
|
3
|
+
#TODO: remove this module to be part of Dolly::Document
|
3
4
|
module Dolly
|
4
5
|
module NameSpace
|
5
6
|
include ActiveModel::Naming
|
@@ -9,12 +10,12 @@ module Dolly
|
|
9
10
|
end
|
10
11
|
|
11
12
|
def base_id id
|
12
|
-
|
13
|
-
id.
|
13
|
+
id = URI.unescape id
|
14
|
+
id.sub %r~^#{name_paramitized}/~, ''
|
14
15
|
end
|
15
16
|
|
16
17
|
def namespace id
|
17
|
-
return id if id =~
|
18
|
+
return id if id =~ %r~^#{name_paramitized}/~
|
18
19
|
"#{name_paramitized}/#{id}"
|
19
20
|
end
|
20
21
|
end
|
data/lib/dolly/query.rb
CHANGED
@@ -12,9 +12,14 @@ module Dolly
|
|
12
12
|
|
13
13
|
DESIGN_DOC = "dolly"
|
14
14
|
|
15
|
-
def find *
|
16
|
-
|
17
|
-
|
15
|
+
def find *keys
|
16
|
+
query_hash = { keys: keys.map{|key| namespace key} }
|
17
|
+
|
18
|
+
if keys.count > 1
|
19
|
+
build_collection( query_hash )
|
20
|
+
else
|
21
|
+
self.new.from_json( database.all_docs(query_hash).parsed_response )
|
22
|
+
end
|
18
23
|
rescue NoMethodError => err
|
19
24
|
if err.message == "undefined method `[]' for nil:NilClass"
|
20
25
|
raise Dolly::ResourceNotFound
|
@@ -23,22 +28,26 @@ module Dolly
|
|
23
28
|
end
|
24
29
|
end
|
25
30
|
|
31
|
+
def default_query_args
|
32
|
+
{startkey: "#{name_paramitized}/", endkey: "#{name_paramitized}/{}"}
|
33
|
+
end
|
34
|
+
|
26
35
|
def all
|
27
|
-
build_collection
|
36
|
+
build_collection default_query_args
|
28
37
|
end
|
29
38
|
|
30
39
|
def first limit = 1
|
31
|
-
res = build_collection
|
40
|
+
res = build_collection default_query_args.merge( limit: 1)
|
32
41
|
limit == 1 ? res.first : res
|
33
42
|
end
|
34
43
|
|
35
44
|
def last limit = 1
|
36
|
-
res = build_collection
|
45
|
+
res = build_collection({startkey: default_query_args[:endkey], endkey: default_query_args[:startkey], limit: limit, descending: true})
|
37
46
|
limit == 1 ? res.first : res
|
38
47
|
end
|
39
48
|
|
40
49
|
def build_collection q
|
41
|
-
res =
|
50
|
+
res = database.all_docs(q)
|
42
51
|
Collection.new res.parsed_response, name.constantize
|
43
52
|
end
|
44
53
|
|
@@ -47,10 +56,6 @@ module Dolly
|
|
47
56
|
Collection.new res.parsed_response, name.constantize
|
48
57
|
end
|
49
58
|
|
50
|
-
def default_view options = {}
|
51
|
-
view default_doc, options
|
52
|
-
end
|
53
|
-
|
54
59
|
def view doc, options = {}
|
55
60
|
options.merge! include_docs: true
|
56
61
|
database.get doc, options
|
@@ -69,5 +74,6 @@ module Dolly
|
|
69
74
|
def self.included(base)
|
70
75
|
base.extend ClassMethods
|
71
76
|
end
|
77
|
+
|
72
78
|
end
|
73
79
|
end
|
data/lib/dolly/request.rb
CHANGED
data/lib/dolly/version.rb
CHANGED
data/lib/tasks/db.rake
CHANGED
@@ -1,30 +1,8 @@
|
|
1
1
|
namespace :db do
|
2
2
|
desc "Will create if missing database and add default views"
|
3
3
|
task setup: :environment do
|
4
|
-
FIND_VIEW = { "find" => { "map" => "(d)->\n if d._id\n [str, t, id] = d._id.match /([^/]+)[/](.+)/\n emit [t, id], 1 if t and id"} }
|
5
|
-
|
6
|
-
default_doc = {
|
7
|
-
"language" => "coffeescript",
|
8
|
-
"views" => FIND_VIEW
|
9
|
-
}.freeze
|
10
|
-
|
11
4
|
Dolly::Document.database.put "", nil
|
12
|
-
|
13
|
-
remote_doc = begin
|
14
|
-
JSON.parse Dolly::Document.database.get(Dolly::Document.design_doc).parsed_response
|
15
|
-
rescue Dolly::ResourceNotFound
|
16
|
-
nil
|
17
|
-
end
|
18
|
-
|
19
|
-
doc = if remote_doc
|
20
|
-
remote_doc["views"].merge! FIND_VIEW
|
21
|
-
remote_doc
|
22
|
-
else
|
23
|
-
default_doc
|
24
|
-
end
|
25
|
-
|
26
|
-
res = Dolly::Document.database.put Dolly::Document.design_doc, doc.to_json
|
27
|
-
puts "design document #{Dolly::Document.design_doc} was created/updated."
|
5
|
+
puts "Database created"
|
28
6
|
end
|
29
7
|
|
30
8
|
desc "Will update design document with what is on db/designs/*.coffee"
|
data/test/document_test.rb
CHANGED
@@ -9,8 +9,7 @@ class FooBar < Dolly::Document
|
|
9
9
|
end
|
10
10
|
|
11
11
|
class DocumentTest < ActiveSupport::TestCase
|
12
|
-
DB_BASE_PATH = "http://localhost:5984/test
|
13
|
-
VIEW_DOC = "find".freeze
|
12
|
+
DB_BASE_PATH = "http://localhost:5984/test".freeze
|
14
13
|
|
15
14
|
def setup
|
16
15
|
data = {foo: 'Foo', bar: 'Bar', type: 'foo_bar'}
|
@@ -19,17 +18,24 @@ class DocumentTest < ActiveSupport::TestCase
|
|
19
18
|
|
20
19
|
view_resp = build_view_response [data]
|
21
20
|
empty_resp = build_view_response []
|
21
|
+
not_found_resp = generic_response [{ key: "foo_bar/2", error: "not_found" }]
|
22
22
|
@multi_resp = build_view_response all_docs
|
23
23
|
|
24
24
|
build_request [["foo_bar","1"]], view_resp
|
25
25
|
build_request [["foo_bar","2"]], empty_resp
|
26
26
|
build_request [["foo_bar","1"],["foo_bar","2"]], @multi_resp
|
27
27
|
|
28
|
-
|
29
|
-
FakeWeb.register_uri :get, "#{
|
30
|
-
FakeWeb.register_uri :get, "#{
|
31
|
-
FakeWeb.register_uri :get, "#{
|
32
|
-
FakeWeb.register_uri :get, "#{
|
28
|
+
#TODO: Mock Dolly::Request to return helper with expected response. request builder can be tested by itself.
|
29
|
+
FakeWeb.register_uri :get, "#{query_base_path}?startkey=%22foo_bar%2F%22&endkey=%22foo_bar%2F%7B%7D%22&include_docs=true", body: @multi_resp.to_json
|
30
|
+
FakeWeb.register_uri :get, "#{query_base_path}?startkey=%22foo_bar%2F%22&endkey=%22foo_bar%2F%7B%7D%22&limit=1&include_docs=true", body: view_resp.to_json
|
31
|
+
FakeWeb.register_uri :get, "#{query_base_path}?endkey=%22foo_bar%2F%22&startkey=%22foo_bar%2F%7B%7D%22&limit=1&descending=true&include_docs=true", body: view_resp.to_json
|
32
|
+
FakeWeb.register_uri :get, "#{query_base_path}?startkey=%22foo_bar%2F%22&endkey=%22foo_bar%22%2C%7B%7D&limit=2&include_docs=true", body: @multi_resp.to_json
|
33
|
+
FakeWeb.register_uri :get, "#{query_base_path}?endkey=%22foo_bar%2F%22&startkey=%22foo_bar%2F%7B%7D%22&limit=2&descending=true&include_docs=true", body: @multi_resp.to_json
|
34
|
+
FakeWeb.register_uri :get, "#{query_base_path}?keys=%5B%22foo_bar%2F1%22%5D&include_docs=true", body: view_resp.to_json
|
35
|
+
FakeWeb.register_uri :get, "#{query_base_path}?keys=%5B%5D&include_docs=true", body: not_found_resp.to_json
|
36
|
+
FakeWeb.register_uri :get, "#{query_base_path}?keys=%5B%22foo_bar%2Ferror%22%5D&include_docs=true", body: 'error', status: ["500", "Error"]
|
37
|
+
FakeWeb.register_uri :get, "#{query_base_path}?keys=%5B%22foo_bar%2F1%22%2C%22foo_bar%2F2%22%5D&include_docs=true", body: @multi_resp.to_json
|
38
|
+
FakeWeb.register_uri :get, "#{query_base_path}?keys=%5B%22foo_bar%2F2%22%5D&include_docs=true", body: not_found_resp.to_json
|
33
39
|
end
|
34
40
|
|
35
41
|
test 'with timestamps!' do
|
@@ -62,15 +68,15 @@ class DocumentTest < ActiveSupport::TestCase
|
|
62
68
|
|
63
69
|
test 'empty find should raise error' do
|
64
70
|
assert_raise Dolly::ResourceNotFound do
|
65
|
-
FakeWeb.register_uri :get, "#{
|
71
|
+
FakeWeb.register_uri :get, "#{query_base_path}?keys=%5B%5D&include_docs=true", :status => ["404", "Not Found"]
|
66
72
|
foo = FooBar.find
|
67
73
|
end
|
68
74
|
end
|
69
75
|
|
70
76
|
test 'error on server raises Dolly::ServerError' do
|
71
77
|
assert_raise Dolly::ServerError do
|
72
|
-
FakeWeb.register_uri :get, "#{
|
73
|
-
foo = FooBar.find
|
78
|
+
FakeWeb.register_uri :get, "#{query_base_path}?keys=", :status => ["500", "Error"]
|
79
|
+
foo = FooBar.find 'error'
|
74
80
|
end
|
75
81
|
end
|
76
82
|
|
@@ -100,6 +106,11 @@ class DocumentTest < ActiveSupport::TestCase
|
|
100
106
|
assert_equal false, foo.respond_to?(:type)
|
101
107
|
end
|
102
108
|
|
109
|
+
test 'can find with fixnum id' do
|
110
|
+
foo = FooBar.find 1
|
111
|
+
assert_equal 'Foo', foo.foo
|
112
|
+
end
|
113
|
+
|
103
114
|
test 'with default will return default value on nil' do
|
104
115
|
foo = FooBar.find "1"
|
105
116
|
assert_equal 1, foo.with_default
|
@@ -201,6 +212,10 @@ class DocumentTest < ActiveSupport::TestCase
|
|
201
212
|
end
|
202
213
|
|
203
214
|
private
|
215
|
+
def generic_response rows, count = 1
|
216
|
+
{total_rows: count, offset:0, rows: rows}
|
217
|
+
end
|
218
|
+
|
204
219
|
def build_view_response properties
|
205
220
|
rows = properties.map.with_index do |v, i|
|
206
221
|
{
|
@@ -210,16 +225,16 @@ class DocumentTest < ActiveSupport::TestCase
|
|
210
225
|
doc: {_id: "foo_bar/#{i}", _rev: SecureRandom.hex}.merge!(v)
|
211
226
|
}
|
212
227
|
end
|
213
|
-
|
228
|
+
generic_response rows, properties.count
|
214
229
|
end
|
215
230
|
|
216
231
|
def build_request keys, body, view_name = 'foo_bar'
|
217
232
|
query = "keys=#{CGI::escape keys.to_s.gsub(' ','')}&" unless keys.blank?
|
218
|
-
FakeWeb.register_uri :get, "#{
|
233
|
+
FakeWeb.register_uri :get, "#{query_base_path}?#{query.to_s}include_docs=true", body: body.to_json
|
219
234
|
end
|
220
235
|
|
221
|
-
def
|
222
|
-
"#{DB_BASE_PATH}
|
236
|
+
def query_base_path
|
237
|
+
"#{DB_BASE_PATH}/_all_docs"
|
223
238
|
end
|
224
239
|
|
225
240
|
end
|