soulmate 0.0.3 → 0.0.4

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/Gemfile CHANGED
@@ -11,3 +11,8 @@ group :development do
11
11
  gem "jeweler", "~> 1.5.2"
12
12
  gem "rcov", ">= 0"
13
13
  end
14
+
15
+ gem 'redis', "~> 2.1.1"
16
+ gem 'rack-contrib'
17
+ gem 'vegas', "~> 0.1.8"
18
+ gem 'sinatra', "~> 1.2.3"
data/Gemfile.lock CHANGED
@@ -6,9 +6,19 @@ GEM
6
6
  bundler (~> 1.0.0)
7
7
  git (>= 1.2.5)
8
8
  rake
9
+ rack (1.2.2)
10
+ rack-contrib (1.1.0)
11
+ rack (>= 0.9.1)
9
12
  rake (0.8.7)
10
13
  rcov (0.9.9)
14
+ redis (2.1.1)
11
15
  shoulda (2.11.3)
16
+ sinatra (1.2.3)
17
+ rack (~> 1.1)
18
+ tilt (>= 1.2.2, < 2.0)
19
+ tilt (1.2.2)
20
+ vegas (0.1.8)
21
+ rack (>= 1.0.0)
12
22
 
13
23
  PLATFORMS
14
24
  ruby
@@ -16,5 +26,9 @@ PLATFORMS
16
26
  DEPENDENCIES
17
27
  bundler (~> 1.0.0)
18
28
  jeweler (~> 1.5.2)
29
+ rack-contrib
19
30
  rcov
31
+ redis (~> 2.1.1)
20
32
  shoulda
33
+ sinatra (~> 1.2.3)
34
+ vegas (~> 0.1.8)
data/README.markdown CHANGED
@@ -48,6 +48,8 @@ And here's the load command (Soulmate assumes redis is running locally on the de
48
48
 
49
49
  $ soulmate load venue --redis=redis://localhost:6379/0 < venues.json
50
50
 
51
+ You can also provide an array of strings under the `aliases` key that will also be added to the index for this item.
52
+
51
53
  ### Querying for Data
52
54
 
53
55
  Once it's loaded, we can query this data by starting `soulmate-web`:
@@ -91,7 +93,7 @@ And viewing the service in your browser: <a href="http://localhost:5678/search?t
91
93
  }
92
94
  }
93
95
 
94
- The `/search` method supports multiple `types` as well as an optional `limit`. For example: `http://localhost:5678/search?types[]=event&types[]=venue&types[]=performer&limit=3&term=yank`.
96
+ The `/search` method supports multiple `types` as well as an optional `limit`. For example: `http://localhost:5678/search?types[]=event&types[]=venue&types[]=performer&limit=3&term=yank`. You can also add the `callback` parameter to enable JSONP output.
95
97
 
96
98
  Contributing to soulmate
97
99
  ------------------------
data/Rakefile CHANGED
@@ -45,8 +45,6 @@ Rcov::RcovTask.new do |test|
45
45
  test.verbose = true
46
46
  end
47
47
 
48
- task :default => :test
49
-
50
48
  require 'rake/rdoctask'
51
49
  Rake::RDocTask.new do |rdoc|
52
50
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
@@ -56,3 +54,41 @@ Rake::RDocTask.new do |rdoc|
56
54
  rdoc.rdoc_files.include('README*')
57
55
  rdoc.rdoc_files.include('lib/**/*.rb')
58
56
  end
57
+
58
+ REDIS_DIR = File.expand_path(File.join("..", "test"), __FILE__)
59
+ REDIS_CNF = File.join(REDIS_DIR, "test.conf")
60
+ REDIS_PID = File.join(REDIS_DIR, "db", "redis.pid")
61
+ REDIS_LOCATION = ENV['REDIS_LOCATION']
62
+
63
+ task :default => :run
64
+
65
+ desc "Run tests and manage server start/stop"
66
+ task :run => [:start, :test, :stop]
67
+
68
+ desc "Run rcov and manage server start/stop"
69
+ task :rcoverage => [:start, :rcov, :stop]
70
+
71
+ desc "Start the Redis server"
72
+ task :start do
73
+ redis_running = \
74
+ begin
75
+ File.exists?(REDIS_PID) && Process.kill(0, File.read(REDIS_PID).to_i)
76
+ rescue Errno::ESRCH
77
+ FileUtils.rm REDIS_PID
78
+ false
79
+ end
80
+
81
+ if REDIS_LOCATION
82
+ system "#{REDIS_LOCATION}/redis-server #{REDIS_CNF}" unless redis_running
83
+ else
84
+ system "redis-server #{REDIS_CNF}" unless redis_running
85
+ end
86
+ end
87
+
88
+ desc "Stop the Redis server"
89
+ task :stop do
90
+ if File.exists?(REDIS_PID)
91
+ Process.kill "INT", File.read(REDIS_PID).to_i
92
+ FileUtils.rm REDIS_PID
93
+ end
94
+ end
@@ -29,7 +29,8 @@ module Soulmate
29
29
  # store the raw data in a separate key to reduce memory usage
30
30
  Soulmate.redis.hset(database, id, JSON.dump(item))
31
31
 
32
- prefixes_for_phrase(term).each do |p|
32
+ phrase = ([term] + (item["aliases"] || [])).join(' ')
33
+ prefixes_for_phrase(phrase).uniq.each do |p|
33
34
  Soulmate.redis.sadd(base, p) # remember this prefix in a master set
34
35
  Soulmate.redis.zadd("#{base}:#{p}", score, id) # store the id of this term in the index
35
36
  end
@@ -1,11 +1,14 @@
1
1
  require 'sinatra/base'
2
2
  require 'soulmate'
3
+ require 'rack/contrib'
3
4
 
4
5
  module Soulmate
5
6
 
6
7
  class Server < Sinatra::Base
7
8
  include Helpers
8
9
 
10
+ use Rack::JSONP
11
+
9
12
  before do
10
13
  content_type 'application/json', :charset => 'utf-8'
11
14
  end
@@ -2,7 +2,7 @@ module Soulmate
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- PATCH = 3
5
+ PATCH = 4
6
6
 
7
7
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
data/soulmate.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{soulmate}
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Eric Waller"]
12
- s.date = %q{2011-02-14}
12
+ s.date = %q{2011-07-07}
13
13
  s.description = %q{Soulmate is a tool to help solve the common problem of developing a fast autocomplete feature. It uses Redis's sorted sets to build an index of partial words and corresponding top matches, and provides a simple sinatra app to query them. Soulmate finishes your sentences.}
14
14
  s.email = %q{eric@seatgeek.com}
15
15
  s.executables = ["soulmate", "soulmate-web"]
@@ -34,13 +34,16 @@ Gem::Specification.new do |s|
34
34
  "lib/soulmate/server.rb",
35
35
  "lib/soulmate/version.rb",
36
36
  "soulmate.gemspec",
37
+ "test/db/.gitkeep",
37
38
  "test/helper.rb",
39
+ "test/samples/venues.json",
40
+ "test/test.conf",
38
41
  "test/test_soulmate.rb"
39
42
  ]
40
43
  s.homepage = %q{http://github.com/seatgeek/soulmate}
41
44
  s.licenses = ["MIT"]
42
45
  s.require_paths = ["lib"]
43
- s.rubygems_version = %q{1.3.7}
46
+ s.rubygems_version = %q{1.6.2}
44
47
  s.summary = %q{Redis-backed service for fast autocompleting - extracted from SeatGeek}
45
48
  s.test_files = [
46
49
  "test/helper.rb",
@@ -48,10 +51,13 @@ Gem::Specification.new do |s|
48
51
  ]
49
52
 
50
53
  if s.respond_to? :specification_version then
51
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
54
  s.specification_version = 3
53
55
 
54
56
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
+ s.add_runtime_dependency(%q<redis>, ["~> 2.1.1"])
58
+ s.add_runtime_dependency(%q<rack-contrib>, [">= 0"])
59
+ s.add_runtime_dependency(%q<vegas>, ["~> 0.1.8"])
60
+ s.add_runtime_dependency(%q<sinatra>, ["~> 1.2.3"])
55
61
  s.add_development_dependency(%q<shoulda>, [">= 0"])
56
62
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
57
63
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
@@ -61,6 +67,10 @@ Gem::Specification.new do |s|
61
67
  s.add_runtime_dependency(%q<sinatra>, [">= 1.0"])
62
68
  s.add_runtime_dependency(%q<json>, ["~> 1.4.6"])
63
69
  else
70
+ s.add_dependency(%q<redis>, ["~> 2.1.1"])
71
+ s.add_dependency(%q<rack-contrib>, [">= 0"])
72
+ s.add_dependency(%q<vegas>, ["~> 0.1.8"])
73
+ s.add_dependency(%q<sinatra>, ["~> 1.2.3"])
64
74
  s.add_dependency(%q<shoulda>, [">= 0"])
65
75
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
66
76
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
@@ -71,6 +81,10 @@ Gem::Specification.new do |s|
71
81
  s.add_dependency(%q<json>, ["~> 1.4.6"])
72
82
  end
73
83
  else
84
+ s.add_dependency(%q<redis>, ["~> 2.1.1"])
85
+ s.add_dependency(%q<rack-contrib>, [">= 0"])
86
+ s.add_dependency(%q<vegas>, ["~> 0.1.8"])
87
+ s.add_dependency(%q<sinatra>, ["~> 1.2.3"])
74
88
  s.add_dependency(%q<shoulda>, [">= 0"])
75
89
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
76
90
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
data/test/db/.gitkeep ADDED
File without changes
@@ -0,0 +1,6 @@
1
+ {"id":1,"term":"Dodger Stadium","score":84,"data":{"url":"\/dodger-stadium-tickets\/","subtitle":"Los Angeles, CA"},"aliases":["Chavez Ravine"]}
2
+ {"id":28,"term":"Angel Stadium","score":90,"data":{"url":"\/angel-stadium-tickets\/","subtitle":"Anaheim, CA"},"aliases":["Edison International Field of Anaheim"]}
3
+ {"id":30,"term":"Chase Field ","score":80,"data":{"url":"\/chase-field-tickets\/","subtitle":"Phoenix, AZ"},"aliases":["Bank One Ballpark", "Bank One Stadium"]}
4
+ {"id":29,"term":"Sun Life Stadium","score":75,"data":{"url":"\/sun-life-stadium-tickets\/","subtitle":"Miami, FL"},"aliases":["Dolphins Stadium","Land Shark Stadium"]}
5
+ {"id":2,"term":"Turner Field","score":50,"data":{"url":"\/turner-field-tickets\/","subtitle":"Atlanta, GA"}}
6
+ {"id":3,"term":"Citi Field","score":92,"data":{"url":"\/citi-field-tickets\/","subtitle":"Atlanta, GA"},"aliases":["Shea Stadium"]}
data/test/test.conf ADDED
@@ -0,0 +1,8 @@
1
+ dir ./test/db
2
+ pidfile ./redis.pid
3
+ port 6379
4
+ timeout 300
5
+ loglevel debug
6
+ logfile stdout
7
+ databases 16
8
+ daemonize yes
@@ -1,7 +1,45 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestSoulmate < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
4
+ def test_integration_can_load_values_and_query
5
+ items = []
6
+ venues = File.open(File.expand_path(File.dirname(__FILE__)) + '/samples/venues.json', "r")
7
+ venues.each_line do |venue|
8
+ items << JSON.parse(venue)
9
+ end
10
+
11
+ items_loaded = Soulmate::Loader.new('venues').load(items)
12
+
13
+ assert_equal 6, items_loaded
14
+
15
+ matcher = Soulmate::Matcher.new('venues')
16
+ results = matcher.matches_for_term('stad', :limit => 5)
17
+
18
+ assert_equal 5, results.size
19
+ assert_equal 'Citi Field', results[0]['term']
20
+ end
21
+
22
+ def test_integration_can_load_values_and_query_via_aliases
23
+ items = []
24
+ venues = File.open(File.expand_path(File.dirname(__FILE__)) + '/samples/venues.json', "r")
25
+ venues.each_line do |venue|
26
+ items << JSON.parse(venue)
27
+ end
28
+
29
+ items_loaded = Soulmate::Loader.new('venues').load(items)
30
+
31
+ assert_equal 6, items_loaded
32
+
33
+ matcher = Soulmate::Matcher.new('venues')
34
+ results = matcher.matches_for_term('land shark stadium', :limit => 5)
35
+
36
+ assert_equal 1, results.size
37
+ assert_equal 'Sun Life Stadium', results[0]['term']
38
+
39
+ # Make sure we don't get dupes between aliases and the original term
40
+ # this shouldn't happen due to Redis doing an intersect, but just in case!
41
+
42
+ results = matcher.matches_for_term('stadium', :limit => 5)
43
+ assert_equal 5, results.size
6
44
  end
7
45
  end
metadata CHANGED
@@ -1,147 +1,162 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: soulmate
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 3
9
- version: 0.0.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Eric Waller
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-02-14 00:00:00 -05:00
12
+ date: 2011-07-07 00:00:00.000000000 -04:00
18
13
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: redis
17
+ requirement: &2164813260 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 2.1.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2164813260
26
+ - !ruby/object:Gem::Dependency
27
+ name: rack-contrib
28
+ requirement: &2164811620 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *2164811620
37
+ - !ruby/object:Gem::Dependency
38
+ name: vegas
39
+ requirement: &2164810860 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 0.1.8
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *2164810860
48
+ - !ruby/object:Gem::Dependency
49
+ name: sinatra
50
+ requirement: &2164809840 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 1.2.3
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *2164809840
59
+ - !ruby/object:Gem::Dependency
21
60
  name: shoulda
22
- requirement: &id001 !ruby/object:Gem::Requirement
61
+ requirement: &2164808840 !ruby/object:Gem::Requirement
23
62
  none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
30
67
  type: :development
31
68
  prerelease: false
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *2164808840
70
+ - !ruby/object:Gem::Dependency
34
71
  name: bundler
35
- requirement: &id002 !ruby/object:Gem::Requirement
72
+ requirement: &2164807780 !ruby/object:Gem::Requirement
36
73
  none: false
37
- requirements:
74
+ requirements:
38
75
  - - ~>
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 1
42
- - 0
43
- - 0
76
+ - !ruby/object:Gem::Version
44
77
  version: 1.0.0
45
78
  type: :development
46
79
  prerelease: false
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *2164807780
81
+ - !ruby/object:Gem::Dependency
49
82
  name: jeweler
50
- requirement: &id003 !ruby/object:Gem::Requirement
83
+ requirement: &2164807160 !ruby/object:Gem::Requirement
51
84
  none: false
52
- requirements:
85
+ requirements:
53
86
  - - ~>
54
- - !ruby/object:Gem::Version
55
- segments:
56
- - 1
57
- - 5
58
- - 2
87
+ - !ruby/object:Gem::Version
59
88
  version: 1.5.2
60
89
  type: :development
61
90
  prerelease: false
62
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *2164807160
92
+ - !ruby/object:Gem::Dependency
64
93
  name: rcov
65
- requirement: &id004 !ruby/object:Gem::Requirement
94
+ requirement: &2164806540 !ruby/object:Gem::Requirement
66
95
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- segments:
71
- - 0
72
- version: "0"
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
73
100
  type: :development
74
101
  prerelease: false
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
102
+ version_requirements: *2164806540
103
+ - !ruby/object:Gem::Dependency
77
104
  name: redis
78
- requirement: &id005 !ruby/object:Gem::Requirement
105
+ requirement: &2164805780 !ruby/object:Gem::Requirement
79
106
  none: false
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- segments:
84
- - 2
85
- - 0
86
- version: "2.0"
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '2.0'
87
111
  type: :runtime
88
112
  prerelease: false
89
- version_requirements: *id005
90
- - !ruby/object:Gem::Dependency
113
+ version_requirements: *2164805780
114
+ - !ruby/object:Gem::Dependency
91
115
  name: vegas
92
- requirement: &id006 !ruby/object:Gem::Requirement
116
+ requirement: &2164805020 !ruby/object:Gem::Requirement
93
117
  none: false
94
- requirements:
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- segments:
98
- - 0
99
- - 1
100
- - 0
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
101
121
  version: 0.1.0
102
122
  type: :runtime
103
123
  prerelease: false
104
- version_requirements: *id006
105
- - !ruby/object:Gem::Dependency
124
+ version_requirements: *2164805020
125
+ - !ruby/object:Gem::Dependency
106
126
  name: sinatra
107
- requirement: &id007 !ruby/object:Gem::Requirement
127
+ requirement: &2164804440 !ruby/object:Gem::Requirement
108
128
  none: false
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- segments:
113
- - 1
114
- - 0
115
- version: "1.0"
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '1.0'
116
133
  type: :runtime
117
134
  prerelease: false
118
- version_requirements: *id007
119
- - !ruby/object:Gem::Dependency
135
+ version_requirements: *2164804440
136
+ - !ruby/object:Gem::Dependency
120
137
  name: json
121
- requirement: &id008 !ruby/object:Gem::Requirement
138
+ requirement: &2164803800 !ruby/object:Gem::Requirement
122
139
  none: false
123
- requirements:
140
+ requirements:
124
141
  - - ~>
125
- - !ruby/object:Gem::Version
126
- segments:
127
- - 1
128
- - 4
129
- - 6
142
+ - !ruby/object:Gem::Version
130
143
  version: 1.4.6
131
144
  type: :runtime
132
145
  prerelease: false
133
- version_requirements: *id008
134
- description: Soulmate is a tool to help solve the common problem of developing a fast autocomplete feature. It uses Redis's sorted sets to build an index of partial words and corresponding top matches, and provides a simple sinatra app to query them. Soulmate finishes your sentences.
146
+ version_requirements: *2164803800
147
+ description: Soulmate is a tool to help solve the common problem of developing a fast
148
+ autocomplete feature. It uses Redis's sorted sets to build an index of partial words
149
+ and corresponding top matches, and provides a simple sinatra app to query them.
150
+ Soulmate finishes your sentences.
135
151
  email: eric@seatgeek.com
136
- executables:
152
+ executables:
137
153
  - soulmate
138
154
  - soulmate-web
139
155
  extensions: []
140
-
141
- extra_rdoc_files:
156
+ extra_rdoc_files:
142
157
  - LICENSE.txt
143
158
  - README.markdown
144
- files:
159
+ files:
145
160
  - .document
146
161
  - Gemfile
147
162
  - Gemfile.lock
@@ -158,41 +173,40 @@ files:
158
173
  - lib/soulmate/server.rb
159
174
  - lib/soulmate/version.rb
160
175
  - soulmate.gemspec
176
+ - test/db/.gitkeep
161
177
  - test/helper.rb
178
+ - test/samples/venues.json
179
+ - test/test.conf
162
180
  - test/test_soulmate.rb
163
181
  has_rdoc: true
164
182
  homepage: http://github.com/seatgeek/soulmate
165
- licenses:
183
+ licenses:
166
184
  - MIT
167
185
  post_install_message:
168
186
  rdoc_options: []
169
-
170
- require_paths:
187
+ require_paths:
171
188
  - lib
172
- required_ruby_version: !ruby/object:Gem::Requirement
189
+ required_ruby_version: !ruby/object:Gem::Requirement
173
190
  none: false
174
- requirements:
175
- - - ">="
176
- - !ruby/object:Gem::Version
177
- hash: -255035119
178
- segments:
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ segments:
179
196
  - 0
180
- version: "0"
181
- required_rubygems_version: !ruby/object:Gem::Requirement
197
+ hash: 1504170323034549202
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
199
  none: false
183
- requirements:
184
- - - ">="
185
- - !ruby/object:Gem::Version
186
- segments:
187
- - 0
188
- version: "0"
200
+ requirements:
201
+ - - ! '>='
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
189
204
  requirements: []
190
-
191
205
  rubyforge_project:
192
- rubygems_version: 1.3.7
206
+ rubygems_version: 1.6.2
193
207
  signing_key:
194
208
  specification_version: 3
195
209
  summary: Redis-backed service for fast autocompleting - extracted from SeatGeek
196
- test_files:
210
+ test_files:
197
211
  - test/helper.rb
198
212
  - test/test_soulmate.rb