xlsxtream 1.3.2 → 2.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
  SHA1:
3
- metadata.gz: 642a452b03d01ae99f30e2718d0ade58a6bb20d1
4
- data.tar.gz: 767f1ab54f50f8fea6c4061d2820d4f21783bbac
3
+ metadata.gz: e9291c6ab43b7b9218c0341b2556daabe838f919
4
+ data.tar.gz: 31aca2466d4cbd18fdc4a3ec9181de16a9488f70
5
5
  SHA512:
6
- metadata.gz: 34026fb0948c29a706c71345a872665946222c20d90e8772e80cd87c7643b6afc78ccff915d6b3e88b8dbcea61dcfe813307dd19c4eb816f99600e0caa6eeb94
7
- data.tar.gz: f341216f5220bead5c40f230b6a2df3c05b85b5540173c0783a40493cd6ba4b2f6b126a3e63f0bd900f7d68127a64c789944de3a8a1f27de864b1f3262e82607
6
+ metadata.gz: cd1d0aab1d0c4117f87ccd9efc432977d4057538ecc4769a339ea46f964020a02b255f971ce8aa1a1c2c4af6d28814a8d740ee1cf0fabcfe76d8c6741312fe19
7
+ data.tar.gz: 5c373153d1b97ca5db24c7c8cd7be7e79605a4129993f2d8b586b3e8ee1fc9c8ccdd51478886a0ca3bebde688ffc72c20e7b932293ff2e2bc861fbcaf6d9cea5
data/.travis.yml CHANGED
@@ -6,9 +6,6 @@ cache: bundler
6
6
  before_install: gem install bundler -v '~> 1.15' --conservative --minimal-deps
7
7
 
8
8
  rvm:
9
- - 1.9.2
10
- - 1.9.3
11
- - 2.0.0
12
9
  - 2.1.10
13
10
  - 2.2.7
14
11
  - 2.3.4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.0 (2017-10-31)
4
+
5
+ - Replace RubyZip with ZipTricks as default compressor (#16)
6
+ - Drop support for Ruby < 2.1.0 (required for zip\_tricks gem)
7
+ - Deprecate :io\_wrapper option, you can now pass wrapper instances (#20)
8
+
3
9
  ## 1.3.2 (2017-10-30)
4
10
 
5
11
  - Fix circular require in workbook
data/README.md CHANGED
@@ -61,7 +61,7 @@ end
61
61
  # for the workbook or a single worksheet. The SST has to be kept in memory,
62
62
  # so do not use it if you have a huge amount of rows or a little duplication
63
63
  # of content across cells. A single SST is used for the whole workbook.
64
- xlsx.write_worksheet('SheetWithSST', :use_shared_strings => true) do |sheet|
64
+ xlsx.write_worksheet('SheetWithSST', use_shared_strings: true) do |sheet|
65
65
  sheet << ['the', 'same', 'old', 'story']
66
66
  sheet << ['the', 'old', 'same', 'story']
67
67
  sheet << ['old', 'the', 'same', 'story']
@@ -72,7 +72,7 @@ end
72
72
  # "Number stored as text". Dates and times must be in the ISO-8601 format and
73
73
  # numeric values must contain only numbers and an optional decimal separator.
74
74
  # The strings true and false are detected as boolean values.
75
- xlsx.write_worksheet('SheetWithAutoFormat', :auto_format => true) do |sheet|
75
+ xlsx.write_worksheet('SheetWithAutoFormat', auto_format: true) do |sheet|
76
76
  # these two rows will be identical in the xlsx-output
77
77
  sheet << [true, 11.85, DateTime.parse('2050-01-01T12:00'), Date.parse('1984-01-01')]
78
78
  sheet << ['true', '11.85', '2050-01-01T12:00', '1984-01-01']
@@ -84,14 +84,41 @@ xlsx.close
84
84
  io.close
85
85
 
86
86
  # Changing the default font from Calibri, 12pt, Swiss
87
- Xlsxtream::Workbook.new(io, :font => {
88
- :name => 'Times New Roman',
89
- :size => 10, # size in pt
90
- :family => 'Roman' # Swiss, Modern, Script, Decorative
87
+ Xlsxtream::Workbook.new(io, font: {
88
+ name: 'Times New Roman',
89
+ size: 10, # size in pt
90
+ family: 'Roman' # Swiss, Modern, Script, Decorative
91
91
  })
92
92
 
93
93
  ```
94
94
 
95
+ ## Compatibility
96
+
97
+ The current version of Xlsxtream requires at least Ruby 2.1.0.
98
+
99
+ If you are using an older Ruby version you can use the following in your Gemfile:
100
+
101
+ ```ruby
102
+ gem 'xlsxtream', '< 2'
103
+ ```
104
+
105
+ * The last version with support for Ruby 1.9.1 is 1.2.0.
106
+ * The last version with support for Ruby 1.9.2 is 1.3.2.
107
+
108
+ ## Upgrading
109
+
110
+ 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:
111
+
112
+ ```ruby
113
+ # Pre 2.x code with :io_wrapper option
114
+ Xlsxtream::Workbook.new(io, io_wrapper: MyCustomIOWrapper)
115
+ # New code with IO wrapper instance
116
+ io_wrapper = MyCustomIOWrapper.new(io)
117
+ Xlsxtream::Workbook.new(io_wrapper)
118
+ ```
119
+
120
+ Every IO-like object that responds to `:add_file` is treated as an IO wrapper.
121
+
95
122
  ## Development
96
123
 
97
124
  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,3 +1,4 @@
1
1
  module Xlsxtream
2
2
  class Error < StandardError; end
3
+ class Deprecation < StandardError; end
3
4
  end
@@ -5,6 +5,7 @@ module Xlsxtream
5
5
  class Directory
6
6
  def initialize(path)
7
7
  @path = Pathname(path)
8
+ @file = nil
8
9
  end
9
10
 
10
11
  def <<(data)
@@ -19,7 +20,7 @@ module Xlsxtream
19
20
  end
20
21
 
21
22
  def close
22
- @file.close if @file.respond_to? :close
23
+ @file.close if @file
23
24
  end
24
25
  end
25
26
  end
@@ -3,6 +3,7 @@ module Xlsxtream
3
3
  class Stream
4
4
  def initialize(stream)
5
5
  @stream = stream
6
+ @path = nil
6
7
  end
7
8
 
8
9
  def <<(data)
@@ -0,0 +1,44 @@
1
+ require "zip_tricks"
2
+
3
+ module Xlsxtream
4
+ module IO
5
+ class ZipTricks
6
+ BUFFER_SIZE = 64 * 1024
7
+
8
+ def initialize(body)
9
+ @streamer = ::ZipTricks::Streamer.new(body)
10
+ @wf = nil
11
+ @buffer = ''
12
+ end
13
+
14
+ def <<(data)
15
+ @buffer << data
16
+ flush_buffer if @buffer.size >= BUFFER_SIZE
17
+ self
18
+ end
19
+
20
+ def add_file(path)
21
+ flush_file
22
+ @wf = @streamer.write_deflated_file(path)
23
+ end
24
+
25
+ def close
26
+ flush_file
27
+ @streamer.close
28
+ end
29
+
30
+ private
31
+
32
+ def flush_buffer
33
+ @wf << @buffer
34
+ @buffer.clear
35
+ end
36
+
37
+ def flush_file
38
+ return unless @wf
39
+ flush_buffer if @buffer.size > 0
40
+ @wf.close
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ require "zip_tricks"
2
+
3
+ module Xlsxtream
4
+ module IO
5
+ class ZipTricksFibers
6
+ def initialize(body)
7
+ @streamer = ::ZipTricks::Streamer.new(body)
8
+ @wf = nil
9
+ end
10
+
11
+ def <<(data)
12
+ @wf.resume(data)
13
+ self
14
+ end
15
+
16
+ def add_file(path)
17
+ @wf.resume(:__close__) if @wf
18
+
19
+ @wf = Fiber.new do | bytes_or_close_sym |
20
+ @streamer.write_deflated_file(path) do |write_sink|
21
+ loop do
22
+ break if bytes_or_close_sym == :__close__
23
+ write_sink << bytes_or_close_sym
24
+ bytes_or_close_sym = Fiber.yield
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ def close
31
+ @wf.resume(:__close__) if @wf
32
+ @streamer.close
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Xlsxtream
2
- VERSION = '1.3.2'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
@@ -1,10 +1,9 @@
1
1
  # encoding: utf-8
2
- require "stringio"
3
2
  require "xlsxtream/errors"
4
3
  require "xlsxtream/xml"
5
4
  require "xlsxtream/shared_string_table"
6
5
  require "xlsxtream/worksheet"
7
- require "xlsxtream/io/rubyzip"
6
+ require "xlsxtream/io/zip_tricks"
8
7
 
9
8
  module Xlsxtream
10
9
  class Workbook
@@ -20,7 +19,7 @@ module Xlsxtream
20
19
 
21
20
  class << self
22
21
 
23
- def open(output = nil, options = {})
22
+ def open(output, options = {})
24
23
  workbook = new(output, options)
25
24
  if block_given?
26
25
  begin
@@ -35,15 +34,25 @@ module Xlsxtream
35
34
 
36
35
  end
37
36
 
38
- def initialize(output = nil, options = {})
39
- output ||= StringIO.new
37
+ def initialize(output, options = {})
38
+ if output.nil?
39
+ fail Error, "Xlsxtream::Workbook.new output cannot be nil"
40
+ end
40
41
  @options = options
41
- io_wrapper = options[:io_wrapper] || IO::RubyZip
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
42
47
  if output.is_a?(String) || !output.respond_to?(:<<)
43
48
  @file = File.open(output, 'wb')
44
- @io = io_wrapper.new(@file)
49
+ @io = IO::ZipTricks.new(@file)
50
+ elsif output.respond_to? :add_file
51
+ @file = nil
52
+ @io = output
45
53
  else
46
- @io = io_wrapper.new(output)
54
+ @file = nil
55
+ @io = IO::ZipTricks.new(output)
47
56
  end
48
57
  @sst = SharedStringTable.new
49
58
  @worksheets = Hash.new { |hash, name| hash[name] = hash.size + 1 }
@@ -77,7 +86,7 @@ module Xlsxtream
77
86
  write_workbook_rels
78
87
  write_root_rels
79
88
  write_content_types
80
- @io.close
89
+ @io.close if @io.respond_to? :close
81
90
  @file.close if @file
82
91
  nil
83
92
  end
data/xlsxtream.gemspec CHANGED
@@ -18,12 +18,13 @@ 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 = '>= 1.9.2'
21
+ spec.required_ruby_version = ">= 2.1.0"
22
22
 
23
- spec.add_dependency "rubyzip", ">= 1.2.0"
23
+ spec.add_dependency "zip_tricks", "~> 4.5"
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.7"
26
- spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "rubyzip", "~> 1.2"
27
28
  spec.add_development_dependency "minitest"
28
29
  spec.add_development_dependency "pry"
29
30
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xlsxtream
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 2.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: 2017-10-30 00:00:00.000000000 Z
11
+ date: 2017-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rubyzip
14
+ name: zip_tricks
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.2.0
19
+ version: '4.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.2.0
26
+ version: '4.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -40,18 +40,32 @@ dependencies:
40
40
  version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubyzip
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '10.0'
61
+ version: '1.2'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '10.0'
68
+ version: '1.2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: minitest
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +117,8 @@ files:
103
117
  - lib/xlsxtream/io/hash.rb
104
118
  - lib/xlsxtream/io/rubyzip.rb
105
119
  - lib/xlsxtream/io/stream.rb
120
+ - lib/xlsxtream/io/zip_tricks.rb
121
+ - lib/xlsxtream/io/zip_tricks_fibers.rb
106
122
  - lib/xlsxtream/row.rb
107
123
  - lib/xlsxtream/shared_string_table.rb
108
124
  - lib/xlsxtream/version.rb
@@ -122,7 +138,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
138
  requirements:
123
139
  - - ">="
124
140
  - !ruby/object:Gem::Version
125
- version: 1.9.2
141
+ version: 2.1.0
126
142
  required_rubygems_version: !ruby/object:Gem::Requirement
127
143
  requirements:
128
144
  - - ">="