bloom_filter 0.6.5 → 0.6.6

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/Rakefile CHANGED
@@ -15,6 +15,7 @@ begin
15
15
  gem.add_dependency "eventmachine", ">=0.12.8"
16
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
17
  end
18
+ Jeweler::GemcutterTasks.new
18
19
  rescue LoadError
19
20
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
20
21
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.5
1
+ 0.6.6
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bloom_filter}
8
- s.version = "0.6.5"
8
+ s.version = "0.6.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Arya Asemanfar"]
12
- s.date = %q{2010-02-04}
12
+ s.date = %q{2010-02-07}
13
13
  s.default_executable = %q{bloom_filter_server}
14
14
  s.description = %q{}
15
15
  s.email = %q{misterfunnyarsal@gmail.com}
@@ -57,8 +57,16 @@ class BloomFilter
57
57
  [@m, @k, *@bits].join(DUMP_SEPARATOR)
58
58
  end
59
59
 
60
- def replace(file)
61
- m, k, bits = self.class.read(file)
60
+ def dup
61
+ self.class.new(@m, @k, @bits.dup)
62
+ end
63
+
64
+ def replace(*args)
65
+ m, k, bits = if args.size == 1
66
+ self.class.read(args.first)
67
+ else
68
+ args
69
+ end
62
70
  @m, @k = m, k
63
71
  @bits.replace(bits)
64
72
  end
@@ -116,6 +116,7 @@ class BloomFilter
116
116
  self.disconnect
117
117
  @raise_on_timeout ? raise : default
118
118
  rescue BloomFilter::ConnectionError, Errno::EPIPE
119
+ self.disconnect
119
120
  @raise_on_error ? raise : default
120
121
  end
121
122
  else
@@ -67,18 +67,14 @@ class BloomFilter
67
67
  write_response(request_body.split(Protocol::DEFAULT_SEPARATOR).collect { |el| self.class.filter.include?(el) })
68
68
  when Protocol::DUMP
69
69
  begin
70
- File.open(request_body, "w") do |f|
71
- f.write(self.class.filter.dump)
72
- end
70
+ deferred_dump(request_body)
73
71
  write_response(true)
74
72
  rescue Exception => e
75
73
  write_response(false)
76
74
  end
77
75
  when Protocol::LOAD
78
76
  begin
79
- File.open(request_body, "r") do |file|
80
- self.class.filter.replace(file)
81
- end
77
+ deferred_load(request_body)
82
78
  write_response(true)
83
79
  rescue Exception => e
84
80
  write_response(false)
@@ -93,5 +89,27 @@ class BloomFilter
93
89
  str = vector.to_s
94
90
  send_data([str.size].pack(PACK_N) + str)
95
91
  end
92
+
93
+ def deferred_load(file_name)
94
+ file = File.open(file_name, "r") # open here so IO errors are thrown to the caller
95
+
96
+ loader = lambda do
97
+ attrs = BloomFilter.read(file)
98
+ file.close unless file.nil? || file.closed?
99
+ attrs
100
+ end
101
+
102
+ setter = lambda do |attributes|
103
+ self.class.filter.replace(*attributes)
104
+ end
105
+
106
+ EM.defer(loader, setter)
107
+ end
108
+
109
+ def deferred_dump(file_name)
110
+ file = File.open(file_name, "w")
111
+ duped = self.class.filter.dup
112
+ EM.defer { file.write(duped.dump) }
113
+ end
96
114
  end
97
115
  end
@@ -123,6 +123,7 @@ class BloomFilterClientTest < Test::Unit::TestCase
123
123
  socket = mock()
124
124
 
125
125
  socket.stubs(:closed?).returns(false)
126
+ socket.stubs(:close)
126
127
  TCPSocket.stubs(:new).with("localhost", 4111).returns(socket)
127
128
  IO.stubs(:select).returns(socket)
128
129
  socket.stubs(:write)
@@ -38,11 +38,14 @@ class BloomFilterServerTest < Test::Unit::TestCase
38
38
 
39
39
  should "send dump" do
40
40
  path = "/tmp/f"
41
- @filter.expects(:dump).returns("dumped_data")
41
+ dupped = mock()
42
+ @filter.expects(:dup).returns(dupped)
43
+ dupped.expects(:dump).returns("dumped_data")
42
44
 
43
45
  file = mock()
44
- File.expects(:open).with(path, 'w').yields(file)
46
+ File.expects(:open).with(path, 'w').returns(file)
45
47
  file.expects(:write).with("dumped_data")
48
+ EM.expects(:defer).with().yields()
46
49
 
47
50
  expects_send_data("#{[1].pack("N")}#{BloomFilter::Protocol::TRUE}")
48
51
 
@@ -53,9 +56,14 @@ class BloomFilterServerTest < Test::Unit::TestCase
53
56
  should "send load" do
54
57
  path = "/tmp/f"
55
58
  file = mock()
56
- @filter.expects(:replace).with(file)
57
- File.expects(:open).with(path, 'r').yields(file)
58
-
59
+ file.stubs(:closed?)
60
+ file.stubs(:close)
61
+ attrs = [1,2,3]
62
+ BloomFilter.stubs(:read).with(file).returns(attrs)
63
+ @filter.expects(:replace).with(*attrs)
64
+ EM.expects(:defer).with {|loader, setter| setter.call(loader.call); true}
65
+ File.expects(:open).with(path, 'r').returns(file)
66
+
59
67
  expects_send_data("#{[1].pack("N")}#{BloomFilter::Protocol::TRUE}")
60
68
 
61
69
  @server.receive_data("#{[path.size + 1].pack("N")}#{BloomFilter::Protocol::LOAD}#{path}")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bloom_filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.5
4
+ version: 0.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arya Asemanfar
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-04 00:00:00 -08:00
12
+ date: 2010-02-07 00:00:00 -08:00
13
13
  default_executable: bloom_filter_server
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency