xlsxtream 2.4.0 → 3.0.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: ad3cd850f298db3909ce061876610fdaad2de689675d9b23d6738f8a177f5254
4
- data.tar.gz: 5b1002fa1031cd53612735d6732acd43a8b0c086aaccc0f62f9a761583f21c5a
3
+ metadata.gz: e14836ad11f003e4019482eaf41eaf3a9ff76cb2dd61936a38b295e3b8e95b1a
4
+ data.tar.gz: 1603a0f3563d7c1f433ccaea41f73afca61603165d02d3c6b984225fecbb4cce
5
5
  SHA512:
6
- metadata.gz: bed396c449a050615e3822fc9c76935db6e9c7cb7434bc5a49c4effd76221ed66a023be3cff3859f30d290259c33cf685f8e8a2baaa237d52ae5787b79ee7d67
7
- data.tar.gz: 5c31396c6b49b90c7eb9f4fd4a32959ff97eefbe2fa0936833dfc4326954d6e06a267ee4e97ee42faaf8268a2147b3e15edc1ed3341f55794e96f5531afff601
6
+ metadata.gz: e196498e8816bd269ad49f09fb47774b19518b3add9f4b466be2bb919b87bae5d48539209357f3fa124671586352b5b473af49b7175349d83066db2bbc10e17f
7
+ data.tar.gz: 86f3dd5355883938d09c38f2c20d8840c650be9bea551916c3b1290994060d89df7acb1b984f86c2c80c2596ce037b927e7f1d66ffd2ca8a3a706a4e112141de
@@ -0,0 +1,27 @@
1
+ name: CI
2
+
3
+ on:
4
+ - push
5
+
6
+ env:
7
+ BUNDLE_PATH: vendor/bundle
8
+
9
+ jobs:
10
+ test:
11
+ name: Tests
12
+ runs-on: ubuntu-22.04
13
+ strategy:
14
+ matrix:
15
+ ruby:
16
+ - '2.6'
17
+ - '3.2'
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v4
21
+ - name: Setup Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby }}
25
+ bundler-cache: true
26
+ - name: "Tests"
27
+ run: bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0.0 (2024-12-28)
4
+
5
+ - Change dependency from zip\_tricks to zip\_kit (#57)
6
+ - Switch from Travis-CI to Github Actions (#58)
7
+ - Allow ZipKit streamer to be passed in as output destination (#59)
8
+ - Remove IO wrappers and leave just the ZIP output wrapper (#59)
9
+ - Ensure the gem can use the ZipKit Rails streaming helper for output (#59)
10
+ - Drop support for Ruby < 2.6.0 (required for zip\_kit gem)
11
+
3
12
  ## 2.4.0 (2020-06-27)
4
13
 
5
14
  - Allow writing worksheets without a block using add\_worksheet (#42, #45)
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Xlsxtream
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/xlsxtream.svg)](https://rubygems.org/gems/xlsxtream)
4
- [![Build Status](https://travis-ci.org/felixbuenemann/xlsxtream.svg)](https://travis-ci.org/felixbuenemann/xlsxtream)
5
4
 
6
5
  Xlsxtream is a streaming writer for XLSX spreadsheets. It supports multiple worksheets and optional string
7
6
  deduplication via a shared string table (SST). Its purpose is to replace CSV for large exports, because using
@@ -10,7 +9,7 @@ low memory usage.
10
9
 
11
10
  Xlsxtream does not support formatting, charts, comments and a myriad of
12
11
  other [OOXML](https://en.wikipedia.org/wiki/Office_Open_XML) features. If you are looking for a
13
- fully featured solution take a look at [axslx](https://github.com/randym/axlsx).
12
+ fully featured solution take a look at [caxslx](https://github.com/caxlsx/caxlsx).
14
13
 
15
14
  Xlsxtream supports writing to files or IO-like objects, data is flushed as the ZIP compressor sees fit.
16
15
 
@@ -33,7 +32,7 @@ Or install it yourself as:
33
32
  ## Usage
34
33
 
35
34
  ```ruby
36
- # Creates a new workbook and closes it at the end of the block
35
+ # Creates a new workbook file, write and close it at the end of the block
37
36
  Xlsxtream::Workbook.open('my_data.xlsx') do |xlsx|
38
37
  xlsx.write_worksheet 'Sheet1' do |sheet|
39
38
  # Boolean, Date, Time, DateTime and Numeric are properly mapped
@@ -108,36 +107,36 @@ Xlsxtream::Workbook.new(io, columns: [
108
107
  ])
109
108
  # The :columns option can also be given to write_worksheet, so it's
110
109
  # possible to have multiple worksheets with different column widths.
111
- ```
112
-
113
-
114
- ## Compatibility
115
-
116
- The current version of Xlsxtream requires at least Ruby 2.1.0.
117
110
 
118
- If you are using an older Ruby version you can use the following in your Gemfile:
119
111
 
120
- ```ruby
121
- gem 'xlsxtream', '< 2'
112
+ # Output from Rails (will stream without buffering)
113
+ class ReportsController < ApplicationController
114
+ include ZipKit::RailsStreaming
115
+ EXCEL_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
116
+
117
+ def download
118
+ zip_kit_stream(filename: "report.xlsx", type: EXCEL_CONTENT_TYPE) do |zip_kit_streamer|
119
+ Xlsxtream::Workbook.open(zip_kit_streamer) do |xlsx|
120
+ xlsx.write_worksheet 'Sheet1' do |sheet|
121
+ # Boolean, Date, Time, DateTime and Numeric are properly mapped
122
+ sheet << [true, Date.today, 'hello', 'world', 42, 3.14159265359, 42**13]
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
122
128
  ```
123
129
 
124
- * The last version with support for Ruby 1.9.1 is 1.2.0.
125
- * The last version with support for Ruby 1.9.2 is 1.3.2.
130
+ ## Compatibility
126
131
 
127
- ## Upgrading
132
+ The current version of Xlsxtream requires at least Ruby 2.6
128
133
 
129
- If you are upgrading from a version earlier than 2.x and are using the undocumented `:io_wrapper` option you need to update your code:
134
+ If you are using an older Ruby version you can use the following in your Gemfile:
130
135
 
131
136
  ```ruby
132
- # Pre 2.x code with :io_wrapper option
133
- Xlsxtream::Workbook.new(io, io_wrapper: MyCustomIOWrapper)
134
- # New code with IO wrapper instance
135
- io_wrapper = MyCustomIOWrapper.new(io)
136
- Xlsxtream::Workbook.new(io_wrapper)
137
+ gem 'xlsxtream', '< 3'
137
138
  ```
138
139
 
139
- Every IO-like object that responds to `:add_file` is treated as an IO wrapper.
140
-
141
140
  ## Development
142
141
 
143
142
  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.
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Xlsxtream
3
- VERSION = '2.4.0'.freeze
3
+ VERSION = '3.0.0'
4
4
  end
@@ -3,7 +3,7 @@ require "xlsxtream/errors"
3
3
  require "xlsxtream/xml"
4
4
  require "xlsxtream/shared_string_table"
5
5
  require "xlsxtream/worksheet"
6
- require "xlsxtream/io/zip_tricks"
6
+ require "xlsxtream/zip_kit_writer"
7
7
 
8
8
  module Xlsxtream
9
9
  class Workbook
@@ -35,25 +35,8 @@ module Xlsxtream
35
35
  end
36
36
 
37
37
  def initialize(output, options = {})
38
- if output.nil?
39
- fail Error, "Xlsxtream::Workbook.new output cannot be nil"
40
- end
38
+ @writer = ZipKitWriter.with_output_to(output)
41
39
  @options = options
42
- if options[:io_wrapper]
43
- fail Deprecation,
44
- "The Xlsxtream::Workbook.new :io_wrapper option is deprecated. "\
45
- "Please pass an IO wrapper instance as the first argument instead."
46
- end
47
- if output.is_a?(String) || !output.respond_to?(:<<)
48
- @file = File.open(output, 'wb')
49
- @io = IO::ZipTricks.new(@file)
50
- elsif output.respond_to? :add_file
51
- @file = nil
52
- @io = output
53
- else
54
- @file = nil
55
- @io = IO::ZipTricks.new(output)
56
- end
57
40
  @sst = SharedStringTable.new
58
41
  @worksheets = []
59
42
  end
@@ -89,8 +72,8 @@ module Xlsxtream
89
72
  write_workbook_rels
90
73
  write_root_rels
91
74
  write_content_types
92
- @io.close if @io.respond_to? :close
93
- @file.close if @file
75
+ @writer.close
76
+
94
77
  nil
95
78
  end
96
79
 
@@ -109,18 +92,18 @@ module Xlsxtream
109
92
  sheet_id = @worksheets.size + 1
110
93
  name = name || options[:name] || "Sheet#{sheet_id}"
111
94
 
112
- @io.add_file "xl/worksheets/sheet#{sheet_id}.xml"
95
+ @writer.add_file "xl/worksheets/sheet#{sheet_id}.xml"
113
96
 
114
- worksheet = Worksheet.new(@io, :id => sheet_id, :name => name, :sst => sst, :auto_format => auto_format, :columns => columns)
97
+ worksheet = Worksheet.new(@writer, :id => sheet_id, :name => name, :sst => sst, :auto_format => auto_format, :columns => columns)
115
98
  @worksheets << worksheet
116
99
 
117
100
  worksheet
118
101
  end
119
102
 
120
103
  def write_root_rels
121
- @io.add_file "_rels/.rels"
122
- @io << XML.header
123
- @io << XML.strip(<<-XML)
104
+ @writer.add_file "_rels/.rels"
105
+ @writer << XML.header
106
+ @writer << XML.strip(<<-XML)
124
107
  <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
125
108
  <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
126
109
  </Relationships>
@@ -129,17 +112,17 @@ module Xlsxtream
129
112
 
130
113
  def write_workbook
131
114
  rid = String.new("rId0")
132
- @io.add_file "xl/workbook.xml"
133
- @io << XML.header
134
- @io << XML.strip(<<-XML)
115
+ @writer.add_file "xl/workbook.xml"
116
+ @writer << XML.header
117
+ @writer << XML.strip(<<-XML)
135
118
  <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
136
119
  <workbookPr date1904="false"/>
137
120
  <sheets>
138
121
  XML
139
122
  @worksheets.each do |worksheet|
140
- @io << %'<sheet name="#{XML.escape_attr worksheet.name}" sheetId="#{worksheet.id}" r:id="#{rid.next!}"/>'
123
+ @writer << %'<sheet name="#{XML.escape_attr worksheet.name}" sheetId="#{worksheet.id}" r:id="#{rid.next!}"/>'
141
124
  end
142
- @io << XML.strip(<<-XML)
125
+ @writer << XML.strip(<<-XML)
143
126
  </sheets>
144
127
  </workbook>
145
128
  XML
@@ -154,9 +137,9 @@ module Xlsxtream
154
137
  "Invalid font family #{font_family}, must be one of "\
155
138
  + FONT_FAMILY_IDS.keys.map(&:inspect).join(', ')
156
139
 
157
- @io.add_file "xl/styles.xml"
158
- @io << XML.header
159
- @io << XML.strip(<<-XML)
140
+ @writer.add_file "xl/styles.xml"
141
+ @writer << XML.header
142
+ @writer << XML.strip(<<-XML)
160
143
  <styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
161
144
  <numFmts count="2">
162
145
  <numFmt numFmtId="164" formatCode="yyyy\\-mm\\-dd"/>
@@ -198,43 +181,43 @@ module Xlsxtream
198
181
  end
199
182
 
200
183
  def write_sst
201
- @io.add_file "xl/sharedStrings.xml"
202
- @io << XML.header
203
- @io << %'<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="#{@sst.references}" uniqueCount="#{@sst.size}">'
184
+ @writer.add_file "xl/sharedStrings.xml"
185
+ @writer << XML.header
186
+ @writer << %'<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="#{@sst.references}" uniqueCount="#{@sst.size}">'
204
187
  @sst.each_key do |string|
205
- @io << "<si><t>#{XML.escape_value string}</t></si>"
188
+ @writer << "<si><t>#{XML.escape_value string}</t></si>"
206
189
  end
207
- @io << '</sst>'
190
+ @writer << '</sst>'
208
191
  end
209
192
 
210
193
  def write_workbook_rels
211
194
  rid = String.new("rId0")
212
- @io.add_file "xl/_rels/workbook.xml.rels"
213
- @io << XML.header
214
- @io << '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'
195
+ @writer.add_file "xl/_rels/workbook.xml.rels"
196
+ @writer << XML.header
197
+ @writer << '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'
215
198
  @worksheets.each do |worksheet|
216
- @io << %'<Relationship Id="#{rid.next!}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet#{worksheet.id}.xml"/>'
199
+ @writer << %'<Relationship Id="#{rid.next!}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet#{worksheet.id}.xml"/>'
217
200
  end
218
- @io << %'<Relationship Id="#{rid.next!}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>'
219
- @io << %'<Relationship Id="#{rid.next!}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>' unless @sst.empty?
220
- @io << '</Relationships>'
201
+ @writer << %'<Relationship Id="#{rid.next!}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>'
202
+ @writer << %'<Relationship Id="#{rid.next!}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>' unless @sst.empty?
203
+ @writer << '</Relationships>'
221
204
  end
222
205
 
223
206
  def write_content_types
224
- @io.add_file "[Content_Types].xml"
225
- @io << XML.header
226
- @io << XML.strip(<<-XML)
207
+ @writer.add_file "[Content_Types].xml"
208
+ @writer << XML.header
209
+ @writer << XML.strip(<<-XML)
227
210
  <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
228
211
  <Default Extension="xml" ContentType="application/xml"/>
229
212
  <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
230
213
  <Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>
231
214
  <Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>
232
215
  XML
233
- @io << '<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>' unless @sst.empty?
216
+ @writer << '<Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>' unless @sst.empty?
234
217
  @worksheets.each do |worksheet|
235
- @io << %'<Override PartName="/xl/worksheets/sheet#{worksheet.id}.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>'
218
+ @writer << %'<Override PartName="/xl/worksheets/sheet#{worksheet.id}.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>'
236
219
  end
237
- @io << '</Types>'
220
+ @writer << '</Types>'
238
221
  end
239
222
  end
240
223
  end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+ require "zip_kit"
3
+
4
+ module Xlsxtream
5
+ class ZipKitWriter
6
+ BUFFER_SIZE = 64 * 1024
7
+
8
+ def self.with_output_to(output)
9
+ if output.is_a?(self)
10
+ output
11
+ elsif output.is_a?(ZipKit::Streamer)
12
+ # If this is a Streamer which has already been initialized, it is likely that the streamer
13
+ # was initialized with a Streamer.open block - it will close itself. This allows xslxstream
14
+ # to be used with zip_kit_stream and other cases where the Streamer is managed externally
15
+ new(output, close: [])
16
+ elsif output.is_a?(String)
17
+ file = File.open(output, 'wb')
18
+ streamer = ZipKit::Streamer.new(file)
19
+ # First the Streamer needs to be closed (to write out the central directory), then the file
20
+ new(streamer, close: [streamer, file])
21
+ elsif output.respond_to?(:<<) || output.respond_to?(:write)
22
+ streamer = ZipKit::Streamer.new(output)
23
+ new(streamer, close: [streamer])
24
+ else
25
+ error = <<~MSG
26
+ An `output` object must be one of:
27
+
28
+ * A String containing a path to a file ("workbook.xslx")
29
+ * A ZipKit::Streamer
30
+ * An IO-like object responding to #<< or #write
31
+
32
+ but it was a #{output.class}
33
+ MSG
34
+ raise ArgumentError, error
35
+ end
36
+ end
37
+
38
+ def initialize(streamer, close: [])
39
+ @streamer = streamer
40
+ @currently_writing_file_inside_zip = nil
41
+ @buffer = String.new
42
+ @close = close
43
+ end
44
+
45
+ def <<(data)
46
+ @buffer << data
47
+ flush_buffer if @buffer.size >= BUFFER_SIZE
48
+ self
49
+ end
50
+
51
+ def add_file(path)
52
+ flush_file
53
+ @currently_writing_file_inside_zip = @streamer.write_deflated_file(path)
54
+ end
55
+
56
+ def close
57
+ flush_file
58
+ @close.each(&:close)
59
+ end
60
+
61
+ private
62
+
63
+ def flush_buffer
64
+ @currently_writing_file_inside_zip << @buffer
65
+ @buffer.clear
66
+ end
67
+
68
+ def flush_file
69
+ return unless @currently_writing_file_inside_zip
70
+ flush_buffer if @buffer.size > 0
71
+ @currently_writing_file_inside_zip.close
72
+ end
73
+ end
74
+ end
data/xlsxtream.gemspec CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.bindir = "exe"
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
- spec.required_ruby_version = ">= 2.1.0"
21
+ spec.required_ruby_version = ">= 2.6.0"
22
22
 
23
- spec.add_dependency "zip_tricks", ">= 4.5", "< 6"
23
+ spec.add_dependency "zip_kit", ">= 6.2", "< 7"
24
24
 
25
25
  spec.add_development_dependency "bundler", ">= 1.7", "< 3"
26
26
  spec.add_development_dependency "rake"
metadata CHANGED
@@ -1,35 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xlsxtream
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Bünemann
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-27 00:00:00.000000000 Z
11
+ date: 2024-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: zip_tricks
14
+ name: zip_kit
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.5'
19
+ version: '6.2'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6'
22
+ version: '7'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '4.5'
29
+ version: '6.2'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6'
32
+ version: '7'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: bundler
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -114,8 +114,8 @@ executables: []
114
114
  extensions: []
115
115
  extra_rdoc_files: []
116
116
  files:
117
+ - ".github/workflows/ci.yml"
117
118
  - ".gitignore"
118
- - ".travis.yml"
119
119
  - CHANGELOG.md
120
120
  - Gemfile
121
121
  - LICENSE.txt
@@ -126,17 +126,13 @@ files:
126
126
  - lib/xlsxtream.rb
127
127
  - lib/xlsxtream/columns.rb
128
128
  - lib/xlsxtream/errors.rb
129
- - lib/xlsxtream/io/directory.rb
130
- - lib/xlsxtream/io/hash.rb
131
- - lib/xlsxtream/io/rubyzip.rb
132
- - lib/xlsxtream/io/stream.rb
133
- - lib/xlsxtream/io/zip_tricks.rb
134
129
  - lib/xlsxtream/row.rb
135
130
  - lib/xlsxtream/shared_string_table.rb
136
131
  - lib/xlsxtream/version.rb
137
132
  - lib/xlsxtream/workbook.rb
138
133
  - lib/xlsxtream/worksheet.rb
139
134
  - lib/xlsxtream/xml.rb
135
+ - lib/xlsxtream/zip_kit_writer.rb
140
136
  - xlsxtream.gemspec
141
137
  homepage: https://github.com/felixbuenemann/xlsxtream
142
138
  licenses:
@@ -150,14 +146,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
146
  requirements:
151
147
  - - ">="
152
148
  - !ruby/object:Gem::Version
153
- version: 2.1.0
149
+ version: 2.6.0
154
150
  required_rubygems_version: !ruby/object:Gem::Requirement
155
151
  requirements:
156
152
  - - ">="
157
153
  - !ruby/object:Gem::Version
158
154
  version: '0'
159
155
  requirements: []
160
- rubygems_version: 3.1.2
156
+ rubygems_version: 3.4.19
161
157
  signing_key:
162
158
  specification_version: 4
163
159
  summary: Xlsxtream is a streaming XLSX spreadsheet writer
data/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- language: ruby
2
-
3
- os: linux
4
- dist: xenial
5
- cache: bundler
6
-
7
- before_install:
8
- - gem install bundler -v '~> 1.15' --conservative --minimal-deps
9
-
10
- rvm:
11
- - 2.1.10
12
- - 2.2.10
13
- - 2.3.8
14
- - 2.4.10
15
- - 2.5.8
16
- - 2.6.6
17
- - 2.7.1
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
- require "pathname"
3
-
4
- module Xlsxtream
5
- module IO
6
- class Directory
7
- def initialize(path)
8
- @path = Pathname(path)
9
- @file = nil
10
- end
11
-
12
- def <<(data)
13
- @file << data
14
- end
15
-
16
- def add_file(path)
17
- close
18
- file_path = @path + path
19
- file_path.parent.mkpath
20
- @file = file_path.open("wb")
21
- end
22
-
23
- def close
24
- @file.close if @file
25
- end
26
- end
27
- end
28
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
- module Xlsxtream
3
- module IO
4
- class Hash
5
- def initialize(stream)
6
- @stream = stream
7
- @hash = {}
8
- @path = nil
9
- end
10
-
11
- def <<(data)
12
- @stream << data
13
- end
14
-
15
- def add_file(path)
16
- close
17
- @path = path
18
- @hash[@path] = [@stream.tell]
19
- end
20
-
21
- def close
22
- @hash[@path] << @stream.tell if @path
23
- end
24
-
25
- def fetch(path)
26
- old = @stream.tell
27
- from, to = @hash.fetch(path)
28
- size = to - from
29
- @stream.seek(from)
30
- data = @stream.read(size)
31
- @stream.seek(old)
32
- data
33
- end
34
-
35
- def [](path)
36
- fetch(path)
37
- rescue KeyError
38
- nil
39
- end
40
-
41
- def to_h
42
- ::Hash[@hash.keys.map {|path| [path, fetch(path)] }]
43
- end
44
- end
45
- end
46
- end
47
-
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
- require "zip"
3
- require "xlsxtream/errors"
4
-
5
- module Xlsxtream
6
- module IO
7
- class RubyZip
8
- def initialize(io)
9
- unless io.respond_to? :pos and io.respond_to? :pos=
10
- raise Error, 'IO is not seekable'
11
- end
12
- io.binmode if io.respond_to? :binmode
13
- stream = true
14
- @zos = Zip::OutputStream.new(io, stream)
15
- end
16
-
17
- def <<(data)
18
- @zos << data
19
- end
20
-
21
- def add_file(path)
22
- @zos.put_next_entry path
23
- end
24
-
25
- def close
26
- os = @zos.close_buffer
27
- os.flush if os.respond_to? :flush
28
- end
29
- end
30
- end
31
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
- module Xlsxtream
3
- module IO
4
- class Stream
5
- def initialize(stream)
6
- @stream = stream
7
- @path = nil
8
- end
9
-
10
- def <<(data)
11
- @stream << data
12
- end
13
-
14
- def add_file(path)
15
- close
16
- @path = path
17
- @stream << "#@path\n"
18
- end
19
-
20
- def close
21
- @stream << "\n" if @path
22
- end
23
- end
24
- end
25
- end
26
-
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
- require "zip_tricks"
3
-
4
- module Xlsxtream
5
- module IO
6
- class ZipTricks
7
- BUFFER_SIZE = 64 * 1024
8
-
9
- def initialize(body)
10
- @streamer = ::ZipTricks::Streamer.new(body)
11
- @wf = nil
12
- @buffer = String.new
13
- end
14
-
15
- def <<(data)
16
- @buffer << data
17
- flush_buffer if @buffer.size >= BUFFER_SIZE
18
- self
19
- end
20
-
21
- def add_file(path)
22
- flush_file
23
- @wf = @streamer.write_deflated_file(path)
24
- end
25
-
26
- def close
27
- flush_file
28
- @streamer.close
29
- end
30
-
31
- private
32
-
33
- def flush_buffer
34
- @wf << @buffer
35
- @buffer.clear
36
- end
37
-
38
- def flush_file
39
- return unless @wf
40
- flush_buffer if @buffer.size > 0
41
- @wf.close
42
- end
43
- end
44
- end
45
- end