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 +5 -0
- data/Gemfile.lock +14 -0
- data/README.markdown +3 -1
- data/Rakefile +38 -2
- data/lib/soulmate/loader.rb +2 -1
- data/lib/soulmate/server.rb +3 -0
- data/lib/soulmate/version.rb +1 -1
- data/soulmate.gemspec +18 -4
- data/test/db/.gitkeep +0 -0
- data/test/samples/venues.json +6 -0
- data/test/test.conf +8 -0
- data/test/test_soulmate.rb +40 -2
- metadata +126 -112
data/Gemfile
CHANGED
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
|
data/lib/soulmate/loader.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/soulmate/server.rb
CHANGED
data/lib/soulmate/version.rb
CHANGED
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.
|
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-
|
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.
|
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
data/test/test_soulmate.rb
CHANGED
@@ -1,7 +1,45 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestSoulmate < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
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
|
-
|
5
|
-
|
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: &
|
61
|
+
requirement: &2164808840 !ruby/object:Gem::Requirement
|
23
62
|
none: false
|
24
|
-
requirements:
|
25
|
-
- -
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
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: *
|
33
|
-
- !ruby/object:Gem::Dependency
|
69
|
+
version_requirements: *2164808840
|
70
|
+
- !ruby/object:Gem::Dependency
|
34
71
|
name: bundler
|
35
|
-
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: *
|
48
|
-
- !ruby/object:Gem::Dependency
|
80
|
+
version_requirements: *2164807780
|
81
|
+
- !ruby/object:Gem::Dependency
|
49
82
|
name: jeweler
|
50
|
-
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: *
|
63
|
-
- !ruby/object:Gem::Dependency
|
91
|
+
version_requirements: *2164807160
|
92
|
+
- !ruby/object:Gem::Dependency
|
64
93
|
name: rcov
|
65
|
-
requirement: &
|
94
|
+
requirement: &2164806540 !ruby/object:Gem::Requirement
|
66
95
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
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: *
|
76
|
-
- !ruby/object:Gem::Dependency
|
102
|
+
version_requirements: *2164806540
|
103
|
+
- !ruby/object:Gem::Dependency
|
77
104
|
name: redis
|
78
|
-
requirement: &
|
105
|
+
requirement: &2164805780 !ruby/object:Gem::Requirement
|
79
106
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
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: *
|
90
|
-
- !ruby/object:Gem::Dependency
|
113
|
+
version_requirements: *2164805780
|
114
|
+
- !ruby/object:Gem::Dependency
|
91
115
|
name: vegas
|
92
|
-
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: *
|
105
|
-
- !ruby/object:Gem::Dependency
|
124
|
+
version_requirements: *2164805020
|
125
|
+
- !ruby/object:Gem::Dependency
|
106
126
|
name: sinatra
|
107
|
-
requirement: &
|
127
|
+
requirement: &2164804440 !ruby/object:Gem::Requirement
|
108
128
|
none: false
|
109
|
-
requirements:
|
110
|
-
- -
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
|
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: *
|
119
|
-
- !ruby/object:Gem::Dependency
|
135
|
+
version_requirements: *2164804440
|
136
|
+
- !ruby/object:Gem::Dependency
|
120
137
|
name: json
|
121
|
-
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: *
|
134
|
-
description: Soulmate is a tool to help solve the common problem of developing a fast
|
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
|
-
|
178
|
-
segments:
|
191
|
+
requirements:
|
192
|
+
- - ! '>='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
segments:
|
179
196
|
- 0
|
180
|
-
|
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
|
-
|
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.
|
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
|