bloomrb 0.0.1

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.
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: []