tanker 0.3.0 → 0.5.0
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/README.rdoc +2 -3
- data/VERSION +1 -1
- data/lib/tanker/configuration.rb +1 -1
- data/lib/tanker/railtie.rb +16 -0
- data/lib/tanker/tasks/tanker.rake +29 -0
- data/lib/tanker/utilities.rb +44 -0
- data/lib/tanker.rb +28 -15
- data/spec/spec_helper.rb +47 -0
- data/spec/tanker_spec.rb +6 -34
- data/spec/utilities_spec.rb +23 -0
- data/tanker.gemspec +8 -3
- metadata +8 -3
data/README.rdoc
CHANGED
@@ -5,8 +5,7 @@
|
|
5
5
|
IndexTank is a great search indexing service, this gem tries to make
|
6
6
|
any orm keep in sync with indextank with ease. This gem has a simple
|
7
7
|
but powerful approach to integrating IndexTank to any orm. The gem
|
8
|
-
also supports pagination using the +will_paginate/collection+.
|
9
|
-
simple to integrate with Rails 3 basically you just need to
|
8
|
+
also supports pagination using the +will_paginate/collection+.
|
10
9
|
|
11
10
|
There are very few things needed to integrate Tanker to any orm.
|
12
11
|
Basically the orm instance must respond to +id+ and any attributes
|
@@ -41,7 +40,7 @@ in the IndexTank Dashboard
|
|
41
40
|
include Tanker
|
42
41
|
|
43
42
|
# define the index by supplying the index name and the fields to index
|
44
|
-
tankit '
|
43
|
+
tankit 'my_index' do
|
45
44
|
indexes :title
|
46
45
|
indexes :content
|
47
46
|
indexes :tag_list #NOTICE this is an array of Tags! Awesome!
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/lib/tanker/configuration.rb
CHANGED
@@ -3,7 +3,7 @@ module Tanker
|
|
3
3
|
module Configuration
|
4
4
|
|
5
5
|
def configuration
|
6
|
-
|
6
|
+
@@configuration || raise(NotConfigured, "Please configure Tanker. Set Tanker.configuration = {:url => ''}")
|
7
7
|
end
|
8
8
|
|
9
9
|
def configuration=(new_configuration)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
module Tanker
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
config.index_tank_url = ''
|
6
|
+
|
7
|
+
config.after_initialize do
|
8
|
+
Tanker.configuration = {:url => config.index_tank_url }
|
9
|
+
end
|
10
|
+
|
11
|
+
rake_tasks do
|
12
|
+
load "tanker/tasks/tanker.rake"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
namespace :tanker do
|
2
|
+
|
3
|
+
desc "Reindex all models"
|
4
|
+
task :reindex => :environment do
|
5
|
+
puts "reinexing all models"
|
6
|
+
load_models
|
7
|
+
Tanker::Utilities.reindex_all_models
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Clear all Index Tank indexes"
|
11
|
+
task :clear_indexes => :environment do
|
12
|
+
puts "clearing all indexes"
|
13
|
+
load_models
|
14
|
+
Tanker::Utilities.clear_all_indexes
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_models
|
18
|
+
app_root = Rails.root
|
19
|
+
dirs = ["#{app_root}/app/models/"] + Dir.glob("#{app_root}/vendor/plugins/*/app/models/")
|
20
|
+
|
21
|
+
dirs.each do |base|
|
22
|
+
Dir["#{base}**/*.rb"].each do |file|
|
23
|
+
model_name = file.gsub(/^#{base}([\w_\/\\]+)\.rb/, '\1')
|
24
|
+
next if model_name.nil?
|
25
|
+
model_name.camelize.constantize
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Tanker
|
2
|
+
module Utilities
|
3
|
+
class << self
|
4
|
+
def get_model_classes
|
5
|
+
Tanker.included_in ? Tanker.included_in : []
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_available_indexes
|
9
|
+
get_model_classes.map{|model| model.index_name}.uniq.compact
|
10
|
+
end
|
11
|
+
|
12
|
+
def clear_all_indexes
|
13
|
+
get_available_indexes.each do |index_name|
|
14
|
+
begin
|
15
|
+
index = Tanker.api.get_index(index_name)
|
16
|
+
|
17
|
+
if index.exists?
|
18
|
+
puts "Deleting #{index_name} index"
|
19
|
+
index.delete_index()
|
20
|
+
end
|
21
|
+
puts "Creating #{index_name} index"
|
22
|
+
index.create_index()
|
23
|
+
puts "Waiting for the index to be ready"
|
24
|
+
while not index.running?
|
25
|
+
sleep 0.5
|
26
|
+
end
|
27
|
+
rescue => e
|
28
|
+
puts "There was an error clearing or creating the #{index_name} index: #{e.to_s}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def reindex_all_models
|
34
|
+
get_model_classes.each do |klass|
|
35
|
+
puts "Indexing #{klass.to_s} model"
|
36
|
+
klass.all.each do |model_instance|
|
37
|
+
model_instance.update_tank_indexes
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
data/lib/tanker.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "bundler"
|
3
|
-
require 'indextank_client'
|
4
3
|
|
4
|
+
Bundler.setup :default
|
5
|
+
|
6
|
+
require 'indextank_client'
|
5
7
|
require 'tanker/configuration'
|
8
|
+
require 'tanker/utilities'
|
6
9
|
require 'will_paginate/collection'
|
7
10
|
|
8
|
-
|
11
|
+
|
12
|
+
if defined? Rails
|
13
|
+
require 'tanker/railtie'
|
14
|
+
end
|
9
15
|
|
10
16
|
module Tanker
|
11
17
|
|
@@ -13,11 +19,20 @@ module Tanker
|
|
13
19
|
class NoBlockGiven < StandardError; end
|
14
20
|
|
15
21
|
autoload :Configuration, 'tanker/configuration'
|
16
|
-
|
17
22
|
extend Configuration
|
18
23
|
|
19
24
|
class << self
|
25
|
+
attr_reader :included_in
|
26
|
+
|
27
|
+
def api
|
28
|
+
@api ||= IndexTank::ApiClient.new(Tanker.configuration[:url])
|
29
|
+
end
|
30
|
+
|
20
31
|
def included(klass)
|
32
|
+
@included_in ||= []
|
33
|
+
@included_in << klass
|
34
|
+
@included_in.uniq!
|
35
|
+
|
21
36
|
klass.instance_variable_set('@tanker_configuration', configuration)
|
22
37
|
klass.instance_variable_set('@tanker_indexes', [])
|
23
38
|
klass.send :include, InstanceMethods
|
@@ -26,7 +41,6 @@ module Tanker
|
|
26
41
|
class << klass
|
27
42
|
define_method(:per_page) { 10 } unless respond_to?(:per_page)
|
28
43
|
end
|
29
|
-
|
30
44
|
end
|
31
45
|
end
|
32
46
|
|
@@ -48,15 +62,12 @@ module Tanker
|
|
48
62
|
@tanker_indexes << field
|
49
63
|
end
|
50
64
|
|
51
|
-
def api
|
52
|
-
@api ||= IndexTank::ApiClient.new(Tanker.configuration[:url])
|
53
|
-
end
|
54
|
-
|
55
65
|
def index
|
56
|
-
@index ||= api.get_index(self.index_name)
|
66
|
+
@index ||= Tanker.api.get_index(self.index_name)
|
57
67
|
end
|
58
68
|
|
59
69
|
def search_tank(query, options = {})
|
70
|
+
ids = []
|
60
71
|
page = options.delete(:page) || 1
|
61
72
|
per_page = options.delete(:per_page) || self.per_page
|
62
73
|
|
@@ -72,13 +83,12 @@ module Tanker
|
|
72
83
|
|
73
84
|
results = index.search(query, options)
|
74
85
|
|
75
|
-
unless results[
|
76
|
-
ids = results[
|
86
|
+
unless results["results"].empty?
|
87
|
+
ids = results["results"].map{|res| res["docid"].split(" ", 2)[1]}
|
77
88
|
else
|
78
89
|
return nil
|
79
90
|
end
|
80
91
|
|
81
|
-
|
82
92
|
@entries = WillPaginate::Collection.create(page, per_page) do |pager|
|
83
93
|
result = self.find(ids)
|
84
94
|
# inject the result array into the paginated collection:
|
@@ -86,20 +96,21 @@ module Tanker
|
|
86
96
|
|
87
97
|
unless pager.total_entries
|
88
98
|
# the pager didn't manage to guess the total count, do it manually
|
89
|
-
pager.total_entries = results[
|
99
|
+
pager.total_entries = results["matches"]
|
90
100
|
end
|
91
101
|
end
|
92
102
|
end
|
93
103
|
|
94
104
|
end
|
95
105
|
|
96
|
-
# these are the
|
106
|
+
# these are the instance methods included
|
97
107
|
module InstanceMethods
|
98
108
|
|
99
109
|
def tanker_indexes
|
100
110
|
self.class.tanker_indexes
|
101
111
|
end
|
102
112
|
|
113
|
+
# update a create instance from index tank
|
103
114
|
def update_tank_indexes
|
104
115
|
data = {}
|
105
116
|
|
@@ -114,13 +125,15 @@ module Tanker
|
|
114
125
|
self.class.index.add_document(it_doc_id, data)
|
115
126
|
end
|
116
127
|
|
128
|
+
# delete instance from index tank
|
117
129
|
def delete_tank_indexes
|
118
130
|
self.class.index.delete_document(it_doc_id)
|
119
131
|
end
|
120
132
|
|
133
|
+
# create a unique index based on the model name and unique id
|
121
134
|
def it_doc_id
|
122
135
|
self.class.name + ' ' + self.id.to_s
|
123
136
|
end
|
124
|
-
|
125
137
|
end
|
126
138
|
end
|
139
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -9,3 +9,50 @@ require 'rspec'
|
|
9
9
|
Rspec.configure do |c|
|
10
10
|
c.mock_with :rspec
|
11
11
|
end
|
12
|
+
|
13
|
+
Tanker.configuration = {:url => 'http://api.indextank.com'}
|
14
|
+
|
15
|
+
class Dummy
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
class Person
|
20
|
+
include Tanker
|
21
|
+
|
22
|
+
tankit 'people' do
|
23
|
+
indexes :name
|
24
|
+
indexes :last_name
|
25
|
+
end
|
26
|
+
|
27
|
+
def id
|
28
|
+
1
|
29
|
+
end
|
30
|
+
|
31
|
+
def name
|
32
|
+
'paco'
|
33
|
+
end
|
34
|
+
|
35
|
+
def last_name
|
36
|
+
'viramontes'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Dog
|
41
|
+
include Tanker
|
42
|
+
|
43
|
+
tankit 'animals' do
|
44
|
+
indexes :name
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
class Cat
|
50
|
+
include Tanker
|
51
|
+
|
52
|
+
tankit 'animals' do
|
53
|
+
indexes :name
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
data/spec/tanker_spec.rb
CHANGED
@@ -1,33 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
Tanker.configuration = {:url => 'http://api.indextank.com'}
|
4
|
-
|
5
|
-
class Dummy
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
|
10
|
-
class Person
|
11
|
-
include Tanker
|
12
|
-
|
13
|
-
tankit 'persons' do
|
14
|
-
indexes :name
|
15
|
-
indexes :last_name
|
16
|
-
end
|
17
|
-
|
18
|
-
def id
|
19
|
-
1
|
20
|
-
end
|
21
|
-
|
22
|
-
def name
|
23
|
-
'paco'
|
24
|
-
end
|
25
|
-
|
26
|
-
def last_name
|
27
|
-
'viramontes'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
3
|
describe Tanker do
|
32
4
|
|
33
5
|
it 'sets configuration' do
|
@@ -66,7 +38,7 @@ describe Tanker do
|
|
66
38
|
|
67
39
|
describe 'tanker instance' do
|
68
40
|
it 'should create an api instance' do
|
69
|
-
|
41
|
+
Tanker.api.class.should == IndexTank::ApiClient
|
70
42
|
end
|
71
43
|
|
72
44
|
it 'should create a connexion to index tank' do
|
@@ -76,12 +48,12 @@ describe Tanker do
|
|
76
48
|
it 'should be able to perform a seach query' do
|
77
49
|
Person.index.should_receive(:search).and_return(
|
78
50
|
{
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
51
|
+
"matches" => 1,
|
52
|
+
"results" => [{
|
53
|
+
"docid" => Person.new.it_doc_id,
|
54
|
+
"name" => 'pedro'
|
83
55
|
}],
|
84
|
-
|
56
|
+
"search_time" => 1
|
85
57
|
}
|
86
58
|
)
|
87
59
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Dummy
|
4
|
+
include Tanker
|
5
|
+
|
6
|
+
tankit 'dummy index' do
|
7
|
+
indexes :name
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
describe Tanker::Utilities do
|
14
|
+
|
15
|
+
it "should get the models where Tanker module was included" do
|
16
|
+
(Tanker::Utilities.get_model_classes - [Dummy, Person, Dog, Cat]).should == []
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should get the available indexes" do
|
20
|
+
Tanker::Utilities.get_available_indexes.should == ["people", "animals", "dummy index"]
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/tanker.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{tanker}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["@kidpollo"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-21}
|
13
13
|
s.description = %q{IndexTank is a great search indexing service, this gem tries to make any orm keep in sync with indextank with ease}
|
14
14
|
s.email = %q{kidpollo@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -29,8 +29,12 @@ Gem::Specification.new do |s|
|
|
29
29
|
"lib/indextank_client.rb",
|
30
30
|
"lib/tanker.rb",
|
31
31
|
"lib/tanker/configuration.rb",
|
32
|
+
"lib/tanker/railtie.rb",
|
33
|
+
"lib/tanker/tasks/tanker.rake",
|
34
|
+
"lib/tanker/utilities.rb",
|
32
35
|
"spec/spec_helper.rb",
|
33
36
|
"spec/tanker_spec.rb",
|
37
|
+
"spec/utilities_spec.rb",
|
34
38
|
"tanker.gemspec"
|
35
39
|
]
|
36
40
|
s.homepage = %q{http://github.com/kidpollo/tanker}
|
@@ -40,7 +44,8 @@ Gem::Specification.new do |s|
|
|
40
44
|
s.summary = %q{IndexTank integration to your favorite orm}
|
41
45
|
s.test_files = [
|
42
46
|
"spec/spec_helper.rb",
|
43
|
-
"spec/tanker_spec.rb"
|
47
|
+
"spec/tanker_spec.rb",
|
48
|
+
"spec/utilities_spec.rb"
|
44
49
|
]
|
45
50
|
|
46
51
|
if s.respond_to? :specification_version then
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 5
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.5.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- "@kidpollo"
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-21 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -71,8 +71,12 @@ files:
|
|
71
71
|
- lib/indextank_client.rb
|
72
72
|
- lib/tanker.rb
|
73
73
|
- lib/tanker/configuration.rb
|
74
|
+
- lib/tanker/railtie.rb
|
75
|
+
- lib/tanker/tasks/tanker.rake
|
76
|
+
- lib/tanker/utilities.rb
|
74
77
|
- spec/spec_helper.rb
|
75
78
|
- spec/tanker_spec.rb
|
79
|
+
- spec/utilities_spec.rb
|
76
80
|
- tanker.gemspec
|
77
81
|
has_rdoc: true
|
78
82
|
homepage: http://github.com/kidpollo/tanker
|
@@ -109,3 +113,4 @@ summary: IndexTank integration to your favorite orm
|
|
109
113
|
test_files:
|
110
114
|
- spec/spec_helper.rb
|
111
115
|
- spec/tanker_spec.rb
|
116
|
+
- spec/utilities_spec.rb
|