couch-quilt 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/couch-quilt.gemspec +8 -5
- data/lib/couchquilt.rb +1 -0
- data/lib/couchquilt/fs.rb +15 -78
- data/lib/couchquilt/mapper.rb +75 -0
- data/lib/couchquilt/version.rb +1 -1
- data/spec/{couchquilt_spec.rb → couchquilt/fs_spec.rb} +61 -37
- data/spec/couchquilt/mapper_spec.rb +184 -0
- metadata +7 -4
data/Rakefile
CHANGED
data/couch-quilt.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{couch-quilt}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Johannes J\303\266rg Schmidt"]
|
12
|
-
s.date = %q{2010-02-
|
12
|
+
s.date = %q{2010-02-26}
|
13
13
|
s.default_executable = %q{couchquilt}
|
14
14
|
s.description = %q{Access CouchDB JSON documents from filesystem.}
|
15
15
|
s.email = %q{schmidt@netzmerk.com}
|
@@ -28,8 +28,10 @@ Gem::Specification.new do |s|
|
|
28
28
|
"lib/couchquilt/couch_client.rb",
|
29
29
|
"lib/couchquilt/debugged_fs.rb",
|
30
30
|
"lib/couchquilt/fs.rb",
|
31
|
+
"lib/couchquilt/mapper.rb",
|
31
32
|
"lib/couchquilt/version.rb",
|
32
|
-
"spec/
|
33
|
+
"spec/couchquilt/fs_spec.rb",
|
34
|
+
"spec/couchquilt/mapper_spec.rb",
|
33
35
|
"spec/spec_helper.rb"
|
34
36
|
]
|
35
37
|
s.homepage = %q{http://jo.github.com/quilt}
|
@@ -39,8 +41,9 @@ Gem::Specification.new do |s|
|
|
39
41
|
s.rubygems_version = %q{1.3.5}
|
40
42
|
s.summary = %q{Access CouchDB from filesystem.}
|
41
43
|
s.test_files = [
|
42
|
-
"spec/
|
43
|
-
"spec/
|
44
|
+
"spec/spec_helper.rb",
|
45
|
+
"spec/couchquilt/fs_spec.rb",
|
46
|
+
"spec/couchquilt/mapper_spec.rb"
|
44
47
|
]
|
45
48
|
|
46
49
|
if s.respond_to? :specification_version then
|
data/lib/couchquilt.rb
CHANGED
data/lib/couchquilt/fs.rb
CHANGED
@@ -3,6 +3,8 @@ require 'uri'
|
|
3
3
|
|
4
4
|
module Couchquilt
|
5
5
|
class FS
|
6
|
+
include Mapper
|
7
|
+
|
6
8
|
# initializes Quilt FS with the database server name
|
7
9
|
def initialize(server_name)
|
8
10
|
@couch = CouchClient.new(server_name)
|
@@ -101,13 +103,13 @@ module Couchquilt
|
|
101
103
|
|
102
104
|
content case named_path(path)
|
103
105
|
when :database_info
|
104
|
-
@couch.get(database)[
|
106
|
+
@couch.get(database)[key_for(id)]
|
105
107
|
when :show_function_result
|
106
108
|
parts.shift
|
107
|
-
@couch.get(
|
109
|
+
@couch.get(key_for(File.join(database, id, "_show", *parts)))
|
108
110
|
when :list_function_result
|
109
111
|
parts.shift
|
110
|
-
@couch.get(
|
112
|
+
@couch.get(key_for(File.join(database, id, "_list", *parts)))
|
111
113
|
when :view_function_result
|
112
114
|
get_view_result_part(database, id, parts)
|
113
115
|
when :uuid
|
@@ -134,11 +136,12 @@ module Couchquilt
|
|
134
136
|
|
135
137
|
# writes content str to path
|
136
138
|
def write_to(path, str)
|
139
|
+
str.strip!
|
137
140
|
database, id, *parts = extract_parts(path)
|
138
141
|
# fetch document
|
139
142
|
doc = @couch.get("#{database}/#{id}")
|
140
143
|
# update the value that the file at path holds
|
141
|
-
|
144
|
+
map_fs(doc, parts, str)
|
142
145
|
# save document
|
143
146
|
@couch.put("#{database}/#{id}", doc)
|
144
147
|
end
|
@@ -163,7 +166,7 @@ module Couchquilt
|
|
163
166
|
# fetch document
|
164
167
|
doc = @couch.get("#{database}/#{id}")
|
165
168
|
# remove object
|
166
|
-
|
169
|
+
map_fs(doc, parts, nil)
|
167
170
|
# save document
|
168
171
|
@couch.put("#{database}/#{id}", doc)
|
169
172
|
end
|
@@ -197,7 +200,7 @@ module Couchquilt
|
|
197
200
|
# fetch document
|
198
201
|
doc = @couch.get("#{database}/#{id}")
|
199
202
|
# insert empty object
|
200
|
-
|
203
|
+
map_fs(doc, parts)
|
201
204
|
# save document
|
202
205
|
@couch.put("#{database}/#{id}", doc)
|
203
206
|
end
|
@@ -223,7 +226,7 @@ module Couchquilt
|
|
223
226
|
# fetch document
|
224
227
|
doc = @couch.get("#{database}/#{id}")
|
225
228
|
# remove object
|
226
|
-
|
229
|
+
map_fs(doc, parts, nil)
|
227
230
|
# save document
|
228
231
|
@couch.put("#{database}/#{id}", doc)
|
229
232
|
end
|
@@ -316,21 +319,10 @@ module Couchquilt
|
|
316
319
|
end
|
317
320
|
end
|
318
321
|
|
319
|
-
# maps json contents into contents array
|
320
|
-
def map_json(doc)
|
321
|
-
case doc
|
322
|
-
when Hash
|
323
|
-
# Hash is mapped to directory
|
324
|
-
doc.keys.sort.map { |k| append_extname(k, doc[k]) }
|
325
|
-
when Array
|
326
|
-
# Array is mapped to directory
|
327
|
-
doc.map { |k| append_extname(doc.index(k), k) }
|
328
|
-
end
|
329
|
-
end
|
330
|
-
|
331
322
|
# fetch part of document
|
332
323
|
def get_document_part(database, id, parts = [])
|
333
324
|
doc = @couch.get("#{database}/#{id}")
|
325
|
+
parts.map! { |p| key_for p }
|
334
326
|
get_part(doc, parts)
|
335
327
|
end
|
336
328
|
|
@@ -339,76 +331,21 @@ module Couchquilt
|
|
339
331
|
a, view_function_name, *rest = parts
|
340
332
|
view = [id.sub("_design/", ""), "_view", view_function_name].join("/")
|
341
333
|
doc = @couch.get("#{database}/_design/#{view}")
|
334
|
+
rest.map! { |p| key_for p }
|
342
335
|
get_part(doc, rest)
|
343
336
|
end
|
344
337
|
|
345
338
|
# get a part of the document
|
346
339
|
# eg: get_part({ :a => { :b => :c}}, [:a, :b]) #=> :c
|
347
|
-
|
348
|
-
def get_part(doc, parts)
|
340
|
+
def get_part(doc, keys = [])
|
349
341
|
return if doc.nil?
|
350
342
|
doc = doc.dup
|
351
|
-
|
352
|
-
|
353
|
-
when Hash
|
354
|
-
doc = doc[remove_extname(part)]
|
355
|
-
when Array
|
356
|
-
doc = doc[part.to_i]
|
357
|
-
end
|
343
|
+
keys.each do |key|
|
344
|
+
doc = doc[key]
|
358
345
|
end
|
359
346
|
doc
|
360
347
|
end
|
361
348
|
|
362
|
-
# updates a part of a hash
|
363
|
-
# Example:
|
364
|
-
# update_value({:a => { :b => 'c'}}, [:a, :b], 'cis') #=> {:a => { :b => 'cis'}}
|
365
|
-
def update_value(hash, keys, value)
|
366
|
-
key = remove_extname(keys.shift)
|
367
|
-
if keys.empty?
|
368
|
-
hash[key] = value
|
369
|
-
else
|
370
|
-
hash[key] = update_value(hash[key], keys, value)
|
371
|
-
end
|
372
|
-
hash
|
373
|
-
end
|
374
|
-
|
375
|
-
# removes an object from a hash
|
376
|
-
# Example:
|
377
|
-
# remove_object({:a => { :b => 'c'}}, [:a, :b]) #=> {:a => { }}
|
378
|
-
def remove_object(hash, keys)
|
379
|
-
key = remove_extname(keys.shift)
|
380
|
-
if keys.empty?
|
381
|
-
hash.delete(key)
|
382
|
-
else
|
383
|
-
hash[key] = remove_object(hash[key], keys)
|
384
|
-
end
|
385
|
-
hash
|
386
|
-
end
|
387
|
-
|
388
|
-
# remove extname to get the id
|
389
|
-
def remove_extname(filename)
|
390
|
-
filename.sub(/((\.(f|i|b))?\.js|\.html)\z/, "")
|
391
|
-
end
|
392
|
-
|
393
|
-
# Appends extname, that is: builds a filename from key and value.
|
394
|
-
# Note: values are casted by extension.
|
395
|
-
def append_extname(key, value)
|
396
|
-
basename = key.is_a?(Integer) ? "%di" % key : key
|
397
|
-
|
398
|
-
case value
|
399
|
-
when Float
|
400
|
-
"#{basename}.f.js"
|
401
|
-
when Integer
|
402
|
-
"#{basename}.i.js"
|
403
|
-
when nil, String
|
404
|
-
"#{basename}.js"
|
405
|
-
when true, false
|
406
|
-
"#{basename}.b.js"
|
407
|
-
else
|
408
|
-
basename
|
409
|
-
end
|
410
|
-
end
|
411
|
-
|
412
349
|
# escapes the value for using as filename
|
413
350
|
def list(array)
|
414
351
|
return [] if array.nil?
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Couchquilt
|
2
|
+
module Mapper
|
3
|
+
# regexp to check wheather a key should be mapped as part of an array
|
4
|
+
ARRAY_MAPPING = /\A\d+i(\.js)?\z/
|
5
|
+
|
6
|
+
# maps json contents into contents array
|
7
|
+
def map_json(json = {})
|
8
|
+
case json
|
9
|
+
when Hash
|
10
|
+
json.keys.sort.map { |k| name_for(k, json[k]) }
|
11
|
+
when Array
|
12
|
+
# using zip for backwards compatibily:
|
13
|
+
# in Ruby 1.9 (and 1.8.7) we could simply use
|
14
|
+
# json.each_with_index.map { |k,i| ... }
|
15
|
+
json.zip((0..json.size).to_a).map { |v,i| name_for(i, v) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# recursively updates a part of a json hash from fs
|
20
|
+
def map_fs(json, keys = [], value = :empty)
|
21
|
+
return {} if keys.empty?
|
22
|
+
|
23
|
+
insert_as_array = keys.last =~ /.+\.array\Z/
|
24
|
+
key = key_for(keys.shift)
|
25
|
+
if keys.empty?
|
26
|
+
if value.nil? && json.is_a?(Hash)
|
27
|
+
json.delete key
|
28
|
+
elsif value.nil? && json.is_a?(Array)
|
29
|
+
json.delete_at key
|
30
|
+
elsif value == :empty && insert_as_array
|
31
|
+
json[key] = []
|
32
|
+
elsif value == :empty
|
33
|
+
json[key] = {}
|
34
|
+
else
|
35
|
+
json[key] = value
|
36
|
+
end
|
37
|
+
else
|
38
|
+
json[key] = map_fs(json[key], keys, value)
|
39
|
+
end
|
40
|
+
|
41
|
+
json
|
42
|
+
end
|
43
|
+
|
44
|
+
# remove fs mapping extnames
|
45
|
+
# and converts array entry mappings
|
46
|
+
def key_for(name)
|
47
|
+
if name =~ ARRAY_MAPPING
|
48
|
+
name.to_i
|
49
|
+
else
|
50
|
+
name.sub(/((\.(f|i|b))?\.js|\.html|\.array)\z/, "")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Appends extname, that is: builds a filename from key and value.
|
55
|
+
# Note: values are casted by extension.
|
56
|
+
def name_for(key, value = nil)
|
57
|
+
basename = key.is_a?(Integer) ? "%di" % key : key.to_s
|
58
|
+
|
59
|
+
case value
|
60
|
+
when Array
|
61
|
+
"#{basename}.array"
|
62
|
+
when Float
|
63
|
+
"#{basename}.f.js"
|
64
|
+
when Integer
|
65
|
+
"#{basename}.i.js"
|
66
|
+
when nil, String
|
67
|
+
"#{basename}.js"
|
68
|
+
when true, false
|
69
|
+
"#{basename}.b.js"
|
70
|
+
else
|
71
|
+
basename
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/couchquilt/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
1
|
+
require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
2
2
|
|
3
3
|
# Note: databases, documents and keys with slashes are not supported by now
|
4
|
-
describe
|
4
|
+
describe Couchquilt::FS do
|
5
5
|
before :all do
|
6
6
|
RestClient.put(File.join(SERVER_NAME, TESTDB), nil)
|
7
7
|
|
@@ -171,7 +171,7 @@ describe "Quilt" do
|
|
171
171
|
@quilt.file?("/#{TESTDB}/document_id").should be_false
|
172
172
|
end
|
173
173
|
it "contents should list documents content" do
|
174
|
-
@quilt.contents("/#{TESTDB}/document_id").should == ["_id.js", "_rev.js", "array", "boolean.b.js", "empty", "float.f.js", "integer.i.js", "name.js", "object"]
|
174
|
+
@quilt.contents("/#{TESTDB}/document_id").should == ["_id.js", "_rev.js", "array.array", "boolean.b.js", "empty", "float.f.js", "integer.i.js", "name.js", "object"]
|
175
175
|
end
|
176
176
|
it "can_mkdir? should return false" do
|
177
177
|
@quilt.can_mkdir?("/#{TESTDB}/document_id").should be_false
|
@@ -265,7 +265,7 @@ describe "Quilt" do
|
|
265
265
|
it "write_to should update document" do
|
266
266
|
@quilt.write_to("/#{TESTDB}/document_id/boolean.b.js", "value").should be_true
|
267
267
|
end
|
268
|
-
it "can_delete? should return
|
268
|
+
it "can_delete? should return true" do
|
269
269
|
@quilt.can_delete?("/#{TESTDB}/document_id/boolean.b.js").should be_true
|
270
270
|
end
|
271
271
|
it "delete should update document" do
|
@@ -295,21 +295,45 @@ describe "Quilt" do
|
|
295
295
|
end
|
296
296
|
|
297
297
|
# /database_id/document_id/array
|
298
|
-
describe "array/" do
|
298
|
+
describe "array.array/" do
|
299
299
|
it "directory? should return true" do
|
300
|
-
@quilt.directory?("/#{TESTDB}/document_id/array").should be_true
|
300
|
+
@quilt.directory?("/#{TESTDB}/document_id/array.array").should be_true
|
301
301
|
end
|
302
302
|
it "file? should return false" do
|
303
|
-
@quilt.file?("/#{TESTDB}/document_id/array").should be_false
|
303
|
+
@quilt.file?("/#{TESTDB}/document_id/array.array").should be_false
|
304
304
|
end
|
305
305
|
it "contents should list array content" do
|
306
|
-
@quilt.contents("/#{TESTDB}/document_id/array").should == ["0i.js"]
|
306
|
+
@quilt.contents("/#{TESTDB}/document_id/array.array").should == ["0i.js"]
|
307
307
|
end
|
308
308
|
it "can_mkdir? should return false" do
|
309
|
-
@quilt.can_mkdir?("/#{TESTDB}/document_id/array").should be_false
|
309
|
+
@quilt.can_mkdir?("/#{TESTDB}/document_id/array.array").should be_false
|
310
310
|
end
|
311
311
|
it "can_rmdir? should return false when not empty" do
|
312
|
-
@quilt.can_rmdir?("/#{TESTDB}/document_id/array").should be_false
|
312
|
+
@quilt.can_rmdir?("/#{TESTDB}/document_id/array.array").should be_false
|
313
|
+
end
|
314
|
+
describe "0i.js" do
|
315
|
+
it "directory? should return false" do
|
316
|
+
@quilt.directory?("/#{TESTDB}/document_id/array.array/0i.js").should be_false
|
317
|
+
end
|
318
|
+
it "file? should return true" do
|
319
|
+
@quilt.file?("/#{TESTDB}/document_id/array.array/0i.js").should be_true
|
320
|
+
end
|
321
|
+
it "read_file should return contents" do
|
322
|
+
@quilt.read_file("/#{TESTDB}/document_id/array.array/0i.js").should == @document["array"].first
|
323
|
+
end
|
324
|
+
it "can_write? should return true" do
|
325
|
+
@quilt.can_write?("/#{TESTDB}/document_id/array.array/0i.js").should be_true
|
326
|
+
end
|
327
|
+
it "write_to should update document" do
|
328
|
+
@quilt.write_to("/#{TESTDB}/document_id/array.array/0i.js", "value").should be_true
|
329
|
+
end
|
330
|
+
it "can_delete? should return true" do
|
331
|
+
@quilt.can_delete?("/#{TESTDB}/document_id/array.array/0i.js").should be_true
|
332
|
+
end
|
333
|
+
it "delete should update document" do
|
334
|
+
@quilt.delete("/#{TESTDB}/document_id/array.array/0i.js").should be_true
|
335
|
+
@quilt.file?("/#{TESTDB}/document_id/array.array/0i.js").should be_false
|
336
|
+
end
|
313
337
|
end
|
314
338
|
end
|
315
339
|
|
@@ -570,7 +594,7 @@ describe "Quilt" do
|
|
570
594
|
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name").should be_false
|
571
595
|
end
|
572
596
|
it "contents should list view result document contents" do
|
573
|
-
@quilt.contents("/#{TESTDB}/_design/design_document_id/_view/view_function_name").should == ["offset.i.js", "rows", "total_rows.i.js"]
|
597
|
+
@quilt.contents("/#{TESTDB}/_design/design_document_id/_view/view_function_name").should == ["offset.i.js", "rows.array", "total_rows.i.js"]
|
574
598
|
end
|
575
599
|
it "can_mkdir? should return false" do
|
576
600
|
@quilt.can_mkdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name").should be_false
|
@@ -600,87 +624,87 @@ describe "Quilt" do
|
|
600
624
|
@quilt.can_delete?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/total_rows.i.js").should be_false
|
601
625
|
end
|
602
626
|
end
|
603
|
-
describe "rows/" do
|
627
|
+
describe "rows.array/" do
|
604
628
|
it "directory? should return true" do
|
605
|
-
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows").should be_true
|
629
|
+
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array").should be_true
|
606
630
|
end
|
607
631
|
it "file? should return false" do
|
608
|
-
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows").should be_false
|
632
|
+
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array").should be_false
|
609
633
|
end
|
610
634
|
it "contents should list view rows" do
|
611
|
-
@quilt.contents("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows").should == ["0i"]
|
635
|
+
@quilt.contents("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array").should == ["0i"]
|
612
636
|
end
|
613
637
|
it "can_mkdir? should return false" do
|
614
|
-
@quilt.can_mkdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows").should be_false
|
638
|
+
@quilt.can_mkdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array").should be_false
|
615
639
|
end
|
616
640
|
it "can_rmdir? should return false" do
|
617
|
-
@quilt.can_rmdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows").should be_false
|
641
|
+
@quilt.can_rmdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array").should be_false
|
618
642
|
end
|
619
643
|
describe "0i/" do
|
620
644
|
it "directory? should return true" do
|
621
|
-
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i").should be_true
|
645
|
+
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i").should be_true
|
622
646
|
end
|
623
647
|
it "file? should return false" do
|
624
|
-
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i").should be_false
|
648
|
+
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i").should be_false
|
625
649
|
end
|
626
650
|
it "contents should list view result row content" do
|
627
|
-
@quilt.contents("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i").should == ["id.js", "key.js", "value.js"]
|
651
|
+
@quilt.contents("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i").should == ["id.js", "key.js", "value.js"]
|
628
652
|
end
|
629
653
|
it "can_mkdir? should return false" do
|
630
|
-
@quilt.can_mkdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i").should be_false
|
654
|
+
@quilt.can_mkdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i").should be_false
|
631
655
|
end
|
632
656
|
it "can_rmdir? should return false" do
|
633
|
-
@quilt.can_rmdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i").should be_false
|
657
|
+
@quilt.can_rmdir?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i").should be_false
|
634
658
|
end
|
635
659
|
describe "id.js" do
|
636
660
|
it "directory? should return false" do
|
637
|
-
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/id.js").should be_false
|
661
|
+
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/id.js").should be_false
|
638
662
|
end
|
639
663
|
it "file? should return true" do
|
640
|
-
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/id.js").should be_true
|
664
|
+
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/id.js").should be_true
|
641
665
|
end
|
642
666
|
it "read_file should return contents" do
|
643
|
-
@quilt.read_file("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/id.js").should == "document_id"
|
667
|
+
@quilt.read_file("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/id.js").should == "document_id"
|
644
668
|
end
|
645
669
|
it "can_write? should return false" do
|
646
|
-
@quilt.can_write?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/id.js").should be_false
|
670
|
+
@quilt.can_write?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/id.js").should be_false
|
647
671
|
end
|
648
672
|
it "can_delete? should return false" do
|
649
|
-
@quilt.can_delete?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/id.js").should be_false
|
673
|
+
@quilt.can_delete?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/id.js").should be_false
|
650
674
|
end
|
651
675
|
end
|
652
676
|
describe "key.js" do
|
653
677
|
it "directory? should return false" do
|
654
|
-
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/key.js").should be_false
|
678
|
+
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/key.js").should be_false
|
655
679
|
end
|
656
680
|
it "file? should return true" do
|
657
|
-
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/key.js").should be_true
|
681
|
+
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/key.js").should be_true
|
658
682
|
end
|
659
683
|
it "read_file should return contents" do
|
660
|
-
@quilt.read_file("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/key.js").should == "This is a name"
|
684
|
+
@quilt.read_file("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/key.js").should == "This is a name"
|
661
685
|
end
|
662
686
|
it "can_write? should return false" do
|
663
|
-
@quilt.can_write?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/key.js").should be_false
|
687
|
+
@quilt.can_write?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/key.js").should be_false
|
664
688
|
end
|
665
689
|
it "can_delete? should return false" do
|
666
|
-
@quilt.can_delete?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/key.js").should be_false
|
690
|
+
@quilt.can_delete?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/key.js").should be_false
|
667
691
|
end
|
668
692
|
end
|
669
693
|
describe "value.js" do
|
670
694
|
it "directory? should return false" do
|
671
|
-
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/value.js").should be_false
|
695
|
+
@quilt.directory?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/value.js").should be_false
|
672
696
|
end
|
673
697
|
it "file? should return true" do
|
674
|
-
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/value.js").should be_true
|
698
|
+
@quilt.file?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/value.js").should be_true
|
675
699
|
end
|
676
700
|
it "read_file should return contents" do
|
677
|
-
@quilt.read_file("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/value.js").should == ""
|
701
|
+
@quilt.read_file("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/value.js").should == ""
|
678
702
|
end
|
679
703
|
it "can_write? should return false" do
|
680
|
-
@quilt.can_write?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/value.js").should be_false
|
704
|
+
@quilt.can_write?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/value.js").should be_false
|
681
705
|
end
|
682
706
|
it "can_delete? should return false" do
|
683
|
-
@quilt.can_delete?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows/0i/value.js").should be_false
|
707
|
+
@quilt.can_delete?("/#{TESTDB}/_design/design_document_id/_view/view_function_name/rows.array/0i/value.js").should be_false
|
684
708
|
end
|
685
709
|
end
|
686
710
|
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
2
|
+
|
3
|
+
describe Couchquilt::Mapper do
|
4
|
+
include Couchquilt::Mapper
|
5
|
+
|
6
|
+
describe "map_json" do
|
7
|
+
describe "value mapping" do
|
8
|
+
it "should map string value" do
|
9
|
+
result = map_json({ "key" => "value" })
|
10
|
+
result.should == ["key.js"]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should map integer value" do
|
14
|
+
result = map_json({ "key" => 1 })
|
15
|
+
result.should == ["key.i.js"]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should map float value" do
|
19
|
+
result = map_json({ "key" => 1.1 })
|
20
|
+
result.should == ["key.f.js"]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should map false value" do
|
24
|
+
result = map_json({ "key" => false })
|
25
|
+
result.should == ["key.b.js"]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should map true value" do
|
29
|
+
result = map_json({ "key" => true })
|
30
|
+
result.should == ["key.b.js"]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should map an array value" do
|
34
|
+
result = map_json(["value"])
|
35
|
+
result.should == ["0i.js"]
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should map hash value" do
|
39
|
+
result = map_json({ "key" => {}})
|
40
|
+
result.should == ["key"]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should map array value" do
|
44
|
+
result = map_json({ "key" => []})
|
45
|
+
result.should == ["key.array"]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "nested mapping" do
|
50
|
+
it "should map only keys" do
|
51
|
+
result = map_json("key" => { "key" => "value" })
|
52
|
+
result.should == ["key"]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "array mapping" do
|
57
|
+
it "should map uniq array values" do
|
58
|
+
result = map_json(["value1", "value2"])
|
59
|
+
result.should == ["0i.js", "1i.js"]
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should map equal array values" do
|
63
|
+
result = map_json(["value", "value"])
|
64
|
+
result.should == ["0i.js", "1i.js"]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "map_fs" do
|
70
|
+
before do
|
71
|
+
@json = { :a => 1, :b => 2}
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should remove all contents for empty keys" do
|
75
|
+
result = map_fs(@json)
|
76
|
+
result.should == {}
|
77
|
+
end
|
78
|
+
|
79
|
+
# TODO: really spec this
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "key_for" do
|
83
|
+
it "should return parsed integer value for 1i" do
|
84
|
+
result = key_for("1i")
|
85
|
+
result.should == 1
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should return parsed integer value for 1i.js" do
|
89
|
+
result = key_for("1i.js")
|
90
|
+
result.should == 1
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should remove js extension" do
|
94
|
+
result = key_for("key.js")
|
95
|
+
result.should == "key"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should remove f.js extension" do
|
99
|
+
result = key_for("key.f.js")
|
100
|
+
result.should == "key"
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should remove i.js extension" do
|
104
|
+
result = key_for("key.i.js")
|
105
|
+
result.should == "key"
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should remove b.js extension" do
|
109
|
+
result = key_for("key.b.js")
|
110
|
+
result.should == "key"
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should remove html extension" do
|
114
|
+
result = key_for("key.html")
|
115
|
+
result.should == "key"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "name_for" do
|
120
|
+
describe "with integer key" do
|
121
|
+
it "should append i.js for nil value" do
|
122
|
+
result = name_for(1)
|
123
|
+
result.should == "1i.js"
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should append i.js for string value" do
|
127
|
+
result = name_for(1, "value")
|
128
|
+
result.should == "1i.js"
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should append i.f.js for float value" do
|
132
|
+
result = name_for(1, 1.1)
|
133
|
+
result.should == "1i.f.js"
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should append i.i.js for integer value" do
|
137
|
+
result = name_for(1, 1)
|
138
|
+
result.should == "1i.i.js"
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should append i.b.js for true value" do
|
142
|
+
result = name_for(1, true)
|
143
|
+
result.should == "1i.b.js"
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should append i.b.js for false value" do
|
147
|
+
result = name_for(1, false)
|
148
|
+
result.should == "1i.b.js"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "with other key" do
|
153
|
+
it "should append js for nil value" do
|
154
|
+
result = name_for("key")
|
155
|
+
result.should == "key.js"
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should append js for string value" do
|
159
|
+
result = name_for("key", "value")
|
160
|
+
result.should == "key.js"
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should append f.js for float value" do
|
164
|
+
result = name_for("key", 1.1)
|
165
|
+
result.should == "key.f.js"
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should append i.js for integer value" do
|
169
|
+
result = name_for("key", 1)
|
170
|
+
result.should == "key.i.js"
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should append b.js for true value" do
|
174
|
+
result = name_for("key", true)
|
175
|
+
result.should == "key.b.js"
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should append b.js for false value" do
|
179
|
+
result = name_for("key", false)
|
180
|
+
result.should == "key.b.js"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couch-quilt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Johannes J\xC3\xB6rg Schmidt"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-26 00:00:00 +01:00
|
13
13
|
default_executable: couchquilt
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -32,8 +32,10 @@ files:
|
|
32
32
|
- lib/couchquilt/couch_client.rb
|
33
33
|
- lib/couchquilt/debugged_fs.rb
|
34
34
|
- lib/couchquilt/fs.rb
|
35
|
+
- lib/couchquilt/mapper.rb
|
35
36
|
- lib/couchquilt/version.rb
|
36
|
-
- spec/
|
37
|
+
- spec/couchquilt/fs_spec.rb
|
38
|
+
- spec/couchquilt/mapper_spec.rb
|
37
39
|
- spec/spec_helper.rb
|
38
40
|
has_rdoc: true
|
39
41
|
homepage: http://jo.github.com/quilt
|
@@ -64,5 +66,6 @@ signing_key:
|
|
64
66
|
specification_version: 3
|
65
67
|
summary: Access CouchDB from filesystem.
|
66
68
|
test_files:
|
67
|
-
- spec/couchquilt_spec.rb
|
68
69
|
- spec/spec_helper.rb
|
70
|
+
- spec/couchquilt/fs_spec.rb
|
71
|
+
- spec/couchquilt/mapper_spec.rb
|