file-manager 0.1.1 → 0.6.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: 11c5040ea386ad4c4b780c23f42c60e3afdce272
4
- data.tar.gz: 07c9e554131fb3008fb45234dccb3fc8733a3bc4
2
+ SHA256:
3
+ metadata.gz: a5889d97b6382e2e9d85f3af01a73586cee45fa3dde1eebbb2b95ca5ed1608ed
4
+ data.tar.gz: 18683494a9bdce32792531b1c628c89a677663191b1ceeb095128f78cbdcc1fa
5
5
  SHA512:
6
- metadata.gz: 0c51d02ca0be703fac48827b47e0d71284bf34e1d23e1eb2a9fa5632ae04a3a3eabb4062d3309c5d85f3b407c56dbd60646a13b84756d7cffd339034bc9cf84b
7
- data.tar.gz: 5c6863d83c1aba9cb3796530412be4c79589c6bd0300f1f3810f64bb4938929bc48cf53187e9def6d0514ad3d6ace1c2fc8de31e8e9b6a2c168e0b0445fef9e7
6
+ metadata.gz: 31920a61731e9c2cca6328f1c622c4fec4a955df500e02352adfb655a93033e5ae04bf9a0eae549caeb481648435875b0fe1261c747bd6bde6bf9aa80624fd71
7
+ data.tar.gz: 57117c765ae71ddb57261de259c78e49099bafda2b0c2fcd61a2ae551ac2d3a05bd94935818a873f79b7a0ad8cc2ce2bd477d699ce6eb8d6cd36ada52ecdb4ea
@@ -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,51 +1,55 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- file-manager (0.1.1)
5
- aws-sdk (= 2.2.13)
4
+ file-manager (0.6.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.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-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
53
+
54
+ BUNDLED WITH
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.1.1'
6
+ spec.version = '0.6.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,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,10 +47,33 @@ 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.delete(File.join(root_path, file_name))
50
+ full_file_name = File.join(root_path, file_name)
51
+ File.delete(full_file_name) if File.exist?(full_file_name)
40
52
  @logger.puts 'done.'
41
53
  end
42
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
61
+ @logger.puts 'done.'
62
+ rescue Errno::ENOENT
63
+ raise FileNotFoundError.new(full_original_file_name)
64
+ end
65
+
66
+ def copy_file source_file_name, target_file_name
67
+ @logger.print "Copying file \"#{source_file_name}\" to \"#{target_file_name}\" from local folder \"#{root_path}\"..."
68
+ full_source_file_name = File.join(root_path, source_file_name)
69
+ full_target_file_name = Pathname(File.join(root_path, target_file_name))
70
+ FileUtils.mkdir_p(full_target_file_name.dirname)
71
+ FileUtils.cp full_source_file_name, full_target_file_name
72
+ @logger.puts 'done.'
73
+ rescue Errno::ENOENT
74
+ raise FileNotFoundError.new(full_source_file_name)
75
+ end
76
+
43
77
  private
44
78
 
45
79
  def root_path
@@ -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,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,6 +80,26 @@ 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
+ rescue Aws::S3::Errors::NoSuchKey
90
+ raise FileNotFoundError.new("#{bucket_name}/#{original_file_name}")
91
+ end
92
+
93
+ def copy_file source_file_name, target_file_name
94
+ s3_service = connect_s3_service
95
+ bucket = s3_service.bucket(bucket_name)
96
+ logger.print "Copying file \"#{source_file_name}\" \"#{target_file_name}\" from bucket \"#{bucket_name}\"..."
97
+ bucket.object(source_file_name).copy_to(bucket: bucket_name, key: target_file_name)
98
+ logger.puts 'done.'
99
+ rescue Aws::S3::Errors::NoSuchKey
100
+ raise FileNotFoundError.new("#{bucket_name}/#{source_file_name}")
101
+ end
102
+
70
103
  private
71
104
 
72
105
  def connect_s3_service
@@ -80,4 +113,9 @@ class S3FileManager < FileManager
80
113
  service
81
114
  end
82
115
 
116
+ def connect_s3_client
117
+ credentials = Aws::Credentials.new(options[:access_key_id], options[:secret_access_key])
118
+ Aws::S3::Client.new(region: options[:region], credentials: credentials)
119
+ end
120
+
83
121
  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' }
@@ -47,4 +49,68 @@ 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
+
83
+ assert_raises(FileNotFoundError) { @manager.rename_file 'nao_existe/name.txt', 'new/name.txt' }
84
+ ensure
85
+ @manager.delete_file 'original/name.txt'
86
+ @manager.delete_file 'new/new2/name.txt'
87
+ assert_empty @manager.list_files
88
+ end
89
+
90
+ def test_copy_file
91
+ assert_empty @manager.list_files
92
+ @manager.save_file 'original/name.txt', 'same_content'
93
+
94
+ @manager.copy_file 'original/name.txt', 'new/name.txt'
95
+ assert_equal ['new/name.txt', 'original/name.txt'].sort, @manager.list_files.sort
96
+ assert_equal 'same_content', @manager.read_file('new/name.txt')
97
+
98
+ @manager.copy_file 'original/name.txt', 'new/name.txt'
99
+ assert_equal ['new/name.txt', 'original/name.txt'].sort, @manager.list_files.sort
100
+
101
+ assert_raises(FileNotFoundError) { @manager.copy_file 'nao_existe/name.txt', 'new/name.txt' }
102
+ ensure
103
+ @manager.delete_file 'original/name.txt'
104
+ @manager.delete_file 'new/name.txt'
105
+ assert_empty @manager.list_files
106
+ end
107
+ end
108
+
109
+ class FileManagerLoggerTest < Minitest::Test
110
+
111
+ def test_logger_prints_and_puts
112
+ logger = FileManager::Logger.new({})
113
+ assert_output("hello\n") { logger.puts "hello" }
114
+ assert_output("hi") { logger.print "hi" }
115
+ end
50
116
  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