omgdav 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/.document +3 -0
- data/.gitignore +17 -0
- data/.manifest +53 -0
- data/.wrongdoc.yml +6 -0
- data/COPYING +661 -0
- data/ChangeLog +185 -0
- data/GIT-VERSION-FILE +1 -0
- data/GIT-VERSION-GEN +33 -0
- data/GNUmakefile +35 -0
- data/LATEST +1 -0
- data/NEWS +1 -0
- data/README +154 -0
- data/bin/omgdav-setup +4 -0
- data/bin/omgdav-sync +32 -0
- data/lib/omgdav/app.rb +70 -0
- data/lib/omgdav/copy.rb +100 -0
- data/lib/omgdav/copy_move.rb +54 -0
- data/lib/omgdav/db.rb +258 -0
- data/lib/omgdav/delete.rb +66 -0
- data/lib/omgdav/get.rb +35 -0
- data/lib/omgdav/http_get.rb +146 -0
- data/lib/omgdav/input_wrapper.rb +32 -0
- data/lib/omgdav/migrations/0001_initial.rb +45 -0
- data/lib/omgdav/migrations/0002_contenttype.rb +15 -0
- data/lib/omgdav/migrations/0003_synctmp.rb +14 -0
- data/lib/omgdav/mkcol.rb +28 -0
- data/lib/omgdav/move.rb +74 -0
- data/lib/omgdav/options.rb +21 -0
- data/lib/omgdav/propfind.rb +46 -0
- data/lib/omgdav/propfind_response.rb +150 -0
- data/lib/omgdav/proppatch.rb +116 -0
- data/lib/omgdav/put.rb +110 -0
- data/lib/omgdav/rack_util.rb +56 -0
- data/lib/omgdav/setup.rb +16 -0
- data/lib/omgdav/sync.rb +78 -0
- data/lib/omgdav/version.rb +2 -0
- data/lib/omgdav.rb +27 -0
- data/omgdav.gemspec +35 -0
- data/pkg.mk +175 -0
- data/setup.rb +1586 -0
- data/test/integration.rb +232 -0
- data/test/test_copy.rb +121 -0
- data/test/test_delete.rb +15 -0
- data/test/test_litmus.rb +61 -0
- data/test/test_move.rb +66 -0
- data/test/test_omgdav_app.rb +102 -0
- data/test/test_propfind.rb +30 -0
- data/test/test_proppatch.rb +156 -0
- data/test/test_put.rb +31 -0
- data/test/test_readonly.rb +22 -0
- data/test/test_sync.rb +49 -0
- data/test/test_urlmap.rb +59 -0
- data/test/test_worm.rb +26 -0
- metadata +342 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
# -*- encoding: binary -*-
|
2
|
+
# Copyright (C) 2012, Eric Wong <normalperson@yhbt.net>
|
3
|
+
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
|
4
|
+
require './test/integration'
|
5
|
+
class TestProppatch < MiniTest::Unit::TestCase
|
6
|
+
include TestMogileFSIntegration
|
7
|
+
|
8
|
+
def test_proppatch_live
|
9
|
+
assert_equal 201, req("MKCOL", "/prop")[0].to_i
|
10
|
+
|
11
|
+
t = Time.at(666)
|
12
|
+
xml = <<-EOF
|
13
|
+
<?xml version="1.0" encoding="utf-8"?>
|
14
|
+
<D:propertyupdate xmlns:D="DAV:">
|
15
|
+
<D:set>
|
16
|
+
<D:prop>
|
17
|
+
<getlastmodified xmlns="DAV:">#{t.httpdate}</getlastmodified>
|
18
|
+
</D:prop>
|
19
|
+
</D:set>
|
20
|
+
</D:propertyupdate>
|
21
|
+
EOF
|
22
|
+
opts = {
|
23
|
+
input: StringIO.new(xml.strip!)
|
24
|
+
}
|
25
|
+
|
26
|
+
assert_equal 200, req("PROPPATCH", "/prop", opts)[0].to_i
|
27
|
+
assert_equal 666, @db[:paths][name: "prop"][:mtime]
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_getcontenttype
|
31
|
+
path = "//D:multistatus/D:response/D:propstat/D:prop/D:getcontenttype"
|
32
|
+
assert_equal 201, req("PUT", "/type")[0].to_i
|
33
|
+
_, _, body = req("PROPFIND", "/type", "HTTP_DEPTH" => '0')
|
34
|
+
t = Nokogiri::XML(body).search(path)
|
35
|
+
assert_equal "application/octet-stream", t.text
|
36
|
+
|
37
|
+
xml = <<-EOF
|
38
|
+
<?xml version="1.0" encoding="utf-8"?>
|
39
|
+
<D:propertyupdate xmlns:D="DAV:">
|
40
|
+
<D:set>
|
41
|
+
<D:prop>
|
42
|
+
<getcontenttype xmlns="DAV:">audio/flac</getcontenttype>
|
43
|
+
</D:prop>
|
44
|
+
</D:set>
|
45
|
+
</D:propertyupdate>
|
46
|
+
EOF
|
47
|
+
opts = {
|
48
|
+
input: StringIO.new(xml.strip!)
|
49
|
+
}
|
50
|
+
|
51
|
+
assert_equal 200, req("PROPPATCH", "/type", opts)[0].to_i
|
52
|
+
_, _, body = req("PROPFIND", "/type", "HTTP_DEPTH" => '0')
|
53
|
+
t = Nokogiri::XML(body).search(path)
|
54
|
+
assert_equal "audio/flac", t.text
|
55
|
+
|
56
|
+
xml = <<-EOF
|
57
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
58
|
+
<D:propertyupdate xmlns:D="DAV:"
|
59
|
+
xmlns:Z="http://ns.example.com/standards/z39.50/">
|
60
|
+
<D:remove>
|
61
|
+
<D:prop><D:getcontenttype/></D:prop>
|
62
|
+
</D:remove>
|
63
|
+
</D:propertyupdate>
|
64
|
+
EOF
|
65
|
+
opts = {
|
66
|
+
input: StringIO.new(xml.strip!)
|
67
|
+
}
|
68
|
+
assert_equal 200, req("PROPPATCH", "/type", opts)[0].to_i
|
69
|
+
_, _, body = req("PROPFIND", "/type", "HTTP_DEPTH" => '0')
|
70
|
+
t = Nokogiri::XML(body).search(path)
|
71
|
+
assert_equal "application/octet-stream", t.text
|
72
|
+
|
73
|
+
opts = {
|
74
|
+
"HTTP_DESTINATION" => "http://example.com/type.txt",
|
75
|
+
"HTTP_HOST" => "example.com",
|
76
|
+
}
|
77
|
+
assert_equal 201, req("MOVE", "/type", opts)[0].to_i
|
78
|
+
_, _, body = req("PROPFIND", "/type.txt", "HTTP_DEPTH" => '0')
|
79
|
+
t = Nokogiri::XML(body).search(path)
|
80
|
+
assert_equal "text/plain", t.text
|
81
|
+
|
82
|
+
# try something invalid
|
83
|
+
[
|
84
|
+
"audio flac",
|
85
|
+
"foo/bar adlkj",
|
86
|
+
"foo/bar paramet()=ff"
|
87
|
+
].each do |bad|
|
88
|
+
xml = <<-EOF
|
89
|
+
<?xml version="1.0" encoding="utf-8"?>
|
90
|
+
<D:propertyupdate xmlns:D="DAV:">
|
91
|
+
<D:set>
|
92
|
+
<D:prop>
|
93
|
+
<getcontenttype xmlns="DAV:">#{bad}</getcontenttype>
|
94
|
+
</D:prop>
|
95
|
+
</D:set>
|
96
|
+
</D:propertyupdate>
|
97
|
+
EOF
|
98
|
+
opts = { input: StringIO.new(xml.strip!) }
|
99
|
+
assert_equal 400, req("PROPPATCH", "/type.txt", opts)[0].to_i, bad
|
100
|
+
assert_nil @db[:paths][name: "type.txt"][:contenttype]
|
101
|
+
end
|
102
|
+
|
103
|
+
xml = <<-EOF
|
104
|
+
<?xml version="1.0" encoding="utf-8"?>
|
105
|
+
<D:propertyupdate xmlns:D="DAV:">
|
106
|
+
<D:set>
|
107
|
+
<D:prop>
|
108
|
+
<getcontenttype xmlns="DAV:">teXt/plain; chArset="ASCII"</getcontenttype>
|
109
|
+
</D:prop>
|
110
|
+
</D:set>
|
111
|
+
</D:propertyupdate>
|
112
|
+
EOF
|
113
|
+
opts = { input: StringIO.new(xml.strip!) }
|
114
|
+
assert_equal 200, req("PROPPATCH", "/type.txt", opts)[0].to_i
|
115
|
+
i = @db[:paths][name: "type.txt"][:contenttype]
|
116
|
+
assert_kind_of Integer, i
|
117
|
+
t = @db[:prop_mappings][id: i][:value]
|
118
|
+
assert_equal 'text/plain; charset="ASCII"', t
|
119
|
+
refute_equal i, @db[:prop_mappings][value: 'audio/flac'][:id]
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_proppatch_dead
|
123
|
+
assert_equal 201, req("MKCOL", "/prop")[0].to_i
|
124
|
+
|
125
|
+
xml = <<-EOF
|
126
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
127
|
+
<D:propertyupdate xmlns:D="DAV:"
|
128
|
+
xmlns:Z="http://ns.example.com/standards/z39.50/">
|
129
|
+
<D:set>
|
130
|
+
<D:prop>
|
131
|
+
<Z:Authors>
|
132
|
+
<Z:Author>Jim Whitehead</Z:Author>
|
133
|
+
<Z:Author>Roy Fielding</Z:Author>
|
134
|
+
</Z:Authors>
|
135
|
+
</D:prop>
|
136
|
+
</D:set>
|
137
|
+
<D:remove>
|
138
|
+
<D:prop><Z:Copyright-Owner/></D:prop>
|
139
|
+
</D:remove>
|
140
|
+
</D:propertyupdate>
|
141
|
+
EOF
|
142
|
+
opts = {
|
143
|
+
input: StringIO.new(xml.strip!)
|
144
|
+
}
|
145
|
+
|
146
|
+
assert_equal 200, req("PROPPATCH", "/prop", opts)[0].to_i
|
147
|
+
prop = @db[:paths][name: "prop"]
|
148
|
+
props = @app.dead_props_get(prop)
|
149
|
+
ns_prop = props["http://ns.example.com/standards/z39.50/"]
|
150
|
+
assert_instance_of Hash, ns_prop
|
151
|
+
authors = ns_prop["Authors"].strip
|
152
|
+
expect = "<Author>Jim Whitehead</Author>\n" \
|
153
|
+
" <Author>Roy Fielding</Author>"
|
154
|
+
assert_equal expect, authors
|
155
|
+
end
|
156
|
+
end
|
data/test/test_put.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: binary -*-
|
2
|
+
# Copyright (C) 2012, Eric Wong <normalperson@yhbt.net>
|
3
|
+
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
|
4
|
+
require './test/integration'
|
5
|
+
class TestPut < MiniTest::Unit::TestCase
|
6
|
+
include TestMogileFSIntegration
|
7
|
+
|
8
|
+
def test_put_overwrite
|
9
|
+
resp = @req.put("/hello", input: StringIO.new("HELLO"))
|
10
|
+
assert_equal 201, resp.status.to_i
|
11
|
+
before = @db[:paths].to_a[0]
|
12
|
+
|
13
|
+
status, headers, body = req("GET", "/hello")
|
14
|
+
assert_equal 200, status.to_i
|
15
|
+
assert_equal "5", headers["Content-Length"]
|
16
|
+
assert_equal "HELLO", body_string(body)
|
17
|
+
|
18
|
+
resp = @req.put("/hello", input: StringIO.new("GOODBYE"))
|
19
|
+
assert_equal 204, resp.status.to_i
|
20
|
+
after = @db[:paths].to_a[0]
|
21
|
+
|
22
|
+
status, headers, body = req("GET", "/hello")
|
23
|
+
assert_equal 200, status.to_i
|
24
|
+
assert_equal "7", headers["Content-Length"]
|
25
|
+
assert_equal "GOODBYE", body_string(body)
|
26
|
+
|
27
|
+
[ :parent_id, :id, :domain_id, :name ].each do |field|
|
28
|
+
assert_equal before[field], after[field]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: binary -*-
|
2
|
+
# Copyright (C) 2012, Eric Wong <normalperson@yhbt.net>
|
3
|
+
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
|
4
|
+
require './test/integration'
|
5
|
+
class Test_ReadOnly < MiniTest::Unit::TestCase
|
6
|
+
include TestMogileFSIntegration
|
7
|
+
|
8
|
+
def test_readonly
|
9
|
+
resp = @req.put("/foo", input: StringIO.new("HELLO"))
|
10
|
+
assert_equal 201, resp.status.to_i
|
11
|
+
|
12
|
+
@app = OMGDAV::App.new(@db, @mogc, methods: :ro)
|
13
|
+
@req = Rack::MockRequest.new(@app)
|
14
|
+
resp = @req.put("/foo", input: StringIO.new("GOODBYE"))
|
15
|
+
assert_equal 405, resp.status.to_i
|
16
|
+
status, _, body = req("GET", "/foo")
|
17
|
+
assert_equal 200, status.to_i
|
18
|
+
assert_equal "HELLO", body_string(body)
|
19
|
+
|
20
|
+
assert_equal 405, req("DELETE", "/foo")[0].to_i
|
21
|
+
end
|
22
|
+
end
|
data/test/test_sync.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Copyright (C) 2012, Eric Wong <normalperson@yhbt.net>
|
2
|
+
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
|
3
|
+
require "./test/integration"
|
4
|
+
require "omgdav/sync"
|
5
|
+
|
6
|
+
class TestSync < MiniTest::Unit::TestCase
|
7
|
+
include TestMogileFSIntegration
|
8
|
+
|
9
|
+
def test_sync
|
10
|
+
nr = 0
|
11
|
+
(5..11).each do |i|
|
12
|
+
(995..1005).each do |j|
|
13
|
+
@mogc.store_content("#{i}/#{j}", "default", "#{i}-#{j}")
|
14
|
+
@mogc.store_content("#{j}/#{i}", "default", "#{j}-#{i}")
|
15
|
+
nr += 2
|
16
|
+
end
|
17
|
+
end
|
18
|
+
imp = OMGDAV::Sync.new(@db, @mogc)
|
19
|
+
imp.sync
|
20
|
+
paths = @db[:paths].where { self.>(:parent_id, 0) }
|
21
|
+
assert_equal nr, paths.where(collection: false).count
|
22
|
+
assert_equal 18, paths.where(collection: true).count
|
23
|
+
keys, _ = @mogc.list_keys
|
24
|
+
cache = {}
|
25
|
+
pkeys = []
|
26
|
+
paths.where(collection: false).each do |node|
|
27
|
+
pkeys << @app.node_to_key(node, cache)
|
28
|
+
end
|
29
|
+
assert_equal keys.sort, pkeys.sort
|
30
|
+
|
31
|
+
# ensure MogileFS-only deletions are synced
|
32
|
+
first = keys.shift
|
33
|
+
@mogc.delete(first)
|
34
|
+
imp.sync
|
35
|
+
|
36
|
+
pkeys.clear
|
37
|
+
cache.clear
|
38
|
+
paths.where(collection: false).each do |node|
|
39
|
+
pkeys << @app.node_to_key(node, cache)
|
40
|
+
end
|
41
|
+
assert_equal(keys.size, pkeys.size)
|
42
|
+
refute pkeys.include?(first)
|
43
|
+
|
44
|
+
# nuke it all!
|
45
|
+
keys.each { |key| @mogc.delete(key) }
|
46
|
+
imp.sync
|
47
|
+
assert_equal 0, @db[:paths].where(collection: false).count
|
48
|
+
end
|
49
|
+
end
|
data/test/test_urlmap.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# -*- encoding: binary -*-
|
2
|
+
# Copyright (C) 2012, Eric Wong <normalperson@yhbt.net>
|
3
|
+
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
|
4
|
+
require './test/integration'
|
5
|
+
require 'rack/builder'
|
6
|
+
require 'rack/lobster'
|
7
|
+
|
8
|
+
# ensure everything works when we're using Rack::URLMap with builder
|
9
|
+
class TestUrlmap < MiniTest::Unit::TestCase
|
10
|
+
include TestMogileFSIntegration
|
11
|
+
|
12
|
+
def test_url_map
|
13
|
+
old_app = @app
|
14
|
+
@app = Rack::Builder.new do
|
15
|
+
map "/test" do
|
16
|
+
run old_app
|
17
|
+
end
|
18
|
+
map "http://example.com/test" do
|
19
|
+
run old_app
|
20
|
+
end
|
21
|
+
map "/bogus" do
|
22
|
+
run Rack::Lobster.new
|
23
|
+
end
|
24
|
+
end.to_app
|
25
|
+
|
26
|
+
assert_equal 201, req("PUT", "/test/foo", input: StringIO.new("H"))[0].to_i
|
27
|
+
|
28
|
+
assert_equal "foo", @db[:paths].where { self.~(parent_id: 0) }.first[:name]
|
29
|
+
status, headers, body = req("PROPFIND", "/test", "HTTP_DEPTH" => "1")
|
30
|
+
xml = Nokogiri.XML(body)
|
31
|
+
hrefs = xml.search("//D:href").to_a.map { |x| x.text }
|
32
|
+
assert_equal 2, hrefs.size
|
33
|
+
assert hrefs.include?("/test/"), hrefs.inspect
|
34
|
+
assert hrefs.include?("/test/foo"), hrefs.inspect
|
35
|
+
|
36
|
+
assert_equal 200, req("HEAD", "/test/foo")[0].to_i
|
37
|
+
|
38
|
+
opts = {
|
39
|
+
"HTTP_DESTINATION" => "http://example.com/test/bar",
|
40
|
+
"HTTP_HOST" => "example.com",
|
41
|
+
}
|
42
|
+
assert_equal 201, req("MOVE", "/test/foo", opts)[0].to_i
|
43
|
+
opts["HTTP_DESTINATION"] = "http://example.com/bar"
|
44
|
+
assert_equal 502, req("MOVE", "/test/bar", opts)[0].to_i
|
45
|
+
|
46
|
+
opts["HTTP_DESTINATION"] = "http://example.com/test/foo"
|
47
|
+
assert_equal 201, req("COPY", "/test/bar", opts)[0].to_i
|
48
|
+
|
49
|
+
assert_equal 201, req("MKCOL", "/test/col")[0].to_i
|
50
|
+
opts["HTTP_DESTINATION"] = "http://example.com/test/col/foo"
|
51
|
+
assert_equal 201, req("COPY", "/test/bar", opts)[0].to_i
|
52
|
+
|
53
|
+
opts["HTTP_DESTINATION"] = "http://example.com/zz"
|
54
|
+
assert_equal 502, req("MOVE", "/test/col/", opts)[0].to_i
|
55
|
+
|
56
|
+
opts["HTTP_DESTINATION"] = "http://example.com/test/COL"
|
57
|
+
assert_equal 201, req("MOVE", "/test/col/", opts)[0].to_i
|
58
|
+
end
|
59
|
+
end
|
data/test/test_worm.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: binary -*-
|
2
|
+
# Copyright (C) 2012, Eric Wong <normalperson@yhbt.net>
|
3
|
+
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
|
4
|
+
require './test/integration'
|
5
|
+
class TestWorm < MiniTest::Unit::TestCase
|
6
|
+
include TestMogileFSIntegration
|
7
|
+
|
8
|
+
def test_worm
|
9
|
+
resp = @req.put("/foo", input: StringIO.new("HELLO"))
|
10
|
+
assert_equal 201, resp.status.to_i
|
11
|
+
|
12
|
+
@app = OMGDAV::App.new(@db, @mogc, methods: :worm)
|
13
|
+
@req = Rack::MockRequest.new(@app)
|
14
|
+
resp = @req.put("/foo", input: StringIO.new("GOODBYE"))
|
15
|
+
assert_equal 409, resp.status.to_i
|
16
|
+
|
17
|
+
resp = @req.put("/bar", input: StringIO.new("GOODBYE"))
|
18
|
+
assert_equal 201, resp.status.to_i
|
19
|
+
|
20
|
+
status, _, body = req("GET", "/foo")
|
21
|
+
assert_equal 200, status.to_i
|
22
|
+
assert_equal "HELLO", body_string(body)
|
23
|
+
|
24
|
+
assert_equal 405, req("DELETE", "/foo")[0].to_i
|
25
|
+
end
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,342 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: !binary |-
|
3
|
+
b21nZGF2
|
4
|
+
version: !ruby/object:Gem::Version
|
5
|
+
version: 0.0.0
|
6
|
+
prerelease:
|
7
|
+
platform: ruby
|
8
|
+
authors:
|
9
|
+
- !binary |-
|
10
|
+
T01HREFWIGhhY2tlcnM=
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2012-11-15 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: !binary |-
|
18
|
+
cmFjaw==
|
19
|
+
requirement: !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - !binary |-
|
23
|
+
fj4=
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: !binary |-
|
26
|
+
MS40
|
27
|
+
type: :runtime
|
28
|
+
prerelease: false
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - !binary |-
|
33
|
+
fj4=
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: !binary |-
|
36
|
+
MS40
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: !binary |-
|
39
|
+
a2dpbw==
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - !binary |-
|
44
|
+
fj4=
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: !binary |-
|
47
|
+
Mi43
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - !binary |-
|
54
|
+
fj4=
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: !binary |-
|
57
|
+
Mi43
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: !binary |-
|
60
|
+
a2Nhcg==
|
61
|
+
requirement: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - !binary |-
|
65
|
+
fj4=
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: !binary |-
|
68
|
+
MC40
|
69
|
+
type: :runtime
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - !binary |-
|
75
|
+
fj4=
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: !binary |-
|
78
|
+
MC40
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: !binary |-
|
81
|
+
ZmFzdF94cw==
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - !binary |-
|
86
|
+
fj4=
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: !binary |-
|
89
|
+
MC44
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - !binary |-
|
96
|
+
fj4=
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: !binary |-
|
99
|
+
MC44
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: !binary |-
|
102
|
+
bW9naWxlZnMtY2xpZW50
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - !binary |-
|
107
|
+
fj4=
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: !binary |-
|
110
|
+
My40
|
111
|
+
type: :runtime
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - !binary |-
|
117
|
+
fj4=
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: !binary |-
|
120
|
+
My40
|
121
|
+
- !ruby/object:Gem::Dependency
|
122
|
+
name: !binary |-
|
123
|
+
bm9rb2dpcmk=
|
124
|
+
requirement: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
126
|
+
requirements:
|
127
|
+
- - !binary |-
|
128
|
+
fj4=
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: !binary |-
|
131
|
+
MS41
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
none: false
|
136
|
+
requirements:
|
137
|
+
- - !binary |-
|
138
|
+
fj4=
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: !binary |-
|
141
|
+
MS41
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: !binary |-
|
144
|
+
c2VxdWVs
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - !binary |-
|
149
|
+
fj4=
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: !binary |-
|
152
|
+
My40MQ==
|
153
|
+
- - !binary |-
|
154
|
+
Pj0=
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: !binary |-
|
157
|
+
My40MS4w
|
158
|
+
type: :runtime
|
159
|
+
prerelease: false
|
160
|
+
version_requirements: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - !binary |-
|
164
|
+
fj4=
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: !binary |-
|
167
|
+
My40MQ==
|
168
|
+
- - !binary |-
|
169
|
+
Pj0=
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: !binary |-
|
172
|
+
My40MS4w
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: !binary |-
|
175
|
+
dW5pY29ybg==
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - !binary |-
|
180
|
+
fj4=
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: !binary |-
|
183
|
+
NC40LjA=
|
184
|
+
type: :development
|
185
|
+
prerelease: false
|
186
|
+
version_requirements: !ruby/object:Gem::Requirement
|
187
|
+
none: false
|
188
|
+
requirements:
|
189
|
+
- - !binary |-
|
190
|
+
fj4=
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: !binary |-
|
193
|
+
NC40LjA=
|
194
|
+
- !ruby/object:Gem::Dependency
|
195
|
+
name: !binary |-
|
196
|
+
d3Jvbmdkb2M=
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
none: false
|
199
|
+
requirements:
|
200
|
+
- - !binary |-
|
201
|
+
fj4=
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: !binary |-
|
204
|
+
MS42LjE=
|
205
|
+
type: :development
|
206
|
+
prerelease: false
|
207
|
+
version_requirements: !ruby/object:Gem::Requirement
|
208
|
+
none: false
|
209
|
+
requirements:
|
210
|
+
- - !binary |-
|
211
|
+
fj4=
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: !binary |-
|
214
|
+
MS42LjE=
|
215
|
+
description: ! 'omgdav exposes an existing MogileFS domain over WebDAV. There is
|
216
|
+
|
217
|
+
absolutely no commitment or modification needed to your existing
|
218
|
+
|
219
|
+
MogileFS installation to try omgdav in read-only mode.'
|
220
|
+
email: !binary |-
|
221
|
+
bm9ybWFscGVyc29uQHloYnQubmV0
|
222
|
+
executables:
|
223
|
+
- !binary |-
|
224
|
+
b21nZGF2LXNldHVw
|
225
|
+
- !binary |-
|
226
|
+
b21nZGF2LXN5bmM=
|
227
|
+
extensions: []
|
228
|
+
extra_rdoc_files:
|
229
|
+
- ChangeLog
|
230
|
+
- NEWS
|
231
|
+
- README
|
232
|
+
files:
|
233
|
+
- .document
|
234
|
+
- .gitignore
|
235
|
+
- .manifest
|
236
|
+
- .wrongdoc.yml
|
237
|
+
- COPYING
|
238
|
+
- ChangeLog
|
239
|
+
- GIT-VERSION-FILE
|
240
|
+
- GIT-VERSION-GEN
|
241
|
+
- GNUmakefile
|
242
|
+
- LATEST
|
243
|
+
- NEWS
|
244
|
+
- README
|
245
|
+
- bin/omgdav-setup
|
246
|
+
- bin/omgdav-sync
|
247
|
+
- lib/omgdav.rb
|
248
|
+
- lib/omgdav/app.rb
|
249
|
+
- lib/omgdav/copy.rb
|
250
|
+
- lib/omgdav/copy_move.rb
|
251
|
+
- lib/omgdav/db.rb
|
252
|
+
- lib/omgdav/delete.rb
|
253
|
+
- lib/omgdav/get.rb
|
254
|
+
- lib/omgdav/http_get.rb
|
255
|
+
- lib/omgdav/input_wrapper.rb
|
256
|
+
- lib/omgdav/migrations/0001_initial.rb
|
257
|
+
- lib/omgdav/migrations/0002_contenttype.rb
|
258
|
+
- lib/omgdav/migrations/0003_synctmp.rb
|
259
|
+
- lib/omgdav/mkcol.rb
|
260
|
+
- lib/omgdav/move.rb
|
261
|
+
- lib/omgdav/options.rb
|
262
|
+
- lib/omgdav/propfind.rb
|
263
|
+
- lib/omgdav/propfind_response.rb
|
264
|
+
- lib/omgdav/proppatch.rb
|
265
|
+
- lib/omgdav/put.rb
|
266
|
+
- lib/omgdav/rack_util.rb
|
267
|
+
- lib/omgdav/setup.rb
|
268
|
+
- lib/omgdav/sync.rb
|
269
|
+
- lib/omgdav/version.rb
|
270
|
+
- omgdav.gemspec
|
271
|
+
- pkg.mk
|
272
|
+
- setup.rb
|
273
|
+
- test/integration.rb
|
274
|
+
- test/test_copy.rb
|
275
|
+
- test/test_delete.rb
|
276
|
+
- test/test_litmus.rb
|
277
|
+
- test/test_move.rb
|
278
|
+
- test/test_omgdav_app.rb
|
279
|
+
- test/test_propfind.rb
|
280
|
+
- test/test_proppatch.rb
|
281
|
+
- test/test_put.rb
|
282
|
+
- test/test_readonly.rb
|
283
|
+
- test/test_sync.rb
|
284
|
+
- test/test_urlmap.rb
|
285
|
+
- test/test_worm.rb
|
286
|
+
homepage: http://bogomips.org/omgdav/README
|
287
|
+
licenses:
|
288
|
+
- !binary |-
|
289
|
+
QUdQTHYzKw==
|
290
|
+
post_install_message:
|
291
|
+
rdoc_options:
|
292
|
+
- -t
|
293
|
+
- omgdav - Rack app for bridging WebDAV and MogileFS
|
294
|
+
- -W
|
295
|
+
- http://bogomips.org/omgdav.git/tree/%s
|
296
|
+
require_paths:
|
297
|
+
- lib
|
298
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
299
|
+
none: false
|
300
|
+
requirements:
|
301
|
+
- - !binary |-
|
302
|
+
fj4=
|
303
|
+
- !ruby/object:Gem::Version
|
304
|
+
version: !binary |-
|
305
|
+
MS45
|
306
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
307
|
+
none: false
|
308
|
+
requirements:
|
309
|
+
- - ! '>='
|
310
|
+
- !ruby/object:Gem::Version
|
311
|
+
version: '0'
|
312
|
+
requirements: []
|
313
|
+
rubyforge_project:
|
314
|
+
rubygems_version: 1.8.23
|
315
|
+
signing_key:
|
316
|
+
specification_version: 3
|
317
|
+
summary: Rack app for bridging WebDAV and MogileFS
|
318
|
+
test_files:
|
319
|
+
- !binary |-
|
320
|
+
dGVzdC90ZXN0X2xpdG11cy5yYg==
|
321
|
+
- !binary |-
|
322
|
+
dGVzdC90ZXN0X29tZ2Rhdl9hcHAucmI=
|
323
|
+
- !binary |-
|
324
|
+
dGVzdC90ZXN0X3N5bmMucmI=
|
325
|
+
- !binary |-
|
326
|
+
dGVzdC90ZXN0X21vdmUucmI=
|
327
|
+
- !binary |-
|
328
|
+
dGVzdC90ZXN0X3dvcm0ucmI=
|
329
|
+
- !binary |-
|
330
|
+
dGVzdC90ZXN0X3B1dC5yYg==
|
331
|
+
- !binary |-
|
332
|
+
dGVzdC90ZXN0X3Byb3BmaW5kLnJi
|
333
|
+
- !binary |-
|
334
|
+
dGVzdC90ZXN0X3VybG1hcC5yYg==
|
335
|
+
- !binary |-
|
336
|
+
dGVzdC90ZXN0X2RlbGV0ZS5yYg==
|
337
|
+
- !binary |-
|
338
|
+
dGVzdC90ZXN0X3JlYWRvbmx5LnJi
|
339
|
+
- !binary |-
|
340
|
+
dGVzdC90ZXN0X3Byb3BwYXRjaC5yYg==
|
341
|
+
- !binary |-
|
342
|
+
dGVzdC90ZXN0X2NvcHkucmI=
|