To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / vendor / gems / coderay-0.9.7 / lib / coderay / helpers / gzip_simple.rb @ 442:753f1380d6bc

History | View | Annotate | Download (2.64 KB)

1
# =GZip Simple
2
#
3
# A simplified interface to the gzip library +zlib+ (from the Ruby Standard Library.)
4
#
5
# Author: murphy (mail to murphy rubychan de)
6
#
7
# Version: 0.2 (2005.may.28)
8
#
9
# ==Documentation
10
#
11
# See +GZip+ module and the +String+ extensions.
12
#
13
module GZip
14

    
15
  require 'zlib'
16

    
17
  # The default zipping level. 7 zips good and fast.
18
  DEFAULT_GZIP_LEVEL = 7
19

    
20
  # Unzips the given string +s+.
21
  #
22
  # Example:
23
  #   require 'gzip_simple'
24
  #   print GZip.gunzip(File.read('adresses.gz'))
25
  def GZip.gunzip s
26
    Zlib::Inflate.inflate s
27
  end
28

    
29
  # Zips the given string +s+.
30
  #
31
  # Example:
32
  #   require 'gzip_simple'
33
  #   File.open('adresses.gz', 'w') do |file
34
  #     file.write GZip.gzip('Mum: 0123 456 789', 9)
35
  #   end
36
  #
37
  # If you provide a +level+, you can control how strong
38
  # the string is compressed:
39
  # - 0: no compression, only convert to gzip format
40
  # - 1: compress fast
41
  # - 7: compress more, but still fast (default)
42
  # - 8: compress more, slower
43
  # - 9: compress best, very slow
44
  def GZip.gzip s, level = DEFAULT_GZIP_LEVEL
45
    Zlib::Deflate.new(level).deflate s, Zlib::FINISH
46
  end
47
end
48

    
49

    
50
# String extensions to use the GZip module.
51
#
52
# The methods gzip and gunzip provide an even more simple
53
# interface to the ZLib:
54
#
55
#   # create a big string
56
#   x = 'a' * 1000
57
#   
58
#   # zip it
59
#   x_gz = x.gzip
60
#   
61
#   # test the result
62
#   puts 'Zipped %d bytes to %d bytes.' % [x.size, x_gz.size]
63
#   #-> Zipped 1000 bytes to 19 bytes.
64
#   
65
#   # unzipping works
66
#   p x_gz.gunzip == x  #-> true
67
class String
68
  # Returns the string, unzipped.
69
  # See GZip.gunzip
70
  def gunzip
71
    GZip.gunzip self
72
  end
73
  # Replaces the string with its unzipped value.
74
  # See GZip.gunzip
75
  def gunzip!
76
    replace gunzip
77
  end
78

    
79
  # Returns the string, zipped.
80
  # +level+ is the gzip compression level, see GZip.gzip.
81
  def gzip level = GZip::DEFAULT_GZIP_LEVEL
82
    GZip.gzip self, level
83
  end
84
  # Replaces the string with its zipped value.
85
  # See GZip.gzip.
86
  def gzip!(*args)
87
    replace gzip(*args)
88
  end
89
end
90

    
91
if $0 == __FILE__
92
  eval DATA.read, nil, $0, __LINE__+4
93
end
94

    
95
__END__
96
#CODE
97

    
98
# Testing / Benchmark
99
x = 'a' * 1000
100
x_gz = x.gzip
101
puts 'Zipped %d bytes to %d bytes.' % [x.size, x_gz.size]  #-> Zipped 1000 bytes to 19 bytes.
102
p x_gz.gunzip == x  #-> true
103

    
104
require 'benchmark'
105

    
106
INFO = 'packed to %0.3f%%'  # :nodoc:
107

    
108
x = Array.new(100000) { rand(255).chr + 'aaaaaaaaa' + rand(255).chr }.join
109
Benchmark.bm(10) do |bm|
110
  for level in 0..9
111
    bm.report "zip #{level}" do
112
      $x = x.gzip level
113
    end
114
    puts INFO % [100.0 * $x.size / x.size]
115
  end
116
  bm.report 'zip' do
117
    $x = x.gzip
118
  end
119
  puts INFO % [100.0 * $x.size / x.size]
120
  bm.report 'unzip' do
121
    $x.gunzip
122
  end
123
end