jruby-bloomfilter 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source :rubygems
2
+
3
+ gem 'jets3t-rb', :git => 'git://github.com/gaiottino/jets3t-rb.git'
4
+ gem 'rspec'
5
+
data/Gemfile.lock ADDED
@@ -0,0 +1,25 @@
1
+ GIT
2
+ remote: git://github.com/gaiottino/jets3t-rb.git
3
+ revision: f7c77fa1d393bb3ebaf42d4d871071d3e9652328
4
+ specs:
5
+ jets3t-rb (1.0.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.1.2)
11
+ rspec (2.5.0)
12
+ rspec-core (~> 2.5.0)
13
+ rspec-expectations (~> 2.5.0)
14
+ rspec-mocks (~> 2.5.0)
15
+ rspec-core (2.5.1)
16
+ rspec-expectations (2.5.0)
17
+ diff-lcs (~> 1.1.2)
18
+ rspec-mocks (2.5.0)
19
+
20
+ PLATFORMS
21
+ java
22
+
23
+ DEPENDENCIES
24
+ jets3t-rb!
25
+ rspec
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ $: << File.expand_path('../lib', __FILE__)
4
+
5
+ Dir['ext/*.jar'].each { |jar| require jar }
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'jruby-bloomfilter'
9
+ s.version = '1.0.2'
10
+ s.platform = Gem::Platform::RUBY
11
+ s.authors = ['Daniel Gaiottino']
12
+ s.email = ['daniel@burtcorp.com']
13
+ s.homepage = 'http://github.com/gaiottino/bloomfilter'
14
+ s.summary = %q{JRuby wrapper for java-bloomfilter}
15
+ s.description = %q{JRuby wrapper (+ some extra functionality) to http://code.google.com/p/java-bloomfilter}
16
+
17
+ s.rubyforge_project = 'jruby-bloomfilter'
18
+ s.add_dependency 'jets3t-rb', '~> 1.0.0'
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = %w(lib)
24
+ end
data/lib/bloomfilter.rb CHANGED
@@ -3,44 +3,39 @@
3
3
  require 'java'
4
4
  require 'ext/java-bloomfilter-0.9.3'
5
5
 
6
- require 'serializer'
6
+ require_relative 'bloomfilter/serializer'
7
7
 
8
8
  module Jar
9
9
  import com.skjegstad.utils.BloomFilter
10
10
  end
11
11
 
12
- class Bloomfilter
13
- include Serialization
14
-
15
- def initialize(options = {})
16
- if options[:size] && options[:false_positive_percentage]
17
- @filter = Jar::BloomFilter.new(options[:false_positive_percentage], options[:size])
18
- elsif options[:filter]
19
- @filter = options[:filter]
12
+ module Bloomfilter
13
+ class Bloomfilter
14
+ def initialize(options = {})
15
+ if options[:size] && options[:false_positive_percentage]
16
+ @filter = Jar::BloomFilter.new(options[:false_positive_percentage], options[:size])
17
+ elsif options[:filter]
18
+ @filter = options[:filter]
19
+ end
20
20
  end
21
- end
22
21
 
23
- def << (k)
24
- @filter.add(k)
25
- end
22
+ def << (k)
23
+ @filter.add(k)
24
+ end
25
+
26
+ def add_if_absent(k)
27
+ @filter.synchronized do
28
+ @filter.add(k) unless @filter.contains(k)
29
+ end
30
+ end
26
31
 
27
- def include?(k)
28
- @filter.contains(k)
29
- end
32
+ def include?(k)
33
+ @filter.contains(k)
34
+ end
30
35
 
31
- def count
32
- @filter.count
33
- end
36
+ def count
37
+ @filter.count
38
+ end
34
39
 
35
- # def store(path)
36
- # raise 'Cannot call store without specifying :serializer in initlialize options' unless @serializer
37
- # @serializer.store(path, @filter)
38
- # end
39
- #
40
- # def self.load(type, path)
41
- # serializer = Serialization.serializer(type)
42
- # filter = serializer.load(path)
43
- # Bloomfilter.new(:filter => filter)
44
- # end
45
-
40
+ end
46
41
  end
@@ -0,0 +1,29 @@
1
+ module Bloomfilter
2
+ module Serialization
3
+ class File
4
+ def store(path, filter)
5
+ dir = ::File.dirname(path)
6
+ unless ::File.directory?(dir)
7
+ %x(mkdir -p #{dir})
8
+ end
9
+
10
+ ::File.open(path, 'w') do |f|
11
+ Marshal.dump(filter, f)
12
+ end
13
+ end
14
+
15
+ def load(path)
16
+ return nil unless ::File.exist?(path)
17
+
18
+ ::File.open(path, 'r') do |f|
19
+ return Marshal.load(f)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def extract_folder_path
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ require 'jets3t'
2
+ require 'tempfile'
3
+
4
+ module Bloomfilter
5
+ module Serialization
6
+ class S3
7
+ AWS_SECRET_PATH = '~/.awssecret'.freeze
8
+ TEMP_FILE_PREFIX = 'bloomfilter'.freeze
9
+
10
+ def initialize(s3_service, bucket_name)
11
+ @file_serializer = File.new
12
+ @bucket = s3_service.bucket(bucket_name)
13
+ end
14
+
15
+ def store(path, filter)
16
+ tmp = Tempfile.new(TEMP_FILE_PREFIX)
17
+ @file_serializer.store(tmp.path, filter)
18
+ @bucket.put(path, tmp)
19
+ end
20
+
21
+ def load(path)
22
+ s3_object = @bucket.get(path)
23
+ tmp = Tempfile.new(TEMP_FILE_PREFIX)
24
+ ::File.open(tmp.path, 'w') do |f|
25
+ f << s3_object.data
26
+ end
27
+ @file_serializer.load(tmp.path)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'serialization/file'
2
+ require_relative 'serialization/s3'
3
+
4
+ module Bloomfilter
5
+ class Serializer
6
+
7
+ def self.s3(access_key, secret_key, bucket_name)
8
+ credentials = JetS3t::AWSCredentials.new(access_key_id, secret_access_key)
9
+ s3_service = JetS3t::RestS3Service.new(credentials)
10
+ return Serialization::S3.new(s3_service, bucket_name)
11
+ end
12
+
13
+ def self.file
14
+ return Serialization::File.new
15
+ end
16
+
17
+ end
18
+ end
Binary file
@@ -4,33 +4,35 @@ require_relative 'spec_helper'
4
4
 
5
5
  require 'tempfile'
6
6
 
7
- describe Bloomfilter do
8
- before :all do
9
- @filter = Bloomfilter.new(:size => 1_000, :false_positive_percentage => 0.01)
10
- @path = Tempfile.new('bloomfilter').path
11
- end
12
-
13
- it 'should not have any elements from start' do
14
- @filter.count.should == 0
15
- end
7
+ module Bloomfilter
8
+ describe Bloomfilter do
9
+ before :all do
10
+ @filter = Bloomfilter.new(:size => 1_000, :false_positive_percentage => 0.01)
11
+ @path = Tempfile.new('bloomfilter').path
12
+ end
16
13
 
17
- describe '#<<' do
18
- it 'should be possible to add elements which updates the count' do
19
- @filter << 'hello'
20
- @filter.count.should == 1
14
+ it 'should not have any elements from start' do
15
+ @filter.count.should == 0
21
16
  end
22
- end
23
17
 
24
- describe '#include?' do
25
- it 'should return false if an element does not exist' do
26
- @filter.include?('world').should be_false
18
+ describe '#<<' do
19
+ it 'should be possible to add elements which updates the count' do
20
+ @filter << 'hello'
21
+ @filter.count.should == 1
22
+ end
27
23
  end
24
+
25
+ describe '#include?' do
26
+ it 'should return false if an element does not exist' do
27
+ @filter.include?('world').should be_false
28
+ end
28
29
 
29
- it 'should return true if an element exists' do
30
- @filter.include?('hello').should be_true
30
+ it 'should return true if an element exists' do
31
+ @filter.include?('hello').should be_true
31
32
 
32
- @filter << 'world'
33
- @filter.include?('world').should be_true
33
+ @filter << 'world'
34
+ @filter.include?('world').should be_true
35
+ end
34
36
  end
35
37
  end
36
38
  end
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'spec_helper'
4
+
5
+ require 'tempfile'
6
+
7
+ module Bloomfilter
8
+ describe 'Serialization' do
9
+ before :all do
10
+ @filter = Bloomfilter.new(:size => 1_000, :false_positive_percentage => 0.01)
11
+ @filter << 'hello'
12
+ @filter << 'world'
13
+ @path = Tempfile.new('bloomfilter').path
14
+ end
15
+
16
+ context 'File' do
17
+ it 'should be possible to store a filter to a file' do
18
+ Serializer.file.store(@path, @filter)
19
+ File.new(@path).size.should == 1612
20
+ end
21
+
22
+ it 'should be possible to load a filter from a file' do
23
+ filter = Serializer.file.load(@path)
24
+ filter.count.should == 2
25
+ filter.include?('hello').should be_true
26
+ filter.include?('world').should be_true
27
+ filter.include?('bloomfilter').should be_false
28
+ end
29
+ end
30
+
31
+ context 'S3' do
32
+ before do
33
+ bucket_name = 'test-bucket'
34
+ s3_service = stub('s3_service')
35
+ @bucket = stub(bucket_name)
36
+
37
+ s3_service.stub(:bucket).with(bucket_name).and_return(@bucket)
38
+ @s3 = Serialization::S3.new(s3_service, bucket_name)
39
+ end
40
+
41
+ it 'should be possible to store a filter to S3' do
42
+ @bucket.should_receive(:put).with('/some/path', anything)
43
+ @s3.store('/some/path', @filter)
44
+ end
45
+
46
+ it 'should be possible to load a filter from S3' do
47
+ s3_object = stub('s3_object')
48
+ @bucket.should_receive(:get).with('/some/path').and_return(s3_object)
49
+ s3_object.should_receive(:data).and_return(Marshal.dump(@filter))
50
+ @s3.load('/some/path')
51
+ end
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: jruby-bloomfilter
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.0.0
5
+ version: 1.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel Gaiottino
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-11 00:00:00 Z
13
+ date: 2011-07-12 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: jets3t-rb
@@ -35,11 +35,18 @@ extra_rdoc_files: []
35
35
  files:
36
36
  - .gitignore
37
37
  - .rvmrc
38
+ - Gemfile
39
+ - Gemfile.lock
38
40
  - README
39
41
  - benchmark/memory.rb
42
+ - bloomfilter.gemspec
40
43
  - lib/bloomfilter.rb
44
+ - lib/bloomfilter/serialization/file.rb
45
+ - lib/bloomfilter/serialization/s3.rb
46
+ - lib/bloomfilter/serializer.rb
41
47
  - lib/ext/java-bloomfilter-0.9.3.jar
42
48
  - spec/bloomfilter_spec.rb
49
+ - spec/serialization_spec.rb
43
50
  - spec/spec_helper.rb
44
51
  homepage: http://github.com/gaiottino/bloomfilter
45
52
  licenses: []
@@ -70,4 +77,5 @@ specification_version: 3
70
77
  summary: JRuby wrapper for java-bloomfilter
71
78
  test_files:
72
79
  - spec/bloomfilter_spec.rb
80
+ - spec/serialization_spec.rb
73
81
  - spec/spec_helper.rb