active_storage-send_zip 0.1.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8207888c37b524f02c443b39a3a886c570b4fe6d8a1fab0dc962ede883a24f3d
4
- data.tar.gz: 4b960e75cdc3f948e6e77eddea418e8c6e8b07df5166d4739006569957f60d99
3
+ metadata.gz: a5dbef1dda4a5236e3290d9cd38a23de7e296b5e404356bf222dfbeb0c75197b
4
+ data.tar.gz: d2558817de8b496c48606c1e3af71df086480eede14b55186ea4a5e7206bfe5c
5
5
  SHA512:
6
- metadata.gz: 5558ce4b108d0a28a046f774adea7e73e15db5def44e31943ba13c28329ce2a5a35c16285e44b32beef7aa7089f0d3c518208e1cee927316195d84fb4f87f36f
7
- data.tar.gz: 27511b5c8a954c4bf1176fc2433b005c42a0265549f649857c46de051e31a6723482e1f741f18f2b7662f0fee8ef8385ecab9f51cea360891bc66bb7d00c216a
6
+ metadata.gz: 49f3758cc21c8a66dce8f69fe231c679f0802ad8374a222f8a178557ac668b5c2cf3ce7ea4a4f1d0c1e40dcb701a65c200de7bea3e82089cc56a3e20d9495e5f
7
+ data.tar.gz: 8830d24a60774f277e4576614243a077f661d08313259aaa501692ca5f58cb5bb13ef8975e6659432433d366195211e5f3c38c8bd25e2312feee1352908bf7a6
@@ -0,0 +1,11 @@
1
+ 0.2.0:
2
+ - move some methods to avoid to polute controller methods
3
+ - `ActiveStorage::SendZip#save_files_on_server` become `ActiveStorage::SendZipHelperSendZip#save_files_on_server`
4
+ - `SendZip#save_file_on_server` become `ActiveStorage::SendZipHelperSendZip#save_file_on_server`
5
+ - `SendZip#create_temporary_zip_file` become `ActiveStorage::SendZipHelperSendZip#create_temporary_zip_file`
6
+ - `send_zip` can now handle an `Hash` param to organize in subfolder
7
+ 0.1.1:
8
+ - handle double filenames
9
+ - use a radom folder instead of fixed one (this was problematic qith multiples queries at the same times)
10
+ 0.1.0:
11
+ - first versions
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_storage-send_zip (0.1.1)
4
+ active_storage-send_zip (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,27 +1,14 @@
1
1
  # ActiveStorage::SendZip
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/active_storage-send_zip.svg)](https://badge.fury.io/rb/active_storage-send_zip)
4
+ [![MIT Licence](https://badges.frapsoft.com/os/mit/mit.png?v=103)](https://opensource.org/licenses/mit-license.php)
4
5
 
5
- Create a zip from one or more Active Storage objects and return it in a rails controller
6
-
7
- ## Installation
8
-
9
- Add this line to your application's Gemfile:
10
-
11
- ```ruby
12
- gem 'active_storage-send_zip'
13
- ```
14
-
15
- And then execute:
16
-
17
- $ bundle
18
-
19
- Or install it yourself as:
20
-
21
- $ gem install active_storage-send_zip
6
+ Add a `send_zip` method in your Rails controller to send a `.zip` file containing one or many [ActiveStorage](https://edgeguides.rubyonrails.org/active_storage_overview.html) objects.
22
7
 
23
8
  ## Usage
24
9
 
10
+ ### With `Array`
11
+
25
12
  Assuming you have an ActiveRecord model with ActiveStorage like this:
26
13
 
27
14
  ~~~ruby
@@ -51,6 +38,64 @@ class UsersController < ApplicationController
51
38
  end
52
39
  ~~~
53
40
 
41
+ Will produce a `.zip` archive like this:
42
+
43
+ ~~~
44
+ ├── a.jpg
45
+ ├── b.png
46
+ └── c.gif
47
+ ~~~
48
+
49
+ Ii will also prevent duplicate filename and add an [`SecureRandom.uuid`](https://ruby-doc.org/stdlib-2.3.0/libdoc/securerandom/rdoc/SecureRandom.html) if two files as the same name.
50
+
51
+
52
+ ### With `Hash`
53
+
54
+ You can also pass an `Hash` parameter at `send_zip` method to organize files in sublfolder:
55
+
56
+ ~~~ruby
57
+ # app/controllers/holidays_controller.rb
58
+ class HolidaysController < ApplicationController
59
+ include ActiveStorage::SendZip
60
+
61
+ def zip
62
+ send_zip {
63
+ 'Holidays in Lyon <3' => Holidays.where(place: 'lyon').first.pictures,
64
+ 'Holidays in Paris' => Holidays.where(place: 'paris').first.pictures,
65
+ }
66
+ end
67
+ end
68
+ ~~~
69
+
70
+ Will produce a `.zip` archive like this:
71
+
72
+ ~~~
73
+ ├── Holidays in Lyon <3
74
+ │   ├── a.jpg
75
+ │   ├── b.png
76
+ │   └── c.gif
77
+ └── Holidays in Paris
78
+ ├── a.jpg
79
+ ├── b.png
80
+ └── c.gif
81
+ ~~~
82
+
83
+ ## Installation
84
+
85
+ Add this line to your application's Gemfile:
86
+
87
+ ```ruby
88
+ gem 'active_storage-send_zip'
89
+ ```
90
+
91
+ And then execute:
92
+
93
+ $ bundle
94
+
95
+ Or install it yourself as:
96
+
97
+ $ gem install active_storage-send_zip
98
+
54
99
  ## Development
55
100
 
56
101
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -61,10 +106,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
61
106
 
62
107
  Bug reports and pull requests are welcome on GitHub at https://github.com/madeindjs/active_storage-send_zip. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
63
108
 
64
- ## License
65
-
66
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
67
-
68
109
  ## Code of Conduct
69
110
 
70
111
  Everyone interacting in the ActiveStorage::SendZip project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/madeindjs/active_storage-send_zip/blob/master/CODE_OF_CONDUCT.md).
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.email = ['contact@rousseau-alexandre.fr']
10
10
 
11
11
  spec.summary = 'Create a zip from one or more Active Storage objects'
12
- spec.description = 'Create a zip from one or more Active Storage objects and return it in a rails controller'
12
+ spec.description = 'Add a `send_zip` method in your Rails controller to send a `.zip` file containing one (or many) ActiveStorage object(s)'
13
13
  spec.homepage = 'https://github.com/madeindjs/active_storage-send_zip'
14
14
  spec.license = 'MIT'
15
15
 
@@ -1,10 +1,10 @@
1
1
  require 'active_storage/send_zip/version'
2
- require 'rails'
3
- require 'zip'
4
- require 'tempfile'
5
- require 'pathname'
2
+ require 'active_storage/send_zip_helper'
6
3
 
4
+ # I `ActiveStorage` namespace to monkey-path my methods into it
7
5
  module ActiveStorage
6
+ # This is an `ActiveSupport::Concern` to include into your controller.
7
+ # The purpose is just to add a `send_zip` method to your controller
8
8
  module SendZip
9
9
  extend ActiveSupport::Concern
10
10
 
@@ -16,76 +16,10 @@ module ActiveStorage
16
16
  # @param filename [ActiveStorage::Attached::Many] files to save
17
17
  def send_zip(active_storages, filename: 'my.zip')
18
18
  require 'zip'
19
- files = save_files_on_server active_storages
20
- zip_data = create_temporary_zip_file files
19
+ files = SendZipHelper.save_files_on_server active_storages
20
+ zip_data = SendZipHelper.create_temporary_zip_file files
21
21
 
22
22
  send_data(zip_data, type: 'application/zip', filename: filename)
23
23
  end
24
-
25
- private
26
-
27
- # Download active storage files on server in a temporary folder
28
- #
29
- # @param files [ActiveStorage::Attached::Many] files to save
30
- # @return [Array<String>] files paths of saved files
31
- def save_files_on_server(files)
32
- require 'zip'
33
- # get a temporary folder and create it
34
- temp_folder = Dir.mktmpdir 'active_storage-send_zip'
35
-
36
- # count each files to avoid duplicates
37
- filepaths = []
38
-
39
- # download all ActiveStorage into
40
- files.each do |picture|
41
- filename = picture.filename.to_s
42
- filepath = File.join temp_folder, filename
43
-
44
- # ensure that filename not exists
45
- if filepaths.include? filepath
46
- # create a new random filenames
47
- basename = File.basename filename
48
- extension = File.extname filename
49
-
50
- filename = "#{basename}_#{SecureRandom.uuid}#{extension}"
51
- filepath = File.join temp_folder, filename
52
- end
53
-
54
- File.open(filepath, 'wb') { |f| f.write(picture.download) }
55
-
56
- filepaths << filepath
57
- end
58
-
59
- filepaths
60
- end
61
-
62
- # Create a temporary zip file & return the content as bytes
63
- #
64
- # @param filepaths [Array<String>] files paths
65
- # @return [String] as content of zip
66
- def create_temporary_zip_file(filepaths)
67
- temp_file = Tempfile.new('user.zip')
68
-
69
- begin
70
- # Initialize the temp file as a zip file
71
- Zip::OutputStream.open(temp_file) { |zos| }
72
-
73
- # open the zip
74
- Zip::File.open(temp_file.path, Zip::File::CREATE) do |zip|
75
- filepaths.each do |filepath|
76
- filename = File.basename filepath
77
- # add file into the zip
78
- zip.add filename, filepath
79
- end
80
- end
81
-
82
- return File.read(temp_file.path)
83
- ensure
84
- # close all ressources & remove temporary files
85
- temp_file.close
86
- temp_file.unlink
87
- filepaths.each { |filepath| FileUtils.rm(filepath) }
88
- end
89
- end
90
24
  end
91
25
  end
@@ -1,5 +1,6 @@
1
1
  module ActiveStorage
2
2
  module SendZip
3
- VERSION = '0.1.1'.freeze
3
+ # The version of this gem
4
+ VERSION = '0.2.0'.freeze
4
5
  end
5
6
  end
@@ -0,0 +1,89 @@
1
+ require 'rails'
2
+ require 'zip'
3
+ require 'tempfile'
4
+ require 'pathname'
5
+
6
+ module ActiveStorage
7
+ # This module contains some methods usefull for `ActiveStorage::SendZip.send_zip`
8
+ # method.
9
+ module SendZipHelper
10
+ # Download active storage files on server in a temporary folder
11
+ #
12
+ # @param files [ActiveStorage::Attached::Many] files to save
13
+ # @return [Array<String>] files paths of saved files
14
+ def self.save_files_on_server(files)
15
+ require 'zip'
16
+ # get a temporary folder and create it
17
+ temp_folder = Dir.mktmpdir 'active_storage-send_zip'
18
+
19
+ if files.is_a? Array
20
+ return files.map { |file| save_file_on_server(file, temp_folder) }
21
+ elsif files.is_a? Hash
22
+ filepaths = []
23
+
24
+ files.each do |subfolder, filesHash|
25
+ filesHash.each { |f| filepaths << save_file_on_server(f, temp_folder, subfolder: subfolder) }
26
+ end
27
+
28
+ return filepaths
29
+ end
30
+ end
31
+
32
+ # Save the given file on the server
33
+ #
34
+ # @param file [ActiveStorage::Attached] files to save
35
+ # @param folder [String] where to store the file
36
+ # @return [String] the filepath of file created
37
+ def self.save_file_on_server(file, folder, subfolder: nil)
38
+ filename = file.filename.to_s
39
+
40
+ folder = File.join(folder, subfolder) unless subfolder.nil?
41
+ Dir.mkdir(folder) unless Dir.exist?(folder)
42
+
43
+ # build filepath & create path if not exists
44
+ filepath = File.join(folder, filename)
45
+
46
+ # Ensure that filename not already exists
47
+ if File.exist? filepath
48
+ # create a new random filenames
49
+ basename = File.basename filename
50
+ extension = File.extname filename
51
+
52
+ filename = "#{basename}_#{SecureRandom.uuid}#{extension}"
53
+ filepath = File.join folder, filename
54
+ end
55
+
56
+ File.open(filepath, 'wb') { |f| f.write(file.download) }
57
+ filepath
58
+ end
59
+
60
+ # Create a temporary zip file & return the content as bytes
61
+ #
62
+ # @param filepaths [Array<String>] files paths
63
+ # @return [String] as content of zip
64
+ def self.create_temporary_zip_file(filepaths)
65
+ temp_file = Tempfile.new('user.zip')
66
+
67
+ begin
68
+ # Initialize the temp file as a zip file
69
+ Zip::OutputStream.open(temp_file) { |zos| }
70
+
71
+ # open the zip
72
+ Zip::File.open(temp_file.path, Zip::File::CREATE) do |zip|
73
+ filepaths.each do |filepath|
74
+ filename = File.basename filepath
75
+ # add file into the zip
76
+ zip.add filename, filepath
77
+ end
78
+ end
79
+
80
+ return File.read(temp_file.path)
81
+ ensure
82
+ # close all ressources & remove temporary files
83
+ temp_file.close
84
+ temp_file.unlink
85
+ filepaths.each { |filepath| FileUtils.rm(filepath) }
86
+ end
87
+ end
88
+ end
89
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_storage-send_zip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandre Rousseau
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-12-03 00:00:00.000000000 Z
11
+ date: 2018-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,8 +52,8 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
- description: Create a zip from one or more Active Storage objects and return it in
56
- a rails controller
55
+ description: Add a `send_zip` method in your Rails controller to send a `.zip` file
56
+ containing one (or many) ActiveStorage object(s)
57
57
  email:
58
58
  - contact@rousseau-alexandre.fr
59
59
  executables: []
@@ -62,6 +62,7 @@ extra_rdoc_files: []
62
62
  files:
63
63
  - ".gitignore"
64
64
  - ".travis.yml"
65
+ - CHANGELOG.yml
65
66
  - CODE_OF_CONDUCT.md
66
67
  - Gemfile
67
68
  - Gemfile.lock
@@ -73,6 +74,7 @@ files:
73
74
  - bin/setup
74
75
  - lib/active_storage/send_zip.rb
75
76
  - lib/active_storage/send_zip/version.rb
77
+ - lib/active_storage/send_zip_helper.rb
76
78
  homepage: https://github.com/madeindjs/active_storage-send_zip
77
79
  licenses:
78
80
  - MIT