peterc-rsmaz 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,3 @@
1
+ == 0.0.1 2009-04-02
2
+
3
+ * Initial release
data/Manifest.txt ADDED
@@ -0,0 +1,13 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ lib/rsmaz.rb
7
+ script/console
8
+ script/destroy
9
+ script/generate
10
+ spec/rsmaz_spec.rb
11
+ spec/spec.opts
12
+ spec/spec_helper.rb
13
+ tasks/rspec.rake
data/PostInstall.txt ADDED
@@ -0,0 +1,6 @@
1
+ Code example:
2
+
3
+ require 'rsmaz'
4
+ RSmaz.decompress(RSmaz.compress("this is a test"))
5
+
6
+ For more information on smaz in general, see http://github.com/antirez/smaz/tree/master
data/README.rdoc ADDED
@@ -0,0 +1,69 @@
1
+ = rsmaz
2
+
3
+ * http://github.com/peterc/rsmaz/tree/master
4
+ * http://github.com/antirez/smaz/tree/master (original C version)
5
+
6
+ == DESCRIPTION:
7
+
8
+ Short String Compression for Ruby.
9
+
10
+ RSmaz is a pure-Ruby port of the Smaz short string compression
11
+ algorithm by Salvatore Sanfilippo and released as a C library at:
12
+ http://github.com/antirez/smaz/tree/master
13
+
14
+ I've done some initial cleanup of a pure Ruby->C port, but this
15
+ is not yet complete. It does pass the specs, however!
16
+
17
+ == REQUIREMENTS:
18
+
19
+ * RSpec (if you want to run the specs)
20
+ * Some strings to compress
21
+ * A sense of humor
22
+
23
+ == INSTALL:
24
+
25
+ * require 'rsmaz'
26
+ r = RSmaz.compress("whatever")
27
+ puts RSmaz.decompress(r)
28
+
29
+ == LICENSE:
30
+
31
+ Copyright (c) 2009 Peter Cooper, Salvatore Sanfilippo
32
+
33
+ Permission is hereby granted, free of charge, to any person obtaining
34
+ a copy of this software and associated documentation files (the
35
+ 'Software'), to deal in the Software without restriction, including
36
+ without limitation the rights to use, copy, modify, merge, publish,
37
+ distribute, sublicense, and/or sell copies of the Software, and to
38
+ permit persons to whom the Software is furnished to do so, subject to
39
+ the following conditions:
40
+
41
+ The above copyright notice and this permission notice shall be
42
+ included in all copies or substantial portions of the Software.
43
+
44
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
45
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
46
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
47
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
48
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
49
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
50
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
51
+
52
+ == SMAZ LICENSE:
53
+
54
+ Copyright (c) 2006-2009, Salvatore Sanfilippo
55
+ All rights reserved.
56
+
57
+ Redistribution and use in source and binary forms, with or without
58
+ modification, are permitted provided that the following conditions are met:
59
+
60
+ * Redistributions of source code must retain the above copyright
61
+ notice, this list of conditions and the following disclaimer.
62
+ * Redistributions in binary form must reproduce the above copyright
63
+ notice, this list of conditions and the following disclaimer in the
64
+ documentation and/or other materials provided with the distribution.
65
+ * Neither the name of Smaz nor the names of its contributors may be
66
+ used to endorse or promote products derived from this software without
67
+ specific prior written permission.
68
+
69
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
2
+ require File.dirname(__FILE__) + '/lib/rsmaz'
3
+
4
+ # Generate all the Rake tasks
5
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
+ $hoe = Hoe.new('rsmaz', RSmaz::VERSION) do |p|
7
+ p.developer('Peter Cooper', 'pcooper@petercooper.co.uk')
8
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
+ p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
10
+ p.rubyforge_name = p.name # TODO this is default value
11
+ # p.extra_deps = [
12
+ # ['activesupport','>= 2.0.2'],
13
+ # ]
14
+ p.extra_dev_deps = [
15
+ ['newgem', ">= #{::Newgem::VERSION}"]
16
+ ]
17
+
18
+ p.clean_globs |= %w[**/.DS_Store tmp *.log]
19
+ path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
20
+ p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
21
+ p.rsync_args = '-av --delete --ignore-errors'
22
+ end
23
+
24
+ require 'newgem/tasks' # load /tasks/*.rake
25
+ Dir['tasks/**/*.rake'].each { |t| load t }
26
+
27
+ # TODO - want other tests/tasks run by default? Add them to the list
28
+ # task :default => [:spec, :features]
data/lib/rsmaz.rb ADDED
@@ -0,0 +1,164 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'strscan'
5
+
6
+ # RSmaz is too small to bother splitting into separate files, so I'll be lazy..
7
+
8
+ module RSmaz
9
+ VERSION = '0.0.1'
10
+
11
+ # From http://github.com/antirez/smaz/blob/4b913924e15b7663ee0240af19cedfd266052aab/smaz.c
12
+ CODEBOOK = ["\002s,\266", "\003had\232\002leW", "\003on \216", "", "\001yS",
13
+ "\002ma\255\002li\227", "\003or \260", "", "\002ll\230\003s t\277",
14
+ "\004fromg\002mel", "", "\003its\332", "\001z\333", "\003ingF", "\001>\336",
15
+ "\001 \000\003 (\002nc\344", "\002nd=\003 on\312",
16
+ "\002ne\213\003hat\276\003re q", "", "\002ngT\003herz\004have\306\003s o\225",
17
+ "", "\003ionk\003s a\254\002ly\352", "\003hisL\003 inN\003 be\252", "",
18
+ "\003 fo\325\003 of \003 ha\311", "", "\002of\005",
19
+ "\003 co\241\002no\267\003 ma\370", "", "", "\003 cl\356\003enta\003 an7",
20
+ "\002ns\300\001\"e", "\003n t\217\002ntP\003s, \205",
21
+ "\002pe\320\003 we\351\002om\223", "\002on\037", "", "\002y G", "\003 wa\271",
22
+ "\003 re\321\002or*", "", "\002=\"\251\002ot\337", "\003forD\002ou[",
23
+ "\003 toR", "\003 th\r", "\003 it\366",
24
+ "\003but\261\002ra\202\003 wi\363\002</\361", "\003 wh\237", "\002 4",
25
+ "\003nd ?", "\002re!", "", "\003ng c", "",
26
+ "\003ly \307\003ass\323\001a\004\002rir", "", "", "", "\002se_", "\003of \"",
27
+ "\003div\364\002ros\003ere\240", "", "\002ta\310\001bZ\002si\324", "",
28
+ "\003and\a\002rs\335", "\002rt\362", "\002teE", "\003ati\316", "\002so\263",
29
+ "\002th\021", "\002tiJ\001c\034\003allp", "\003ate\345", "\002ss\246",
30
+ "\002stM", "", "\002><\346", "\002to\024", "\003arew", "\001d\030",
31
+ "\002tr\303", "", "\001\n1\003 a \222", "\003f tv\002veo", "\002un\340", "",
32
+ "\003e o\242", "\002a \243\002wa\326\001e\002", "\002ur\226\003e a\274",
33
+ "\002us\244\003\n\r\n\247", "\002ut\304\003e c\373", "\002we\221", "", "",
34
+ "\002wh\302", "\001f,", "", "", "", "\003d t\206", "", "", "\003th \343",
35
+ "\001g;", "", "", "\001\r9\003e s\265", "\003e t\234", "", "\003to Y",
36
+ "\003e\r\n\236", "\002d \036\001h\022", "", "\001,Q", "\002 a\031", "\002 b^",
37
+ "\002\r\n\025\002 cI", "\002 d\245", "\002 e\253", "\002 fh\001i\b\002e \v",
38
+ "", "\002 hU\001-\314", "\002 i8", "", "", "\002 l\315", "\002 m{",
39
+ "\002f :\002 n\354", "\002 o\035", "\002 p}\001.n\003\r\n\r\250", "",
40
+ "\002 r\275", "\002 s>", "\002 t\016", "", "\002g \235\005which+\003whi\367",
41
+ "\002 w5", "\001/\305", "\003as \214", "\003at \207", "", "\003who\331", "",
42
+ "\001l\026\002h \212", "", "\002, $", "", "\004withV", "", "", "", "\001m-", "",
43
+ "", "\002ac\357", "\002ad\350", "\003TheH", "", "", "\004this\233\001n\t",
44
+ "", "\002. y", "", "\002alX\003e, \365", "\003tio\215\002be\\",
45
+ "\002an\032\003ver\347", "", "\004that0\003tha\313\001o\006", "\003was2",
46
+ "\002arO", "\002as.", "\002at'\003the\001\004they\200\005there\322\005theird",
47
+ "\002ce\210", "\004were]", "", "\002ch\231\002l \264\001p<", "", "",
48
+ "\003one\256", "", "\003he \023\002dej", "\003ter\270", "\002cou", "",
49
+ "\002by\177\002di\201\002eax", "", "\002ec\327", "\002edB", "\002ee\353", "",
50
+ "", "\001r\f\002n )", "", "", "", "\002el\262", "", "\003in i\002en3", "",
51
+ "\002o `\001s\n", "", "\002er\033", "\003is t\002es6", "", "\002ge\371",
52
+ "\004.com\375", "\002fo\334\003our\330", "\003ch \301\001t\003", "\002hab", "",
53
+ "\003men\374", "", "\002he\020", "", "", "\001u&", "\002hif", "",
54
+ "\003not\204\002ic\203", "\003ed @\002id\355", "", "", "\002ho\273",
55
+ "\002r K\001vm", "", "", "", "\003t t\257\002il\360", "\002im\342",
56
+ "\003en \317\002in\017", "\002io\220", "\002s \027\001wA", "", "\003er |",
57
+ "\003es ~\002is%", "\002it/", "", "\002iv\272", "",
58
+ "\002t #\ahttp://C\001x\372", "\002la\211", "\001<\341", "\003, a\224"]
59
+
60
+ # From http://github.com/antirez/smaz/blob/4b913924e15b7663ee0240af19cedfd266052aab/smaz.c
61
+ REVERSE_CODEBOOK = [" ", "the", "e", "t", "a", "of", "o", "and", "i", "n", "s", "e ", "r", " th",
62
+ " t", "in", "he", "th", "h", "he ", "to", "\r\n", "l", "s ", "d", " a", "an",
63
+ "er", "c", " o", "d ", "on", " of", "re", "of ", "t ", ", ", "is", "u", "at",
64
+ " ", "n ", "or", "which", "f", "m", "as", "it", "that", "\n", "was", "en",
65
+ " ", " w", "es", " an", " i", "\r", "f ", "g", "p", "nd", " s", "nd ", "ed ",
66
+ "w", "ed", "http://", "for", "te", "ing", "y ", "The", " c", "ti", "r ", "his",
67
+ "st", " in", "ar", "nt", ",", " to", "y", "ng", " h", "with", "le", "al", "to ",
68
+ "b", "ou", "be", "were", " b", "se", "o ", "ent", "ha", "ng ", "their", "\"",
69
+ "hi", "from", " f", "in ", "de", "ion", "me", "v", ".", "ve", "all", "re ",
70
+ "ri", "ro", "is ", "co", "f t", "are", "ea", ". ", "her", " m", "er ", " p",
71
+ "es ", "by", "they", "di", "ra", "ic", "not", "s, ", "d t", "at ", "ce", "la",
72
+ "h ", "ne", "as ", "tio", "on ", "n t", "io", "we", " a ", "om", ", a", "s o",
73
+ "ur", "li", "ll", "ch", "had", "this", "e t", "g ", "e\r\n", " wh", "ere",
74
+ " co", "e o", "a ", "us", " d", "ss", "\n\r\n", "\r\n\r", "=\"", " be", " e",
75
+ "s a", "ma", "one", "t t", "or ", "but", "el", "so", "l ", "e s", "s,", "no",
76
+ "ter", " wa", "iv", "ho", "e a", " r", "hat", "s t", "ns", "ch ", "wh", "tr",
77
+ "ut", "/", "have", "ly ", "ta", " ha", " on", "tha", "-", " l", "ati", "en ",
78
+ "pe", " re", "there", "ass", "si", " fo", "wa", "ec", "our", "who", "its", "z",
79
+ "fo", "rs", ">", "ot", "un", "<", "im", "th ", "nc", "ate", "><", "ver", "ad",
80
+ " we", "ly", "ee", " n", "id", " cl", "ac", "il", "</", "rt", " wi", "div",
81
+ "e, ", " it", "whi", " ma", "ge", "x", "e c", "men", ".com"]
82
+
83
+ # Compress a string to Smaz encoding
84
+ def self.compress(input)
85
+ h1, h2, h3 = 0
86
+ verb = ""
87
+ out = ""
88
+
89
+ # This algorithm has been ported to Ruby from C and only
90
+ # slightly Rubyized.. still a lonnnng way to go. Wanna give it a crack?
91
+ while (input && input.length > 0)
92
+ h1 = h2 = input[0] << 3
93
+ h2 += input[1] if (input.length > 1)
94
+ h3 = h2 ^ input[2] if (input.length > 2)
95
+ q = []
96
+
97
+ [input.length, 7].min.downto(1) do |j2|
98
+ slot = if j2 == 1
99
+ CODEBOOK[h1 % 241]
100
+ elsif j2 == 2
101
+ CODEBOOK[h2 % 241]
102
+ else
103
+ CODEBOOK[h3 % 241]
104
+ end
105
+
106
+ while (slot && slot[0]) do
107
+ if (slot[0] == j2 && (slot[1,j2] == input[0,j2]))
108
+ # Match found in hash table
109
+ q << verb
110
+ verb = ""
111
+ q << slot[slot[0]+1]
112
+ input = input[j2..-1]
113
+ else
114
+ slot = slot[2..-1]
115
+ end
116
+ end
117
+ end
118
+
119
+ # No queue? It means we matched nothing, so add the current byte to the verbatim buffer
120
+ if q.empty?
121
+ verb << input[0] #if input[0]
122
+ input = input[1..-1]
123
+ end
124
+
125
+ # If the verbatim buffer is getting too long or we're at the end of the doc
126
+ # throw the verbatim buffer to the output queue
127
+ q << verb if verb.length == 256 || (verb.length > 0 && input.length == 0)
128
+
129
+ out << q.collect do |item|
130
+ if item.class == String && item.length == 1
131
+ "\376" + item
132
+ elsif item.class == String && item.length > 1
133
+ "\377" + (item.length - 1).chr + item
134
+ elsif item.class == Fixnum
135
+ item.chr
136
+ end
137
+ end.join
138
+
139
+ end
140
+
141
+ out
142
+ end
143
+
144
+ # Decompress a Smaz encoded string back to normal plain text
145
+ def self.decompress(input)
146
+ out = ""
147
+ s = StringScanner.new(input)
148
+ until s.eos?
149
+ bv = s.get_byte[0]
150
+ if (bv == 254)
151
+ out << s.get_byte
152
+ elsif (bv == 255)
153
+ len = s.get_byte[0] + 1
154
+ len.times do
155
+ out << s.get_byte
156
+ end
157
+ else
158
+ out << REVERSE_CODEBOOK[bv]
159
+ end
160
+ end
161
+
162
+ out
163
+ end
164
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/rsmaz.rb'}"
9
+ puts "Loading rsmaz gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe RSmaz do
4
+
5
+ it "should compress 'the' to one byte" do
6
+ RSmaz.compress("the").length.should == 1
7
+ end
8
+
9
+ it "should compress 'thex' to three bytes" do
10
+ RSmaz.compress("thex").length.should == 3
11
+ end
12
+
13
+ it "should compress and decompress strings to the same thing" do
14
+ [
15
+ "This is a test.",
16
+ "This is a test",
17
+ "this is a test",
18
+ "Let's try a SlIgHtLy Funkie938R str1ng!?!?x",
19
+ "What about a long one?" * 100
20
+ ].each { |str| RSmaz.decompress(RSmaz.compress(str)).should == str }
21
+ end
22
+
23
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,10 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
10
+ require 'rsmaz'
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: peterc-rsmaz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Peter Cooper
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-02 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: newgem
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.3.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: hoe
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.0
34
+ version:
35
+ description: "Short String Compression for Ruby. RSmaz is a pure-Ruby port of the Smaz short string compression algorithm by Salvatore Sanfilippo and released as a C library at: http://github.com/antirez/smaz/tree/master I've done some initial cleanup of a pure Ruby->C port, but this is not yet complete. It does pass the specs, however!"
36
+ email:
37
+ - pcooper@petercooper.co.uk
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - History.txt
44
+ - Manifest.txt
45
+ - PostInstall.txt
46
+ - README.rdoc
47
+ files:
48
+ - History.txt
49
+ - Manifest.txt
50
+ - PostInstall.txt
51
+ - README.rdoc
52
+ - Rakefile
53
+ - lib/rsmaz.rb
54
+ - script/console
55
+ - script/destroy
56
+ - script/generate
57
+ - spec/rsmaz_spec.rb
58
+ - spec/spec.opts
59
+ - spec/spec_helper.rb
60
+ - tasks/rspec.rake
61
+ has_rdoc: true
62
+ homepage: http://github.com/peterc/rsmaz/tree/master
63
+ post_install_message: PostInstall.txt
64
+ rdoc_options:
65
+ - --main
66
+ - README.rdoc
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ requirements: []
82
+
83
+ rubyforge_project: rsmaz
84
+ rubygems_version: 1.2.0
85
+ signing_key:
86
+ specification_version: 2
87
+ summary: Short String Compression for Ruby
88
+ test_files: []
89
+