flying-sphinx 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - ree
data/HISTORY ADDED
@@ -0,0 +1,48 @@
1
+ 0.5.2 - 28th July 2011
2
+ * Log SSH exceptions during indexing (when we're being verbose).
3
+ * This history file now exists (pre-populated).
4
+ * An actual README, courtesy of some prodding by Mislav.
5
+ * Added support for wordforms (automatically sent through to the server).
6
+ * Don't presume that ENV['DATABASE_URL'] exists - it won't in non-Heroku environments.
7
+
8
+ 0.5.1 - 23rd June 2011
9
+ * Adding rake as a development dependency, just for Travis CI.
10
+ * Have a default database port - Cedar stack doesn't set it by default.
11
+ * Allow for newer net-ssh gem versions (including 2.1).
12
+ * Sinatra loader (equivalent of a Railtie).
13
+ * Fixed bug for handling JSON always as a Hash (sometimes it's an Array).
14
+ * Better error checking when index requests don't get created as expected.
15
+
16
+ 0.5.0 - 12th May 2011
17
+ * Rake tasks for latest actions and last index log.
18
+ * Switching to version 2 of the API.
19
+ * Adding default rake task for Travis CI.
20
+ * Allow for Rails 2 versions of Delayed Job.
21
+ * Set client_key for connections, configuration if supported by Riddle and Thinking Sphinx.
22
+ * Allow server to automatically close SSH connections.
23
+ * Adding logging on API calls (Josh Kalderimis).
24
+ * Allow for non-tunnelled index requests (for RDS).
25
+ * Don't use custom database adapter if the database is MySQL.
26
+ * Fall back to environment variables for connection settings.
27
+ * Switching from JSON and HTTParty to MultiJSON and Faraday (Josh Kalderimis).
28
+ * Using Bundler as gem driver instead of Jeweler (Josh Kalderimis).
29
+ * More flexible JSON dependency.
30
+
31
+ 0.4.4 - 7th February 2011
32
+ * Using ActiveRecord's connection information, as we can't rely on heroku_env.yml to be around.
33
+
34
+ 0.4.3 - 4th February 2011
35
+ * Wait until the SSH session and forward is prepared before making the index request.
36
+ * If credentials are invalid, raise an appropriate error instead of letting the JSON parsing fail.
37
+
38
+ 0.4.2 - 29th January 2011
39
+ * Set the Thinking Sphinx database adapter when loaded, instead of requiring the Rails dispatcher to setup.
40
+
41
+ 0.4.1 - 24th January 2011
42
+ * Comparing against response bodies for consistency (and avoiding HTTParty magic).
43
+
44
+ 0.4.0 - 18th January 2011
45
+ * Using HTTPS for API calls.
46
+ * Using Flying Sphinx server's account identifier instead of the heroku id from the environment (the latter being unreliable and not part of any official Heroku add-on documentation).
47
+
48
+ Note: Any releases before this were most definitely experimental and pre-alpha.
data/README.textile CHANGED
@@ -1,3 +1,38 @@
1
1
  h1. Flying Sphinx
2
2
 
3
- Coming soon - well, with a bit of luck.
3
+ This library is the code behind the @flying-sphinx@ gem. Its sole purpose is to connect Thinking Sphinx to the "Flying Sphinx Heroku addon":http://addons.heroku.com/flying_sphinx - and so you can just use Thinking Sphinx as normal on Heroku-hosted sites.
4
+
5
+ h2. Installation and Usage
6
+
7
+ This is all covered pretty well on "the Flying Sphinx site":http://flying-sphinx.com/docs, but if you're reading this on Github, you're probably keen on using this repository as the source instead of the gem. Here's the code snippet for your @Gemfile@:
8
+
9
+ <pre><code>gem 'flying-sphinx',
10
+ :git => 'git://github.com/flying-sphinx/flying-sphinx.git'</code></pre>
11
+
12
+ h2. Compatibility and Limitations
13
+
14
+ Flying Sphinx is built with support for Rails 2.3.6 and beyond. Sadly, earlier versions of Rails aren't supported due to a requirement of a recent version of Rack deep in the dependency tree. It's not tested against Rails 3.1 at this time, but in theory should work fine. Let me know if I'm wrong!
15
+
16
+ It works with Rails 1.8.7 and 1.9.2, and on both Heroku's Bamboo and Cedar stacks. You _do_ need to use it with Heroku at this point - allowing others hosting elsewhere to use Flying Sphinx is something I'm considering, but it's not possible right now.
17
+
18
+ There are limitations with Heroku's setup and Sphinx/Thinking Sphinx functionality - again, the official documentation "covers this":http://flying-sphinx.com/docs#limitations, so have a read there.
19
+
20
+ h2. Contributing
21
+
22
+ Patches are indeed welcome - though I understand it's a little tricky to test them thoroughly. It's best to give your changes a spin on your Heroku app that's running Flying Sphinx (and if you don't have one of those, I'm a little confused as to why you're contributing).
23
+
24
+ API documentation is required - consider this paragraph a placeholder for that.
25
+
26
+ In the meantime, please keep in mind the following:
27
+
28
+ * Write tests using RSpec
29
+ * Keep your commits in a separate branch
30
+ * Don't change the version or History file in your feature branch - makes merging changes much easier.
31
+
32
+ h2. Contributors
33
+
34
+ * "Josh Kalderimis":http://blog.cookiestack.com/ for switching the API calls to Faraday, improving the specs, a ton of debugging, and encouraging a versioned API.
35
+
36
+ h2. Licence
37
+
38
+ Copyright &copy; 2011 Pat Allan, released under an MIT licence.
@@ -1,10 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = 'flying-sphinx'
4
- s.version = '0.5.1'
4
+ s.version = '0.5.2'
5
5
  s.authors = ['Pat Allan']
6
6
  s.email = 'pat@freelancing-gods.com'
7
- s.date = '2011-05-12'
8
7
  s.summary = 'Sphinx in the Cloud'
9
8
  s.description = 'Hooks Thinking Sphinx into the Flying Sphinx service'
10
9
  s.homepage = 'https://flying-sphinx.com'
@@ -74,6 +74,6 @@ class FlyingSphinx::API
74
74
  end
75
75
 
76
76
  def log?
77
- ENV['VERBOSE_LOGGING'].present?
77
+ ENV['VERBOSE_LOGGING'] && ENV['VERBOSE_LOGGING'].length > 0
78
78
  end
79
79
  end
@@ -16,9 +16,20 @@ class FlyingSphinx::Configuration
16
16
  def sphinx_configuration
17
17
  thinking_sphinx.generate
18
18
  set_database_settings
19
+ set_wordforms
19
20
 
20
21
  riddle.render
21
22
  end
23
+
24
+ def wordform_file_pairs
25
+ @wordform_file_pairs ||= begin
26
+ pairs = {}
27
+ wordform_sources.each_with_index do |source, index|
28
+ pairs[source] = "#{base_path}/wordforms/#{index}.txt"
29
+ end
30
+ pairs
31
+ end
32
+ end
22
33
 
23
34
  def start_sphinx
24
35
  api.post('start')
@@ -112,6 +123,19 @@ class FlyingSphinx::Configuration
112
123
  end
113
124
  end
114
125
  end
126
+
127
+ def set_wordforms
128
+ riddle.indexes.each do |index|
129
+ next unless index.respond_to?(:wordforms)
130
+ index.wordforms = wordform_file_pairs[index.wordforms]
131
+ end
132
+ end
133
+
134
+ def wordform_sources
135
+ @wordform_sources ||= riddle.indexes.collect { |index|
136
+ index.respond_to?(:wordforms) ? index.wordforms : nil
137
+ }.flatten.compact.uniq
138
+ end
115
139
 
116
140
  def identifier_from_env
117
141
  ENV['FLYING_SPHINX_IDENTIFIER']
@@ -30,6 +30,7 @@ class FlyingSphinx::IndexRequest
30
30
 
31
31
  def update_and_index
32
32
  update_sphinx_configuration
33
+ update_sphinx_reference_files
33
34
  index
34
35
  end
35
36
 
@@ -68,6 +69,15 @@ class FlyingSphinx::IndexRequest
68
69
  def update_sphinx_configuration
69
70
  api.put('/', :configuration => configuration.sphinx_configuration)
70
71
  end
72
+
73
+ def update_sphinx_reference_files
74
+ configuration.wordform_file_pairs.each do |local, remote|
75
+ api.post '/add_file',
76
+ :setting => 'wordforms',
77
+ :file_name => remote.split('/').last,
78
+ :content => open(local).read
79
+ end
80
+ end
71
81
 
72
82
  def index
73
83
  if FlyingSphinx::Tunnel.required?
@@ -75,9 +85,10 @@ class FlyingSphinx::IndexRequest
75
85
  else
76
86
  direct_index
77
87
  end
78
- rescue Net::SSH::Exception
88
+ rescue Net::SSH::Exception => err
79
89
  # Server closed the connection on us. That's (hopefully) expected, nothing
80
90
  # to worry about.
91
+ puts "SSH/Indexing Error: #{err.message}" if log?
81
92
  rescue RuntimeError => err
82
93
  puts err.message
83
94
  end
@@ -137,4 +148,8 @@ class FlyingSphinx::IndexRequest
137
148
  def api
138
149
  configuration.api
139
150
  end
151
+
152
+ def log?
153
+ ENV['VERBOSE_LOGGING'] && ENV['VERBOSE_LOGGING'].length > 0
154
+ end
140
155
  end
@@ -10,7 +10,7 @@ unless Rails.env.development? || Rails.env.test?
10
10
  config.client_key
11
11
  end
12
12
 
13
- if ENV['DATABASE_URL'][/^mysql/].nil?
13
+ if ENV['DATABASE_URL'] && ENV['DATABASE_URL'][/^mysql/].nil?
14
14
  ThinkingSphinx.database_adapter = FlyingSphinx::HerokuSharedAdapter
15
15
  end
16
16
  end
@@ -11,7 +11,7 @@ class FlyingSphinx::Railtie < Rails::Railtie
11
11
  ThinkingSphinx::Configuration.instance.configuration.searchd.client_key =
12
12
  config.client_key
13
13
 
14
- if ENV['DATABASE_URL'][/^mysql/].nil?
14
+ if ENV['DATABASE_URL'] && ENV['DATABASE_URL'][/^mysql/].nil?
15
15
  ThinkingSphinx.database_adapter = FlyingSphinx::HerokuSharedAdapter
16
16
  end
17
17
  end unless Rails.env.development? || Rails.env.test?
@@ -3,7 +3,8 @@ require 'spec_helper'
3
3
  describe FlyingSphinx::IndexRequest do
4
4
  let(:api) { FlyingSphinx::API.new 'foo', 'bar' }
5
5
  let(:configuration) {
6
- stub(:configuration, :api => api, :sphinx_configuration => 'foo {}')
6
+ stub(:configuration, :api => api, :sphinx_configuration => 'foo {}',
7
+ :wordform_file_pairs => {})
7
8
  }
8
9
 
9
10
  let(:index_response) {
@@ -67,6 +68,32 @@ describe FlyingSphinx::IndexRequest do
67
68
  end
68
69
  end
69
70
 
71
+ context 'with wordforms' do
72
+ let(:file_params) {
73
+ {:setting => 'wordforms', :file_name => 'bar.txt', :content => 'baz'}
74
+ }
75
+
76
+ before :each do
77
+ configuration.stub!(:wordform_file_pairs => {'foo.txt' => 'bar.txt'})
78
+ index_request.stub!(:open => double('file', :read => 'baz'))
79
+ end
80
+
81
+ it "sends the wordform file" do
82
+ api.should_receive(:put).with('/', conf_params).and_return('ok')
83
+ api.should_receive(:post).with('/add_file', file_params).
84
+ and_return('ok')
85
+ api.should_receive(:post).
86
+ with('indices', index_params).and_return(index_response)
87
+
88
+ begin
89
+ Timeout::timeout(0.2) {
90
+ index_request.update_and_index
91
+ }
92
+ rescue Timeout::Error
93
+ end
94
+ end
95
+ end
96
+
70
97
  context 'delta request without delta support' do
71
98
  it "should explain why the request failed" do
72
99
  api.should_receive(:put).
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: flying-sphinx
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.5.1
5
+ version: 0.5.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Pat Allan
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-12 00:00:00 +10:00
13
+ date: 2011-07-28 00:00:00 +10:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -166,7 +166,9 @@ extra_rdoc_files:
166
166
  - README.textile
167
167
  files:
168
168
  - .gitignore
169
+ - .travis.yml
169
170
  - Gemfile
171
+ - HISTORY
170
172
  - LICENCE
171
173
  - README.textile
172
174
  - Rakefile