fog-external 0.0.1 → 0.0.2
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/.gitignore +0 -1
- data/examples/ernie.conf +1 -1
- data/examples/example.rb +37 -8
- data/examples/handler.sh +2 -0
- data/fog-external.gemspec +1 -1
- data/lib/fog/external/backend/bertrpc.rb +36 -0
- data/lib/fog/external/backend/local.rb +137 -0
- data/lib/fog/external/models/storage/file.rb +3 -2
- data/lib/fog/external/models/storage/files.rb +3 -2
- data/spec/fog/external/backend/bertrpc_spec.rb +12 -0
- data/spec/fog/external/backend/local_spec.rb +12 -0
- metadata +14 -8
- data/examples/fog.rb +0 -102
data/.gitignore
CHANGED
data/examples/ernie.conf
CHANGED
data/examples/example.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# WARNING: Running this file will access /tmp/ernie.pid, /tmp/ernie.log and /tmp/fog-bertrpc-handler.
|
2
|
+
# Make sure you are not using any of these paths.
|
1
3
|
require 'rubygems'
|
2
4
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
5
|
require 'fog/external/storage'
|
4
|
-
require
|
6
|
+
require 'fog/external/backend/bertrpc'
|
5
7
|
|
6
|
-
ROOT = '/tmp/fog-external-example-root'
|
7
8
|
Dir.chdir File.join(File.dirname(__FILE__), '..')
|
8
9
|
|
10
|
+
ROOT = '/tmp/fog-bertrpc-handler'
|
9
11
|
Dir.mkdir(ROOT) unless File.exists?(ROOT)
|
10
12
|
|
11
13
|
def run(cmd)
|
@@ -14,23 +16,50 @@ def run(cmd)
|
|
14
16
|
end
|
15
17
|
|
16
18
|
puts "Starting ernie on localhost:8000"
|
17
|
-
run "ernie -d -c examples/ernie.conf -P
|
19
|
+
run "ernie -d -c examples/ernie.conf -P /tmp/ernie.pid -a /tmp/ernie.log"
|
18
20
|
|
19
21
|
puts "Ernie running."
|
20
22
|
|
23
|
+
begin
|
24
|
+
|
21
25
|
storage = Fog::Storage.new({
|
22
26
|
:provider => 'External',
|
23
|
-
:delegate =>
|
27
|
+
:delegate => Fog::External::Backend::Bertrpc.new('localhost', 8000)
|
24
28
|
})
|
25
29
|
|
26
30
|
puts "Known directories: "
|
27
31
|
puts storage.directories.all.inspect
|
28
32
|
|
29
|
-
|
30
|
-
|
33
|
+
print "Creating directory mydir/ ..."
|
34
|
+
dir = storage.directories.new(key: 'mydir')
|
35
|
+
puts dir.save
|
36
|
+
|
37
|
+
puts "Known directories: "
|
38
|
+
puts storage.directories.all.inspect
|
39
|
+
|
40
|
+
print "Creating mydir/test.txt with content 'ohai' ..."
|
41
|
+
f = dir.files.new(key: 'test.txt')
|
42
|
+
f.body = 'ohai'
|
43
|
+
if f.save
|
44
|
+
puts "done."
|
45
|
+
else
|
46
|
+
puts "error."
|
47
|
+
end
|
48
|
+
|
49
|
+
print "Contents of mydir/test.txt: "
|
50
|
+
f = storage.directories.get('/').files.get('mydir/test.txt')
|
51
|
+
puts f.body
|
52
|
+
|
53
|
+
puts "Destroying mydir/test.txt"
|
54
|
+
f.destroy
|
55
|
+
|
56
|
+
puts "Destroying mydir/"
|
57
|
+
dir.destroy
|
31
58
|
|
32
59
|
puts "Known directories: "
|
33
60
|
puts storage.directories.all.inspect
|
34
61
|
|
35
|
-
|
36
|
-
|
62
|
+
ensure
|
63
|
+
puts "Stopping ernie on localhost:8000"
|
64
|
+
run "kill `cat /tmp/ernie.pid`"
|
65
|
+
end
|
data/examples/handler.sh
ADDED
data/fog-external.gemspec
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
require "bertrpc"
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module External
|
5
|
+
module Backend
|
6
|
+
|
7
|
+
class Bertrpc
|
8
|
+
def initialize(host, port)
|
9
|
+
@service = BERTRPC::Service.new(host, port)
|
10
|
+
@module = @service.call.fog
|
11
|
+
end
|
12
|
+
|
13
|
+
METHODS = %w(create_directory list_directories get_directory destroy_directory list_files head_file get_file destroy_file save_file)
|
14
|
+
|
15
|
+
METHODS.each do |m|
|
16
|
+
define_method m do |*args|
|
17
|
+
@module.send m, *args
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_file(key)
|
22
|
+
res = @module.get_file(key)
|
23
|
+
res[:body] = Base64.decode64(res[:body])
|
24
|
+
res
|
25
|
+
end
|
26
|
+
|
27
|
+
def save_file(key, body)
|
28
|
+
body = Base64.encode64(body)
|
29
|
+
@module.save_file(key, body)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module External
|
5
|
+
module Backend
|
6
|
+
|
7
|
+
class Local
|
8
|
+
def self.act_as_ernie_handler!(root = '/tmp/fog-bertrpc-handler')
|
9
|
+
require 'ernie'
|
10
|
+
instance = self.new(root)
|
11
|
+
|
12
|
+
mod = Module.new do
|
13
|
+
instance.methods.each do |m|
|
14
|
+
define_method m do |*args|
|
15
|
+
instance.send m, *args
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Ernie.expose(:fog, mod)
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(root)
|
24
|
+
@root = root
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_directory(key)
|
28
|
+
if ::File.directory?(path_to(key))
|
29
|
+
false
|
30
|
+
else
|
31
|
+
Dir.mkdir path_to(key)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def list_directories
|
36
|
+
data = Dir.entries(@root).select do |entry|
|
37
|
+
entry[0...1] != '.' && ::File.directory?(path_to(entry))
|
38
|
+
end.map do |entry|
|
39
|
+
{:key => entry}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_directory(key)
|
44
|
+
if ::File.directory?(path_to(key))
|
45
|
+
{ key: key }
|
46
|
+
else
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def destroy_directory(key)
|
52
|
+
if ::File.directory?(path_to(key))
|
53
|
+
Dir.rmdir(path_to(key))
|
54
|
+
true
|
55
|
+
else
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def list_files(dir_key)
|
62
|
+
data = nil
|
63
|
+
Dir.chdir(path_to(dir_key)) do
|
64
|
+
data = Dir.glob('**/*').reject do |file|
|
65
|
+
::File.directory?(file)
|
66
|
+
end.map do |key|
|
67
|
+
path = path_to(key)
|
68
|
+
{
|
69
|
+
:content_length => ::File.size(path),
|
70
|
+
:key => key,
|
71
|
+
:last_modified => ::File.mtime(path)
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
data
|
76
|
+
end
|
77
|
+
|
78
|
+
def head_file(key)
|
79
|
+
path = path_to(key)
|
80
|
+
if ::File.exists?(path)
|
81
|
+
{
|
82
|
+
:content_length => ::File.size(path),
|
83
|
+
:key => key,
|
84
|
+
:last_modified => ::File.mtime(path)
|
85
|
+
}
|
86
|
+
else
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_file(key)
|
92
|
+
path = path_to(key)
|
93
|
+
if ::File.exists?(path)
|
94
|
+
{
|
95
|
+
:content_length => ::File.size(path),
|
96
|
+
:key => key,
|
97
|
+
:last_modified => ::File.mtime(path),
|
98
|
+
:body => ::File.read(path)
|
99
|
+
}
|
100
|
+
else
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def destroy_file(key)
|
106
|
+
path = path_to(key)
|
107
|
+
|
108
|
+
if ::File.exists?(path)
|
109
|
+
::File.delete(path)
|
110
|
+
true
|
111
|
+
else
|
112
|
+
false
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def save_file(key, body)
|
117
|
+
path = path_to(key)
|
118
|
+
|
119
|
+
::FileUtils.mkdir_p(File.dirname(path))
|
120
|
+
|
121
|
+
file = ::File.new(path, 'wb')
|
122
|
+
file.write(body)
|
123
|
+
file.close
|
124
|
+
|
125
|
+
::File.mtime(path)
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
def path_to(entry)
|
131
|
+
::File.join(@root, entry)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fog/core/model'
|
2
|
+
require "base64"
|
2
3
|
|
3
4
|
module Fog
|
4
5
|
module Storage
|
@@ -55,8 +56,8 @@ module Fog
|
|
55
56
|
|
56
57
|
def save
|
57
58
|
requires :body, :directory, :key
|
58
|
-
|
59
|
-
if res = connection.remote.save_file(full_key,
|
59
|
+
body_string = body.respond_to?(:read) ? body.read : body
|
60
|
+
if res = connection.remote.save_file(full_key, body_string)
|
60
61
|
merge_attributes(
|
61
62
|
:content_length => Fog::Storage.get_body_size(body),
|
62
63
|
:last_modified => res
|
@@ -28,8 +28,9 @@ module Fog
|
|
28
28
|
|
29
29
|
def head(id) # hackish!
|
30
30
|
requires :directory
|
31
|
-
|
32
|
-
|
31
|
+
|
32
|
+
data = connection.remote.head_file(file_key(id))
|
33
|
+
if data
|
33
34
|
new(data)
|
34
35
|
else
|
35
36
|
nil
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'spec_helper'))
|
2
|
+
require 'fog/external/backend/bertrpc'
|
3
|
+
|
4
|
+
describe "Fog::External::Backend::Bertrpc" do
|
5
|
+
let(:backend) { Fog::External::Backend::Bertrpc.new 'localhost', 8000 }
|
6
|
+
|
7
|
+
%w(create_directory list_directories get_directory destroy_directory list_files head_file get_file destroy_file save_file).each do |m|
|
8
|
+
it "responds to #{m}" do
|
9
|
+
backend.should respond_to(m)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'spec_helper'))
|
2
|
+
require 'fog/external/backend/local'
|
3
|
+
|
4
|
+
describe "Fog::External::Backend::Local" do
|
5
|
+
let(:backend) { Fog::External::Backend::Local.new '/tmp' }
|
6
|
+
|
7
|
+
%w(create_directory list_directories get_directory destroy_directory list_files head_file get_file destroy_file save_file).each do |m|
|
8
|
+
it "responds to #{m}" do
|
9
|
+
backend.should respond_to(m)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog-external
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-12-03 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &72799370 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *72799370
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &72799160 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *72799160
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: fog
|
38
|
-
requirement: &
|
38
|
+
requirement: &72798950 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *72798950
|
47
47
|
description: Use a custom backend (such as BERTRPC) with Fog:Storage.
|
48
48
|
email:
|
49
49
|
- mail@jonasschneider.com
|
@@ -59,15 +59,19 @@ files:
|
|
59
59
|
- Watchrfile
|
60
60
|
- examples/ernie.conf
|
61
61
|
- examples/example.rb
|
62
|
-
- examples/
|
62
|
+
- examples/handler.sh
|
63
63
|
- fog-external.gemspec
|
64
64
|
- lib/fog-external.rb
|
65
|
+
- lib/fog/external/backend/bertrpc.rb
|
66
|
+
- lib/fog/external/backend/local.rb
|
65
67
|
- lib/fog/external/models/storage/directories.rb
|
66
68
|
- lib/fog/external/models/storage/directory.rb
|
67
69
|
- lib/fog/external/models/storage/file.rb
|
68
70
|
- lib/fog/external/models/storage/files.rb
|
69
71
|
- lib/fog/external/storage.rb
|
70
72
|
- spec/boot.rb
|
73
|
+
- spec/fog/external/backend/bertrpc_spec.rb
|
74
|
+
- spec/fog/external/backend/local_spec.rb
|
71
75
|
- spec/fog/external/storage_spec.rb
|
72
76
|
- spec/service_mock.rb
|
73
77
|
- spec/spec_helper.rb
|
@@ -97,6 +101,8 @@ specification_version: 3
|
|
97
101
|
summary: Fog::Storage with a consistent API
|
98
102
|
test_files:
|
99
103
|
- spec/boot.rb
|
104
|
+
- spec/fog/external/backend/bertrpc_spec.rb
|
105
|
+
- spec/fog/external/backend/local_spec.rb
|
100
106
|
- spec/fog/external/storage_spec.rb
|
101
107
|
- spec/service_mock.rb
|
102
108
|
- spec/spec_helper.rb
|
data/examples/fog.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
require 'ernie'
|
2
|
-
ROOT = '/tmp/fog-external-example-root'
|
3
|
-
# ported from Fog's Local storage
|
4
|
-
|
5
|
-
module Fog
|
6
|
-
def create_directory(key)
|
7
|
-
if ::File.directory?(path_to(key))
|
8
|
-
false
|
9
|
-
else
|
10
|
-
Dir.mkdir path_to(key)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def list_directories
|
15
|
-
data = Dir.entries(ROOT).select do |entry|
|
16
|
-
entry[0...1] != '.' && ::File.directory?(path_to(entry))
|
17
|
-
end.map do |entry|
|
18
|
-
{:key => entry}
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def get_directory(key)
|
23
|
-
if ::File.directory?(path_to(key))
|
24
|
-
{ key: key }
|
25
|
-
else
|
26
|
-
nil
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def destroy_directory(key)
|
31
|
-
if ::File.directory?(path_to(key))
|
32
|
-
Dir.rmdir(path_to(key))
|
33
|
-
true
|
34
|
-
else
|
35
|
-
false
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
def list_files(dir_key)
|
41
|
-
Dir.chdir(path_to(dir_key)) do
|
42
|
-
data = Dir.glob('**/*').reject do |file|
|
43
|
-
::File.directory?(file)
|
44
|
-
end.map do |key|
|
45
|
-
path = file_path(key)
|
46
|
-
{
|
47
|
-
:content_length => ::File.size(path),
|
48
|
-
:key => key,
|
49
|
-
:last_modified => ::File.mtime(path)
|
50
|
-
}
|
51
|
-
end
|
52
|
-
end
|
53
|
-
data
|
54
|
-
end
|
55
|
-
|
56
|
-
def get_file(key)
|
57
|
-
path = path_to(key)
|
58
|
-
if ::File.exists?(path)
|
59
|
-
{
|
60
|
-
:content_length => ::File.size(path),
|
61
|
-
:key => key,
|
62
|
-
:last_modified => ::File.mtime(path),
|
63
|
-
:body => ::File.read(path)
|
64
|
-
}
|
65
|
-
else
|
66
|
-
nil
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def destroy_file(key)
|
71
|
-
path = path_to(key)
|
72
|
-
|
73
|
-
if ::File.exists?(path)
|
74
|
-
::File.delete(path)
|
75
|
-
true
|
76
|
-
else
|
77
|
-
false
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def save_file(key, body)
|
82
|
-
file = ::File.new(path, 'wb')
|
83
|
-
if body.is_a?(String)
|
84
|
-
file.write(body)
|
85
|
-
else
|
86
|
-
file.write(body.read)
|
87
|
-
end
|
88
|
-
file.close
|
89
|
-
|
90
|
-
::File.mtime(path)
|
91
|
-
rescue
|
92
|
-
false
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def path_to(entry)
|
98
|
-
::File.join(ROOT, entry)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
Ernie.expose(:fog, Fog)
|