xlsxtream_rails 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f95f772a88e172129234f4283c232efc799fe20b752675e6b44d8f96d6fbf582
4
+ data.tar.gz: 0e910d29f10e28c3ea51c7ec10e32708199118cfc803bafc0b17f28a5e00ee28
5
+ SHA512:
6
+ metadata.gz: f2d2e2d691e850a3b6d50637ee3b97f186b66172af768273ff73ab091db36619f2399063e9724fc38668f2c179ca518eab6ada601189465830189c60b969920b
7
+ data.tar.gz: dc0a03fe157d825c586f6af81a59083ac33fe0599115ba9baa43b2e8c3678b691b9c26dbd625d6d1cdeeab8739662947abfba48cebf428bc5397b5ea06a86bb9
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2022 doabit
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # XlsxtreamRails
2
+ Xlsx stream download for rails with template.
3
+
4
+ ## Installation
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem "xlsxtream_rails"
9
+ ```
10
+
11
+ And then execute:
12
+ ```bash
13
+ $ bundle
14
+ ```
15
+
16
+ Or install it yourself as:
17
+ ```bash
18
+ $ gem install xlsxtream_rails
19
+ ```
20
+
21
+ ## Controller
22
+
23
+ Set your instance variables in your controller and configure the response if needed:
24
+
25
+ ```ruby
26
+ class PostsController < ApplicationController
27
+ def index
28
+ @posts = Post.all
29
+ respond_to do |format|
30
+ format.xlsx
31
+ end
32
+ end
33
+ end
34
+ ```
35
+
36
+ ## Model
37
+
38
+ Add `xlsx_columns` method for model:
39
+
40
+ ```ruby
41
+ class Post < ApplicationRecord
42
+ def xlsx_columns
43
+ [:id, :title, :body]
44
+ end
45
+ end
46
+ ```
47
+
48
+ or
49
+
50
+ ```ruby
51
+ class Post < ApplicationRecord
52
+ belongs_to :category
53
+
54
+ def xlsx_columns
55
+ [
56
+ [:category, category.name],
57
+ :title,
58
+ :body
59
+ ]
60
+ end
61
+ end
62
+ ```
63
+
64
+ ## View
65
+
66
+ If you want to render with template, you can create the template with the .xlsx.xrb extension (index.xlsx.xrb for example)
67
+
68
+ ```ruby
69
+ xlsx.write_worksheet do |sheet|
70
+ @posts.find_each do |post|
71
+ sheet.add_row [post.id, post.title]
72
+ end
73
+ end
74
+ ```
75
+
76
+ ## This gem is inspired by the following
77
+
78
+ [spreadsheet_architect](https://github.com/westonganger/spreadsheet_architect)
79
+
80
+ [caxlsx_rails](https://github.com/caxlsx/caxlsx_rails)
81
+
82
+ ## License
83
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "bundler/setup"
2
+
3
+ require "bundler/gem_tasks"
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :xlsxtream_rails do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,56 @@
1
+ require "action_controller"
2
+ require "stringio"
3
+
4
+ Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx
5
+
6
+ ActionController::Renderers.add :xlsx do |data, options|
7
+ # force layout false
8
+ options[:layout] = false
9
+ # disposition / filename
10
+ options[:disposition] = options.delete(:disposition) || "attachment"
11
+
12
+ if defined?(ActiveRecord) && data.is_a?(ActiveRecord::Relation)
13
+ options[:filename] ||= data.klass.name.pluralize
14
+ end
15
+
16
+ options[:filename] = options[:filename] ? options[:filename].strip.sub(/\.xlsx$/i, "") : "data"
17
+ options[:filename] += ".xlsx"
18
+
19
+ headers["Content-Type"] = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
20
+ headers["Content-disposition"] = "attachment; filename=\"#{options[:filename]}.xlsx\""
21
+ headers["X-Accel-Buffering"] = "no"
22
+ headers["Cache-Control"] = "no-cache"
23
+ headers["Last-Modified"] = Time.zone.now.ctime.to_s
24
+ headers.delete("Content-Length")
25
+ self.response_body = Enumerator.new do |enumerator|
26
+ xlsx = Xlsxtream::Workbook.new(enumerator)
27
+ if lookup_context.template_exists?(options[:template], options[:prefixes])
28
+ source = lookup_context.find_template(options[:template], options[:prefixes], false).source
29
+ builder = StringIO.new
30
+ builder << "# encoding: utf-8\n"
31
+ builder << source
32
+ view_context.instance_eval(builder.string)
33
+ else
34
+ XlsxtreamRails::Utils.write_xls(xlsx, data)
35
+ end
36
+
37
+ xlsx.close
38
+ end
39
+ end
40
+
41
+ # For respond_to default
42
+ begin
43
+ ActionController::Responder
44
+ rescue
45
+ else
46
+ class ActionController::Responder
47
+ def to_xlsx
48
+ @_action_has_layout = false
49
+ if @default_response
50
+ @default_response.call(options)
51
+ else
52
+ controller.render({xlsx: controller.action_name}.merge(options))
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,14 @@
1
+ module XlsxtreamRails
2
+ class Railtie < ::Rails::Railtie
3
+ initializer "xlsxtream_rails.initialization" do
4
+ ActiveSupport.on_load(:action_view) do
5
+ require "xlsxtream_rails/template_handler"
6
+ ActionView::Template.register_template_handler :xrb, ActionView::Template::Handlers::XrbBuilder.new
7
+ end
8
+
9
+ ActiveSupport.on_load(:action_controller) do
10
+ require "xlsxtream_rails/action_controller"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require "action_view"
2
+ require "stringio"
3
+
4
+ module ActionView
5
+ module Template::Handlers
6
+ class XrbBuilder
7
+ def default_format
8
+ Mime[:xlsx].symbol
9
+ end
10
+
11
+ def call(template, source = nil)
12
+ builder = StringIO.new
13
+ builder << "# encoding: utf-8\n"
14
+ builder << (source || template.source)
15
+ builder.string
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ module XlsxtreamRails
2
+ module Utils
3
+ def self.write_xls(xlsx, data)
4
+ headers = []
5
+ needs_headers = true
6
+ needs_column_types = false
7
+ xlsx.write_worksheet(auto_format: false) do |sheet|
8
+ data.find_each do |instance, index|
9
+ row_data = []
10
+ instance_cols = instance.xlsx_columns
11
+ instance_cols.each_with_index do |x, i|
12
+ if x.is_a?(Array)
13
+ headers.push(x[0].to_s) if needs_headers
14
+ row_data.push(x[1].is_a?(Symbol) ? instance.send(x[1]) : x[1])
15
+ if needs_column_types
16
+ column_types[i] = x[2]
17
+ end
18
+ else
19
+ headers.push(str_titleize(x.to_s)) if needs_headers
20
+ row_data.push(x.is_a?(Symbol) ? instance.send(x) : x)
21
+ end
22
+ end
23
+ sheet.add_row headers if needs_headers
24
+ needs_headers = false
25
+ sheet.add_row row_data
26
+ end
27
+ end
28
+ end
29
+
30
+ def self.str_titleize(str)
31
+ str.sub(/\A_+/, "")
32
+ .gsub(/[_.]/, " ")
33
+ .sub(" rescue nil", "")
34
+ .gsub(/(\A|\ )\w/) { |x| x.upcase }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module XlsxtreamRails
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,11 @@
1
+ require "xlsxtream"
2
+ require "xlsxtream_rails/utils"
3
+ require "xlsxtream_rails/version"
4
+ require "xlsxtream_rails/railtie"
5
+
6
+ module XlsxtreamRails
7
+ def xlsx_columns(opts = {})
8
+ column_names = self.class.column_names
9
+ column_names.map { |x| x.to_sym }
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xlsxtream_rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - doabit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-03-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '7.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '7.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: xlsxtream
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.4.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.4.0
41
+ description: Xlsx stream download for rails with template.
42
+ email:
43
+ - doinsist@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - MIT-LICENSE
49
+ - README.md
50
+ - Rakefile
51
+ - lib/tasks/xlsxtream_rails_tasks.rake
52
+ - lib/xlsxtream_rails.rb
53
+ - lib/xlsxtream_rails/action_controller.rb
54
+ - lib/xlsxtream_rails/railtie.rb
55
+ - lib/xlsxtream_rails/template_handler.rb
56
+ - lib/xlsxtream_rails/utils.rb
57
+ - lib/xlsxtream_rails/version.rb
58
+ homepage: https://github.com/ruby-gems/xlsxtream_rails
59
+ licenses:
60
+ - MIT
61
+ metadata:
62
+ homepage_uri: https://github.com/ruby-gems/xlsxtream_rails
63
+ source_code_uri: https://github.com/ruby-gems/xlsxtream_rails
64
+ changelog_uri: https://github.com/ruby-gems/xlsxtream_rails
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubygems_version: 3.2.3
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: Xlsx stream download for rails with template.
84
+ test_files: []