file-manager 0.2.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3274b9402d808285bad4ecb41f687666157135f7
4
- data.tar.gz: a5d16438c16799c45c76d8b7633fe9dcaf1a5732
2
+ SHA256:
3
+ metadata.gz: f13f65293d73d3c2a9579e931eece74f25a71dade78f8683c18225d421bdd325
4
+ data.tar.gz: a4e2a80b4b11d894129f39a843ed1304e197a2b2e92d66f8bbffc7dfefd30306
5
5
  SHA512:
6
- metadata.gz: cc14c2b86c76e173319127c7562902044b4a8355478594f63c515b8b2f7d67095b2d11744a65d75745fb188c9d9a5adeec106f176b14f2039079268a8766374c
7
- data.tar.gz: 2ae8c3f919f1620b4f41d949a2b35b8b3cfac1ae247a01631f29626a4dde91532414d73ca33ea6b702bf098b19608f1715c1ebb40ab777ec277f1d824d25d70d
6
+ metadata.gz: c4034f8b52e6a0d28219fb97fc7912889193967d84930fd8cfa96a800a175c5f7d27271d6a403cf924fe947b30e1e0ccd97334945be70110357c1de5a08508c4
7
+ data.tar.gz: 3e04ef0a2d74bcb42ce53618b6e4188e446e28297aa343601d82adb9e1befe256fbafa56b205bcc435b761f66ca2c1871bef8a6fc85ba48dbefcf8cc2853a0f7
@@ -1,8 +1,13 @@
1
1
  language: ruby
2
+ env:
3
+ - JRUBY_OPTS=--debug
2
4
  rvm:
3
- - 2.2.1
4
- - jruby-19mode
5
+ - 2.5.3
6
+ - jruby-9.2.5.0
5
7
  - ruby-head
6
8
  - jruby-head
7
9
  jdk:
8
- - openjdk7
10
+ - openjdk8
11
+ before_install:
12
+ - gem update --system
13
+ - gem --version
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in file-manager.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'single_cov', require: false
8
+ end
@@ -1,54 +1,55 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- file-manager (0.2.0)
5
- aws-sdk (= 2.2.13)
4
+ file-manager (0.7.0)
5
+ aws-sdk-s3 (~> 1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- addressable (2.4.0)
11
- aws-sdk (2.2.13)
12
- aws-sdk-resources (= 2.2.13)
13
- aws-sdk-core (2.2.13)
10
+ addressable (2.7.0)
11
+ public_suffix (>= 2.0.2, < 5.0)
12
+ aws-eventstream (1.1.0)
13
+ aws-partitions (1.394.0)
14
+ aws-sdk-core (3.109.3)
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-resources (2.2.13)
16
- aws-sdk-core (= 2.2.13)
17
- codeclimate-test-reporter (0.4.8)
18
- simplecov (>= 0.7.1, < 1.0.0)
19
- crack (0.4.3)
20
- safe_yaml (~> 1.0.0)
21
- docile (1.1.5)
22
- hashdiff (0.2.3)
23
- jmespath (1.1.3)
24
- json (1.8.3)
25
- json (1.8.3-java)
26
- minitest (5.8.4)
27
- rake (10.5.0)
28
- safe_yaml (1.0.4)
29
- simplecov (0.11.1)
30
- docile (~> 1.1.0)
31
- json (~> 1.8)
32
- simplecov-html (~> 0.10.0)
33
- simplecov-html (0.10.0)
34
- vcr (3.0.1)
35
- 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)
36
37
  addressable (>= 2.3.6)
37
38
  crack (>= 0.3.2)
38
- hashdiff
39
+ hashdiff (>= 0.4.0, < 2.0.0)
39
40
 
40
41
  PLATFORMS
41
42
  java
42
43
  ruby
43
44
 
44
45
  DEPENDENCIES
45
- bundler (~> 1.3)
46
- codeclimate-test-reporter
46
+ bundler (>= 1.16.2)
47
47
  file-manager!
48
48
  minitest
49
49
  rake
50
+ single_cov
50
51
  vcr
51
52
  webmock
52
53
 
53
54
  BUNDLED WITH
54
- 1.10.6
55
+ 2.0.1
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
- # File::Manager [![Build Status](https://travis-ci.org/fortesinformatica/file-manager.svg?branch=master)](https://travis-ci.org/fortesinformatica/file-manager) [![Code Climate](https://codeclimate.com/github/fortesinformatica/file-manager/badges/gpa.svg)](https://codeclimate.com/github/fortesinformatica/file-manager) [![Test Coverage](https://codeclimate.com/github/fortesinformatica/file-manager/badges/coverage.svg)](https://codeclimate.com/github/fortesinformatica/file-manager) [![Dependency Status](https://gemnasium.com/fortesinformatica/file-manager.svg)](https://gemnasium.com/fortesinformatica/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
@@ -4,6 +4,7 @@ require 'rake/testtask'
4
4
  Rake::TestTask.new do |t|
5
5
  t.libs << 'test'
6
6
  t.pattern = 'test/**/*_test.rb'
7
+ t.warning = false
7
8
  end
8
9
 
9
10
  desc 'Run tests'
@@ -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.2.0'
6
+ spec.version = '0.7.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', '2.2.13'
20
- spec.add_development_dependency "bundler", "~> 1.3"
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
@@ -15,6 +15,10 @@ class FileManager
15
15
  raise 'Not implemented!'
16
16
  end
17
17
 
18
+ def download_to_temp_file(file_name)
19
+ raise 'Not implemented!'
20
+ end
21
+
18
22
  def list_files(prefix = '', file_extension = '*')
19
23
  raise 'Not implemented!'
20
24
  end
@@ -23,6 +23,19 @@ 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
+ rescue Errno::ENOENT
36
+ raise FileNotFoundError.new(full_file_name)
37
+ end
38
+
26
39
  def list_files(prefix = '', file_extension = '*')
27
40
  FileUtils.mkdir_p(root_path)
28
41
  @logger.print "Listing \"#{prefix}*.#{file_extension}\" from local folder \"#{root_path}\"..."
@@ -37,8 +50,30 @@ class LocalFileManager < FileManager
37
50
  def delete_file file_name
38
51
  @logger.print "Deleting file \"#{file_name}\" from local folder \"#{root_path}\"..."
39
52
  full_file_name = File.join(root_path, file_name)
40
- File.delete(full_file_name) if File.exists?(full_file_name)
53
+ File.delete(full_file_name) if File.exist?(full_file_name)
54
+ @logger.puts 'done.'
55
+ end
56
+
57
+ def rename_file original_file_name, target_file_name
58
+ @logger.print "Renaming file \"#{original_file_name}\" to \"#{target_file_name}\" from local folder \"#{root_path}\"..."
59
+ full_original_file_name = File.join(root_path, original_file_name)
60
+ full_target_file_name = Pathname(File.join(root_path, target_file_name))
61
+ FileUtils.mkdir_p(full_target_file_name.dirname)
62
+ FileUtils.mv full_original_file_name, full_target_file_name
41
63
  @logger.puts 'done.'
64
+ rescue Errno::ENOENT
65
+ raise FileNotFoundError.new(full_original_file_name)
66
+ end
67
+
68
+ def copy_file source_file_name, target_file_name
69
+ @logger.print "Copying file \"#{source_file_name}\" to \"#{target_file_name}\" from local folder \"#{root_path}\"..."
70
+ full_source_file_name = File.join(root_path, source_file_name)
71
+ full_target_file_name = Pathname(File.join(root_path, target_file_name))
72
+ FileUtils.mkdir_p(full_target_file_name.dirname)
73
+ FileUtils.cp full_source_file_name, full_target_file_name
74
+ @logger.puts 'done.'
75
+ rescue Errno::ENOENT
76
+ raise FileNotFoundError.new(full_source_file_name)
42
77
  end
43
78
 
44
79
  private
@@ -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,21 @@ 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}"] || (raise FileNotFoundError.new("No such file '#{original_file_name}'"))
41
+ @data.delete "#{original_file_name}"
42
+ end
43
+
44
+ def copy_file source_file_name, target_file_name
45
+ @data["#{target_file_name}"] = @data["#{source_file_name}"] || (raise FileNotFoundError.new("No such file '#{source_file_name}'"))
46
+ end
26
47
  end
@@ -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,21 @@ 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
+ rescue Aws::S3::Errors::NoSuchKey
45
+ raise FileNotFoundError.new("#{bucket_name}/#{file_name}")
46
+ end
47
+
33
48
  def list_files(prefix = '', file_extension = '*')
34
49
  # objects = []
35
50
  # last_key = nil
@@ -67,6 +82,26 @@ class S3FileManager < FileManager
67
82
  logger.puts 'done.'
68
83
  end
69
84
 
85
+ def rename_file original_file_name, target_file_name
86
+ s3_service = connect_s3_service
87
+ bucket = s3_service.bucket(bucket_name)
88
+ logger.print "Renaming file \"#{original_file_name}\" \"#{target_file_name}\" from bucket \"#{bucket_name}\"..."
89
+ bucket.object(original_file_name).move_to(bucket: bucket_name, key: target_file_name)
90
+ logger.puts 'done.'
91
+ rescue Aws::S3::Errors::NoSuchKey
92
+ raise FileNotFoundError.new("#{bucket_name}/#{original_file_name}")
93
+ end
94
+
95
+ def copy_file source_file_name, target_file_name
96
+ s3_service = connect_s3_service
97
+ bucket = s3_service.bucket(bucket_name)
98
+ logger.print "Copying file \"#{source_file_name}\" \"#{target_file_name}\" from bucket \"#{bucket_name}\"..."
99
+ bucket.object(source_file_name).copy_to(bucket: bucket_name, key: target_file_name)
100
+ logger.puts 'done.'
101
+ rescue Aws::S3::Errors::NoSuchKey
102
+ raise FileNotFoundError.new("#{bucket_name}/#{source_file_name}")
103
+ end
104
+
70
105
  private
71
106
 
72
107
  def connect_s3_service
@@ -80,4 +115,9 @@ class S3FileManager < FileManager
80
115
  service
81
116
  end
82
117
 
118
+ def connect_s3_client
119
+ credentials = Aws::Credentials.new(options[:access_key_id], options[:secret_access_key])
120
+ Aws::S3::Client.new(region: options[:region], credentials: credentials)
121
+ end
122
+
83
123
  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
@@ -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' }
@@ -48,8 +50,68 @@ module FileManagerTest
48
50
  assert_empty @manager.list_files
49
51
  end
50
52
 
53
+
51
54
  def test_remove_not_existing_file_dont_raise
52
55
  assert_empty @manager.list_files
53
56
  @manager.delete_file 'sub_dir/saved.*'
54
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
+ assert_raises(FileNotFoundError) { @manager.download_to_temp_file('temp_file/saved') {} }
70
+ end
71
+
72
+ def test_rename_file
73
+ assert_empty @manager.list_files
74
+ @manager.save_file 'original/name.txt', 'rename_content'
75
+
76
+ @manager.rename_file 'original/name.txt', 'new/name.txt'
77
+ assert_equal ['new/name.txt'], @manager.list_files
78
+ assert_equal 'rename_content', @manager.read_file('new/name.txt')
79
+
80
+ @manager.rename_file 'new/name.txt', 'new/new2/name.txt'
81
+ assert_equal ['new/new2/name.txt'], @manager.list_files
82
+ assert_equal 'rename_content', @manager.read_file('new/new2/name.txt')
83
+
84
+ assert_raises(FileNotFoundError) { @manager.rename_file 'nao_existe/name.txt', 'new/name.txt' }
85
+ ensure
86
+ @manager.delete_file 'original/name.txt'
87
+ @manager.delete_file 'new/new2/name.txt'
88
+ assert_empty @manager.list_files
89
+ end
90
+
91
+ def test_copy_file
92
+ assert_empty @manager.list_files
93
+ @manager.save_file 'original/name.txt', 'same_content'
94
+
95
+ @manager.copy_file 'original/name.txt', 'new/name.txt'
96
+ assert_equal ['new/name.txt', 'original/name.txt'].sort, @manager.list_files.sort
97
+ assert_equal 'same_content', @manager.read_file('new/name.txt')
98
+
99
+ @manager.copy_file 'original/name.txt', 'new/name.txt'
100
+ assert_equal ['new/name.txt', 'original/name.txt'].sort, @manager.list_files.sort
101
+
102
+ assert_raises(FileNotFoundError) { @manager.copy_file 'nao_existe/name.txt', 'new/name.txt' }
103
+ ensure
104
+ @manager.delete_file 'original/name.txt'
105
+ @manager.delete_file 'new/name.txt'
106
+ assert_empty @manager.list_files
107
+ end
108
+ end
109
+
110
+ class FileManagerLoggerTest < Minitest::Test
111
+
112
+ def test_logger_prints_and_puts
113
+ logger = FileManager::Logger.new({})
114
+ assert_output("hello\n") { logger.puts "hello" }
115
+ assert_output("hi") { logger.print "hi" }
116
+ end
55
117
  end
@@ -1,5 +1,8 @@
1
1
  require './test/test_helper'
2
2
  require 'local_file_manager'
3
+ require_relative 'file_manager_test'
4
+
5
+ SingleCov.covered!
3
6
 
4
7
  class LocalFileManagerTest < Minitest::Test
5
8
  include FileManagerTest