cloud_encrypted_sync_filesystem_adapter 0.1.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/.gitignore +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +35 -0
- data/README.md +16 -0
- data/Rakefile +10 -0
- data/cloud_encrypted_sync_filesystem_adapter.gemspec +25 -0
- data/lib/adapters/filesystem.rb +55 -0
- data/lib/cloud_encrypted_sync_filesystem_adapter.rb +2 -0
- data/lib/version.rb +3 -0
- data/test/test_helper.rb +34 -0
- data/test/unit/adapter_test.rb +118 -0
- metadata +154 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
coverage/*
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
cloud_encrypted_sync_filesystem_adapter (0.1.0)
|
5
|
+
cloud_encrypted_sync
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (3.2.3)
|
11
|
+
i18n (~> 0.6)
|
12
|
+
multi_json (~> 1.0)
|
13
|
+
cloud_encrypted_sync (0.3.1)
|
14
|
+
fakefs (0.4.1)
|
15
|
+
i18n (0.6.0)
|
16
|
+
metaclass (0.0.1)
|
17
|
+
mocha (0.11.4)
|
18
|
+
metaclass (~> 0.0.1)
|
19
|
+
multi_json (1.3.4)
|
20
|
+
rake (0.9.2.2)
|
21
|
+
simplecov (0.6.4)
|
22
|
+
multi_json (~> 1.0)
|
23
|
+
simplecov-html (~> 0.5.3)
|
24
|
+
simplecov-html (0.5.3)
|
25
|
+
|
26
|
+
PLATFORMS
|
27
|
+
ruby
|
28
|
+
|
29
|
+
DEPENDENCIES
|
30
|
+
activesupport
|
31
|
+
cloud_encrypted_sync_filesystem_adapter!
|
32
|
+
fakefs
|
33
|
+
mocha
|
34
|
+
rake
|
35
|
+
simplecov
|
data/README.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
CloudEncryptedSync Filesystem Adapter
|
2
|
+
=====================================
|
3
|
+
|
4
|
+
A simple filesystem adapter for the CloudEncryptedSync gem.
|
5
|
+
|
6
|
+
This gem is meant primarily to serve as a demo. Instead of syncing files
|
7
|
+
to a remote cloud service, this adapter writes the ecrypted files to another
|
8
|
+
folder on your local filesystem.
|
9
|
+
|
10
|
+
In addition to arguments required by CES, you must also pass
|
11
|
+
`--storage-path /some/local/path` which tells CES where to write the encrypted
|
12
|
+
files to.
|
13
|
+
|
14
|
+
In theory, this should work just fine with a NFS mounted folder as well, but
|
15
|
+
this has not been tested and is not officially supported.
|
16
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path('../lib/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "cloud_encrypted_sync_filesystem_adapter"
|
5
|
+
s.version = CloudEncryptedSyncFilesystemAdapter::VERSION
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
s.authors = ["Jonathan S. Garvin"]
|
8
|
+
s.email = ["jon@5valleys.com"]
|
9
|
+
s.homepage = "https://github.com/jsgarvin/cloud_encrypted_sync_filesystem_adapter"
|
10
|
+
s.summary = %q{Filesystem adapter plugin for CloudEncryptedSync gem.}
|
11
|
+
s.description = %q{Filesystem adapter plugin for CloudEncryptedSync gem.}
|
12
|
+
|
13
|
+
s.add_dependency('cloud_encrypted_sync')
|
14
|
+
|
15
|
+
s.add_development_dependency('rake')
|
16
|
+
s.add_development_dependency('mocha')
|
17
|
+
s.add_development_dependency('fakefs')
|
18
|
+
s.add_development_dependency('simplecov')
|
19
|
+
s.add_development_dependency('activesupport')
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module CloudEncryptedSync
|
2
|
+
module Adapters
|
3
|
+
class Filesystem < Template
|
4
|
+
attr_accessor :storage_path
|
5
|
+
|
6
|
+
def parse_command_line_options(parser)
|
7
|
+
parser.on('--storage-path PATH', 'Path to folder where encrypted files are/will be stored.') do |storage|
|
8
|
+
self.storage_path = storage
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def write(data, key)
|
13
|
+
File.open(storage_path_to(key),'w') { |file| file.write(data) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def read(key)
|
17
|
+
if key_exists?(key)
|
18
|
+
File.read(storage_path_to(key))
|
19
|
+
else
|
20
|
+
raise Errors::NoSuchKey.new(key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete(key)
|
25
|
+
if key_exists?(key)
|
26
|
+
File.delete(storage_path_to(key))
|
27
|
+
else
|
28
|
+
raise Errors::NoSuchKey.new(key)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def key_exists?(key)
|
33
|
+
File.exist?(storage_path_to(key))
|
34
|
+
end
|
35
|
+
|
36
|
+
#######
|
37
|
+
private
|
38
|
+
#######
|
39
|
+
|
40
|
+
def storage_path_to(key)
|
41
|
+
"#{expanded_and_created_storage_path}/#{key}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def expanded_and_created_storage_path
|
45
|
+
FileUtils.mkdir_p(expanded_storage_path)
|
46
|
+
return expanded_storage_path
|
47
|
+
end
|
48
|
+
|
49
|
+
def expanded_storage_path
|
50
|
+
File.expand_path(storage_path)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/version.rb
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'simplecov'
|
4
|
+
require 'fakefs/safe'
|
5
|
+
require 'active_support/test_case'
|
6
|
+
require 'test/unit'
|
7
|
+
|
8
|
+
SimpleCov.start
|
9
|
+
|
10
|
+
require 'cloud_encrypted_sync'
|
11
|
+
require 'cloud_encrypted_sync_filesystem_adapter'
|
12
|
+
|
13
|
+
module CloudEncryptedSyncFilesystemAdapter
|
14
|
+
class ActiveSupport::TestCase
|
15
|
+
|
16
|
+
setup :initialize_fake_fs
|
17
|
+
teardown :deactivate_fake_fs
|
18
|
+
|
19
|
+
#######
|
20
|
+
private
|
21
|
+
#######
|
22
|
+
|
23
|
+
def initialize_fake_fs
|
24
|
+
FakeFS.activate!
|
25
|
+
FakeFS::FileSystem.clear
|
26
|
+
end
|
27
|
+
|
28
|
+
def deactivate_fake_fs
|
29
|
+
FakeFS.deactivate!
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
require 'mocha'
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module CloudEncryptedSyncFilesystemAdapter
|
4
|
+
class AdapterTest < ActiveSupport::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
stub_configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
unstub_configuration
|
12
|
+
end
|
13
|
+
|
14
|
+
# This is just a basic example (that will fail until you update it).
|
15
|
+
test 'should parse command line options' do
|
16
|
+
unstub_configuration
|
17
|
+
Object.send(:remove_const,:ARGV)
|
18
|
+
::ARGV = '--storage-path /some/path'.split(/\s/)
|
19
|
+
@option_parser = OptionParser.new do |parser|
|
20
|
+
adapter.parse_command_line_options(parser)
|
21
|
+
end
|
22
|
+
@option_parser.parse!
|
23
|
+
assert_equal('/some/path',CloudEncryptedSync::Adapters::Filesystem.instance.send(:storage_path))
|
24
|
+
stub_configuration #just so that teardown unstub doesn't throw errors
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'should write readable data to cloud and then delete it' do
|
28
|
+
|
29
|
+
test_data = 'testdata'
|
30
|
+
test_key = 'testkey'
|
31
|
+
|
32
|
+
assert !adapter.key_exists?(test_key)
|
33
|
+
|
34
|
+
assert_difference('number_of_files_in_storage') do
|
35
|
+
adapter.write(test_data,test_key)
|
36
|
+
end
|
37
|
+
assert adapter.key_exists?(test_key)
|
38
|
+
|
39
|
+
assert_equal(test_data,adapter.read(test_key))
|
40
|
+
|
41
|
+
assert_difference('number_of_files_in_storage',-1) do
|
42
|
+
adapter.delete(test_key)
|
43
|
+
end
|
44
|
+
assert !adapter.key_exists?(test_key)
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
# Your adapter should be written in such a way that this test passes as is.
|
49
|
+
test 'should raise NoSuchKey error' do
|
50
|
+
assert_raises(CloudEncryptedSync::Errors::NoSuchKey) { adapter.read('nonexistentkey') }
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'should return false for non existent keys' do
|
54
|
+
refute adapter.key_exists?('nonexistentkey')
|
55
|
+
end
|
56
|
+
|
57
|
+
test 'should return true to existent keys' do
|
58
|
+
key = 'foobar'
|
59
|
+
File.open(storage_path_to(key),'w') { |file| file.write('Hello, World!') }
|
60
|
+
assert adapter.key_exists?(key)
|
61
|
+
end
|
62
|
+
|
63
|
+
test 'should write to storage' do
|
64
|
+
key = 'foobar'
|
65
|
+
refute adapter.key_exists?(key)
|
66
|
+
assert_difference('number_of_files_in_storage') do
|
67
|
+
adapter.write('this is my handle, this is my spout',key)
|
68
|
+
end
|
69
|
+
assert adapter.key_exists?(key)
|
70
|
+
end
|
71
|
+
|
72
|
+
test 'should read file from storage' do
|
73
|
+
key = 'foobar'
|
74
|
+
data = 'Hello, World!'
|
75
|
+
File.open(storage_path_to(key),'w') { |file| file.write(data) }
|
76
|
+
assert_equal(data,adapter.read(key))
|
77
|
+
end
|
78
|
+
|
79
|
+
test 'should delete file from storage' do
|
80
|
+
key = 'foobar'
|
81
|
+
data = 'Hello, World!'
|
82
|
+
File.open(storage_path_to(key),'w') { |file| file.write(data) }
|
83
|
+
assert_difference('number_of_files_in_storage',-1) do
|
84
|
+
adapter.delete(key)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
#######
|
89
|
+
private
|
90
|
+
#######
|
91
|
+
|
92
|
+
def number_of_files_in_storage
|
93
|
+
Dir["#{full_storage_path}/*"].length
|
94
|
+
end
|
95
|
+
|
96
|
+
def storage_path_to(key)
|
97
|
+
adapter.send(:storage_path_to,key)
|
98
|
+
end
|
99
|
+
|
100
|
+
def full_storage_path
|
101
|
+
adapter.send(:expanded_storage_path)
|
102
|
+
end
|
103
|
+
|
104
|
+
def adapter
|
105
|
+
CloudEncryptedSync::Adapters::Filesystem.instance
|
106
|
+
end
|
107
|
+
|
108
|
+
# Setup test configuration values here as if they were passed in as command line arguments
|
109
|
+
def stub_configuration
|
110
|
+
CloudEncryptedSync::Adapters::Filesystem.any_instance.stubs(:storage_path).returns(File.expand_path('../test_storage_folder', __FILE__))
|
111
|
+
end
|
112
|
+
|
113
|
+
# Remove stubbed settings here that were stubbed in above method.
|
114
|
+
def unstub_configuration
|
115
|
+
CloudEncryptedSync::Adapters::Filesystem.any_instance.unstub(:storage_path)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cloud_encrypted_sync_filesystem_adapter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jonathan S. Garvin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cloud_encrypted_sync
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: mocha
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: fakefs
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: simplecov
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: activesupport
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Filesystem adapter plugin for CloudEncryptedSync gem.
|
111
|
+
email:
|
112
|
+
- jon@5valleys.com
|
113
|
+
executables: []
|
114
|
+
extensions: []
|
115
|
+
extra_rdoc_files: []
|
116
|
+
files:
|
117
|
+
- .gitignore
|
118
|
+
- Gemfile
|
119
|
+
- Gemfile.lock
|
120
|
+
- README.md
|
121
|
+
- Rakefile
|
122
|
+
- cloud_encrypted_sync_filesystem_adapter.gemspec
|
123
|
+
- lib/adapters/filesystem.rb
|
124
|
+
- lib/cloud_encrypted_sync_filesystem_adapter.rb
|
125
|
+
- lib/version.rb
|
126
|
+
- test/test_helper.rb
|
127
|
+
- test/unit/adapter_test.rb
|
128
|
+
homepage: https://github.com/jsgarvin/cloud_encrypted_sync_filesystem_adapter
|
129
|
+
licenses: []
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
none: false
|
136
|
+
requirements:
|
137
|
+
- - ! '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
none: false
|
142
|
+
requirements:
|
143
|
+
- - ! '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
requirements: []
|
147
|
+
rubyforge_project:
|
148
|
+
rubygems_version: 1.8.24
|
149
|
+
signing_key:
|
150
|
+
specification_version: 3
|
151
|
+
summary: Filesystem adapter plugin for CloudEncryptedSync gem.
|
152
|
+
test_files:
|
153
|
+
- test/test_helper.rb
|
154
|
+
- test/unit/adapter_test.rb
|