chunky_png 1.3.8 → 1.3.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +35 -0
  3. data/.standard.yml +16 -0
  4. data/.yardopts +1 -1
  5. data/CHANGELOG.rdoc +13 -1
  6. data/CONTRIBUTING.rdoc +17 -8
  7. data/Gemfile +5 -3
  8. data/LICENSE +1 -1
  9. data/README.md +6 -1
  10. data/Rakefile +5 -3
  11. data/benchmarks/decoding_benchmark.rb +17 -17
  12. data/benchmarks/encoding_benchmark.rb +22 -19
  13. data/benchmarks/filesize_benchmark.rb +6 -6
  14. data/bin/rake +29 -0
  15. data/bin/standardrb +29 -0
  16. data/chunky_png.gemspec +20 -14
  17. data/lib/chunky_png.rb +46 -45
  18. data/lib/chunky_png/canvas.rb +30 -27
  19. data/lib/chunky_png/canvas/adam7_interlacing.rb +16 -10
  20. data/lib/chunky_png/canvas/data_url_exporting.rb +3 -3
  21. data/lib/chunky_png/canvas/data_url_importing.rb +3 -3
  22. data/lib/chunky_png/canvas/drawing.rb +30 -43
  23. data/lib/chunky_png/canvas/masking.rb +14 -14
  24. data/lib/chunky_png/canvas/operations.rb +28 -24
  25. data/lib/chunky_png/canvas/png_decoding.rb +38 -32
  26. data/lib/chunky_png/canvas/png_encoding.rb +110 -102
  27. data/lib/chunky_png/canvas/resampling.rb +27 -32
  28. data/lib/chunky_png/canvas/stream_exporting.rb +8 -8
  29. data/lib/chunky_png/canvas/stream_importing.rb +8 -8
  30. data/lib/chunky_png/chunk.rb +115 -66
  31. data/lib/chunky_png/color.rb +213 -206
  32. data/lib/chunky_png/datastream.rb +24 -30
  33. data/lib/chunky_png/dimension.rb +18 -11
  34. data/lib/chunky_png/image.rb +11 -11
  35. data/lib/chunky_png/palette.rb +6 -9
  36. data/lib/chunky_png/point.rb +27 -26
  37. data/lib/chunky_png/rmagick.rb +10 -10
  38. data/lib/chunky_png/vector.rb +28 -29
  39. data/lib/chunky_png/version.rb +3 -1
  40. data/spec/chunky_png/canvas/adam7_interlacing_spec.rb +20 -21
  41. data/spec/chunky_png/canvas/data_url_exporting_spec.rb +8 -5
  42. data/spec/chunky_png/canvas/data_url_importing_spec.rb +5 -6
  43. data/spec/chunky_png/canvas/drawing_spec.rb +46 -38
  44. data/spec/chunky_png/canvas/masking_spec.rb +15 -16
  45. data/spec/chunky_png/canvas/operations_spec.rb +68 -67
  46. data/spec/chunky_png/canvas/png_decoding_spec.rb +37 -38
  47. data/spec/chunky_png/canvas/png_encoding_spec.rb +59 -50
  48. data/spec/chunky_png/canvas/resampling_spec.rb +19 -21
  49. data/spec/chunky_png/canvas/stream_exporting_spec.rb +47 -27
  50. data/spec/chunky_png/canvas/stream_importing_spec.rb +10 -11
  51. data/spec/chunky_png/canvas_spec.rb +57 -52
  52. data/spec/chunky_png/color_spec.rb +115 -114
  53. data/spec/chunky_png/datastream_spec.rb +98 -19
  54. data/spec/chunky_png/dimension_spec.rb +10 -10
  55. data/spec/chunky_png/image_spec.rb +11 -14
  56. data/spec/chunky_png/point_spec.rb +21 -23
  57. data/spec/chunky_png/rmagick_spec.rb +7 -8
  58. data/spec/chunky_png/vector_spec.rb +21 -17
  59. data/spec/chunky_png_spec.rb +2 -2
  60. data/spec/png_suite_spec.rb +35 -40
  61. data/spec/resources/itxt_chunk.png +0 -0
  62. data/spec/spec_helper.rb +15 -9
  63. data/tasks/benchmarks.rake +7 -8
  64. metadata +53 -20
  65. data/.travis.yml +0 -16
  66. data/lib/chunky_png/compatibility.rb +0 -15
@@ -1,7 +1,7 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe ChunkyPNG do
4
4
  it "should have a VERSION constant" do
5
- expect(ChunkyPNG.const_defined?('VERSION')).to eql true
5
+ expect(ChunkyPNG.const_defined?("VERSION")).to be_truthy
6
6
  end
7
7
  end
@@ -1,8 +1,7 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
- describe 'PNG testuite' do
4
-
5
- context 'Decoding broken images' do
3
+ describe "PNG testuite" do
4
+ context "Decoding broken images" do
6
5
  png_suite_files(:broken).each do |file|
7
6
  it "should report #{File.basename(file)} as broken" do
8
7
  expect { ChunkyPNG::Image.from_file(file) }.to raise_error(ChunkyPNG::Exception)
@@ -10,24 +9,22 @@ describe 'PNG testuite' do
10
9
  end
11
10
  end
12
11
 
13
- context 'Decoding supported images' do
14
- png_suite_files(:basic, '*.png').each do |file|
15
-
16
- reference = file.sub(/\.png$/, '.rgba')
12
+ context "Decoding supported images" do
13
+ png_suite_files(:basic, "*.png").each do |file|
14
+ reference = file.sub(/\.png$/, ".rgba")
17
15
  color_mode = file.match(/[in](\d)[apgc](\d\d)\.png$/)[1].to_i
18
16
  bit_depth = file.match(/[in](\d)[apgc](\d\d)\.png$/)[2].to_i
19
17
 
20
18
  it "should decode #{File.basename(file)} (color mode: #{color_mode}, bit depth: #{bit_depth}) exactly the same as the reference image" do
21
19
  decoded = ChunkyPNG::Canvas.from_file(file)
22
- File.open(reference, 'rb') { |f| expect(decoded.to_rgba_stream).to eql f.read }
20
+ expect(decoded.to_rgba_stream).to eql(File.read(reference, mode: "rb"))
23
21
  end
24
22
  end
25
23
  end
26
24
 
27
- context 'Decoding text chunks' do
28
-
25
+ context "Decoding text chunks" do
29
26
  it "should not find metadata in a file without text chunks" do
30
- image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, 'cm0n0g04.png'))
27
+ image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, "cm0n0g04.png"))
31
28
  expect(image.metadata).to be_empty
32
29
  end
33
30
 
@@ -42,10 +39,9 @@ describe 'PNG testuite' do
42
39
  # end
43
40
  end
44
41
 
45
- context 'Decoding filter methods' do
46
- png_suite_files(:filtering, '*_reference.png').each do |reference_file|
47
-
48
- file = reference_file.sub(/_reference\.png$/, '.png')
42
+ context "Decoding filter methods" do
43
+ png_suite_files(:filtering, "*_reference.png").each do |reference_file|
44
+ file = reference_file.sub(/_reference\.png$/, ".png")
49
45
  filter_method = file.match(/f(\d\d)[a-z0-9]+\.png/)[1].to_i
50
46
 
51
47
  it "should decode #{File.basename(file)} (filter method: #{filter_method}) exactly the same as the reference image" do
@@ -56,54 +52,53 @@ describe 'PNG testuite' do
56
52
  end
57
53
  end
58
54
 
59
- context 'Decoding different chunk splits' do
55
+ context "Decoding different chunk splits" do
60
56
  it "should decode grayscale images successfully regardless of the data chunk ordering and splitting" do
61
- reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi1n0g16.png')).imagedata
62
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi2n0g16.png')).imagedata).to eql reference
63
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi4n0g16.png')).imagedata).to eql reference
64
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi9n0g16.png')).imagedata).to eql reference
57
+ reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi1n0g16.png")).imagedata
58
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi2n0g16.png")).imagedata).to eql reference
59
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi4n0g16.png")).imagedata).to eql reference
60
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi9n0g16.png")).imagedata).to eql reference
65
61
  end
66
62
 
67
63
  it "should decode color images successfully regardless of the data chunk ordering and splitting" do
68
- reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi1n2c16.png')).imagedata
69
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi2n2c16.png')).imagedata).to eql reference
70
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi4n2c16.png')).imagedata).to eql reference
71
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi9n2c16.png')).imagedata).to eql reference
64
+ reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi1n2c16.png")).imagedata
65
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi2n2c16.png")).imagedata).to eql reference
66
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi4n2c16.png")).imagedata).to eql reference
67
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, "oi9n2c16.png")).imagedata).to eql reference
72
68
  end
73
69
  end
74
70
 
75
- context 'Decoding different compression levels' do
71
+ context "Decoding different compression levels" do
76
72
  it "should decode the image successfully regardless of the compression level" do
77
- reference = ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z00n2c08.png')).imagedata
78
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z03n2c08.png')).imagedata).to eql reference
79
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z06n2c08.png')).imagedata).to eql reference
80
- expect(ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z09n2c08.png')).imagedata).to eql reference
73
+ reference = ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, "z00n2c08.png")).imagedata
74
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, "z03n2c08.png")).imagedata).to eql reference
75
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, "z06n2c08.png")).imagedata).to eql reference
76
+ expect(ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, "z09n2c08.png")).imagedata).to eql reference
81
77
  end
82
78
  end
83
79
 
84
- context 'Decoding transparency' do
85
- png_suite_files(:transparency, 'tp0*.png').each do |file|
80
+ context "Decoding transparency" do
81
+ png_suite_files(:transparency, "tp0*.png").each do |file|
86
82
  it "should not have transparency in #{File.basename(file)}" do
87
- expect(ChunkyPNG::Color.a(ChunkyPNG::Image.from_file(file)[0,0])).to eql 255
83
+ expect(ChunkyPNG::Color.a(ChunkyPNG::Image.from_file(file)[0, 0])).to eql 255
88
84
  end
89
85
  end
90
86
 
91
- png_suite_files(:transparency, 'tp1*.png').each do |file|
87
+ png_suite_files(:transparency, "tp1*.png").each do |file|
92
88
  it "should have transparency in #{File.basename(file)}" do
93
- expect(ChunkyPNG::Color.a(ChunkyPNG::Image.from_file(file)[0,0])).to eql 0
89
+ expect(ChunkyPNG::Color.a(ChunkyPNG::Image.from_file(file)[0, 0])).to eql 0
94
90
  end
95
91
  end
96
92
 
97
- png_suite_files(:transparency, 'tb*.png').each do |file|
93
+ png_suite_files(:transparency, "tb*.png").each do |file|
98
94
  it "should have transparency in #{File.basename(file)}" do
99
- expect(ChunkyPNG::Color.a(ChunkyPNG::Image.from_file(file)[0,0])).to eql 0
95
+ expect(ChunkyPNG::Color.a(ChunkyPNG::Image.from_file(file)[0, 0])).to eql 0
100
96
  end
101
97
  end
102
98
  end
103
99
 
104
- context 'Decoding different sizes' do
105
-
106
- png_suite_files(:sizes, '*n*.png').each do |file|
100
+ context "Decoding different sizes" do
101
+ png_suite_files(:sizes, "*n*.png").each do |file|
107
102
  dimension = file.match(/s(\d\d)n\dp\d\d/)[1].to_i
108
103
 
109
104
  it "should create a canvas with a #{dimension}x#{dimension} size" do
@@ -1,9 +1,8 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'chunky_png'
1
+ require "rubygems"
2
+ require "bundler/setup"
3
+ require "chunky_png"
4
4
 
5
5
  module PNGSuite
6
-
7
6
  def png_suite_file(kind, file)
8
7
  File.join(png_suite_dir(kind), file)
9
8
  end
@@ -12,21 +11,19 @@ module PNGSuite
12
11
  File.expand_path("./png_suite/#{kind}", File.dirname(__FILE__))
13
12
  end
14
13
 
15
- def png_suite_files(kind, pattern = '*.png')
14
+ def png_suite_files(kind, pattern = "*.png")
16
15
  Dir[File.join(png_suite_dir(kind), pattern)]
17
16
  end
18
17
  end
19
18
 
20
-
21
19
  module ResourceFileHelper
22
-
23
20
  def resource_file(name)
24
21
  File.expand_path("./resources/#{name}", File.dirname(__FILE__))
25
22
  end
26
23
 
27
24
  def resource_data(name)
28
25
  data = nil
29
- File.open(resource_file(name), 'rb') { |f| data = f.read }
26
+ File.open(resource_file(name), "rb") { |f| data = f.read }
30
27
  data
31
28
  end
32
29
 
@@ -39,16 +36,25 @@ module ResourceFileHelper
39
36
  end
40
37
 
41
38
  def display(png)
42
- filename = resource_file('_tmp.png')
39
+ filename = resource_file("_tmp.png")
43
40
  png.save(filename)
44
41
  `open #{filename}`
45
42
  end
46
43
  end
47
44
 
45
+ module ChunkOperationsHelper
46
+ def serialized_chunk(chunk)
47
+ chunk.write(stream = StringIO.new)
48
+ stream.rewind
49
+ ChunkyPNG::Chunk.read(stream)
50
+ end
51
+ end
52
+
48
53
  RSpec.configure do |config|
49
54
  config.extend PNGSuite
50
55
  config.include PNGSuite
51
56
  config.include ResourceFileHelper
57
+ config.include ChunkOperationsHelper
52
58
 
53
59
  config.expect_with :rspec do |c|
54
60
  c.syntax = [:should, :expect]
@@ -1,24 +1,23 @@
1
1
  all_benchamrk_tasks = []
2
2
 
3
3
  namespace(:benchmark) do
4
-
5
- Dir[File.join(File.dirname(__FILE__), '..', 'benchmarks', '*_benchmark.rb')]. each do |benchmark_file|
6
- task_name = File.basename(benchmark_file, '_benchmark.rb').to_sym
7
-
4
+ Dir[File.join(File.dirname(__FILE__), "..", "benchmarks", "*_benchmark.rb")]. each do |benchmark_file|
5
+ task_name = File.basename(benchmark_file, "_benchmark.rb").to_sym
6
+
8
7
  desc "Run the #{task_name} benchmark."
9
8
  task(task_name, :n) do |task, args|
10
- ENV['N'] = args[:n] if args[:n]
9
+ ENV["N"] = args[:n] if args[:n]
11
10
  load(File.expand_path(benchmark_file))
12
11
  end
13
-
12
+
14
13
  all_benchamrk_tasks << "benchmark:#{task_name}"
15
14
  end
16
15
  end
17
16
 
18
17
  unless all_benchamrk_tasks.empty?
19
- desc 'Run the whole benchmark suite'
18
+ desc "Run the whole benchmark suite"
20
19
  task(:benchmark, :n) do |task, args|
21
- all_benchamrk_tasks.each do |t|
20
+ all_benchamrk_tasks.each do |t|
22
21
  task(t).invoke(args[:n])
23
22
  puts
24
23
  end
metadata CHANGED
@@ -1,41 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chunky_png
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.8
4
+ version: 1.3.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-11 00:00:00.000000000 Z
11
+ date: 2020-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: standard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rspec
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
- - - ~>
59
+ - - "~>"
32
60
  - !ruby/object:Gem::Version
33
61
  version: '3'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
- - - ~>
66
+ - - "~>"
39
67
  - !ruby/object:Gem::Version
40
68
  version: '3'
41
69
  description: |2
@@ -65,9 +93,10 @@ extra_rdoc_files:
65
93
  - CONTRIBUTING.rdoc
66
94
  - CHANGELOG.rdoc
67
95
  files:
68
- - .gitignore
69
- - .travis.yml
70
- - .yardopts
96
+ - ".github/workflows/ruby.yml"
97
+ - ".gitignore"
98
+ - ".standard.yml"
99
+ - ".yardopts"
71
100
  - BENCHMARKING.rdoc
72
101
  - CHANGELOG.rdoc
73
102
  - CONTRIBUTING.rdoc
@@ -78,6 +107,8 @@ files:
78
107
  - benchmarks/decoding_benchmark.rb
79
108
  - benchmarks/encoding_benchmark.rb
80
109
  - benchmarks/filesize_benchmark.rb
110
+ - bin/rake
111
+ - bin/standardrb
81
112
  - chunky_png.gemspec
82
113
  - lib/chunky_png.rb
83
114
  - lib/chunky_png/canvas.rb
@@ -94,7 +125,6 @@ files:
94
125
  - lib/chunky_png/canvas/stream_importing.rb
95
126
  - lib/chunky_png/chunk.rb
96
127
  - lib/chunky_png/color.rb
97
- - lib/chunky_png/compatibility.rb
98
128
  - lib/chunky_png/datastream.rb
99
129
  - lib/chunky_png/dimension.rb
100
130
  - lib/chunky_png/image.rb
@@ -366,6 +396,7 @@ files:
366
396
  - spec/resources/damaged_chunk.png
367
397
  - spec/resources/damaged_signature.png
368
398
  - spec/resources/empty.png
399
+ - spec/resources/itxt_chunk.png
369
400
  - spec/resources/lines.png
370
401
  - spec/resources/operations.png
371
402
  - spec/resources/operations_border.png
@@ -388,33 +419,34 @@ files:
388
419
  - spec/resources/ztxt_chunk.png
389
420
  - spec/spec_helper.rb
390
421
  - tasks/benchmarks.rake
391
- homepage: http://wiki.github.com/wvanbergen/chunky_png
422
+ homepage: https://github.com/wvanbergen/chunky_png/wiki
392
423
  licenses:
393
424
  - MIT
394
- metadata: {}
425
+ metadata:
426
+ source_code_uri: https://github.com/wvanbergen/chunky_png
427
+ wiki_uri: https://github.com/wvanbergen/chunky_png/wiki
395
428
  post_install_message:
396
429
  rdoc_options:
397
- - --title
430
+ - "--title"
398
431
  - chunky_png
399
- - --main
432
+ - "--main"
400
433
  - README.rdoc
401
- - --line-numbers
402
- - --inline-source
434
+ - "--line-numbers"
435
+ - "--inline-source"
403
436
  require_paths:
404
437
  - lib
405
438
  required_ruby_version: !ruby/object:Gem::Requirement
406
439
  requirements:
407
- - - '>='
440
+ - - ">="
408
441
  - !ruby/object:Gem::Version
409
442
  version: '0'
410
443
  required_rubygems_version: !ruby/object:Gem::Requirement
411
444
  requirements:
412
- - - '>='
445
+ - - ">="
413
446
  - !ruby/object:Gem::Version
414
447
  version: '0'
415
448
  requirements: []
416
- rubyforge_project:
417
- rubygems_version: 2.0.14.1
449
+ rubygems_version: 3.0.3
418
450
  signing_key:
419
451
  specification_version: 4
420
452
  summary: Pure ruby library for read/write, chunk-level access to PNG files
@@ -682,6 +714,7 @@ test_files:
682
714
  - spec/resources/damaged_chunk.png
683
715
  - spec/resources/damaged_signature.png
684
716
  - spec/resources/empty.png
717
+ - spec/resources/itxt_chunk.png
685
718
  - spec/resources/lines.png
686
719
  - spec/resources/operations.png
687
720
  - spec/resources/operations_border.png
@@ -1,16 +0,0 @@
1
- language: ruby
2
- script: bundle exec rake
3
- sudo: false
4
-
5
- rvm:
6
- - "2.0"
7
- - "2.1"
8
- - "2.2"
9
- - ruby-head
10
- - rbx-19mode
11
- - jruby-19mode
12
-
13
- matrix:
14
- allow_failures:
15
- - rvm: rbx-19mode
16
- - rvm: ruby-head
@@ -1,15 +0,0 @@
1
- # Define the byte-operators on a string if they're not defined (Ruby 1.8)
2
-
3
- class String
4
- alias_method :getbyte, :[] unless method_defined?(:getbyte)
5
- alias_method :setbyte, :[]= unless method_defined?(:setbyte)
6
- alias_method :bytesize, :size unless method_defined?(:bytesize)
7
- end
8
-
9
- module Enumerable
10
- unless method_defined?(:minmax)
11
- def minmax
12
- [min, max]
13
- end
14
- end
15
- end