fog-local 0.4.0 → 0.8.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.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +10 -0
- data/.github/workflows/ruby.yml +34 -0
- data/.github/workflows/stale.yml +23 -0
- data/CONTRIBUTORS.md +1 -0
- data/README.md +5 -10
- data/fog-local.gemspec +3 -3
- data/lib/fog/bin/local.rb +2 -2
- data/lib/fog/{storage/local → local}/models/directories.rb +4 -3
- data/lib/fog/{storage/local → local}/models/directory.rb +3 -8
- data/lib/fog/{storage/local → local}/models/file.rb +27 -12
- data/lib/fog/{storage/local → local}/models/files.rb +7 -3
- data/lib/fog/local/storage.rb +98 -1
- data/lib/fog/local/version.rb +1 -1
- data/lib/fog/local.rb +7 -7
- data/tests/helper.rb +2 -1
- data/tests/helpers/succeeds_helper.rb +2 -2
- data/tests/local/models/directories_tests.rb +1 -1
- data/tests/local/models/directory_tests.rb +1 -1
- data/tests/local/models/file_tests.rb +81 -5
- data/tests/local/models/files_tests.rb +21 -0
- data/tests/local/storage_tests.rb +4 -4
- metadata +30 -24
- data/.ruby-version +0 -1
- data/.travis.yml +0 -15
- data/lib/fog/storage/local.rb +0 -98
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e7569fa5ae2ee41c45358a28ddb0400a7b9f3224ecda75e03493bd7db059f308
|
4
|
+
data.tar.gz: 37b5d624939ad7da579bef36f4751ecb74fb829aeade62f6b41b2fdc12f20ced
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d15633fba2df0006079c9e6e1c51eb72862561b29d57f051045996b754e8378ad24e1d2f100132dcd2063b5bc18baceffafb68162638894584fc2dbfb47c619
|
7
|
+
data.tar.gz: ed7462cf6ce37d131afa6406bfbb87db8394c573a1fb45dc496420cdbcf2dacc6aee01cc10f54e10ad819ee71a9d63a1f69a82960c5b55b42ab40ae50c073b12
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
strategy:
|
21
|
+
matrix:
|
22
|
+
ruby-version: ['2.5', '2.6', '2.7', '3.0', 'head']
|
23
|
+
|
24
|
+
steps:
|
25
|
+
- uses: actions/checkout@v2
|
26
|
+
- name: Set up Ruby
|
27
|
+
uses: ruby/setup-ruby@v1
|
28
|
+
with:
|
29
|
+
ruby-version: ${{ matrix.ruby-version }}
|
30
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
31
|
+
- name: Install dependencies
|
32
|
+
run: bundle install
|
33
|
+
- name: Run tests
|
34
|
+
run: bundle exec rake
|
@@ -0,0 +1,23 @@
|
|
1
|
+
name: Mark stale issues and pull requests
|
2
|
+
|
3
|
+
on:
|
4
|
+
schedule:
|
5
|
+
- cron: "30 1 * * *"
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
stale:
|
9
|
+
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
|
12
|
+
steps:
|
13
|
+
- uses: actions/stale@v3
|
14
|
+
with:
|
15
|
+
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
16
|
+
days-before-stale: 60
|
17
|
+
days-before-close: 7
|
18
|
+
exempt-issue-labels: 'pinned,security'
|
19
|
+
exempt-pr-labels: 'pinned,security'
|
20
|
+
stale-issue-message: 'This issue has been marked inactive and will be closed if no further activity occurs.'
|
21
|
+
stale-pr-message: 'This pr has been marked inactive and will be closed if no further activity occurs.'
|
22
|
+
stale-issue-label: 'no-issue-activity'
|
23
|
+
stale-pr-label: 'no-pr-activity'
|
data/CONTRIBUTORS.md
CHANGED
data/README.md
CHANGED
@@ -22,27 +22,22 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
Initialise a `Fog::Storage` object
|
25
|
+
Initialise a `Fog::Local::Storage` object:
|
26
26
|
|
27
27
|
```ruby
|
28
|
-
|
29
|
-
storage = Fog::Storage.new({
|
30
|
-
:local_root => '~/fog',
|
31
|
-
:provider => 'Local'
|
32
|
-
})
|
33
|
-
|
28
|
+
storage = Fog::Local::Storage.new(local_root: '~/fog')
|
34
29
|
```
|
35
30
|
|
36
31
|
This can then be used like any other [Fog storage](http://fog.io/storage/).
|
37
32
|
|
38
33
|
```ruby
|
39
|
-
directory = storage.directories.create(:
|
40
|
-
directory.files.create(:
|
34
|
+
directory = storage.directories.create(key: 'data')
|
35
|
+
directory.files.create(body: 'Hello World!', key: 'hello_world.txt')
|
41
36
|
```
|
42
37
|
|
43
38
|
## Contributing
|
44
39
|
|
45
|
-
1. Fork it ( https://github.com/fog/fog-local/fork
|
40
|
+
1. Fork it ( https://github.com/fog/fog-local/fork)
|
46
41
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
47
42
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
48
43
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/fog-local.gemspec
CHANGED
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_development_dependency 'bundler'
|
23
|
-
spec.add_development_dependency 'rake', '
|
22
|
+
spec.add_development_dependency 'bundler'
|
23
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
24
24
|
spec.add_development_dependency 'shindo', '~> 0.3'
|
25
25
|
|
26
|
-
spec.add_dependency 'fog-core', '
|
26
|
+
spec.add_dependency 'fog-core', '>= 1.27', '< 3.0'
|
27
27
|
end
|
data/lib/fog/bin/local.rb
CHANGED
@@ -3,7 +3,7 @@ class Local < Fog::Bin
|
|
3
3
|
def class_for(key)
|
4
4
|
case key
|
5
5
|
when :storage
|
6
|
-
Fog::Storage
|
6
|
+
Fog::Local::Storage
|
7
7
|
else
|
8
8
|
raise ArgumentError, "Unsupported #{self} service: #{key}"
|
9
9
|
end
|
@@ -14,7 +14,7 @@ class Local < Fog::Bin
|
|
14
14
|
hash[key] = case key
|
15
15
|
when :storage
|
16
16
|
Fog::Logger.warning("Local[:storage] is not recommended, use Storage[:local] for portability")
|
17
|
-
Fog::Storage.new
|
17
|
+
Fog::Local::Storage.new
|
18
18
|
else
|
19
19
|
raise ArgumentError, "Unrecognized service: #{key.inspect}"
|
20
20
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Fog
|
2
|
-
module
|
3
|
-
class
|
2
|
+
module Local
|
3
|
+
class Storage
|
4
4
|
class Directories < Fog::Collection
|
5
|
-
model
|
5
|
+
model Directory
|
6
6
|
|
7
7
|
def all
|
8
8
|
data = if ::File.directory?(service.local_root)
|
@@ -22,6 +22,7 @@ module Fog
|
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
|
+
|
25
26
|
def create_directory(key, options)
|
26
27
|
options[:path] ? new(key: key + options[:path]) : new(key: key)
|
27
28
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Fog
|
2
|
-
module
|
3
|
-
class
|
2
|
+
module Local
|
3
|
+
class Storage
|
4
4
|
class Directory < Fog::Model
|
5
5
|
identity :key
|
6
6
|
|
@@ -16,12 +16,7 @@ module Fog
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def files
|
19
|
-
@files ||=
|
20
|
-
Fog::Storage::Local::Files.new(
|
21
|
-
:directory => self,
|
22
|
-
:service => service
|
23
|
-
)
|
24
|
-
end
|
19
|
+
@files ||= Files.new(directory: self, service: service)
|
25
20
|
end
|
26
21
|
|
27
22
|
def public=(new_public)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Fog
|
2
|
-
module
|
3
|
-
class
|
2
|
+
module Local
|
3
|
+
class Storage
|
4
4
|
class File < Fog::Model
|
5
5
|
identity :key, :aliases => 'Key'
|
6
6
|
|
@@ -54,14 +54,7 @@ module Fog
|
|
54
54
|
if dir_path == service.path_to(directory.key)
|
55
55
|
break
|
56
56
|
end
|
57
|
-
|
58
|
-
if ::File.directory?(dir_path)
|
59
|
-
Dir.chdir(dir_path)
|
60
|
-
if Dir.glob('*').empty?
|
61
|
-
Dir.rmdir(dir_path)
|
62
|
-
end
|
63
|
-
Dir.chdir(pwd)
|
64
|
-
end
|
57
|
+
rm_if_empty_dir(dir_path)
|
65
58
|
end
|
66
59
|
true
|
67
60
|
end
|
@@ -74,8 +67,8 @@ module Fog
|
|
74
67
|
requires :directory, :key
|
75
68
|
|
76
69
|
if service.endpoint
|
77
|
-
escaped_directory =
|
78
|
-
escaped_key =
|
70
|
+
escaped_directory = uri_escape(directory.key)
|
71
|
+
escaped_key = uri_escape(key)
|
79
72
|
|
80
73
|
::File.join(service.endpoint, escaped_directory, escaped_key)
|
81
74
|
else
|
@@ -113,6 +106,12 @@ module Fog
|
|
113
106
|
@directory = new_directory
|
114
107
|
end
|
115
108
|
|
109
|
+
def uri_escape(string)
|
110
|
+
string.b.gsub(URI::DEFAULT_PARSER.regexp[:UNSAFE]) do |m|
|
111
|
+
'%' + m.unpack('H2' * m.bytesize).join('%').upcase
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
116
115
|
def path
|
117
116
|
service.path_to(::File.join(directory.key, key))
|
118
117
|
end
|
@@ -125,6 +124,22 @@ module Fog
|
|
125
124
|
IO.copy_stream(input_io, file)
|
126
125
|
end
|
127
126
|
end
|
127
|
+
|
128
|
+
def rm_if_empty_dir(dir_path)
|
129
|
+
if ::File.directory?(dir_path)
|
130
|
+
Dir.rmdir(dir_path) if dir_empty?(dir_path)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def dir_empty?(dir_path)
|
135
|
+
# NOTE: There’s Dir.empty?, but it is only available on Ruby 2.4+
|
136
|
+
|
137
|
+
# NOTE: `entries` will be empty on Windows, and contain . and .. on
|
138
|
+
# unix-like systems (macOS, Linux, BSD, …)
|
139
|
+
|
140
|
+
entries = Dir.entries(dir_path)
|
141
|
+
entries.empty? || entries.all? { |e| ['.', '..'].include?(e) }
|
142
|
+
end
|
128
143
|
end
|
129
144
|
end
|
130
145
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Fog
|
2
|
-
module
|
3
|
-
class
|
2
|
+
module Local
|
3
|
+
class Storage
|
4
4
|
class Files < Fog::Collection
|
5
5
|
attribute :directory
|
6
6
|
|
7
|
-
model
|
7
|
+
model File
|
8
8
|
|
9
9
|
def all
|
10
10
|
requires :directory
|
@@ -71,6 +71,10 @@ module Fog
|
|
71
71
|
super({ :directory => directory }.merge!(attributes))
|
72
72
|
end
|
73
73
|
|
74
|
+
def is_truncated
|
75
|
+
false
|
76
|
+
end
|
77
|
+
|
74
78
|
private
|
75
79
|
|
76
80
|
def file_path(key)
|
data/lib/fog/local/storage.rb
CHANGED
@@ -1 +1,98 @@
|
|
1
|
-
|
1
|
+
module Fog
|
2
|
+
module Local
|
3
|
+
class Storage < Fog::Service
|
4
|
+
autoload :Directories, 'fog/local/models/directories'
|
5
|
+
autoload :Directory, 'fog/local/models/directory'
|
6
|
+
autoload :File, 'fog/local/models/file'
|
7
|
+
autoload :Files, 'fog/local/models/files'
|
8
|
+
|
9
|
+
requires :local_root
|
10
|
+
recognizes :endpoint, :scheme, :host, :port, :path
|
11
|
+
|
12
|
+
model_path 'fog/local/models'
|
13
|
+
collection :directories
|
14
|
+
model :directory
|
15
|
+
model :file
|
16
|
+
collection :files
|
17
|
+
|
18
|
+
require 'uri'
|
19
|
+
|
20
|
+
class Mock
|
21
|
+
attr_reader :endpoint
|
22
|
+
|
23
|
+
def self.data
|
24
|
+
@data ||= Hash.new do |hash, key|
|
25
|
+
hash[key] = {}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.reset
|
30
|
+
@data = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(options={})
|
34
|
+
Fog::Mock.not_implemented
|
35
|
+
|
36
|
+
@local_root = ::File.expand_path(options[:local_root])
|
37
|
+
|
38
|
+
@endpoint = options[:endpoint] || build_endpoint_from_options(options)
|
39
|
+
end
|
40
|
+
|
41
|
+
def data
|
42
|
+
self.class.data[@local_root]
|
43
|
+
end
|
44
|
+
|
45
|
+
def local_root
|
46
|
+
@local_root
|
47
|
+
end
|
48
|
+
|
49
|
+
def path_to(partial)
|
50
|
+
::File.join(@local_root, partial)
|
51
|
+
end
|
52
|
+
|
53
|
+
def reset_data
|
54
|
+
self.class.data.delete(@local_root)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def build_endpoint_from_options(options)
|
59
|
+
return unless options[:host]
|
60
|
+
|
61
|
+
URI::Generic.build(options).to_s
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class Real
|
66
|
+
attr_reader :endpoint
|
67
|
+
|
68
|
+
def initialize(options={})
|
69
|
+
@local_root = ::File.expand_path(options[:local_root])
|
70
|
+
|
71
|
+
@endpoint = options[:endpoint] || build_endpoint_from_options(options)
|
72
|
+
end
|
73
|
+
|
74
|
+
def local_root
|
75
|
+
@local_root
|
76
|
+
end
|
77
|
+
|
78
|
+
def path_to(partial)
|
79
|
+
::File.join(@local_root, partial)
|
80
|
+
end
|
81
|
+
|
82
|
+
def copy_object(source_directory_name, source_object_name, target_directory_name, target_object_name, options={})
|
83
|
+
source_path = path_to(::File.join(source_directory_name, source_object_name))
|
84
|
+
target_path = path_to(::File.join(target_directory_name, target_object_name))
|
85
|
+
::FileUtils.mkdir_p(::File.dirname(target_path))
|
86
|
+
::FileUtils.copy_file(source_path, target_path)
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
def build_endpoint_from_options(options)
|
91
|
+
return unless options[:host]
|
92
|
+
|
93
|
+
URI::Generic.build(options).to_s
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/fog/local/version.rb
CHANGED
data/lib/fog/local.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'fog/core'
|
2
2
|
require 'fileutils'
|
3
3
|
require 'tempfile'
|
4
|
-
require File.expand_path('../local/version', __FILE__)
|
5
4
|
|
6
|
-
|
7
|
-
module Storage
|
8
|
-
autoload :Local, File.expand_path('../storage/local', __FILE__)
|
9
|
-
end
|
5
|
+
require 'fog/local/version'
|
10
6
|
|
7
|
+
module Fog
|
11
8
|
module Local
|
12
|
-
extend
|
9
|
+
extend Provider
|
13
10
|
|
14
|
-
|
11
|
+
autoload :Storage, 'fog/local/storage'
|
12
|
+
service :storage, :Storage
|
15
13
|
end
|
16
14
|
end
|
15
|
+
|
16
|
+
Fog::Storage::Local = Fog::Local::Storage # legacy compat
|
data/tests/helper.rb
CHANGED
@@ -5,7 +5,8 @@ rescue LoadError => e
|
|
5
5
|
$stderr.puts "not recording test coverage: #{e.inspect}"
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
9
|
+
require 'fog/local'
|
9
10
|
|
10
11
|
Bundler.require(:test)
|
11
12
|
require 'tmpdir'
|
@@ -3,7 +3,7 @@ Shindo.tests('Storage[:local] | directories', ["local"]) do
|
|
3
3
|
pending if Fog.mocking?
|
4
4
|
|
5
5
|
@options = { :local_root => Dir.mktmpdir('fog-tests') }
|
6
|
-
@collection = Fog::Storage
|
6
|
+
@collection = Fog::Local::Storage.new(@options).directories
|
7
7
|
|
8
8
|
collection_tests(@collection, {:key => "fogdirtests"}, true)
|
9
9
|
|
@@ -12,7 +12,7 @@ Shindo.tests('Storage[:local] | directory', ["local"]) do
|
|
12
12
|
|
13
13
|
tests('save') do
|
14
14
|
returns('directory') do
|
15
|
-
connection = Fog::Storage
|
15
|
+
connection = Fog::Local::Storage.new(@options)
|
16
16
|
connection.directories.create(:key => 'directory')
|
17
17
|
connection.directories.create(:key => 'directory').key
|
18
18
|
end
|
@@ -15,7 +15,7 @@ Shindo.tests('Storage[:local] | file', ["local"]) do
|
|
15
15
|
returns('http://example.com/files/directory/file.txt') do
|
16
16
|
@options[:endpoint] = 'http://example.com/files'
|
17
17
|
|
18
|
-
connection = Fog::Storage
|
18
|
+
connection = Fog::Local::Storage.new(@options)
|
19
19
|
directory = connection.directories.new(:key => 'directory')
|
20
20
|
file = directory.files.new(:key => 'file.txt')
|
21
21
|
|
@@ -26,7 +26,7 @@ Shindo.tests('Storage[:local] | file', ["local"]) do
|
|
26
26
|
returns(nil) do
|
27
27
|
@options[:endpoint] = nil
|
28
28
|
|
29
|
-
connection = Fog::Storage
|
29
|
+
connection = Fog::Local::Storage.new(@options)
|
30
30
|
directory = connection.directories.new(:key => 'directory')
|
31
31
|
file = directory.files.new(:key => 'file.txt')
|
32
32
|
|
@@ -37,10 +37,21 @@ Shindo.tests('Storage[:local] | file', ["local"]) do
|
|
37
37
|
returns('http://example.com/files/my%20directory/my%20file.txt') do
|
38
38
|
@options[:endpoint] = 'http://example.com/files'
|
39
39
|
|
40
|
-
connection = Fog::Storage
|
40
|
+
connection = Fog::Local::Storage.new(@options)
|
41
41
|
directory = connection.directories.new(:key => 'my directory')
|
42
42
|
file = directory.files.new(:key => 'my file.txt')
|
43
43
|
|
44
|
+
file.public_url
|
45
|
+
end
|
46
|
+
|
47
|
+
tests('when key has safe characters').
|
48
|
+
returns('http://example.com/files/my/directory/my/file.txt') do
|
49
|
+
@options[:endpoint] = 'http://example.com/files'
|
50
|
+
|
51
|
+
connection = Fog::Local::Storage.new(@options)
|
52
|
+
directory = connection.directories.new(:key => 'my/directory')
|
53
|
+
file = directory.files.new(:key => 'my/file.txt')
|
54
|
+
|
44
55
|
file.public_url
|
45
56
|
end
|
46
57
|
end
|
@@ -48,7 +59,7 @@ Shindo.tests('Storage[:local] | file', ["local"]) do
|
|
48
59
|
tests('#save') do
|
49
60
|
tests('creates non-existent subdirs') do
|
50
61
|
returns(true) do
|
51
|
-
connection = Fog::Storage
|
62
|
+
connection = Fog::Local::Storage.new(@options)
|
52
63
|
directory = connection.directories.new(:key => 'path1')
|
53
64
|
file = directory.files.new(:key => 'path2/file.rb', :body => "my contents")
|
54
65
|
file.save
|
@@ -57,7 +68,7 @@ Shindo.tests('Storage[:local] | file', ["local"]) do
|
|
57
68
|
end
|
58
69
|
|
59
70
|
tests('with tempfile').returns('tempfile') do
|
60
|
-
connection = Fog::Storage
|
71
|
+
connection = Fog::Local::Storage.new(@options)
|
61
72
|
directory = connection.directories.create(:key => 'directory')
|
62
73
|
|
63
74
|
tempfile = Tempfile.new(['file', '.txt'])
|
@@ -76,4 +87,69 @@ Shindo.tests('Storage[:local] | file', ["local"]) do
|
|
76
87
|
directory.files.get('tempfile.txt').body
|
77
88
|
end
|
78
89
|
end
|
90
|
+
|
91
|
+
tests('#destroy') do
|
92
|
+
# - removes dir if it contains no files
|
93
|
+
# - keeps dir if it contains non-hidden files
|
94
|
+
# - keeps dir if it contains hidden files
|
95
|
+
# - stays in the same directory
|
96
|
+
|
97
|
+
tests('removes enclosing dir if it is empty') do
|
98
|
+
returns(false) do
|
99
|
+
connection = Fog::Local::Storage.new(@options)
|
100
|
+
directory = connection.directories.new(:key => 'path1')
|
101
|
+
|
102
|
+
file = directory.files.new(:key => 'path2/file.rb', :body => "my contents")
|
103
|
+
file.save
|
104
|
+
file.destroy
|
105
|
+
|
106
|
+
File.exists?(@options[:local_root] + "/path1/path2")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
tests('keeps enclosing dir if it is not empty') do
|
111
|
+
returns(true) do
|
112
|
+
connection = Fog::Local::Storage.new(@options)
|
113
|
+
directory = connection.directories.new(:key => 'path1')
|
114
|
+
|
115
|
+
file = directory.files.new(:key => 'path2/file.rb', :body => "my contents")
|
116
|
+
file.save
|
117
|
+
|
118
|
+
file = directory.files.new(:key => 'path2/file2.rb', :body => "my contents")
|
119
|
+
file.save
|
120
|
+
file.destroy
|
121
|
+
|
122
|
+
File.exists?(@options[:local_root] + "/path1/path2")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
tests('keeps enclosing dir if contains only hidden files') do
|
127
|
+
returns(true) do
|
128
|
+
connection = Fog::Local::Storage.new(@options)
|
129
|
+
directory = connection.directories.new(:key => 'path1')
|
130
|
+
|
131
|
+
file = directory.files.new(:key => 'path2/.file.rb', :body => "my contents")
|
132
|
+
file.save
|
133
|
+
|
134
|
+
file = directory.files.new(:key => 'path2/.file2.rb', :body => "my contents")
|
135
|
+
file.save
|
136
|
+
file.destroy
|
137
|
+
|
138
|
+
File.exists?(@options[:local_root] + "/path1/path2")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
tests('it stays in the same directory') do
|
143
|
+
returns(Dir.pwd) do
|
144
|
+
connection = Fog::Local::Storage.new(@options)
|
145
|
+
directory = connection.directories.new(:key => 'path1')
|
146
|
+
|
147
|
+
file = directory.files.new(:key => 'path2/file2.rb', :body => "my contents")
|
148
|
+
file.save
|
149
|
+
file.destroy
|
150
|
+
|
151
|
+
Dir.pwd
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
79
155
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Shindo.tests('Storage[:local] | files', ["local"]) do
|
2
|
+
|
3
|
+
pending if Fog.mocking?
|
4
|
+
|
5
|
+
before do
|
6
|
+
@options = { :local_root => Dir.mktmpdir('fog-tests') }
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
FileUtils.remove_entry_secure(@options[:local_root]) if File.directory?(@options[:local_root])
|
11
|
+
end
|
12
|
+
|
13
|
+
tests("#is_truncated") do
|
14
|
+
returns(false) do
|
15
|
+
connection = Fog::Local::Storage.new(@options)
|
16
|
+
directory = connection.directories.create(:key => 'directory')
|
17
|
+
collection = directory.files
|
18
|
+
collection.is_truncated
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -13,7 +13,7 @@ Shindo.tests('Local | storage') do
|
|
13
13
|
tests('#endpoint') do
|
14
14
|
tests('when no endpoint is provided').
|
15
15
|
returns(nil) do
|
16
|
-
Fog::Storage
|
16
|
+
Fog::Local::Storage.new(@options).endpoint
|
17
17
|
end
|
18
18
|
|
19
19
|
tests('when no host is provided').
|
@@ -22,14 +22,14 @@ Shindo.tests('Local | storage') do
|
|
22
22
|
@options[:path] = '/files'
|
23
23
|
@options[:port] = 80
|
24
24
|
|
25
|
-
Fog::Storage
|
25
|
+
Fog::Local::Storage.new(@options).endpoint
|
26
26
|
end
|
27
27
|
|
28
28
|
tests('when endpoint is provided').
|
29
29
|
returns('http://example.com/files') do
|
30
30
|
@options[:endpoint] = 'http://example.com/files'
|
31
31
|
|
32
|
-
Fog::Storage
|
32
|
+
Fog::Local::Storage.new(@options).endpoint
|
33
33
|
end
|
34
34
|
|
35
35
|
tests('when at least host option is provided').
|
@@ -38,7 +38,7 @@ Shindo.tests('Local | storage') do
|
|
38
38
|
@options[:host] = 'example.com'
|
39
39
|
@options[:path] = '/files'
|
40
40
|
|
41
|
-
Fog::Storage
|
41
|
+
Fog::Local::Storage.new(@options).endpoint
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
metadata
CHANGED
@@ -1,44 +1,44 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog-local
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wesley Beary
|
8
8
|
- Ville Lautanala
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-01-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '0'
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rake
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - "
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 12.3.3
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 12.3.3
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: shindo
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -57,16 +57,22 @@ dependencies:
|
|
57
57
|
name: fog-core
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '1.27'
|
63
|
+
- - "<"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '3.0'
|
63
66
|
type: :runtime
|
64
67
|
prerelease: false
|
65
68
|
version_requirements: !ruby/object:Gem::Requirement
|
66
69
|
requirements:
|
67
|
-
- - "
|
70
|
+
- - ">="
|
68
71
|
- !ruby/object:Gem::Version
|
69
72
|
version: '1.27'
|
73
|
+
- - "<"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
70
76
|
description: |-
|
71
77
|
This library can be used as a module for `fog` or as standalone provider
|
72
78
|
to use local filesystem storage.
|
@@ -77,10 +83,11 @@ executables: []
|
|
77
83
|
extensions: []
|
78
84
|
extra_rdoc_files: []
|
79
85
|
files:
|
86
|
+
- ".github/dependabot.yml"
|
87
|
+
- ".github/workflows/ruby.yml"
|
88
|
+
- ".github/workflows/stale.yml"
|
80
89
|
- ".gitignore"
|
81
90
|
- ".ruby-gemset"
|
82
|
-
- ".ruby-version"
|
83
|
-
- ".travis.yml"
|
84
91
|
- CONTRIBUTING.md
|
85
92
|
- CONTRIBUTORS.md
|
86
93
|
- Gemfile
|
@@ -90,13 +97,12 @@ files:
|
|
90
97
|
- fog-local.gemspec
|
91
98
|
- lib/fog/bin/local.rb
|
92
99
|
- lib/fog/local.rb
|
100
|
+
- lib/fog/local/models/directories.rb
|
101
|
+
- lib/fog/local/models/directory.rb
|
102
|
+
- lib/fog/local/models/file.rb
|
103
|
+
- lib/fog/local/models/files.rb
|
93
104
|
- lib/fog/local/storage.rb
|
94
105
|
- lib/fog/local/version.rb
|
95
|
-
- lib/fog/storage/local.rb
|
96
|
-
- lib/fog/storage/local/models/directories.rb
|
97
|
-
- lib/fog/storage/local/models/directory.rb
|
98
|
-
- lib/fog/storage/local/models/file.rb
|
99
|
-
- lib/fog/storage/local/models/files.rb
|
100
106
|
- tests/helper.rb
|
101
107
|
- tests/helpers/collection_helper.rb
|
102
108
|
- tests/helpers/mock_helper.rb
|
@@ -105,13 +111,14 @@ files:
|
|
105
111
|
- tests/local/models/directories_tests.rb
|
106
112
|
- tests/local/models/directory_tests.rb
|
107
113
|
- tests/local/models/file_tests.rb
|
114
|
+
- tests/local/models/files_tests.rb
|
108
115
|
- tests/local/storage_tests.rb
|
109
116
|
- tests/watchr.rb
|
110
117
|
homepage: https://github.com/fog/fog-local
|
111
118
|
licenses:
|
112
119
|
- MIT
|
113
120
|
metadata: {}
|
114
|
-
post_install_message:
|
121
|
+
post_install_message:
|
115
122
|
rdoc_options: []
|
116
123
|
require_paths:
|
117
124
|
- lib
|
@@ -126,9 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
133
|
- !ruby/object:Gem::Version
|
127
134
|
version: '0'
|
128
135
|
requirements: []
|
129
|
-
|
130
|
-
|
131
|
-
signing_key:
|
136
|
+
rubygems_version: 3.2.15
|
137
|
+
signing_key:
|
132
138
|
specification_version: 4
|
133
139
|
summary: Module for the 'fog' gem to support local filesystem storage.
|
134
140
|
test_files: []
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.2.0
|
data/.travis.yml
DELETED
data/lib/fog/storage/local.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
module Fog
|
2
|
-
module Storage
|
3
|
-
class Local < Fog::Service
|
4
|
-
autoload :Directories, ::File.expand_path('../local/models/directories', __FILE__)
|
5
|
-
autoload :Directory, ::File.expand_path('../local/models/directory', __FILE__)
|
6
|
-
autoload :File, ::File.expand_path('../local/models/file', __FILE__)
|
7
|
-
autoload :Files, ::File.expand_path('../local/models/files', __FILE__)
|
8
|
-
|
9
|
-
requires :local_root
|
10
|
-
recognizes :endpoint, :scheme, :host, :port, :path
|
11
|
-
|
12
|
-
model_path 'fog/storage/local/models'
|
13
|
-
collection :directories
|
14
|
-
model :directory
|
15
|
-
model :file
|
16
|
-
collection :files
|
17
|
-
|
18
|
-
require 'uri'
|
19
|
-
|
20
|
-
class Mock
|
21
|
-
attr_reader :endpoint
|
22
|
-
|
23
|
-
def self.data
|
24
|
-
@data ||= Hash.new do |hash, key|
|
25
|
-
hash[key] = {}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.reset
|
30
|
-
@data = nil
|
31
|
-
end
|
32
|
-
|
33
|
-
def initialize(options={})
|
34
|
-
Fog::Mock.not_implemented
|
35
|
-
|
36
|
-
@local_root = ::File.expand_path(options[:local_root])
|
37
|
-
|
38
|
-
@endpoint = options[:endpoint] || build_endpoint_from_options(options)
|
39
|
-
end
|
40
|
-
|
41
|
-
def data
|
42
|
-
self.class.data[@local_root]
|
43
|
-
end
|
44
|
-
|
45
|
-
def local_root
|
46
|
-
@local_root
|
47
|
-
end
|
48
|
-
|
49
|
-
def path_to(partial)
|
50
|
-
::File.join(@local_root, partial)
|
51
|
-
end
|
52
|
-
|
53
|
-
def reset_data
|
54
|
-
self.class.data.delete(@local_root)
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
def build_endpoint_from_options(options)
|
59
|
-
return unless options[:host]
|
60
|
-
|
61
|
-
URI::Generic.build(options).to_s
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
class Real
|
66
|
-
attr_reader :endpoint
|
67
|
-
|
68
|
-
def initialize(options={})
|
69
|
-
@local_root = ::File.expand_path(options[:local_root])
|
70
|
-
|
71
|
-
@endpoint = options[:endpoint] || build_endpoint_from_options(options)
|
72
|
-
end
|
73
|
-
|
74
|
-
def local_root
|
75
|
-
@local_root
|
76
|
-
end
|
77
|
-
|
78
|
-
def path_to(partial)
|
79
|
-
::File.join(@local_root, partial)
|
80
|
-
end
|
81
|
-
|
82
|
-
def copy_object(source_directory_name, source_object_name, target_directory_name, target_object_name, options={})
|
83
|
-
source_path = path_to(::File.join(source_directory_name, source_object_name))
|
84
|
-
target_path = path_to(::File.join(target_directory_name, target_object_name))
|
85
|
-
::FileUtils.mkdir_p(::File.dirname(target_path))
|
86
|
-
::FileUtils.copy_file(source_path, target_path)
|
87
|
-
end
|
88
|
-
|
89
|
-
private
|
90
|
-
def build_endpoint_from_options(options)
|
91
|
-
return unless options[:host]
|
92
|
-
|
93
|
-
URI::Generic.build(options).to_s
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|