file-manager 0.1.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +8 -3
- data/Gemfile +4 -0
- data/Gemfile.lock +33 -30
- data/README.md +12 -1
- data/Rakefile +1 -0
- data/file-manager.gemspec +3 -4
- data/lib/file_manager.rb +4 -0
- data/lib/local_file_manager.rb +22 -1
- data/lib/memory_file_manager.rb +17 -0
- data/lib/s3_file_manager.rb +28 -3
- data/test/coverage_test.rb +15 -0
- data/test/file_manager_test.rb +46 -0
- data/test/{local_test.rb → local_file_manager_test.rb} +3 -0
- data/test/{memory_test.rb → memory_file_manager_test.rb} +3 -0
- data/test/{s3_test.rb → s3_file_manager_test.rb} +4 -1
- data/test/test_helper.rb +3 -4
- data/test/vcr_cassettes/test_downloading_to_temp_file.yml +204 -0
- data/test/vcr_cassettes/test_listing_files.yml +103 -110
- data/test/vcr_cassettes/test_listing_files_in_sub_dir.yml +103 -110
- data/test/vcr_cassettes/test_reading.yml +64 -68
- data/test/vcr_cassettes/test_reading_in_sub_dir.yml +64 -68
- data/test/vcr_cassettes/test_remove_not_existing_file_dont_raise.yml +97 -0
- data/test/vcr_cassettes/test_rename_file.yml +641 -0
- metadata +26 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ace7fc3d0de9b646ee8b5de0e5354394c02f6b6a85703cd21691ef14a8466a71
|
4
|
+
data.tar.gz: 18f272b1e9d9d1b57029c66d4385e1a768cf676ce25b15185f4b6c54f0f009d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0468886aa264b87523a7ac13a3571e37fb186e35a1b286bbd8eb1d3746074750e7fddf08cc6665c29b7161078c08f5fef88d576801e11d5d1ce91351c83427d1'
|
7
|
+
data.tar.gz: a323b2c72aea6779fa6f1d14a5ebd063041d4af842cfa6bf661e218c84745e68a2f3537acb58197d476fc379bfc79ce4019898dba6801c316f55b57618e01d41
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,52 +1,55 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
file-manager (0.
|
5
|
-
aws-sdk (
|
4
|
+
file-manager (0.5.0)
|
5
|
+
aws-sdk-s3 (~> 1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
addressable (2.
|
11
|
-
|
12
|
-
|
13
|
-
aws-
|
10
|
+
addressable (2.7.0)
|
11
|
+
public_suffix (>= 2.0.2, < 5.0)
|
12
|
+
aws-eventstream (1.1.0)
|
13
|
+
aws-partitions (1.391.0)
|
14
|
+
aws-sdk-core (3.109.2)
|
15
|
+
aws-eventstream (~> 1, >= 1.0.2)
|
16
|
+
aws-partitions (~> 1, >= 1.239.0)
|
17
|
+
aws-sigv4 (~> 1.1)
|
14
18
|
jmespath (~> 1.0)
|
15
|
-
aws-sdk-
|
16
|
-
aws-sdk-core (
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
vcr (3.0.1)
|
34
|
-
webmock (1.22.6)
|
19
|
+
aws-sdk-kms (1.39.0)
|
20
|
+
aws-sdk-core (~> 3, >= 3.109.0)
|
21
|
+
aws-sigv4 (~> 1.1)
|
22
|
+
aws-sdk-s3 (1.84.1)
|
23
|
+
aws-sdk-core (~> 3, >= 3.109.0)
|
24
|
+
aws-sdk-kms (~> 1)
|
25
|
+
aws-sigv4 (~> 1.1)
|
26
|
+
aws-sigv4 (1.2.2)
|
27
|
+
aws-eventstream (~> 1, >= 1.0.2)
|
28
|
+
crack (0.4.4)
|
29
|
+
hashdiff (1.0.1)
|
30
|
+
jmespath (1.4.0)
|
31
|
+
minitest (5.14.2)
|
32
|
+
public_suffix (4.0.6)
|
33
|
+
rake (13.0.1)
|
34
|
+
single_cov (1.6.0)
|
35
|
+
vcr (6.0.0)
|
36
|
+
webmock (3.9.5)
|
35
37
|
addressable (>= 2.3.6)
|
36
38
|
crack (>= 0.3.2)
|
37
|
-
hashdiff
|
39
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
38
40
|
|
39
41
|
PLATFORMS
|
42
|
+
java
|
40
43
|
ruby
|
41
44
|
|
42
45
|
DEPENDENCIES
|
43
|
-
bundler (
|
44
|
-
codeclimate-test-reporter
|
46
|
+
bundler (>= 1.16.2)
|
45
47
|
file-manager!
|
46
48
|
minitest
|
47
49
|
rake
|
50
|
+
single_cov
|
48
51
|
vcr
|
49
52
|
webmock
|
50
53
|
|
51
54
|
BUNDLED WITH
|
52
|
-
|
55
|
+
2.0.1
|
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
# File::Manager
|
1
|
+
# File::Manager
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/fortesinformatica/file-manager.svg?branch=master)](https://travis-ci.org/fortesinformatica/file-manager)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/fortesinformatica/file-manager/badges/gpa.svg)](https://codeclimate.com/github/fortesinformatica/file-manager)
|
2
5
|
|
3
6
|
File manager local or S3
|
4
7
|
|
@@ -37,6 +40,14 @@ file_manager_txt = factory.create(:txt)
|
|
37
40
|
|
38
41
|
file_manager_txt.save_file('babau.txt', 'buuuu')
|
39
42
|
|
43
|
+
## Testing
|
44
|
+
|
45
|
+
```sh
|
46
|
+
export AWS_ACCESS_KEY_ID='' # with your keys
|
47
|
+
export AWS_SECRET_ACCESS_KEY=''
|
48
|
+
bundle exec rake
|
49
|
+
```
|
50
|
+
|
40
51
|
## Contributing
|
41
52
|
|
42
53
|
1. Fork it
|
data/Rakefile
CHANGED
data/file-manager.gemspec
CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
5
|
spec.name = "file-manager"
|
6
|
-
spec.version = '0.
|
6
|
+
spec.version = '0.5.0'
|
7
7
|
spec.authors = ["Francisco Barroso / Marlus Saraiva"]
|
8
8
|
spec.email = ["franciscobarroso@grupofortes.com.br"]
|
9
9
|
spec.description = 'File manager, access S3 or local'
|
@@ -16,11 +16,10 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.require_paths = ["lib"]
|
17
17
|
spec.homepage = 'https://github.com/fortesinformatica/file-manager'
|
18
18
|
|
19
|
-
spec.add_dependency 'aws-sdk', '
|
20
|
-
spec.add_development_dependency "bundler", "
|
19
|
+
spec.add_dependency 'aws-sdk-s3', '~> 1'
|
20
|
+
spec.add_development_dependency "bundler", ">= 1.16.2"
|
21
21
|
spec.add_development_dependency "rake"
|
22
22
|
spec.add_development_dependency 'minitest'
|
23
23
|
spec.add_development_dependency 'vcr'
|
24
24
|
spec.add_development_dependency 'webmock'
|
25
|
-
spec.add_development_dependency 'codeclimate-test-reporter'
|
26
25
|
end
|
data/lib/file_manager.rb
CHANGED
data/lib/local_file_manager.rb
CHANGED
@@ -23,6 +23,17 @@ class LocalFileManager < FileManager
|
|
23
23
|
@logger.puts 'done.'
|
24
24
|
end
|
25
25
|
|
26
|
+
def download_to_temp_file(file_name)
|
27
|
+
@logger.print "Copying local file \"#{file_name}\" to folder \"#{root_path}\"..."
|
28
|
+
full_file_name = Pathname(File.join(root_path, file_name))
|
29
|
+
Dir.mktmpdir do |dir|
|
30
|
+
temp_file = "#{dir}/#{full_file_name.basename}"
|
31
|
+
FileUtils.cp(full_file_name, temp_file)
|
32
|
+
yield(temp_file)
|
33
|
+
end
|
34
|
+
@logger.puts 'done.'
|
35
|
+
end
|
36
|
+
|
26
37
|
def list_files(prefix = '', file_extension = '*')
|
27
38
|
FileUtils.mkdir_p(root_path)
|
28
39
|
@logger.print "Listing \"#{prefix}*.#{file_extension}\" from local folder \"#{root_path}\"..."
|
@@ -36,7 +47,17 @@ class LocalFileManager < FileManager
|
|
36
47
|
|
37
48
|
def delete_file file_name
|
38
49
|
@logger.print "Deleting file \"#{file_name}\" from local folder \"#{root_path}\"..."
|
39
|
-
File.
|
50
|
+
full_file_name = File.join(root_path, file_name)
|
51
|
+
File.delete(full_file_name) if File.exist?(full_file_name)
|
52
|
+
@logger.puts 'done.'
|
53
|
+
end
|
54
|
+
|
55
|
+
def rename_file original_file_name, target_file_name
|
56
|
+
@logger.print "Renaming file \"#{original_file_name}\" to \"#{target_file_name}\" from local folder \"#{root_path}\"..."
|
57
|
+
full_original_file_name = File.join(root_path, original_file_name)
|
58
|
+
full_target_file_name = Pathname(File.join(root_path, target_file_name))
|
59
|
+
FileUtils.mkdir_p(full_target_file_name.dirname)
|
60
|
+
FileUtils.mv full_original_file_name, full_target_file_name
|
40
61
|
@logger.puts 'done.'
|
41
62
|
end
|
42
63
|
|
data/lib/memory_file_manager.rb
CHANGED
@@ -16,6 +16,10 @@ class MemoryFileManager < FileManager
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def list_files(prefix = '', file_extension = '*')
|
19
|
+
if prefix == '' && file_extension == '*'
|
20
|
+
return @data.keys
|
21
|
+
end
|
22
|
+
|
19
23
|
@data.keys.select{|key| key.start_with?(prefix) && key.end_with?(".#{file_extension}")}
|
20
24
|
end
|
21
25
|
|
@@ -23,4 +27,17 @@ class MemoryFileManager < FileManager
|
|
23
27
|
@data.delete "#{file_name}"
|
24
28
|
end
|
25
29
|
|
30
|
+
def download_to_temp_file(file_name)
|
31
|
+
Dir.mktmpdir do |dir|
|
32
|
+
temp_file = "#{dir}/#{Pathname(file_name).basename}"
|
33
|
+
content = read_file(file_name)
|
34
|
+
File.open(temp_file, 'w') { |file| file.write(content) }
|
35
|
+
yield(temp_file)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def rename_file original_file_name, target_file_name
|
40
|
+
@data["#{target_file_name}"] = @data["#{original_file_name}"]
|
41
|
+
@data.delete "#{original_file_name}"
|
42
|
+
end
|
26
43
|
end
|
data/lib/s3_file_manager.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'file_manager'
|
2
|
-
require 'aws-sdk'
|
2
|
+
require 'aws-sdk-s3'
|
3
3
|
|
4
4
|
class S3FileManager < FileManager
|
5
5
|
|
@@ -30,6 +30,19 @@ class S3FileManager < FileManager
|
|
30
30
|
logger.puts 'done.'
|
31
31
|
end
|
32
32
|
|
33
|
+
def download_to_temp_file(file_name)
|
34
|
+
Dir.mktmpdir do |dir|
|
35
|
+
@logger.print "Downloading file \"#{bucket_name}/#{file_name}\" to temp folder \"#{dir}\"..."
|
36
|
+
temp_file = "#{dir}/#{Pathname(file_name).basename}"
|
37
|
+
|
38
|
+
s3_client = connect_s3_client
|
39
|
+
s3_client.get_object({ bucket: bucket_name, key: file_name }, target: temp_file)
|
40
|
+
|
41
|
+
yield(temp_file)
|
42
|
+
end
|
43
|
+
logger.puts 'done.'
|
44
|
+
end
|
45
|
+
|
33
46
|
def list_files(prefix = '', file_extension = '*')
|
34
47
|
# objects = []
|
35
48
|
# last_key = nil
|
@@ -67,18 +80,30 @@ class S3FileManager < FileManager
|
|
67
80
|
logger.puts 'done.'
|
68
81
|
end
|
69
82
|
|
83
|
+
def rename_file original_file_name, target_file_name
|
84
|
+
s3_service = connect_s3_service
|
85
|
+
bucket = s3_service.bucket(bucket_name)
|
86
|
+
logger.print "Renaming file \"#{original_file_name}\" \"#{target_file_name}\" from bucket \"#{bucket_name}\"..."
|
87
|
+
bucket.object(original_file_name).move_to(bucket: bucket_name, key: target_file_name)
|
88
|
+
logger.puts 'done.'
|
89
|
+
end
|
90
|
+
|
70
91
|
private
|
71
92
|
|
72
93
|
def connect_s3_service
|
73
94
|
logger.print "Accessing S3 service..."
|
74
95
|
|
75
96
|
credentials = Aws::Credentials.new(options[:access_key_id], options[:secret_access_key])
|
76
|
-
|
77
|
-
client = Aws::S3::Client.new(region:'us-west-2', credentials: credentials)
|
97
|
+
client = Aws::S3::Client.new(region: options[:region], credentials: credentials)
|
78
98
|
|
79
99
|
service = Aws::S3::Resource.new(client: client)
|
80
100
|
logger.puts 'done.'
|
81
101
|
service
|
82
102
|
end
|
83
103
|
|
104
|
+
def connect_s3_client
|
105
|
+
credentials = Aws::Credentials.new(options[:access_key_id], options[:secret_access_key])
|
106
|
+
Aws::S3::Client.new(region: options[:region], credentials: credentials)
|
107
|
+
end
|
108
|
+
|
84
109
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require './test/test_helper'
|
2
|
+
SingleCov.not_covered! # not testing any code in lib/
|
3
|
+
|
4
|
+
class CoverageTest < Minitest::Test
|
5
|
+
def test_for_untested_code
|
6
|
+
# option :tests to pass custom Dir.glob results
|
7
|
+
SingleCov.assert_used
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_for_untested_files
|
11
|
+
# option :tests and :files to pass custom Dir.glob results
|
12
|
+
# :untested to get it passing with known untested files
|
13
|
+
SingleCov.assert_tested untested: %w[lib/file_manager_factory.rb]
|
14
|
+
end
|
15
|
+
end
|
data/test/file_manager_test.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require './test/test_helper'
|
2
2
|
require 'memory_file_manager'
|
3
3
|
|
4
|
+
SingleCov.covered! uncovered: 5
|
5
|
+
|
4
6
|
module FileManagerTest
|
5
7
|
def test_reading
|
6
8
|
assert_raises(FileNotFoundError) { @manager.read_file 'not_saved' }
|
@@ -47,4 +49,48 @@ module FileManagerTest
|
|
47
49
|
@manager.delete_file 'sub_dir/saved.*'
|
48
50
|
assert_empty @manager.list_files
|
49
51
|
end
|
52
|
+
|
53
|
+
|
54
|
+
def test_remove_not_existing_file_dont_raise
|
55
|
+
assert_empty @manager.list_files
|
56
|
+
@manager.delete_file 'sub_dir/saved.*'
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_downloading_to_temp_file
|
60
|
+
@manager.save_file 'temp_file/saved', 'content'
|
61
|
+
assert_equal 'content', @manager.read_file('temp_file/saved')
|
62
|
+
|
63
|
+
@manager.download_to_temp_file('temp_file/saved') do |temp_file|
|
64
|
+
contents = File.open(temp_file) { |f| f.read }
|
65
|
+
assert_equal contents, 'content'
|
66
|
+
end
|
67
|
+
|
68
|
+
@manager.delete_file 'temp_file/saved'
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_rename_file
|
72
|
+
assert_empty @manager.list_files
|
73
|
+
@manager.save_file 'original/name.txt', 'rename_content'
|
74
|
+
|
75
|
+
@manager.rename_file 'original/name.txt', 'new/name.txt'
|
76
|
+
assert_equal ['new/name.txt'], @manager.list_files
|
77
|
+
assert_equal 'rename_content', @manager.read_file('new/name.txt')
|
78
|
+
|
79
|
+
@manager.rename_file 'new/name.txt', 'new/new2/name.txt'
|
80
|
+
assert_equal ['new/new2/name.txt'], @manager.list_files
|
81
|
+
assert_equal 'rename_content', @manager.read_file('new/new2/name.txt')
|
82
|
+
ensure
|
83
|
+
@manager.delete_file 'original/name.txt'
|
84
|
+
@manager.delete_file 'new/new2/name.txt'
|
85
|
+
assert_empty @manager.list_files
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class FileManagerLoggerTest < Minitest::Test
|
90
|
+
|
91
|
+
def test_logger_prints_and_puts
|
92
|
+
logger = FileManager::Logger.new({})
|
93
|
+
assert_output("hello\n") { logger.puts "hello" }
|
94
|
+
assert_output("hi") { logger.print "hi" }
|
95
|
+
end
|
50
96
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require './test/test_helper'
|
2
2
|
require 's3_file_manager'
|
3
3
|
|
4
|
+
SingleCov.covered!
|
5
|
+
|
4
6
|
class S3FileManagerTest < Minitest::Test
|
5
7
|
include FileManagerTest
|
6
8
|
|
@@ -16,8 +18,9 @@ class S3FileManagerTest < Minitest::Test
|
|
16
18
|
@manager = S3FileManager.new(
|
17
19
|
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
18
20
|
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
|
21
|
+
region: 'us-west-2',
|
19
22
|
bucket: 'file-manager-tests',
|
20
|
-
silent: true
|
23
|
+
silent: true
|
21
24
|
)
|
22
25
|
end
|
23
26
|
|
data/test/test_helper.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
1
|
+
require 'single_cov'
|
2
|
+
SingleCov.setup :minitest, branches: true if RUBY_PLATFORM != "java"
|
4
3
|
require 'minitest/autorun'
|
5
4
|
require 'webmock/minitest'
|
6
5
|
require 'vcr'
|
@@ -8,5 +7,5 @@ require 'vcr'
|
|
8
7
|
VCR.configure do |c|
|
9
8
|
c.cassette_library_dir = 'test/vcr_cassettes'
|
10
9
|
c.hook_into :webmock
|
11
|
-
c.
|
10
|
+
# c.debug_logger = File.open("record.log", 'w')
|
12
11
|
end
|