caxlsx 3.0.2 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +7 -0
  3. data/examples/{image1.jpeg → assets/image1.jpeg} +0 -0
  4. data/examples/generate.rb +15 -0
  5. data/lib/axlsx.rb +1 -0
  6. data/lib/axlsx/drawing/pie_series.rb +1 -1
  7. data/lib/axlsx/package.rb +17 -4
  8. data/lib/axlsx/util/constants.rb +2 -1
  9. data/lib/axlsx/util/zip_command.rb +73 -0
  10. data/lib/axlsx/version.rb +1 -1
  11. data/lib/axlsx/workbook/worksheet/cell.rb +4 -2
  12. data/test/drawing/tc_drawing.rb +2 -2
  13. data/test/drawing/tc_hyperlink.rb +1 -1
  14. data/test/drawing/tc_one_cell_anchor.rb +1 -1
  15. data/test/drawing/tc_pic.rb +4 -4
  16. data/test/drawing/tc_pie_series.rb +2 -1
  17. data/test/fixtures/image1.gif +0 -0
  18. data/test/fixtures/image1.jpeg +0 -0
  19. data/test/fixtures/image1.jpg +0 -0
  20. data/test/fixtures/image1.png +0 -0
  21. data/test/fixtures/image1_fake.jpg +0 -0
  22. data/test/tc_package.rb +29 -12
  23. data/test/util/tc_mime_type_utils.rb +1 -1
  24. data/test/workbook/worksheet/tc_cell.rb +31 -0
  25. metadata +18 -39
  26. data/examples/2010_comments.rb +0 -17
  27. data/examples/anchor_swapping.rb +0 -28
  28. data/examples/auto_filter.rb +0 -25
  29. data/examples/basic_charts.rb +0 -58
  30. data/examples/chart_colors.rb +0 -88
  31. data/examples/colored_links.rb +0 -45
  32. data/examples/conditional_formatting/example_conditional_formatting.rb +0 -89
  33. data/examples/conditional_formatting/getting_barred.rb +0 -37
  34. data/examples/conditional_formatting/hitting_the_high_notes.rb +0 -37
  35. data/examples/conditional_formatting/scaled_colors.rb +0 -39
  36. data/examples/conditional_formatting/stop_and_go.rb +0 -37
  37. data/examples/data_validation.rb +0 -67
  38. data/examples/example.rb +0 -900
  39. data/examples/extractive.rb +0 -45
  40. data/examples/ios_preview.rb +0 -14
  41. data/examples/merge_cells.rb +0 -17
  42. data/examples/no_grid_with_borders.rb +0 -18
  43. data/examples/page_setup.rb +0 -11
  44. data/examples/pivot_table.rb +0 -39
  45. data/examples/pivot_test.rb +0 -63
  46. data/examples/sheet_protection.rb +0 -10
  47. data/examples/skydrive/real_example.rb +0 -63
  48. data/examples/split.rb +0 -16
  49. data/examples/styles.rb +0 -66
  50. data/examples/underline.rb +0 -13
  51. data/examples/wrap_text.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d1084b09a06fdcca750fa734735fe339c527327f
4
- data.tar.gz: cb0849f0edbe032dc82e3d6766245e7a42ebf81f
2
+ SHA256:
3
+ metadata.gz: 49062d90fcd29bac6406a90ad46894a3b0624b2a5c391d8fc24a4b35f4c7a0b3
4
+ data.tar.gz: 18fbd2886127ae59169c94ce4b7025adf78bb15651dba590d1f2955a2e276940
5
5
  SHA512:
6
- metadata.gz: 736a38bbbb7bebebc204e3e81778e84d7ee45f9794e21b0bfab39d42ed1afe1e1e2cc905345b32889fb8cf3ae3b11a3ac7656173f991016296064a5ca82e98a7
7
- data.tar.gz: 4532801d92486550f8db5ab177acb8a72de3f0e209f2483db9e13df11a7e05ef3a63f97c9062099d478ca0469c86f1ebe7a7bc5cc8d5be8018a8a3abf49b8fe4
6
+ metadata.gz: e5be713d4ea7daa76c58bbb648d37a146b094ea2cb9a132e3f02e58a536b20551aabef73513d4f1f619eb29c54294d02ec758f1fd959a50edbd4be565b368ade
7
+ data.tar.gz: 8a58ee22d90bdd99a3b0a85c59441f926c15f5ce66fdcb6ec2bb969380ba5e2c12458ab16e97cc67291b69d9e4633d102385662733de130aa2cd7bb06e693130
@@ -1,6 +1,13 @@
1
1
  CHANGELOG
2
2
  ---------
3
3
 
4
+ - **Unreleased**
5
+
6
+ - **December.7.20**: 3.0.3
7
+ - [PR #62](https://github.com/caxlsx/caxlsx/pull/62) - Fix edge cases in format detection for objects whose string representation made them look like numbers but the object didn’t respond to `#to_i` or `#to_f`.
8
+ - [PR #56](https://github.com/caxlsx/caxlsx/pull/56) - Add `zip_command` option to `#serialize` for faster serialization of large Excel files by using a zip binary
9
+ - [PR #54](https://github.com/caxlsx/caxlsx/pull/54) - Fix type detection for floats with out-of-rage exponents
10
+
4
11
  - **July.16.20**: 3.0.2
5
12
  - [I #51](https://github.com/caxlsx/caxlsx/issues/51) - Images do not import on Windows. IO read set explicitly to binary mode.
6
13
  - [PR #53](https://github.com/caxlsx/caxlsx/pull/53) - Limit column width to 255. Maximum column width limit in MS Excel is 255 characters, see https://support.microsoft.com/en-us/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ files = if !ARGV.empty?
4
+ ARGV.select { |file| File.exist?(file) }
5
+ else
6
+ Dir['*_example.md']
7
+ end
8
+
9
+ files.each do |file|
10
+ puts "Executing #{file.split('.')[0].tr('_', ' ')}"
11
+ code = File.read(file).match(/```ruby(?<code>.+)```/m)[:code]
12
+ unless code.nil?
13
+ eval(['$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"', code].join("\n"))
14
+ end
15
+ end
@@ -10,6 +10,7 @@ require 'axlsx/util/accessors.rb'
10
10
  require 'axlsx/util/serialized_attributes'
11
11
  require 'axlsx/util/options_parser'
12
12
  require 'axlsx/util/mime_type_utils'
13
+ require 'axlsx/util/zip_command'
13
14
 
14
15
  require 'axlsx/stylesheet/styles.rb'
15
16
 
@@ -47,7 +47,7 @@ module Axlsx
47
47
  # @return [String]
48
48
  def to_xml_string(str = '')
49
49
  super(str) do
50
- str << '<c:explosion val="' + @explosion + '"/>' unless @explosion.nil?
50
+ str << '<c:explosion val="' + @explosion.to_s + '"/>' unless @explosion.nil?
51
51
  colors.each_with_index do |c, index|
52
52
  str << '<c:dPt>'
53
53
  str << ('<c:idx val="' << index.to_s << '"/>')
@@ -75,6 +75,9 @@ module Axlsx
75
75
  #
76
76
  # @param [String] output The name of the file you want to serialize your package to
77
77
  # @param [Boolean] confirm_valid Validate the package prior to serialization.
78
+ # @param [String, nil] zip_command When `nil`, `#serialize` with RubyZip to
79
+ # zip the XLSX file contents. When a String, the provided zip command (e.g.,
80
+ # "zip") is used to zip the file contents (may be faster for large files)
78
81
  # @return [Boolean] False if confirm_valid and validation errors exist. True if the package was serialized
79
82
  # @note A tremendous amount of effort has gone into ensuring that you cannot create invalid xlsx documents.
80
83
  # confirm_valid should be used in the rare case that you cannot open the serialized file.
@@ -88,13 +91,23 @@ module Axlsx
88
91
  # # ......add cool stuff to your workbook......
89
92
  # p.serialize("example.xlsx")
90
93
  #
94
+ # # Serialize to a file, using a system zip binary
95
+ # p.serialize("example.xlsx", false, zip_command: "zip")
96
+ # p.serialize("example.xlsx", false, zip_command: "/path/to/zip")
97
+ # p.serialize("example.xlsx", false, zip_command: "zip -1")
98
+ #
91
99
  # # Serialize to a stream
92
100
  # s = p.to_stream()
93
101
  # File.open('example_streamed.xlsx', 'w') { |f| f.write(s.read) }
94
- def serialize(output, confirm_valid=false)
102
+ def serialize(output, confirm_valid=false, zip_command: nil)
95
103
  return false unless !confirm_valid || self.validate.empty?
104
+ zip_provider = if zip_command
105
+ ZipCommand.new(zip_command)
106
+ else
107
+ Zip::OutputStream
108
+ end
96
109
  Relationship.initialize_ids_cache
97
- Zip::OutputStream.open(output) do |zip|
110
+ zip_provider.open(output) do |zip|
98
111
  write_parts(zip)
99
112
  end
100
113
  true
@@ -153,8 +166,8 @@ module Axlsx
153
166
  private
154
167
 
155
168
  # Writes the package parts to a zip archive.
156
- # @param [Zip::OutputStream] zip
157
- # @return [Zip::OutputStream]
169
+ # @param [Zip::OutputStream, ZipCommand] zip
170
+ # @return [Zip::OutputStream, ZipCommand]
158
171
  def write_parts(zip)
159
172
  p = parts
160
173
  p.each do |part|
@@ -393,7 +393,8 @@ module Axlsx
393
393
  ISO_8601_REGEX = /\A(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])?\Z/.freeze
394
394
 
395
395
  # FLOAT recognition
396
- FLOAT_REGEX = /\A[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\Z/.freeze
396
+ SAFE_FLOAT_REGEX = /\A[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]{1,2})?\Z/.freeze
397
+ MAYBE_FLOAT_REGEX = /\A[-+]?[0-9]*\.?[0-9]+[eE](?<exp>[-+]?[0-9]{3})\Z/.freeze
397
398
 
398
399
  # Numeric recognition
399
400
  NUMERIC_REGEX = /\A[+-]?\d+?\Z/.freeze
@@ -0,0 +1,73 @@
1
+ # encoding: UTF-8
2
+ require 'open3'
3
+ require 'shellwords'
4
+
5
+ module Axlsx
6
+
7
+ # The ZipCommand class supports zipping the Excel file contents using
8
+ # a binary zip program instead of RubyZip's `Zip::OutputStream`.
9
+ #
10
+ # The methods provided here mimic `Zip::OutputStream` so that `ZipCommand` can
11
+ # be used as a drop-in replacement. Note that method signatures are not
12
+ # identical to `Zip::OutputStream`, they are only sufficiently close so that
13
+ # `ZipCommand` and `Zip::OutputStream` can be interchangeably used within
14
+ # `caxlsx`.
15
+ class ZipCommand
16
+ # Raised when the zip command exits with a non-zero status.
17
+ class ZipError < StandardError; end
18
+
19
+ def initialize(zip_command)
20
+ @current_file = nil
21
+ @files = []
22
+ @zip_command = zip_command
23
+ end
24
+
25
+ # Create a temporary directory for writing files to.
26
+ #
27
+ # The directory and its contents are removed at the end of the block.
28
+ def open(output, &block)
29
+ Dir.mktmpdir do |dir|
30
+ @dir = dir
31
+ block.call(self)
32
+ write_file
33
+ zip_parts(output)
34
+ end
35
+ end
36
+
37
+ # Closes the current entry and opens a new for writing.
38
+ def put_next_entry(entry)
39
+ write_file
40
+ @current_file = "#{@dir}/#{entry.name}"
41
+ @files << entry.name
42
+ FileUtils.mkdir_p(File.dirname(@current_file))
43
+ end
44
+
45
+ # Write to a buffer that will be written to the current entry
46
+ def write(content)
47
+ @buffer << content
48
+ end
49
+ alias << write
50
+
51
+ private
52
+
53
+ def write_file
54
+ if @current_file
55
+ @buffer.rewind
56
+ File.open(@current_file, "wb") { |f| f.write @buffer.read }
57
+ end
58
+ @current_file = nil
59
+ @buffer = StringIO.new
60
+ end
61
+
62
+ def zip_parts(output)
63
+ output = Shellwords.shellescape(File.absolute_path(output))
64
+ inputs = Shellwords.shelljoin(@files)
65
+ escaped_dir = Shellwords.shellescape(@dir)
66
+ command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}"
67
+ stdout_and_stderr, status = Open3.capture2e(command)
68
+ if !status.success?
69
+ raise(ZipError.new(stdout_and_stderr))
70
+ end
71
+ end
72
+ end
73
+ end
@@ -1,5 +1,5 @@
1
1
  module Axlsx
2
2
 
3
3
  # The current version
4
- VERSION = "3.0.2"
4
+ VERSION = "3.0.3"
5
5
  end
@@ -451,9 +451,11 @@ module Axlsx
451
451
  :time
452
452
  elsif v.is_a?(TrueClass) || v.is_a?(FalseClass)
453
453
  :boolean
454
- elsif v.to_s =~ Axlsx::NUMERIC_REGEX
454
+ elsif v.to_s =~ Axlsx::NUMERIC_REGEX && v.respond_to?(:to_i)
455
455
  :integer
456
- elsif v.to_s =~ Axlsx::FLOAT_REGEX
456
+ elsif v.to_s =~ Axlsx::SAFE_FLOAT_REGEX && v.respond_to?(:to_f)
457
+ :float
458
+ elsif (matchdata = v.to_s.match(MAYBE_FLOAT_REGEX)) && (Float::MIN_10_EXP..Float::MAX_10_EXP).cover?(matchdata[:exp].to_i) && v.respond_to?(:to_f)
457
459
  :float
458
460
  elsif v.to_s =~ Axlsx::ISO_8601_REGEX
459
461
  :iso_8601
@@ -23,7 +23,7 @@ class TestDrawing < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def test_add_image
26
- src = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
26
+ src = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
27
27
  image = @ws.add_image(:image_src => src, :start_at=>[0,0], :width=>600, :height=>400)
28
28
  assert(@ws.drawing.anchors.last.is_a?(Axlsx::OneCellAnchor))
29
29
  assert(image.is_a?(Axlsx::Pic))
@@ -31,7 +31,7 @@ class TestDrawing < Test::Unit::TestCase
31
31
  assert_equal(400, image.height)
32
32
  end
33
33
  def test_add_two_cell_anchor_image
34
- src = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
34
+ src = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
35
35
  image = @ws.add_image(:image_src => src, :start_at=>[0,0], :end_at => [15,0])
36
36
  assert(@ws.drawing.anchors.last.is_a?(Axlsx::TwoCellAnchor))
37
37
  assert(image.is_a?(Axlsx::Pic))
@@ -5,7 +5,7 @@ class TestHyperlink < Test::Unit::TestCase
5
5
  def setup
6
6
  @p = Axlsx::Package.new
7
7
  ws = @p.workbook.add_worksheet
8
- @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
8
+ @test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
9
9
  @image = ws.add_image :image_src => @test_img, :hyperlink => "http://axlsx.blogspot.com"
10
10
  @hyperlink = @image.hyperlink
11
11
  end
@@ -5,7 +5,7 @@ class TestOneCellAnchor < Test::Unit::TestCase
5
5
  def setup
6
6
  @p = Axlsx::Package.new
7
7
  @ws = @p.workbook.add_worksheet
8
- @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
8
+ @test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
9
9
  @image = @ws.add_image :image_src => @test_img
10
10
  @anchor = @image.anchor
11
11
  end
@@ -5,10 +5,10 @@ class TestPic < Test::Unit::TestCase
5
5
  def setup
6
6
  @p = Axlsx::Package.new
7
7
  ws = @p.workbook.add_worksheet
8
- @test_img = @test_img_jpg = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
9
- @test_img_png = File.dirname(__FILE__) + "/../../examples/image1.png"
10
- @test_img_gif = File.dirname(__FILE__) + "/../../examples/image1.gif"
11
- @test_img_fake = File.dirname(__FILE__) + "/../../examples/image1_fake.jpg"
8
+ @test_img = @test_img_jpg = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
9
+ @test_img_png = File.dirname(__FILE__) + "/../fixtures/image1.png"
10
+ @test_img_gif = File.dirname(__FILE__) + "/../fixtures/image1.gif"
11
+ @test_img_fake = File.dirname(__FILE__) + "/../fixtures/image1_fake.jpg"
12
12
  @image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?", :opacity => 5
13
13
  end
14
14
 
@@ -20,12 +20,13 @@ class TestPieSeries < Test::Unit::TestCase
20
20
  assert_raise(ArgumentError, "require valid explosion") { @series.explosion = :lots }
21
21
  assert_nothing_raised("allow valid explosion") { @series.explosion = 20 }
22
22
  assert(@series.explosion == 20)
23
+ # issue 58 - explosion caused to_xml_string to fail - now tested
24
+ assert_nothing_raised("allow to_xml_string") { @series.to_xml_string }
23
25
  end
24
26
 
25
27
  def test_to_xml_string
26
28
  doc = Nokogiri::XML(@series.to_xml_string)
27
29
  assert(doc.xpath("//srgbClr[@val='#{@series.colors[0]}']"))
28
-
29
30
  end
30
31
  #TODO test unique serialization parts
31
32
 
Binary file
Binary file
Binary file
Binary file
File without changes
@@ -65,7 +65,7 @@ class TestPackage < Test::Unit::TestCase
65
65
  end
66
66
 
67
67
  @fname = 'axlsx_test_serialization.xlsx'
68
- img = File.expand_path('../../examples/image1.jpeg', __FILE__)
68
+ img = File.expand_path('../fixtures/image1.jpeg', __FILE__)
69
69
  ws.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
70
70
  image.width=720
71
71
  image.height=666
@@ -73,12 +73,12 @@ class TestPackage < Test::Unit::TestCase
73
73
  image.start_at 5, 5
74
74
  image.end_at 10, 10
75
75
  end
76
- ws.add_image :image_src => File.expand_path('../../examples/image1.gif', __FILE__) do |image|
76
+ ws.add_image :image_src => File.expand_path('../fixtures/image1.gif', __FILE__) do |image|
77
77
  image.start_at 0, 20
78
78
  image.width=360
79
79
  image.height=333
80
80
  end
81
- ws.add_image :image_src => File.expand_path('../../examples/image1.png', __FILE__) do |image|
81
+ ws.add_image :image_src => File.expand_path('../fixtures/image1.png', __FILE__) do |image|
82
82
  image.start_at 9, 20
83
83
  image.width = 180
84
84
  image.height = 167
@@ -127,18 +127,35 @@ class TestPackage < Test::Unit::TestCase
127
127
  end
128
128
 
129
129
  def test_serialization
130
- assert_nothing_raised do
131
- begin
132
- @package.serialize(@fname)
133
- zf = Zip::File.open(@fname)
134
- @package.send(:parts).each{ |part| zf.get_entry(part[:entry]) }
135
- File.delete(@fname)
136
- rescue Errno::EACCES
137
- puts "WARNING:: test_serialization requires write access."
138
- end
130
+ @package.serialize(@fname)
131
+ assert_zip_file_matches_package(@fname, @package)
132
+ File.delete(@fname)
133
+ end
134
+
135
+ def test_serialization_with_zip_command
136
+ @package.serialize(@fname, false, zip_command: "zip")
137
+ assert_zip_file_matches_package(@fname, @package)
138
+ File.delete(@fname)
139
+ end
140
+
141
+ def test_serialization_with_zip_command_and_absolute_path
142
+ fname = "#{Dir.tmpdir}/#{@fname}"
143
+ @package.serialize(fname, false, zip_command: "zip")
144
+ assert_zip_file_matches_package(fname, @package)
145
+ File.delete(fname)
146
+ end
147
+
148
+ def test_serialization_with_invalid_zip_command
149
+ assert_raises Axlsx::ZipCommand::ZipError do
150
+ @package.serialize(@fname, false, zip_command: "invalid_zip")
139
151
  end
140
152
  end
141
153
 
154
+ def assert_zip_file_matches_package(fname, package)
155
+ zf = Zip::File.open(fname)
156
+ package.send(:parts).each{ |part| zf.get_entry(part[:entry]) }
157
+ end
158
+
142
159
  # See comment for Package#zip_entry_for_part
143
160
  def test_serialization_creates_identical_files_at_any_time_if_created_at_is_set
144
161
  @package.core.created = Time.now
@@ -1,7 +1,7 @@
1
1
  require 'tc_helper.rb'
2
2
  class TestMimeTypeUtils < Test::Unit::TestCase
3
3
  def setup
4
- @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
4
+ @test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg"
5
5
  end
6
6
 
7
7
  def teardown
@@ -100,6 +100,12 @@ class TestCell < Test::Unit::TestCase
100
100
 
101
101
  def test_cell_type_from_value
102
102
  assert_equal(@c.send(:cell_type_from_value, 1.0), :float)
103
+ assert_equal(@c.send(:cell_type_from_value, "1e1"), :float)
104
+ assert_equal(@c.send(:cell_type_from_value, "1e#{Float::MAX_10_EXP}"), :float)
105
+ assert_equal(@c.send(:cell_type_from_value, "1e#{Float::MAX_10_EXP + 1}"), :string)
106
+ assert_equal(@c.send(:cell_type_from_value, "1e-1"), :float)
107
+ assert_equal(@c.send(:cell_type_from_value, "1e#{Float::MIN_10_EXP}"), :float)
108
+ assert_equal(@c.send(:cell_type_from_value, "1e#{Float::MIN_10_EXP - 1}"), :string)
103
109
  assert_equal(@c.send(:cell_type_from_value, 1), :integer)
104
110
  assert_equal(@c.send(:cell_type_from_value, Date.today), :date)
105
111
  assert_equal(@c.send(:cell_type_from_value, Time.now), :time)
@@ -114,6 +120,31 @@ class TestCell < Test::Unit::TestCase
114
120
  assert_equal(:iso_8601, @c.send(:cell_type_from_value, '2008-08-30T01:45:36.123+09:00'))
115
121
  end
116
122
 
123
+ def test_cell_type_from_value_looks_like_number_but_is_not
124
+ mimic_number = Class.new do
125
+ def initialize(to_s_value)
126
+ @to_s_value = to_s_value
127
+ end
128
+
129
+ def to_s
130
+ @to_s_value
131
+ end
132
+ end
133
+
134
+ number_strings = [
135
+ '1',
136
+ '1234567890',
137
+ '1.0',
138
+ '1e1',
139
+ '0',
140
+ "1e#{Float::MIN_10_EXP}"
141
+ ]
142
+
143
+ number_strings.each do |number_string|
144
+ assert_equal(@c.send(:cell_type_from_value, mimic_number.new(number_string)), :string)
145
+ end
146
+ end
147
+
117
148
  def test_cast_value
118
149
  @c.type = :string
119
150
  assert_equal(@c.send(:cast_value, 1.0), "1.0")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caxlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Randy Morgan
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-07-16 00:00:00.000000000 Z
12
+ date: 2020-12-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -105,20 +105,14 @@ dependencies:
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '1.16'
109
- - - ">="
110
- - !ruby/object:Gem::Version
111
- version: 1.16.2
108
+ version: '2.3'
112
109
  type: :development
113
110
  prerelease: false
114
111
  version_requirements: !ruby/object:Gem::Requirement
115
112
  requirements:
116
113
  - - "~>"
117
114
  - !ruby/object:Gem::Version
118
- version: '1.16'
119
- - - ">="
120
- - !ruby/object:Gem::Version
121
- version: 1.16.2
115
+ version: '2.3'
122
116
  - !ruby/object:Gem::Dependency
123
117
  name: timecop
124
118
  requirement: !ruby/object:Gem::Requirement
@@ -151,33 +145,8 @@ files:
151
145
  - LICENSE
152
146
  - README.md
153
147
  - Rakefile
154
- - examples/2010_comments.rb
155
- - examples/anchor_swapping.rb
156
- - examples/auto_filter.rb
157
- - examples/basic_charts.rb
158
- - examples/chart_colors.rb
159
- - examples/colored_links.rb
160
- - examples/conditional_formatting/example_conditional_formatting.rb
161
- - examples/conditional_formatting/getting_barred.rb
162
- - examples/conditional_formatting/hitting_the_high_notes.rb
163
- - examples/conditional_formatting/scaled_colors.rb
164
- - examples/conditional_formatting/stop_and_go.rb
165
- - examples/data_validation.rb
166
- - examples/example.rb
167
- - examples/extractive.rb
168
- - examples/image1.jpeg
169
- - examples/ios_preview.rb
170
- - examples/merge_cells.rb
171
- - examples/no_grid_with_borders.rb
172
- - examples/page_setup.rb
173
- - examples/pivot_table.rb
174
- - examples/pivot_test.rb
175
- - examples/sheet_protection.rb
176
- - examples/skydrive/real_example.rb
177
- - examples/split.rb
178
- - examples/styles.rb
179
- - examples/underline.rb
180
- - examples/wrap_text.rb
148
+ - examples/assets/image1.jpeg
149
+ - examples/generate.rb
181
150
  - lib/axlsx.rb
182
151
  - lib/axlsx/content_type/abstract_content_type.rb
183
152
  - lib/axlsx/content_type/content_type.rb
@@ -256,6 +225,7 @@ files:
256
225
  - lib/axlsx/util/simple_typed_list.rb
257
226
  - lib/axlsx/util/storage.rb
258
227
  - lib/axlsx/util/validators.rb
228
+ - lib/axlsx/util/zip_command.rb
259
229
  - lib/axlsx/version.rb
260
230
  - lib/axlsx/workbook/defined_name.rb
261
231
  - lib/axlsx/workbook/defined_names.rb
@@ -403,6 +373,11 @@ files:
403
373
  - test/drawing/tc_view_3D.rb
404
374
  - test/drawing/tc_vml_drawing.rb
405
375
  - test/drawing/tc_vml_shape.rb
376
+ - test/fixtures/image1.gif
377
+ - test/fixtures/image1.jpeg
378
+ - test/fixtures/image1.jpg
379
+ - test/fixtures/image1.png
380
+ - test/fixtures/image1_fake.jpg
406
381
  - test/profile.rb
407
382
  - test/rels/tc_relationship.rb
408
383
  - test/rels/tc_relationships.rb
@@ -492,8 +467,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
492
467
  - !ruby/object:Gem::Version
493
468
  version: '0'
494
469
  requirements: []
495
- rubyforge_project:
496
- rubygems_version: 2.6.12
470
+ rubygems_version: 3.0.3
497
471
  signing_key:
498
472
  specification_version: 4
499
473
  summary: Excel OOXML (xlsx) with charts, styles, images and autowidth columns.
@@ -547,6 +521,11 @@ test_files:
547
521
  - test/drawing/tc_view_3D.rb
548
522
  - test/drawing/tc_vml_drawing.rb
549
523
  - test/drawing/tc_vml_shape.rb
524
+ - test/fixtures/image1.gif
525
+ - test/fixtures/image1.jpeg
526
+ - test/fixtures/image1.jpg
527
+ - test/fixtures/image1.png
528
+ - test/fixtures/image1_fake.jpg
550
529
  - test/profile.rb
551
530
  - test/rels/tc_relationship.rb
552
531
  - test/rels/tc_relationships.rb