rsmaz 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/{History.txt → HISTORY} +6 -0
- data/README.rdoc +24 -12
- data/Rakefile +6 -25
- data/lib/rsmaz.rb +28 -4
- data/{spec/spec_helper.rb → test/test_helper.rb} +6 -4
- data/test/test_rsmaz.rb +71 -0
- metadata +25 -43
- data/Manifest.txt +0 -13
- data/PostInstall.txt +0 -6
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/spec/rsmaz_spec.rb +0 -56
- data/spec/spec.opts +0 -1
- data/tasks/rspec.rake +0 -21
data/{History.txt → HISTORY}
RENAMED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.0.4 2011-03-26
|
2
|
+
|
3
|
+
* Text forced to binary for a consistent Ruby 1.9 experience (Hongli Lai)
|
4
|
+
* Dependency on hoe removed (Peter Cooper)
|
5
|
+
* Switched from RSpec to MiniTest
|
6
|
+
|
1
7
|
== 0.0.3 2009-04-02
|
2
8
|
|
3
9
|
* Now produces same output as reference smaz implementation
|
data/README.rdoc
CHANGED
@@ -5,21 +5,23 @@
|
|
5
5
|
|
6
6
|
== DESCRIPTION:
|
7
7
|
|
8
|
-
|
8
|
+
Short String Compression for Ruby.
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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! Feel free
|
16
|
+
to clean it up as it's a bit memory inefficient right now... :)
|
17
17
|
|
18
18
|
== REQUIREMENTS:
|
19
19
|
|
20
|
-
*
|
21
|
-
|
22
|
-
|
20
|
+
* MiniTest (in the Ruby 1.9 stdlib or `gem install minitest` on Ruby 1.8)
|
21
|
+
|
22
|
+
== INSTALLATION:
|
23
|
+
|
24
|
+
gem install rsmaz
|
23
25
|
|
24
26
|
== USAGE:
|
25
27
|
|
@@ -27,9 +29,19 @@
|
|
27
29
|
r = RSmaz.compress("whatever")
|
28
30
|
puts RSmaz.decompress(r)
|
29
31
|
|
32
|
+
=== Ruby 1.9 and encodings
|
33
|
+
|
34
|
+
RSmaz.compress always returns a string with the binary encoding. The
|
35
|
+
input can be any encoding, it will internally force it to binary
|
36
|
+
and compress byte-by-byte.
|
37
|
+
|
38
|
+
RSmaz.decompress also always returns a string with the binary encoding.
|
39
|
+
You must manually force the encoding back to the right one because
|
40
|
+
RSmaz does not store information about the original encoding.
|
41
|
+
|
30
42
|
== RSMAZ LICENSE:
|
31
43
|
|
32
|
-
Copyright (c) 2009 Peter Cooper, Salvatore Sanfilippo
|
44
|
+
Copyright (c) 2009-2011 Peter Cooper, Salvatore Sanfilippo, Hongli Lai
|
33
45
|
|
34
46
|
Permission is hereby granted, free of charge, to any person obtaining
|
35
47
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -1,28 +1,9 @@
|
|
1
|
-
%w[rubygems rake rake/
|
2
|
-
require File.dirname(__FILE__) + '/lib/rsmaz'
|
1
|
+
%w[rubygems rake rake/testtask].each { |f| require f }
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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'
|
3
|
+
Rake::TestTask.new(:test) do |test|
|
4
|
+
test.libs << 'lib' << 'test'
|
5
|
+
test.pattern = 'test/**/test_*.rb'
|
6
|
+
test.verbose = true
|
22
7
|
end
|
23
8
|
|
24
|
-
|
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]
|
9
|
+
task :default => :test
|
data/lib/rsmaz.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: binary
|
1
2
|
$:.unshift(File.dirname(__FILE__)) unless
|
2
3
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
4
|
|
@@ -86,11 +87,12 @@ module RSmaz
|
|
86
87
|
" we", "ly", "ee", " n", "id", " cl", "ac", "il", "</", "rt", " wi", "div",
|
87
88
|
"e, ", " it", "whi", " ma", "ge", "x", "e c", "men", ".com"]
|
88
89
|
|
89
|
-
# Compress a string to Smaz encoding
|
90
|
+
# Compress a string to Smaz encoding. On Ruby 1.9, the returned string
|
91
|
+
# has the binary encoding.
|
90
92
|
def self.compress(input)
|
91
93
|
verb = ""
|
92
94
|
out = ""
|
93
|
-
input = input.dup
|
95
|
+
input = force_binary(input.dup)
|
94
96
|
|
95
97
|
# This algorithm has been ported to Ruby from C and only
|
96
98
|
# slightly Rubyized.. still a lonnnng way to go. Wanna give it a crack?
|
@@ -159,10 +161,13 @@ module RSmaz
|
|
159
161
|
out
|
160
162
|
end
|
161
163
|
|
162
|
-
# Decompress a Smaz encoded string back to normal plain text
|
164
|
+
# Decompress a Smaz encoded string back to normal plain text.
|
165
|
+
# On Ruby 1.9, the returned string has the binary encoding. You
|
166
|
+
# must manually force the encoding back to the right one because
|
167
|
+
# RSmaz does not store information about the original encoding.
|
163
168
|
def self.decompress(input)
|
164
169
|
out = ""
|
165
|
-
s = StringScanner.new(input)
|
170
|
+
s = StringScanner.new(dup_and_force_binary(input))
|
166
171
|
until s.eos?
|
167
172
|
bv = s.get_byte.ord
|
168
173
|
if (bv == 254)
|
@@ -179,4 +184,23 @@ module RSmaz
|
|
179
184
|
|
180
185
|
out
|
181
186
|
end
|
187
|
+
|
188
|
+
private
|
189
|
+
if ''.respond_to?(:encoding)
|
190
|
+
def self.force_binary(str)
|
191
|
+
str.force_encoding('binary')
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.dup_and_force_binary(str)
|
195
|
+
str.dup.force_encoding('binary')
|
196
|
+
end
|
197
|
+
else
|
198
|
+
def self.force_binary(str)
|
199
|
+
str
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.dup_and_force_binary(str)
|
203
|
+
str
|
204
|
+
end
|
205
|
+
end
|
182
206
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
begin
|
2
|
-
require 'spec'
|
2
|
+
require 'minitest/spec'
|
3
3
|
rescue LoadError
|
4
4
|
require 'rubygems'
|
5
|
-
gem '
|
6
|
-
require 'spec'
|
5
|
+
gem 'minitest'
|
6
|
+
require 'minitest/spec'
|
7
7
|
end
|
8
8
|
|
9
9
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
@@ -11,4 +11,6 @@ require 'rsmaz'
|
|
11
11
|
|
12
12
|
def memory_usage
|
13
13
|
`ps -Orss #{Process.pid} | tail -1`.scan(/\d+/)[1].to_i rescue 0
|
14
|
-
end
|
14
|
+
end
|
15
|
+
|
16
|
+
MiniTest::Unit.autorun
|
data/test/test_rsmaz.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper.rb')
|
2
|
+
|
3
|
+
describe RSmaz do
|
4
|
+
|
5
|
+
#before(:each) do
|
6
|
+
# # Do some memory leak checking
|
7
|
+
# puts "\nMemory used: #{memory_usage}K"
|
8
|
+
#end
|
9
|
+
#
|
10
|
+
#after(:each) do
|
11
|
+
# puts "\nMemory used: #{memory_usage}K"
|
12
|
+
#end
|
13
|
+
|
14
|
+
it "should compress 'the' to one byte" do
|
15
|
+
RSmaz.compress("the").length.must_equal 1
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should compress 'thex' to two bytes" do
|
19
|
+
RSmaz.compress("thex").length.must_equal 2
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should compress and decompress strings back to the same string" do
|
23
|
+
[
|
24
|
+
"This is a test.",
|
25
|
+
"This is a test",
|
26
|
+
"this is a test",
|
27
|
+
"Let's try a SlIgHtLy Funkie938R str1ng!?!?x",
|
28
|
+
"What about a long one?" * 100
|
29
|
+
].each { |str| RSmaz.decompress(RSmaz.compress(str)).must_equal str }
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should properly decode a reference compression (so the internal coding doesn't change)" do
|
33
|
+
RSmaz.decompress("\020\230`A\376o\f\026\030").must_equal "hello world"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should compress to the same extent as the reference smaz implementation" do
|
37
|
+
RSmaz.compress("foobar").length.must_equal 4
|
38
|
+
RSmaz.compress("Nel mezzo del cammin di nostra vita, mi ritrovai in una selva oscura").length.must_equal 46
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should compress and decompress lots of random strings without issues" do
|
42
|
+
100.times do
|
43
|
+
str = (1..100).map { |a| (rand(26)+97).chr }.join
|
44
|
+
RSmaz.decompress(RSmaz.compress(str)).length.must_equal str.length
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should compress and decompress lots of random strings without issues (again)" do
|
49
|
+
100.times do
|
50
|
+
str = (1..100).map { |a| (rand(26)+97).chr }.join
|
51
|
+
RSmaz.decompress(RSmaz.compress(str)).length.must_equal str.length
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if ''.respond_to?(:encoding)
|
56
|
+
# U+2603 = Unicode snowman
|
57
|
+
|
58
|
+
it "should be able to compress strings with arbitrary encodings" do
|
59
|
+
RSmaz.decompress(RSmaz.compress("\u2603")).force_encoding('utf-8').must_equal "\u2603"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return binary strings upon compressing" do
|
63
|
+
RSmaz.compress("\u2603").encoding.must_equal Encoding.find('binary')
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should return binary strings upon decompressing" do
|
67
|
+
RSmaz.decompress(RSmaz.compress("\u2603")).encoding.must_equal Encoding.find('binary')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsmaz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.4
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Peter Cooper
|
@@ -9,83 +10,64 @@ autorequire:
|
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date:
|
13
|
+
date: 2011-03-26 00:00:00 +00:00
|
13
14
|
default_executable:
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
name: minitest
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
20
21
|
requirements:
|
21
22
|
- - ">="
|
22
23
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
-
version:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: hoe
|
24
|
+
version: "0"
|
27
25
|
type: :development
|
28
|
-
|
29
|
-
|
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! Feel free to clean it up as it's a bit memory inefficient right now... :)"
|
26
|
+
version_requirements: *id001
|
27
|
+
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! Feel free to clean it up as it's a bit memory inefficient right now... :)"
|
36
28
|
email:
|
37
|
-
-
|
29
|
+
- git@peterc.org
|
38
30
|
executables: []
|
39
31
|
|
40
32
|
extensions: []
|
41
33
|
|
42
34
|
extra_rdoc_files:
|
43
|
-
-
|
44
|
-
- Manifest.txt
|
45
|
-
- PostInstall.txt
|
35
|
+
- HISTORY
|
46
36
|
- README.rdoc
|
47
37
|
files:
|
48
|
-
-
|
49
|
-
- Manifest.txt
|
50
|
-
- PostInstall.txt
|
51
|
-
- README.rdoc
|
38
|
+
- HISTORY
|
52
39
|
- Rakefile
|
40
|
+
- README.rdoc
|
41
|
+
- test/test_helper.rb
|
42
|
+
- test/test_rsmaz.rb
|
53
43
|
- 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
44
|
has_rdoc: true
|
62
|
-
homepage: http://github.com/peterc/rsmaz
|
45
|
+
homepage: http://github.com/peterc/rsmaz
|
63
46
|
licenses: []
|
64
47
|
|
65
|
-
post_install_message:
|
66
|
-
rdoc_options:
|
67
|
-
|
68
|
-
- README.rdoc
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
|
69
51
|
require_paths:
|
70
52
|
- lib
|
71
53
|
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
72
55
|
requirements:
|
73
56
|
- - ">="
|
74
57
|
- !ruby/object:Gem::Version
|
75
58
|
version: "0"
|
76
|
-
version:
|
77
59
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
78
61
|
requirements:
|
79
62
|
- - ">="
|
80
63
|
- !ruby/object:Gem::Version
|
81
64
|
version: "0"
|
82
|
-
version:
|
83
65
|
requirements: []
|
84
66
|
|
85
|
-
rubyforge_project:
|
86
|
-
rubygems_version: 1.
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.6.2
|
87
69
|
signing_key:
|
88
|
-
specification_version:
|
70
|
+
specification_version: 3
|
89
71
|
summary: Short String Compression for Ruby
|
90
72
|
test_files: []
|
91
73
|
|
data/Manifest.txt
DELETED
data/PostInstall.txt
DELETED
data/script/console
DELETED
@@ -1,10 +0,0 @@
|
|
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
DELETED
@@ -1,14 +0,0 @@
|
|
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
DELETED
@@ -1,14 +0,0 @@
|
|
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)
|
data/spec/rsmaz_spec.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
-
|
3
|
-
describe RSmaz do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
# Do some memory leak checking
|
7
|
-
puts "\nMemory used: #{memory_usage}K"
|
8
|
-
end
|
9
|
-
|
10
|
-
after(:each) do
|
11
|
-
puts "\nMemory used: #{memory_usage}K"
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should compress 'the' to one byte" do
|
15
|
-
RSmaz.compress("the").length.should == 1
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should compress 'thex' to two bytes" do
|
19
|
-
RSmaz.compress("thex").length.should == 2
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should compress and decompress strings back to the same string" do
|
23
|
-
[
|
24
|
-
"This is a test.",
|
25
|
-
"This is a test",
|
26
|
-
"this is a test",
|
27
|
-
"Let's try a SlIgHtLy Funkie938R str1ng!?!?x",
|
28
|
-
"What about a long one?" * 100
|
29
|
-
].each { |str| RSmaz.decompress(RSmaz.compress(str)).should == str }
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should properly decode a reference compression (so the internal coding doesn't change)" do
|
33
|
-
RSmaz.decompress("\020\230`A\376o\f\026\030").should == "hello world"
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should compress to the same extent as the reference smaz implementation" do
|
37
|
-
RSmaz.compress("foobar").length.should == 4
|
38
|
-
RSmaz.compress("Nel mezzo del cammin di nostra vita, mi ritrovai in una selva oscura").length.should == 46
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should compress and decompress lots of random strings without issues" do
|
42
|
-
100.times do
|
43
|
-
str = (1..100).map { |a| (rand(26)+97).chr }.join
|
44
|
-
RSmaz.decompress(RSmaz.compress(str)).length.should == str.length
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should compress and decompress lots of random strings without issues (again)" do
|
49
|
-
100.times do
|
50
|
-
str = (1..100).map { |a| (rand(26)+97).chr }.join
|
51
|
-
RSmaz.decompress(RSmaz.compress(str)).length.should == str.length
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
end
|
data/spec/spec.opts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--colour
|
data/tasks/rspec.rake
DELETED
@@ -1,21 +0,0 @@
|
|
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
|