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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 986239384ddff9a5fef44810768837a817c2832d
4
- data.tar.gz: 2731cc2f0426eaed27e276aa6976bfce5cb14f71
2
+ SHA256:
3
+ metadata.gz: ace7fc3d0de9b646ee8b5de0e5354394c02f6b6a85703cd21691ef14a8466a71
4
+ data.tar.gz: 18f272b1e9d9d1b57029c66d4385e1a768cf676ce25b15185f4b6c54f0f009d8
5
5
  SHA512:
6
- metadata.gz: fcc26621f3661287ccd08b54d978cc720ecd25959c65534303f13753174ec7080b0b1b600197212fe7e2fdb4d36b20207214ba90a5b5a6c9d414bbe7e851a865
7
- data.tar.gz: 6542f9eb7e6bff8c5f67807bf28b826937cf57d88981c423d12381575e0f17db4938b8c2b8aee25c619d10ee0c11ca3b6b48f7c1bb5c6ffba7d1522a61866ca5
6
+ metadata.gz: '0468886aa264b87523a7ac13a3571e37fb186e35a1b286bbd8eb1d3746074750e7fddf08cc6665c29b7161078c08f5fef88d576801e11d5d1ce91351c83427d1'
7
+ data.tar.gz: a323b2c72aea6779fa6f1d14a5ebd063041d4af842cfa6bf661e218c84745e68a2f3537acb58197d476fc379bfc79ce4019898dba6801c316f55b57618e01d41
@@ -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,52 +1,55 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- file-manager (0.1.0)
5
- aws-sdk (= 2.2.13)
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.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
- minitest (5.8.4)
26
- rake (10.5.0)
27
- safe_yaml (1.0.4)
28
- simplecov (0.11.1)
29
- docile (~> 1.1.0)
30
- json (~> 1.8)
31
- simplecov-html (~> 0.10.0)
32
- simplecov-html (0.10.0)
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 (~> 1.3)
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
- 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.1.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', '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,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.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)
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
 
@@ -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
@@ -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
@@ -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,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
@@ -1,5 +1,8 @@
1
1
  require './test/test_helper'
2
2
  require 'memory_file_manager'
3
+ require_relative 'file_manager_test'
4
+
5
+ SingleCov.covered!
3
6
 
4
7
  class MemoryFileManagerTest < Minitest::Test
5
8
  include FileManagerTest
@@ -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
 
@@ -1,6 +1,5 @@
1
- require 'codeclimate-test-reporter'
2
- CodeClimate::TestReporter.start
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.ignore_hosts 'codeclimate.com'
10
+ # c.debug_logger = File.open("record.log", 'w')
12
11
  end