soulmate 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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