vinted-blurrily 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.
@@ -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: