chill 4 → 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/library/chill.rb +70 -23
- metadata +10 -10
data/library/chill.rb
CHANGED
@@ -37,8 +37,12 @@ module ChillDB
|
|
37
37
|
|
38
38
|
# get or make a document with a particular id/name, or just a blank new one
|
39
39
|
def document id = false
|
40
|
-
if id
|
41
|
-
|
40
|
+
if id.respond_to? :to_ary
|
41
|
+
list = id.to_ary.map { |i| i.to_s }
|
42
|
+
response = @@database.http('_all_docs?include_docs=true').post({ keys: list }.to_json)
|
43
|
+
ChillDB::List.load(JSON.parse(response), database: @@database)
|
44
|
+
elsif id.respond_to? :to_str
|
45
|
+
ChillDB::Document.load(@@database, id.to_str)
|
42
46
|
else
|
43
47
|
ChillDB::Document.new(@@database)
|
44
48
|
end
|
@@ -52,6 +56,12 @@ module ChillDB
|
|
52
56
|
return hash.commit! if hash.is_a? ChillDB::Document
|
53
57
|
return ChillDB::Document.new(@@database, hash).commit!
|
54
58
|
end
|
59
|
+
|
60
|
+
def open *args
|
61
|
+
headers = { accept: '*/*' }
|
62
|
+
headers.merge! args.pop if args.last.respond_to? :to_hash
|
63
|
+
@@database.http(args.map { |i| URI.escape(i, /[^a-z0-9_.-]/i) }.join('/'), headers)
|
64
|
+
end
|
55
65
|
end
|
56
66
|
|
57
67
|
class ChillDB::Database
|
@@ -80,8 +90,8 @@ class ChillDB::Database
|
|
80
90
|
#def revs_limit=(v); http('_revs_limit').put(v.to_s); end
|
81
91
|
|
82
92
|
# grab a RestClient http resource for this database
|
83
|
-
def http resource
|
84
|
-
RestClient::Resource.new((@url + resource).to_s, :
|
93
|
+
def http resource, headers = {}
|
94
|
+
RestClient::Resource.new((@url + resource).to_s, headers: {accept: 'application/json', content_type: 'application/json'}.merge(headers)) { |r| r }
|
85
95
|
end
|
86
96
|
|
87
97
|
private
|
@@ -110,7 +120,7 @@ class ChillDB::IndifferentHash < Hash
|
|
110
120
|
|
111
121
|
# getters and setters for hash items
|
112
122
|
def method_missing name, *args
|
113
|
-
return self[name.to_s] if self
|
123
|
+
return self[name.to_s] if self.key? name.to_s
|
114
124
|
return self[name.to_s[0...-1]] = args.first if name.to_s.end_with? '=' and args.length == 1
|
115
125
|
super
|
116
126
|
end
|
@@ -153,7 +163,7 @@ class ChillDB::IndifferentHash < Hash
|
|
153
163
|
end
|
154
164
|
|
155
165
|
def normalize thing
|
156
|
-
return ChillDB::IndifferentHash.new.replace(thing) if thing.is_a?
|
166
|
+
return ChillDB::IndifferentHash.new.replace(thing) if thing.respond_to? :to_hash unless thing.is_a? self.class
|
157
167
|
return thing.map { |i| normalize(i) } if thing.is_a? Array
|
158
168
|
return thing;
|
159
169
|
end
|
@@ -234,6 +244,11 @@ class ChillDB::Document < ChillDB::IndifferentHash
|
|
234
244
|
json = JSON.parse(request.body)
|
235
245
|
json['_revisions']['ids']
|
236
246
|
end
|
247
|
+
|
248
|
+
# for integration with url routers in webapps, to_param defaults to _id - which you can use straight up in urls
|
249
|
+
def to_param
|
250
|
+
self['_id']
|
251
|
+
end
|
237
252
|
end
|
238
253
|
|
239
254
|
|
@@ -244,9 +259,36 @@ end
|
|
244
259
|
class ChillDB::List < Array
|
245
260
|
attr_accessor :total_rows, :offset, :database
|
246
261
|
|
262
|
+
# creates a new List from a couchdb response
|
263
|
+
def self.load list, extras = {}
|
264
|
+
new_list = self.new
|
265
|
+
|
266
|
+
raise "#{list['error']} - #{list['reason']}" if list['error']
|
267
|
+
[extras, list].each do |properties|
|
268
|
+
properties.each do |key, value|
|
269
|
+
new_list.send("#{key}=", value)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
return new_list
|
274
|
+
end
|
275
|
+
|
247
276
|
# store rows nicely in mah belleh
|
248
277
|
def rows=(arr)
|
249
|
-
self.replace
|
278
|
+
self.replace(arr.map { |item|
|
279
|
+
if item['value'].is_a? Hash
|
280
|
+
if item['value'].respond_to?(:[]) && item['value']['_id']
|
281
|
+
item['value']['_id'] ||= item['id']
|
282
|
+
item['value'] = ChillDB::Document.new(@database, item['value'])
|
283
|
+
else
|
284
|
+
item['value'] = ChillDB::IndifferentHash.new.replace(item['value'])
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
item['doc'] = ChillDB::Document.new(@database, item['doc']) if item['doc']
|
289
|
+
|
290
|
+
item
|
291
|
+
})
|
250
292
|
end
|
251
293
|
|
252
294
|
# we are the rows!
|
@@ -267,13 +309,27 @@ class ChillDB::List < Array
|
|
267
309
|
end
|
268
310
|
|
269
311
|
def docs
|
270
|
-
self.map { |i| i['doc']
|
312
|
+
self.map { |i| i['doc'] }
|
271
313
|
end
|
272
314
|
|
273
315
|
def each_pair &proc
|
274
316
|
self.each { |item| proc.call(item['key'], item['value']) }
|
275
317
|
end
|
276
318
|
|
319
|
+
# gets an item by id value
|
320
|
+
def id value
|
321
|
+
self.find { |i| i['id'] == value }['doc']
|
322
|
+
end
|
323
|
+
|
324
|
+
def key value
|
325
|
+
self.find { |i| i['key'] == value }
|
326
|
+
end
|
327
|
+
|
328
|
+
def [] key
|
329
|
+
return key(key)['doc'] unless key.respond_to? :to_int
|
330
|
+
super
|
331
|
+
end
|
332
|
+
|
277
333
|
# make a regular ruby hash version
|
278
334
|
# if you want docs as values instead of emitted values, use to_h(:doc)
|
279
335
|
def to_h value = :value
|
@@ -285,16 +341,15 @@ class ChillDB::List < Array
|
|
285
341
|
|
286
342
|
return hash
|
287
343
|
end
|
288
|
-
alias_method :to_hash, :to_h
|
289
344
|
|
290
345
|
# remove all the documents in this list from the database
|
291
346
|
def delete_all!
|
292
|
-
each
|
293
|
-
raise "
|
294
|
-
|
347
|
+
each do |item|
|
348
|
+
raise "Some (all?) items in list do not contain _rev properties in their values" unless item['value']['_rev']
|
349
|
+
end
|
295
350
|
|
296
351
|
request = { docs: map { |item|
|
297
|
-
{ _id: item
|
352
|
+
{ _id: item['value']['_id'] || item['id'], _rev: item['value']['_rev'], _deleted: true }
|
298
353
|
} }
|
299
354
|
|
300
355
|
response = JSON.parse @database.http("_bulk_docs").post(request.to_json)
|
@@ -364,17 +419,9 @@ class ChillDB::Design
|
|
364
419
|
opts = options.map { |key, value| "#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}" }.join('&')
|
365
420
|
url = "_design/#{URI.escape @name}/_view/#{URI.escape view.to_s}?#{opts}"
|
366
421
|
response = @database.http(url).get()
|
367
|
-
json = JSON.parse response.body
|
368
|
-
raise "#{json['error']} - #{json['reason']} @ #{url}" if json['error']
|
369
|
-
|
370
|
-
# put the results in to a QueryResults object - a glorified array
|
371
|
-
results = ChillDB::List.new
|
372
|
-
results.database = @database
|
373
|
-
json.each do |key, value|
|
374
|
-
results.send("#{key}=", value)
|
375
|
-
end
|
376
422
|
|
377
|
-
|
423
|
+
# put the results in to a QueryResults object - a glorified array
|
424
|
+
return ChillDB::List.load(JSON.parse(response.body), database: @database)
|
378
425
|
end
|
379
426
|
|
380
427
|
private
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chill
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '5'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-10-
|
12
|
+
date: 2011-10-31 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70177568025240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.
|
21
|
+
version: 1.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70177568025240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rest-client
|
27
|
-
requirement: &
|
27
|
+
requirement: &70177568024660 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.6.7
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70177568024660
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: uuid
|
38
|
-
requirement: &
|
38
|
+
requirement: &70177568024180 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 2.3.4
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70177568024180
|
47
47
|
description: A little library to talk to a couchdb. I made it skinny, because couchdb
|
48
48
|
is very simple. I think that's a good thing.
|
49
49
|
email: a@creativepony.com
|
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
72
|
version: '0'
|
73
73
|
requirements: []
|
74
74
|
rubyforge_project:
|
75
|
-
rubygems_version: 1.8.
|
75
|
+
rubygems_version: 1.8.10
|
76
76
|
signing_key:
|
77
77
|
specification_version: 3
|
78
78
|
summary: A tiny plug to hook ruby in to couchdb
|