bloomrb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/bloomrb.rb +129 -0
  2. metadata +45 -0
data/lib/bloomrb.rb ADDED
@@ -0,0 +1,129 @@
1
+ require 'socket'
2
+
3
+ class Bloomrb
4
+ attr_accessor :host, :port
5
+
6
+ def initialize(host = 'localhost', port = 8673)
7
+ self.host = host
8
+ self.port = port
9
+ end
10
+
11
+ def socket
12
+ @socket ||= TCPSocket.new(host, port)
13
+ end
14
+
15
+ def filter(name)
16
+ BloomFilter.new(name, self)
17
+ end
18
+
19
+ def create(filter, opts = {})
20
+ execute('create', filter, opts) == 'Done'
21
+ end
22
+
23
+ def list
24
+ execute('list').map do |line|
25
+ name, probability, size, capacity, items = line.split(' ')
26
+ {:name => name,
27
+ :probability => probability.to_f,
28
+ :size => size.to_i,
29
+ :capacity => capacity.to_i,
30
+ :items => items.to_i}
31
+ end
32
+ end
33
+
34
+ def drop(filter)
35
+ execute('drop', filter) == 'Done'
36
+ end
37
+
38
+ def close(filter)
39
+ execute('close', filter) == 'Done'
40
+ end
41
+
42
+ def clear(filter)
43
+ execute('clear', filter) == 'Done'
44
+ end
45
+
46
+ def check(filter, key)
47
+ execute('c', filter, key) == 'Yes'
48
+ end
49
+
50
+ def multi(filter, keys)
51
+ Hash[keys.zip(execute('m', filter, *keys).split(' ').map{|r| r == 'Yes'})]
52
+ end
53
+
54
+ def any?(filter, keys)
55
+ !!(execute('m', filter, *keys) =~ /Yes/)
56
+ end
57
+
58
+ def all?(filter, keys)
59
+ !!(execute('m', filter, *keys) !~ /No/)
60
+ end
61
+
62
+ def set(filter, key)
63
+ execute('s', filter, key) == 'Yes'
64
+ end
65
+
66
+ def bulk(filter, keys)
67
+ execute('b', filter, *keys)
68
+ end
69
+
70
+ def info(filter)
71
+ Hash[execute('info', filter).map{|s| s.split(' ')}]
72
+ end
73
+
74
+ def flush(filter = nil)
75
+ execute('flush', filter) == 'Done'
76
+ end
77
+
78
+ protected
79
+
80
+ def execute *args
81
+ opts = Hash === args.last ? args.pop : {}
82
+ args.compact!
83
+
84
+ cmd = args.join(' ')
85
+ cmd += ' ' + opts.map{|k, v| "#{k}=#{v}"}.join(' ') unless opts.empty?
86
+
87
+ socket.puts(cmd)
88
+ result = socket.gets.chomp
89
+ throw result if result =~ /^Client Error:/
90
+
91
+ if result == 'START'
92
+ result = []
93
+ while (s = socket.gets.chomp) != 'END'
94
+ result << s
95
+ end
96
+ end
97
+ result
98
+ end
99
+ end
100
+
101
+ class BloomFilter
102
+ attr_accessor :name, :bloormrb
103
+
104
+ def initialize(name, bloormrb)
105
+ self.name = name
106
+ self.bloormrb = bloormrb
107
+ end
108
+
109
+ protected
110
+
111
+ def self.delegate method
112
+ define_method(method) do |*args|
113
+ bloormrb.send(method, name, *args)
114
+ end
115
+ end
116
+
117
+ delegate :create
118
+ delegate :drop
119
+ delegate :close
120
+ delegate :clear
121
+ delegate :check
122
+ delegate :multi
123
+ delegate :any?
124
+ delegate :all?
125
+ delegate :set
126
+ delegate :bulk
127
+ delegate :info
128
+ delegate :flush
129
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bloomrb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Simon Kroeger
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-11 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Wraps the bloomd protocol for usage in ruby projects
15
+ email: simon.kroeger@sponsorpay.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/bloomrb.rb
21
+ homepage: https://github.com/SponsorPay/bloomrb
22
+ licenses: []
23
+ post_install_message:
24
+ rdoc_options: []
25
+ require_paths:
26
+ - lib
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 1.8.15
42
+ signing_key:
43
+ specification_version: 3
44
+ summary: Ruby client for bloomd
45
+ test_files: []