vinted-blurrily 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,10 @@
1
+ module Blurrily
2
+ DEFAULT_HOST = 'localhost'
3
+ DEFAULT_PORT = 12021
4
+ DEFAULT_DATABASE = 'words'
5
+
6
+ LIMIT_DEFAULT = 10
7
+ LIMIT_RANGE = 1..1024
8
+ REF_RANGE = 1..(1<<31)
9
+ WEIGHT_RANGE = 0..(1<<31)
10
+ end
@@ -0,0 +1,49 @@
1
+ require 'blurrily/map_ext'
2
+ require 'active_support/core_ext/module/aliasing' # alias_method_chain
3
+ require 'active_support/core_ext/string/multibyte' # mb_chars
4
+
5
+ module Blurrily
6
+ class Map < RawMap
7
+
8
+ def put(needle, reference, weight=nil)
9
+ weight ||= 0
10
+ needle = normalize_string needle
11
+ @clean_path = nil
12
+ super(needle, reference, weight)
13
+ end
14
+
15
+ def find(needle, limit=10)
16
+ needle = normalize_string needle
17
+ super(needle, limit)
18
+ end
19
+
20
+ def delete(*args)
21
+ @clean_path = nil
22
+ super(*args)
23
+ end
24
+
25
+ def save(path)
26
+ return if @clean_path == path
27
+ super(path)
28
+ @clean_path = path
29
+ nil
30
+ end
31
+
32
+ def self.load(path)
33
+ super(path).tap do |map|
34
+ map.instance_variable_set :@clean_path, path
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def normalize_string(needle)
41
+ result = needle.downcase
42
+ unless result =~ /^([a-z ])+$/
43
+ result = ActiveSupport::Multibyte::Chars.new(result).mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/,'').to_s.gsub(/[^a-z]/,' ')
44
+ # result = result.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/,'').to_s.gsub(/[^a-z]/,' ')
45
+ end
46
+ result.gsub(/\s+/,' ').strip
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,39 @@
1
+ require 'pathname'
2
+ require 'blurrily/map'
3
+
4
+ module Blurrily
5
+ class MapGroup
6
+
7
+ def initialize(directory = nil)
8
+ @directory = Pathname.new(directory || Dir.pwd)
9
+ @maps = {}
10
+ end
11
+
12
+ def map(name)
13
+ @maps[name] ||= load_map(name) || Map.new
14
+ end
15
+
16
+ def save
17
+ @directory.mkpath
18
+ @maps.each do |name, map|
19
+ map.save(path_for(name).to_s)
20
+ end
21
+ end
22
+
23
+ def clear(name)
24
+ @maps[name] = Map.new
25
+ end
26
+
27
+ private
28
+
29
+ def load_map(name)
30
+ Map.load(path_for(name).to_s)
31
+ rescue Errno::ENOENT
32
+ nil
33
+ end
34
+
35
+ def path_for(name)
36
+ @directory.join("#{name}.trigrams")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,49 @@
1
+ require 'eventmachine'
2
+ require 'blurrily/defaults'
3
+ require 'blurrily/command_processor'
4
+ require 'blurrily/map_group'
5
+
6
+ module Blurrily
7
+ class Server
8
+
9
+ def initialize(options)
10
+ @host = options.fetch(:host, '0.0.0.0')
11
+ @port = options.fetch(:port, Blurrily::DEFAULT_PORT)
12
+ directory = options.fetch(:directory, Dir.pwd)
13
+
14
+ @map_group = MapGroup.new(directory)
15
+ @command_processor = CommandProcessor.new(@map_group)
16
+ end
17
+
18
+ def start
19
+ EventMachine.run do
20
+ # hit Control + C to stop
21
+ Signal.trap("INT") { EventMachine.stop }
22
+ Signal.trap("TERM") { EventMachine.stop }
23
+
24
+ saver = proc { @map_group.save }
25
+ EventMachine.add_periodic_timer(60, &saver)
26
+ EventMachine.add_shutdown_hook(&saver)
27
+ Signal.trap("USR1", &saver)
28
+
29
+ EventMachine.start_server(@host, @port, Handler, @command_processor)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ module Handler
36
+ def initialize(processor)
37
+ @processor = processor
38
+ end
39
+
40
+ def receive_data(data)
41
+ data.split("\n").each do |line|
42
+ output = @processor.process_command(line.strip)
43
+ output << "\n"
44
+ send_data(output)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module Blurrily
2
+ VERSION = "1.0.2"
3
+ end
metadata ADDED
@@ -0,0 +1,280 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vinted-blurrily
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Tomas Varneckas
8
+ - Julien Letessier
9
+ - Dawid Sklodowski
10
+ - Marcus Mitchell
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2017-04-25 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: activesupport
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '4'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '4'
30
+ - !ruby/object:Gem::Dependency
31
+ name: eventmachine
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ - !ruby/object:Gem::Dependency
45
+ name: rspec
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ - !ruby/object:Gem::Dependency
59
+ name: rake
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: rake-compiler
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ - !ruby/object:Gem::Dependency
87
+ name: pry
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ - !ruby/object:Gem::Dependency
101
+ name: pry-nav
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ - !ruby/object:Gem::Dependency
115
+ name: pry-doc
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ - !ruby/object:Gem::Dependency
129
+ name: progressbar
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: benchmark-ips
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ type: :development
150
+ prerelease: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ - !ruby/object:Gem::Dependency
157
+ name: guard
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ - !ruby/object:Gem::Dependency
171
+ name: guard-rspec
172
+ requirement: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ type: :development
178
+ prerelease: false
179
+ version_requirements: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ - !ruby/object:Gem::Dependency
185
+ name: rb-fsevent
186
+ requirement: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ - !ruby/object:Gem::Dependency
199
+ name: terminal-notifier-guard
200
+ requirement: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ - !ruby/object:Gem::Dependency
213
+ name: coveralls
214
+ requirement: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ type: :development
220
+ prerelease: false
221
+ version_requirements: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ description: Native fuzzy string search
227
+ email:
228
+ - t.varneckas@gmail.com
229
+ - julien.letessier@gmail.com
230
+ executables:
231
+ - blurrily
232
+ extensions:
233
+ - ext/blurrily/extconf.rb
234
+ extra_rdoc_files: []
235
+ files:
236
+ - LICENSE.txt
237
+ - README.md
238
+ - bin/blurrily
239
+ - ext/blurrily/blurrily.h
240
+ - ext/blurrily/extconf.rb
241
+ - ext/blurrily/map_ext.c
242
+ - ext/blurrily/search_tree.c
243
+ - ext/blurrily/search_tree.h
244
+ - ext/blurrily/storage.c
245
+ - ext/blurrily/storage.h
246
+ - ext/blurrily/tokeniser.c
247
+ - ext/blurrily/tokeniser.h
248
+ - lib/blurrily.rb
249
+ - lib/blurrily/client.rb
250
+ - lib/blurrily/command_processor.rb
251
+ - lib/blurrily/defaults.rb
252
+ - lib/blurrily/map.rb
253
+ - lib/blurrily/map_group.rb
254
+ - lib/blurrily/server.rb
255
+ - lib/blurrily/version.rb
256
+ homepage: http://github.com/vinted/blurrily
257
+ licenses: []
258
+ metadata: {}
259
+ post_install_message:
260
+ rdoc_options: []
261
+ require_paths:
262
+ - lib
263
+ required_ruby_version: !ruby/object:Gem::Requirement
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ version: '0'
268
+ required_rubygems_version: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ version: '0'
273
+ requirements: []
274
+ rubyforge_project:
275
+ rubygems_version: 2.6.11
276
+ signing_key:
277
+ specification_version: 4
278
+ summary: Native fuzzy string search
279
+ test_files: []
280
+ has_rdoc: