snappy 0.0.13 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +28 -1
  3. data/Gemfile +6 -1
  4. data/README.md +28 -4
  5. data/Rakefile +1 -0
  6. data/ext/extconf.rb +21 -24
  7. data/lib/snappy.rb +3 -1
  8. data/lib/snappy/hadoop.rb +22 -0
  9. data/lib/snappy/hadoop/reader.rb +58 -0
  10. data/lib/snappy/hadoop/writer.rb +51 -0
  11. data/lib/snappy/reader.rb +11 -7
  12. data/lib/snappy/shim.rb +30 -0
  13. data/lib/snappy/version.rb +3 -1
  14. data/lib/snappy/writer.rb +8 -9
  15. data/smoke.sh +8 -0
  16. data/snappy.gemspec +6 -30
  17. data/test/hadoop/test-snappy-hadoop-reader.rb +103 -0
  18. data/test/hadoop/test-snappy-hadoop-writer.rb +48 -0
  19. data/test/test-snappy-hadoop.rb +22 -0
  20. data/vendor/snappy/AUTHORS +1 -0
  21. data/vendor/snappy/CMakeLists.txt +174 -0
  22. data/vendor/snappy/CONTRIBUTING.md +26 -0
  23. data/vendor/snappy/COPYING +54 -0
  24. data/vendor/snappy/NEWS +180 -0
  25. data/vendor/snappy/README.md +149 -0
  26. data/vendor/snappy/cmake/SnappyConfig.cmake +1 -0
  27. data/vendor/snappy/cmake/config.h.in +62 -0
  28. data/vendor/snappy/format_description.txt +110 -0
  29. data/vendor/snappy/framing_format.txt +135 -0
  30. data/vendor/snappy/snappy-c.cc +90 -0
  31. data/vendor/snappy/snappy-c.h +138 -0
  32. data/vendor/snappy/snappy-internal.h +224 -0
  33. data/vendor/snappy/snappy-sinksource.cc +104 -0
  34. data/vendor/snappy/snappy-sinksource.h +182 -0
  35. data/vendor/snappy/snappy-stubs-internal.cc +42 -0
  36. data/vendor/snappy/snappy-stubs-internal.h +561 -0
  37. data/vendor/snappy/snappy-stubs-public.h.in +94 -0
  38. data/vendor/snappy/snappy-test.cc +612 -0
  39. data/vendor/snappy/snappy-test.h +573 -0
  40. data/vendor/snappy/snappy.cc +1515 -0
  41. data/vendor/snappy/snappy.h +203 -0
  42. data/vendor/snappy/snappy_unittest.cc +1410 -0
  43. metadata +38 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f767827959156bc4efe3531874c3cead0599d10a
4
- data.tar.gz: 5c08643b387f25d4b82479b359572eedd377db38
2
+ SHA256:
3
+ metadata.gz: 3b633f54dc239a8a5a4ef4df91fd0a23a100298ca83192d30096490f6174670b
4
+ data.tar.gz: 7caed929e615860f65dc0a25568cbe1c4f01ed377fbbc96de457acffb9dcc349
5
5
  SHA512:
6
- metadata.gz: 40e63dafa6fad90a620169ee3d494d9b9052d07a6f3b81bcd76368b3dba195f50b1b9ebf7e9831ca584e08804a0993d45b4e904f14c25c91c9c5c5772e086792
7
- data.tar.gz: 09e4d31244fc7d5e5182dc19373de522224f825b54f0c78b73d96dd426677a4714418bea063b57c1b8da2c5e63f06221cde9dea34459ecf884bd3c90a0672873
6
+ metadata.gz: 6c51f97d066a0bc256498157c9e9a2dab2da1191f310da24d0b54531de6ceb4db09471a4d8738180e20ca06f8e7147440ded43c6ad6baf1599f626c751a9086a
7
+ data.tar.gz: 8d8b5494df7e5858ebe77c2a86845257409cd71d793f8cd7c2123f9f784e75fb0d66294ce87ddd5fc5140b4702a135e8a644b5a07308414a9fc747fb6111658a
@@ -1,4 +1,31 @@
1
1
  language: ruby
2
+ sudo: false
3
+ cache:
4
+ bundler: true
5
+ directories:
6
+ - "$HOME/.ccache"
2
7
  rvm:
3
- - 2.2.2
8
+ - 1.9.3
9
+ - 2.2
10
+ - 2.3
11
+ - 2.4
12
+ - 2.5
4
13
  - jruby-19mode
14
+ env:
15
+ global:
16
+ - PATH="/usr/lib/ccache:$PATH"
17
+ before_install:
18
+ - travis_retry gem install bundler --no-document -v 1.16.1
19
+ addons:
20
+ apt:
21
+ packages:
22
+ - cmake
23
+ deploy:
24
+ provider: rubygems
25
+ api_key:
26
+ secure: Jwk5pSUD9dUb34fO4dLamqhQw9U/t/5pHX7l5LKE4e1MDlD9fq/KB/DFpRTSfA0s8XUu+NZYtRO+6GZBEBY5UjZyPcUk5izaQzMWANP6QEMI4mYheSFUXTGkimV8MFxo2Fp7itZBM9SsLccDp/59nmbhBUMdr4OECZtd1Igjz63AtRdD7JgZwhC2XqBVbcxyx78VcZH8r4JEZzpcnZjjGN9YwQFubhiPs0V2uTMp/kGSWeP4U3T71MrvRmDlu8QJTsTRsvhv+zDatFySzs2SGsn25+cUCOqWnb5vcwtCbfj7trY+DLO3FqZOvQlvDfvyOy9LlLRpovhu6w+L42Z2ZN5U1Ovz0bMjk5WGLlXRxCLTRqXihvJrtFuL/7B2YSXcWPBNt5HWFwtapEJDm+CJoKpqa/WB7gEgO+uAocHbRqbg64rnPLODOEH0xGeRNSXBA3P5JeVNYhvpFdX8LclRFaVpfYDDenzRV9zpIppMXSq3Suzw/nZPBL9cuuIsBYG6hnijhZertWIRjZqw8D/1wEBd6VT7cDQ+PsNBGKhvPBVd5Nb7Zh9YjwCv4BQHB6XekiKi7mGFN4X/6eTzudRYxG7KyrYqk9AQ6KmEv5U/Xv+Wcar86O49LtNqYykYKLknC9CiUwTDp4lkVD8D3LoIzkL2/AeZyI6NQso8tymB0CM=
27
+ gem: snappy
28
+ on:
29
+ tags: true
30
+ repo: miyucy/snappy
31
+ script: bundle exec rake && ./smoke.sh
data/Gemfile CHANGED
@@ -1,4 +1,9 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in snappy.gemspec
4
- gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'rake'
8
+ gem 'minitest'
9
+ end
data/README.md CHANGED
@@ -4,13 +4,27 @@ see https://github.com/google/snappy
4
4
 
5
5
  ## Preparation
6
6
 
7
- Use libsnappy
8
7
 
9
- $ brew install snappy
8
+ ### macOS
10
9
 
11
- Or
10
+ ```bash
11
+ $ brew install snappy
12
+ $ brew install autoconf automake libtool
13
+ ```
14
+
15
+ ### Ubuntu
16
+
17
+ ```bash
18
+ $ apt-get install libsnappy-dev -y
19
+ $ apt-get install libtool automake autoconf -y
20
+ ```
21
+
22
+ ### Alpine
12
23
 
13
- $ brew install autoconf automake libtool
24
+ ```bash
25
+ $ apk install snappy
26
+ $ apk install build-base libexecinfo automake autoconf libtool
27
+ ```
14
28
 
15
29
  ## Installation
16
30
 
@@ -28,6 +42,7 @@ Or install it yourself as:
28
42
 
29
43
  ## Usage
30
44
 
45
+ Snappy-java format
31
46
  ```ruby
32
47
  require 'snappy'
33
48
 
@@ -38,6 +53,15 @@ Snappy.inflate(source)
38
53
  # => Decompressed data
39
54
  ```
40
55
 
56
+ Hadoop-snappy format
57
+ ```ruby
58
+ Snappy::Hadoop.deflate(source)
59
+ # => Compressed data
60
+
61
+ Snappy::Hadoop.inflate(source)
62
+ # => Decompressed data
63
+ ```
64
+
41
65
  ## Contributing
42
66
 
43
67
  1. Fork it
data/Rakefile CHANGED
@@ -5,6 +5,7 @@ require "rbconfig"
5
5
  DLEXT = RbConfig::CONFIG['DLEXT']
6
6
 
7
7
  Rake::TestTask.new do |t|
8
+ t.pattern = 'test/**/test-*.rb'
8
9
  t.warning = true
9
10
  t.verbose = true
10
11
  end
@@ -1,37 +1,34 @@
1
1
  require 'mkmf'
2
2
  require 'fileutils'
3
3
 
4
- def patch_autogen
5
- # s/libtoolize/glibtoolize/
6
- File.write('autogen.sh', File.read('autogen.sh').gsub(/libtoolize/, 'glibtoolize'))
7
- end
8
-
9
- unless have_library 'snappy'
4
+ unless pkg_config('libsnappy') || have_library('snappy')
10
5
  # build vendor/snappy
11
6
  pwd = File.dirname File.expand_path __FILE__
12
7
  dir = File.join pwd, '..', 'vendor', 'snappy'
13
8
 
14
- Dir.chdir dir do
15
- unless system './autogen.sh'
16
- patch_autogen
17
- raise '`autogen.sh` failed' unless system './autogen.sh'
9
+ Dir.chdir(dir) do
10
+ FileUtils.mkdir_p 'build'
11
+ Dir.chdir(File.join(dir, 'build')) do
12
+ `cmake .. -DCMAKE_BUILD_TYPE=Release`
18
13
  end
19
- raise '`configure` failed' unless system './configure --disable-option-checking --disable-dependency-tracking --disable-gtest --without-gflags'
20
14
  end
21
15
 
22
- src = %w(
23
- config.h
24
- snappy-c.cc
25
- snappy-c.h
26
- snappy-internal.h
27
- snappy-sinksource.cc
28
- snappy-sinksource.h
29
- snappy-stubs-internal.cc
30
- snappy-stubs-internal.h
31
- snappy-stubs-public.h
32
- snappy.cc
33
- snappy.h
34
- ).map { |e| File.join dir, e }
16
+ src = %w[
17
+ config.h
18
+ snappy-stubs-public.h
19
+ ].map { |e| File.join dir, 'build', e }
20
+ FileUtils.cp src, pwd, :verbose => true
21
+ src = %w[
22
+ snappy-c.cc
23
+ snappy-c.h
24
+ snappy-internal.h
25
+ snappy-sinksource.cc
26
+ snappy-sinksource.h
27
+ snappy.cc
28
+ snappy.h
29
+ snappy-stubs-internal.cc
30
+ snappy-stubs-internal.h
31
+ ].map { |e| File.join dir, e }
35
32
  FileUtils.cp src, pwd, :verbose => true
36
33
  end
37
34
 
@@ -1,6 +1,8 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'snappy-jars' if defined?(JRUBY_VERSION)
4
5
  require 'snappy_ext'
5
6
  require 'snappy/reader'
6
- require 'snappy/writer'
7
+ require 'snappy/writer'
8
+ require 'snappy/hadoop'
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require 'stringio'
5
+ require 'snappy/hadoop/reader'
6
+ require 'snappy/hadoop/writer'
7
+
8
+ module Snappy
9
+ module Hadoop
10
+ def self.deflate(source, block_size = Snappy::Hadoop::Writer::DEFAULT_BLOCK_SIZE)
11
+ compressed_io = StringIO.new
12
+ writer = Snappy::Hadoop::Writer.new(compressed_io)
13
+ writer << source
14
+ writer.flush
15
+ compressed_io.string
16
+ end
17
+
18
+ def self.inflate(source)
19
+ Snappy::Hadoop::Reader.new(StringIO.new(source)).read
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'stringio'
4
+ require 'snappy/shim'
5
+
6
+ module Snappy
7
+ module Hadoop
8
+ class Reader
9
+ attr_reader :io
10
+
11
+ def initialize(io)
12
+ @io = Snappy.set_encoding io
13
+ yield self if block_given?
14
+ end
15
+
16
+ def each
17
+ until @io.eof?
18
+ # Uncompressed size (32 bit integer, BE).
19
+ uncompressed_size = @io.read(4).unpack('N').first
20
+
21
+ uncompressed_block_io = StringIO.new
22
+ while uncompressed_block_io.size < uncompressed_size
23
+ # Compressed subblock size (32 bit integer, BE).
24
+ compressed_size = @io.read(4).unpack('N').first
25
+ uncompressed_block_io << Snappy.inflate(@io.read(compressed_size))
26
+ end
27
+
28
+ if uncompressed_block_io.size > uncompressed_size
29
+ raise RuntimeError("Invalid data: expected #{uncompressed_size} bytes, got #{Uncompressed.size}")
30
+ end
31
+
32
+ yield uncompressed_block_io.string if block_given?
33
+ end
34
+ end
35
+
36
+ def read
37
+ buff = StringIO.new
38
+ each do |chunk|
39
+ buff << chunk
40
+ end
41
+ buff.string
42
+ end
43
+
44
+ def each_line(sep_string = $/)
45
+ last = ""
46
+ each do |chunk|
47
+ chunk = last + chunk
48
+ lines = chunk.split(sep_string)
49
+ last = lines.pop
50
+ lines.each do |line|
51
+ yield line if block_given?
52
+ end
53
+ end
54
+ yield last
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'snappy/shim'
4
+
5
+ module Snappy
6
+ module Hadoop
7
+ class Writer
8
+ DEFAULT_BLOCK_SIZE = 256 * 1024
9
+
10
+ attr_reader :io, :block_size
11
+
12
+ def initialize(io, block_size = DEFAULT_BLOCK_SIZE)
13
+ @block_size = block_size
14
+ @buffer = String.new
15
+ @io = Snappy.set_encoding io
16
+ if block_given?
17
+ yield self
18
+ dump!
19
+ end
20
+ end
21
+
22
+ def <<(msg)
23
+ @buffer << msg.to_s
24
+ dump! if @buffer.size >= @block_size
25
+ end
26
+
27
+ alias_method :write, :<<
28
+
29
+ def dump!
30
+ offset = 0
31
+ while offset < @buffer.size
32
+ uncompressed = @buffer[offset, @block_size]
33
+ compressed = Snappy.deflate(uncompressed)
34
+
35
+ # Uncompressed size (32 bit integer, BE), compressed size (32 bit integer, BE), data.
36
+ @io << [uncompressed.size, compressed.size, compressed].pack("NNa#{compressed.size}")
37
+ offset += uncompressed.size
38
+ end
39
+
40
+ @io.flush
41
+ @buffer.clear
42
+ end
43
+
44
+ alias_method :flush, :dump!
45
+
46
+ def close
47
+ @io.close
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,10 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'snappy/shim'
4
+ require 'snappy/writer'
5
+
1
6
  module Snappy
2
7
  class Reader
3
8
  attr_reader :io, :magic, :default_version, :minimum_compatible_version
4
9
 
5
10
  def initialize(io)
6
- @io = io
7
- @io.set_encoding Encoding::ASCII_8BIT unless RUBY_VERSION =~ /^1\.8/
11
+ @io = Snappy.set_encoding io
8
12
  read_header!
9
13
  yield self if block_given?
10
14
  end
@@ -15,20 +19,20 @@ module Snappy
15
19
  size = @io.read(4).unpack('N').first
16
20
  yield Snappy.inflate(@io.read(size)) if block_given?
17
21
  else
18
- yield Snappy.inflate @io.read if block_given?
22
+ yield Snappy.inflate(@io.read) if block_given?
19
23
  end
20
24
  end
21
25
  end
22
26
 
23
27
  def read
24
- @buff = StringIO.new
28
+ buff = StringIO.new
25
29
  each do |chunk|
26
- @buff << chunk
30
+ buff << chunk
27
31
  end
28
- @buff.string
32
+ buff.string
29
33
  end
30
34
 
31
- def each_line(sep_string=$/)
35
+ def each_line(sep_string = $/)
32
36
  last = ""
33
37
  each do |chunk|
34
38
  chunk = last + chunk
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Snappy
4
+ module_function
5
+
6
+ if RUBY_VERSION[0..2] == '1.8'
7
+ def set_encoding(io)
8
+ io
9
+ end
10
+
11
+ def b(str)
12
+ str
13
+ end
14
+ else
15
+ def set_encoding(io)
16
+ io.set_encoding Encoding::ASCII_8BIT
17
+ io
18
+ end
19
+
20
+ if ::String.instance_methods.include? :b
21
+ def b(str)
22
+ str.b
23
+ end
24
+ else
25
+ def b(str)
26
+ str.force_encoding Encoding::ASCII_8BIT
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Snappy
2
- VERSION = "0.0.13"
4
+ VERSION = "0.1.0"
3
5
  end
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'snappy/shim'
4
+
1
5
  module Snappy
2
6
  class Writer
3
- if RUBY_VERSION[0..2] == '1.8'
4
- MAGIC = "\x82SNAPPY\x0"
5
- else
6
- MAGIC = "\x82SNAPPY\x0".force_encoding Encoding::ASCII_8BIT
7
- end
7
+ MAGIC = Snappy.b("\x82SNAPPY\x0")
8
8
  DEFAULT_VERSION = 1
9
9
  MINIMUM_COMPATIBLE_VERSION = 1
10
10
  DEFAULT_BLOCK_SIZE = 32 * 1024
@@ -13,9 +13,8 @@ module Snappy
13
13
 
14
14
  def initialize(io, block_size = DEFAULT_BLOCK_SIZE)
15
15
  @block_size = block_size
16
- @buffer = ""
17
- @io = io
18
- @io.set_encoding Encoding::ASCII_8BIT unless RUBY_VERSION =~ /^1\.8/
16
+ @buffer = String.new
17
+ @io = Snappy.set_encoding io
19
18
  write_header!
20
19
  if block_given?
21
20
  yield self
@@ -34,7 +33,7 @@ module Snappy
34
33
  compressed = Snappy.deflate(@buffer)
35
34
  @io << [compressed.size, compressed].pack("Na#{compressed.size}")
36
35
  @io.flush
37
- @buffer = ""
36
+ @buffer.clear
38
37
  end
39
38
 
40
39
  alias_method :flush, :dump!