lannon-lunr 2.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ require "autotest/restart"
2
+
3
+ Autotest.add_hook :initialize do |at|
4
+ at.testlib = "isolate/now"
5
+ end
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm gemset use lunr
@@ -0,0 +1,59 @@
1
+ === 2.0.9 / 2011-03-15
2
+
3
+ * Bundler & Jeweler added, Isolate removed
4
+
5
+ === 2.0.8 / 2010-09-13
6
+
7
+ * Store pagination and total info in default Search JSON.
8
+
9
+ === 2.0.8 / 2010-09-13
10
+
11
+ * Add a default Lunr::Search#as_json.
12
+
13
+ === 2.0.7 / 2010-09-11
14
+
15
+ * Stop freezing, it's annoying.
16
+
17
+ === 2.0.6 / 2010-09-09
18
+
19
+ * Improve booleans. Fix Sunspot's cast, add property? sugar method.
20
+ * Add Search#results (a faster to_a).
21
+
22
+ === 2.0.5 / 2010-09-08
23
+
24
+ * Add default as_json method (just returns backing store).
25
+
26
+ === 2.0.4 / 2010-09-07
27
+
28
+ * Unbreak model instantiation, switch to Hash backing store.
29
+
30
+ === 2.0.3 / 2010-09-07
31
+
32
+ * Cleanups, squash warnings.
33
+ * Improve the README a bit.
34
+ * Improve search and scope examples.
35
+ * Remove unnecessary monkeypatch.
36
+
37
+ === 2.0.2 / 2010-09-02
38
+
39
+ * Fix Rakefile typo.
40
+ * Add ModelClass.first search helper.
41
+ * Require Ruby >= 1.8.7.
42
+ * Tighten Sunspot dep to = 1.1.0.
43
+ * Improve the README a bit.
44
+
45
+ === 2.0.1 / 2010-09-02
46
+
47
+ * Clean up model and search.
48
+
49
+ === 2.0.0 / 2010-09-01
50
+
51
+ * Reboot.
52
+
53
+ === 1.0.1 / 2010-08-25
54
+
55
+ * Handle missing :p value correctly.
56
+
57
+ === 1.0.0 / 2010-08-25
58
+
59
+ * Birthday!
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ gem "activesupport", "2.3.4"
5
+ gem "activerecord", "2.3.4"
6
+ gem "sunspot", "1.2.1"
7
+
8
+ # Add dependencies to develop your gem here.
9
+ # Include everything needed to run rake, tests, features, etc.
10
+ group :development do
11
+ gem "bundler", "1.0.10"
12
+ gem "jeweler", "1.5.2"
13
+ gem "fakeweb", "1.3.0"
14
+ gem "shoulda", "2.11.3"
15
+ gem "mocha", "0.9.12"
16
+ end
@@ -0,0 +1,37 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activerecord (2.3.4)
5
+ activesupport (= 2.3.4)
6
+ activesupport (2.3.4)
7
+ builder (3.0.0)
8
+ escape (0.0.4)
9
+ fakeweb (1.3.0)
10
+ git (1.2.5)
11
+ jeweler (1.5.2)
12
+ bundler (~> 1.0.0)
13
+ git (>= 1.2.5)
14
+ rake
15
+ mocha (0.9.12)
16
+ pr_geohash (1.0.0)
17
+ rake (0.8.7)
18
+ rsolr (0.12.1)
19
+ builder (>= 2.1.2)
20
+ shoulda (2.11.3)
21
+ sunspot (1.2.1)
22
+ escape (= 0.0.4)
23
+ pr_geohash (~> 1.0)
24
+ rsolr (= 0.12.1)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ activerecord (= 2.3.4)
31
+ activesupport (= 2.3.4)
32
+ bundler (= 1.0.10)
33
+ fakeweb (= 1.3.0)
34
+ jeweler (= 1.5.2)
35
+ mocha (= 0.9.12)
36
+ shoulda (= 2.11.3)
37
+ sunspot (= 1.2.1)
@@ -0,0 +1,168 @@
1
+ = Lunr
2
+
3
+ * http://github.com/jbarnette/lunr
4
+
5
+ == Description
6
+
7
+ A simple read-only interface to Solr, built on Sunspot.
8
+
9
+ Lunr makes it easy to query and create objects from a Sunspot-managed
10
+ Solr index without requiring all the knowledge, code, and data used to
11
+ build the index in the first place. If you have complex indexes with a
12
+ stored fields and need to search / access those fields without access
13
+ to the original data store, Lunr might be what you're looking for.
14
+
15
+ == A Lunr Model
16
+
17
+ require "lunr"
18
+
19
+ class My::SimpleTrack
20
+ include Lunr::Model
21
+
22
+ searches "Track" do
23
+ property :album, :text
24
+ property :artist, :text
25
+ property :title, :text
26
+
27
+ time :accepted_at
28
+ boolean :hot
29
+ string :state
30
+ end
31
+
32
+ scope do
33
+ order_by :hot, :desc
34
+ order_by :accepted_at, :desc
35
+
36
+ with :state, "accepted"
37
+ end
38
+
39
+ scope :hot do
40
+ with :hot, true
41
+ end
42
+
43
+ scope :state do |q, state|
44
+ q.with :state, state
45
+ end
46
+ end
47
+
48
+ === Including the Module
49
+
50
+ All model classes must <code>include Lunr::Model</code>.
51
+
52
+ === Define the Search Index
53
+
54
+ Time to tell Solr what this class searches, and which fields are
55
+ properties. The DSL in here is exactly the same as Sunspot's, with the
56
+ addition of a <code>property</code> method. Calling
57
+ <code>property</code> tells Lunr that you expect access to this field,
58
+ generates an <code>attr_reader</code> and passes it along to Sunspot's
59
+ DSL as <code>:stored => true</code>.
60
+
61
+ searches "Track" do
62
+ property :album, :text
63
+ property :artist, :text
64
+ property :title, :text
65
+
66
+ time :accepted_at
67
+ boolean :hot
68
+ string :state
69
+ end
70
+
71
+ The <code>searches</code> method also takes an optional type name,
72
+ which can be used to map Lunr model types to differing search
73
+ results. In this case, <code>My::SimpleTrack</code> will search
74
+ documents with an original type of <code>Track</code>.
75
+
76
+ List every criteria you might want to search by, but omit any of
77
+ Sunspot's DSL that involves indexing.
78
+
79
+ === Default Scope
80
+
81
+ Call <code>scope</code> with no name to set default filtering,
82
+ ordering, and pagination properties.
83
+
84
+ scope do
85
+ order_by :hot, :desc
86
+ order_by :accepted_at, :desc
87
+
88
+ with :state, "accepted"
89
+ end
90
+
91
+ === Named Scopes
92
+
93
+ You can define any number of named scopes to make searching
94
+ simpler. They're made availble as static methods on the model class,
95
+ and they're chainable when searching. See the "Searching" section
96
+ below.
97
+
98
+ scope :hot do
99
+ with :hot, true
100
+ end
101
+
102
+ Scope blocks without parameters are <code>instance_eval</code>ed in
103
+ the Sunspot query DSL's context. If your scope takes parameters, the
104
+ first param must be the Sunspot query object.
105
+
106
+ scope :state do |q, state|
107
+ q.with :state, state
108
+ end
109
+
110
+ == Searching
111
+
112
+ Use Sunspot's excellent search DSL for ad hoc searches.
113
+
114
+ My::SimpleTrack.search
115
+ My::SimpleTrack.all # same thing
116
+
117
+ My::SimpleTrack.search { with :title, "Hello" }
118
+ My::SimpleTrack.first { with :title, "First!" }
119
+
120
+ All searches return a <code>Lunr::Search</code> object, and searches
121
+ can be narrowed using the Sunspot query DSL or named scopes. Searches
122
+ aren't run until an <code>Enumerable</code>, arraylike, or pagination
123
+ method is called on the search object. For convenience,
124
+ <code>Lunr::Search</code> quacks like
125
+ <code>WillPaginate::Collection</code>.
126
+
127
+ search = My::SimpleTrack.hot.scope { |q| q.fulltext "hello" }
128
+ p :page => search.page, :total => search.total
129
+
130
+ search.each do |track|
131
+ puts "#{track.title} by #{track.artist} on #{track.album}."
132
+ end
133
+
134
+ == Installation
135
+
136
+ $ gem install lunr
137
+
138
+ == Development
139
+
140
+ Lunr is under pretty heavy development. It was extracted from a Real
141
+ Application, and barely has any tests of its own. It will be in flux a
142
+ bit. Contributions and suggestions are very welcome.
143
+
144
+ Install the <code>isolate</code> gem and run <code>rake</code>. All
145
+ dev dependencies will be installed automatically.
146
+
147
+ == License
148
+
149
+ Copyright 2010 John Barnette (code@jbarnette.com)
150
+
151
+ Permission is hereby granted, free of charge, to any person obtaining
152
+ a copy of this software and associated documentation files (the
153
+ 'Software'), to deal in the Software without restriction, including
154
+ without limitation the rights to use, copy, modify, merge, publish,
155
+ distribute, sublicense, and/or sell copies of the Software, and to
156
+ permit persons to whom the Software is furnished to do so, subject to
157
+ the following conditions:
158
+
159
+ The above copyright notice and this permission notice shall be
160
+ included in all copies or substantial portions of the Software.
161
+
162
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
163
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
164
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
165
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
166
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
167
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
168
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,52 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "lannon-lunr"
16
+ gem.homepage = "http://github.com/lannon/lunr"
17
+ gem.summary = %Q{A simple read-only interface to Solr, built on Sunspot}
18
+ gem.description = %Q{A simple read-only interface to Solr, built on Sunspot.
19
+ Lunr makes it easy to query and create objects from a Sunspot-managed
20
+ Solr index without requiring all the knowledge, code, and data used to
21
+ build the index in the first place. If you have complex indexes with a
22
+ stored fields and need to search / access those fields without access
23
+ to the original data store, Lunr might be what you're looking for.}
24
+ gem.email = "code@jbarnette.com"
25
+ gem.authors = ["John Barnette"]
26
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
27
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
28
+ gem.add_runtime_dependency 'activesupport', '2.3.4'
29
+ gem.add_runtime_dependency 'activerecord', '2.3.4'
30
+ gem.add_runtime_dependency 'sunspot', '~> 1.2'
31
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
32
+ end
33
+ Jeweler::RubygemsDotOrgTasks.new
34
+
35
+ require 'rake/testtask'
36
+ Rake::TestTask.new(:test) do |test|
37
+ test.libs << 'lib' << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ end
41
+
42
+ task :default => :test
43
+
44
+ require 'rake/rdoctask'
45
+ Rake::RDocTask.new do |rdoc|
46
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "lunr #{version}"
50
+ rdoc.rdoc_files.include('README*')
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 2.0.10
@@ -0,0 +1,98 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{lannon-lunr}
8
+ s.version = "2.0.10"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["John Barnette"]
12
+ s.date = %q{2011-03-16}
13
+ s.description = %q{A simple read-only interface to Solr, built on Sunspot.
14
+ Lunr makes it easy to query and create objects from a Sunspot-managed
15
+ Solr index without requiring all the knowledge, code, and data used to
16
+ build the index in the first place. If you have complex indexes with a
17
+ stored fields and need to search / access those fields without access
18
+ to the original data store, Lunr might be what you're looking for.}
19
+ s.email = %q{code@jbarnette.com}
20
+ s.extra_rdoc_files = [
21
+ "README.rdoc"
22
+ ]
23
+ s.files = [
24
+ ".autotest",
25
+ ".rvmrc",
26
+ "CHANGELOG.rdoc",
27
+ "Gemfile",
28
+ "Gemfile.lock",
29
+ "README.rdoc",
30
+ "Rakefile",
31
+ "VERSION",
32
+ "lannon-lunr.gemspec",
33
+ "lib/lunr.rb",
34
+ "lib/lunr/errors.rb",
35
+ "lib/lunr/model.rb",
36
+ "lib/lunr/model/klass.rb",
37
+ "lib/lunr/search.rb",
38
+ "lib/lunr/sunspot.rb",
39
+ "test/helper.rb",
40
+ "test/test_lunr.rb",
41
+ "test/test_lunr_model.rb",
42
+ "test/test_lunr_search.rb"
43
+ ]
44
+ s.homepage = %q{http://github.com/lannon/lunr}
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = %q{1.3.7}
47
+ s.summary = %q{A simple read-only interface to Solr, built on Sunspot}
48
+ s.test_files = [
49
+ "test/helper.rb",
50
+ "test/test_lunr.rb",
51
+ "test/test_lunr_model.rb",
52
+ "test/test_lunr_search.rb"
53
+ ]
54
+
55
+ if s.respond_to? :specification_version then
56
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
60
+ s.add_runtime_dependency(%q<activesupport>, ["= 2.3.4"])
61
+ s.add_runtime_dependency(%q<activerecord>, ["= 2.3.4"])
62
+ s.add_runtime_dependency(%q<sunspot>, ["= 1.2.1"])
63
+ s.add_development_dependency(%q<bundler>, ["= 1.0.10"])
64
+ s.add_development_dependency(%q<jeweler>, ["= 1.5.2"])
65
+ s.add_development_dependency(%q<fakeweb>, ["= 1.3.0"])
66
+ s.add_development_dependency(%q<shoulda>, ["= 2.11.3"])
67
+ s.add_development_dependency(%q<mocha>, ["= 0.9.12"])
68
+ s.add_runtime_dependency(%q<activesupport>, ["= 2.3.4"])
69
+ s.add_runtime_dependency(%q<activerecord>, ["= 2.3.4"])
70
+ s.add_runtime_dependency(%q<sunspot>, ["~> 1.2"])
71
+ else
72
+ s.add_dependency(%q<activesupport>, ["= 2.3.4"])
73
+ s.add_dependency(%q<activerecord>, ["= 2.3.4"])
74
+ s.add_dependency(%q<sunspot>, ["= 1.2.1"])
75
+ s.add_dependency(%q<bundler>, ["= 1.0.10"])
76
+ s.add_dependency(%q<jeweler>, ["= 1.5.2"])
77
+ s.add_dependency(%q<fakeweb>, ["= 1.3.0"])
78
+ s.add_dependency(%q<shoulda>, ["= 2.11.3"])
79
+ s.add_dependency(%q<mocha>, ["= 0.9.12"])
80
+ s.add_dependency(%q<activesupport>, ["= 2.3.4"])
81
+ s.add_dependency(%q<activerecord>, ["= 2.3.4"])
82
+ s.add_dependency(%q<sunspot>, ["~> 1.2"])
83
+ end
84
+ else
85
+ s.add_dependency(%q<activesupport>, ["= 2.3.4"])
86
+ s.add_dependency(%q<activerecord>, ["= 2.3.4"])
87
+ s.add_dependency(%q<sunspot>, ["= 1.2.1"])
88
+ s.add_dependency(%q<bundler>, ["= 1.0.10"])
89
+ s.add_dependency(%q<jeweler>, ["= 1.5.2"])
90
+ s.add_dependency(%q<fakeweb>, ["= 1.3.0"])
91
+ s.add_dependency(%q<shoulda>, ["= 2.11.3"])
92
+ s.add_dependency(%q<mocha>, ["= 0.9.12"])
93
+ s.add_dependency(%q<activesupport>, ["= 2.3.4"])
94
+ s.add_dependency(%q<activerecord>, ["= 2.3.4"])
95
+ s.add_dependency(%q<sunspot>, ["~> 1.2"])
96
+ end
97
+ end
98
+
@@ -0,0 +1,12 @@
1
+ require "lunr/sunspot"
2
+ require "lunr/model"
3
+ require "lunr/search"
4
+
5
+ module Lunr
6
+
7
+ # Duh.
8
+
9
+ VERSION = "2.0.9"
10
+
11
+ end
12
+
@@ -0,0 +1,19 @@
1
+ module Lunr
2
+ class Error < StandardError
3
+ end
4
+
5
+ class AlreadyExecuted < Error
6
+ attr_reader :search
7
+
8
+ def initalize search
9
+ @search = search
10
+ super "Can't add more criteria, this search has already been executed!"
11
+ end
12
+ end
13
+
14
+ class BadModel < Error
15
+ def initialize klass
16
+ super "#{klass.name} doesn't include Lunr::Model!"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ require "lunr/model/klass"
2
+
3
+ module Lunr
4
+ module Model
5
+ def initialize hash
6
+ @hash = hash
7
+ end
8
+
9
+ def as_json options = nil
10
+ @hash
11
+ end
12
+
13
+ def id
14
+ @hash[:id]
15
+ end
16
+
17
+ def to_h
18
+ @hash
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,74 @@
1
+ require "lunr/search"
2
+ require "lunr/sunspot"
3
+
4
+ module Lunr
5
+ module Model
6
+ def self.included klass
7
+ klass.extend Klass
8
+ end
9
+
10
+ module Klass
11
+ def create hit
12
+ hash = { :id => hit.primary_key }
13
+
14
+ properties.each do |name, type|
15
+ value = hit.stored name
16
+
17
+ if Array === value && value.length == 1 && type == :text
18
+ # For text fields, which always appear to be multiple.
19
+ value = value.first
20
+ end
21
+
22
+ hash[name] = value
23
+ end
24
+
25
+ new hash
26
+ end
27
+
28
+ def first &block
29
+ search(&block).first
30
+ end
31
+
32
+ def properties
33
+ @properties ||= {}
34
+ end
35
+
36
+ def scopes
37
+ @scopes ||= {}
38
+ end
39
+
40
+ def scope name = :all, &block
41
+ scopes[name] = block
42
+
43
+ unless name == :all
44
+ class_eval <<-END, __FILE__, __LINE__ + 1
45
+ def self.#{name}
46
+ search.#{name}
47
+ end
48
+ END
49
+ end
50
+ end
51
+
52
+ def search &block
53
+ Lunr::Search.new self, &block
54
+ end
55
+
56
+ alias_method :all, :search
57
+
58
+ def searches classname = nil, &block
59
+ Sunspot::TypeField.alias self, classname if classname
60
+ Sunspot.setup self, &block
61
+
62
+ properties.each do |name, type|
63
+ class_eval <<-END, __FILE__, __LINE__ + 1
64
+ def #{name}
65
+ @hash[#{name.inspect}]
66
+ end
67
+ END
68
+
69
+ alias_method "#{name}?", name if type == :boolean
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,126 @@
1
+ require "lunr/errors"
2
+ require "lunr/model"
3
+ require "lunr/sunspot"
4
+
5
+ module Lunr
6
+ class Search
7
+ include Enumerable
8
+
9
+ attr_reader :klass
10
+
11
+ def initialize klass, &block
12
+ raise Lunr::BadModel.new(klass) unless klass < Lunr::Model
13
+
14
+ @executed = false
15
+ @klass = klass
16
+ @search = Sunspot.new_search klass
17
+
18
+ all = @klass.scopes[:all]
19
+
20
+ scope(&all) if all
21
+ scope(&block) if block_given?
22
+ end
23
+
24
+ def as_json options = nil
25
+ {}.tap do |j|
26
+ j[:page] = page
27
+ j[:total] = total
28
+
29
+ key = options.delete(:key) if Hash === options
30
+ j[key || :entries] = map { |e| e.as_json options }
31
+ end
32
+ end
33
+
34
+ def each &block
35
+ execute && @results.each(&block)
36
+ end
37
+
38
+ def empty?
39
+ 0 == total
40
+ end
41
+
42
+ def executable!
43
+ raise Lunr::AlreadyExecuted.new(self) if executed?
44
+ end
45
+
46
+ def executed?
47
+ @executed
48
+ end
49
+
50
+ def method_missing name, *args
51
+ return super unless scope = klass.scopes[name]
52
+
53
+ executable!
54
+
55
+ dsl = @search.send :dsl
56
+
57
+ if args.empty?
58
+ dsl.instance_eval(&scope)
59
+ else
60
+ scope.call dsl, args
61
+ end
62
+
63
+ self
64
+ end
65
+
66
+ def page
67
+ @page ||= execute && @search.query.page
68
+ end
69
+
70
+ def pages
71
+ @pages ||= total / per +
72
+ ((total_entries % per_page) > 0 ? 1 : 0)
73
+ end
74
+
75
+ def params
76
+ @search.query.to_params
77
+ end
78
+
79
+ def per
80
+ @per ||= execute && @search.query.per_page
81
+ end
82
+
83
+ def respond_to name, include_private = false
84
+ klass.scopes.key?(name) || super
85
+ end
86
+
87
+ def results
88
+ execute && @results
89
+ end
90
+
91
+ def scope &block
92
+ executable!
93
+ @search.build(&block)
94
+
95
+ self
96
+ end
97
+
98
+ def total
99
+ @total ||= execute && @search.total
100
+ end
101
+
102
+ alias_method :size, :total
103
+
104
+ # Quack like WillPaginate::Collection
105
+
106
+ alias_method :current_page, :page
107
+ alias_method :per_page, :per
108
+ alias_method :total_entries, :total
109
+ alias_method :total_pages, :pages
110
+
111
+ private
112
+
113
+ def execute
114
+ unless executed?
115
+ @executed = true
116
+ @search.execute
117
+
118
+ @results = @search.hits.map do |hit|
119
+ klass.create hit
120
+ end
121
+ end
122
+
123
+ true
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,57 @@
1
+ require "sunspot"
2
+
3
+ module Sunspot
4
+ module DSL
5
+ class Fields
6
+ def property name, type, options = {}
7
+ @setup.clazz.properties[name] = type
8
+ send type, name, options.merge(:stored => true)
9
+ end
10
+ end
11
+ end
12
+
13
+ module Search
14
+ class Hit
15
+ alias_method :original_initialize, :initialize
16
+
17
+ def initialize *args
18
+ original_initialize(*args)
19
+
20
+ if clazz = Sunspot::TypeField.aliases_inverted[@class_name]
21
+ @class_name = clazz.name
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ module Type
28
+ class BooleanType
29
+ def cast thing
30
+ thing == "true" ? true : thing == "false" ? false : !!thing
31
+ end
32
+ end
33
+ end
34
+
35
+ class TypeField
36
+ class << self
37
+ def alias(dest_class, source_class_name)
38
+ @@inverted = nil # invalidate cache
39
+ aliases[dest_class] = source_class_name
40
+ end
41
+
42
+ def aliases
43
+ @@aliases ||= {}
44
+ end
45
+
46
+ def aliases_inverted
47
+ @@inverted ||= aliases.invert
48
+ end
49
+ end
50
+
51
+ alias_method :old_to_indexed, :to_indexed
52
+
53
+ def to_indexed clazz
54
+ self.class.aliases[clazz] || clazz.name
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,6 @@
1
+ require 'test/unit'
2
+ require 'shoulda'
3
+ require 'fakeweb'
4
+ require 'lunr'
5
+
6
+ FakeWeb.allow_net_connect = false
@@ -0,0 +1,12 @@
1
+ require "helper"
2
+
3
+ class TestLunr < Test::Unit::TestCase
4
+ context "A Lunr test" do
5
+ setup do
6
+ FakeWeb.clean_registry
7
+ end
8
+ should "be so true" do
9
+ assert true
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ require "helper"
2
+
3
+ class TestLunrModel < Test::Unit::TestCase
4
+ should "be so true" do
5
+ assert true
6
+ end
7
+ end
@@ -0,0 +1,59 @@
1
+ require "helper"
2
+ require "mocha"
3
+
4
+ class TestLunrSearch < Test::Unit::TestCase
5
+
6
+ # FIXME: ugly.
7
+ class ::Searchable
8
+ include Lunr::Model
9
+ end
10
+
11
+ Sunspot.setup ::Searchable do
12
+ string :bar
13
+ string :foo
14
+ end
15
+
16
+ context "A Searchable model" do
17
+
18
+ setup do
19
+ @searchable = ::Searchable
20
+ @search = Lunr::Search.new @searchable do
21
+ with :foo, "bar"
22
+ end
23
+ end
24
+
25
+ should "respond to search" do
26
+ puts @searchable.respond_to?(:search)
27
+ end
28
+
29
+ should "have some stuff" do
30
+
31
+ assert_equal @searchable, @search.klass
32
+ assert_equal "type:Searchable", @search.params[:fq].first
33
+ assert @search.params[:fq].include?("foo_s:bar")
34
+ end
35
+
36
+ should "have scopes" do
37
+
38
+ @search.scope { with :foo, "blergh" }
39
+ @search.scope { with :bar, "corge" }
40
+
41
+ assert @search.params[:fq].include?("foo_s:blergh")
42
+ assert @search.params[:fq].include?("bar_s:corge")
43
+ end
44
+
45
+ should "only execute search once" do
46
+ @search.stubs(:executed?).returns true
47
+
48
+ assert_raises Lunr::AlreadyExecuted do
49
+ @search.scope { with :foo, "hello" }
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+
56
+
57
+ end
58
+
59
+
metadata ADDED
@@ -0,0 +1,268 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lannon-lunr
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 2
8
+ - 0
9
+ - 10
10
+ version: 2.0.10
11
+ platform: ruby
12
+ authors:
13
+ - John Barnette
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-03-16 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ type: :runtime
24
+ name: activesupport
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - "="
29
+ - !ruby/object:Gem::Version
30
+ hash: 11
31
+ segments:
32
+ - 2
33
+ - 3
34
+ - 4
35
+ version: 2.3.4
36
+ requirement: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ prerelease: false
39
+ type: :runtime
40
+ name: activerecord
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - "="
45
+ - !ruby/object:Gem::Version
46
+ hash: 11
47
+ segments:
48
+ - 2
49
+ - 3
50
+ - 4
51
+ version: 2.3.4
52
+ requirement: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ prerelease: false
55
+ type: :runtime
56
+ name: sunspot
57
+ version_requirements: &id003 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - "="
61
+ - !ruby/object:Gem::Version
62
+ hash: 29
63
+ segments:
64
+ - 1
65
+ - 2
66
+ - 1
67
+ version: 1.2.1
68
+ requirement: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ prerelease: false
71
+ type: :development
72
+ name: bundler
73
+ version_requirements: &id004 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - "="
77
+ - !ruby/object:Gem::Version
78
+ hash: 3
79
+ segments:
80
+ - 1
81
+ - 0
82
+ - 10
83
+ version: 1.0.10
84
+ requirement: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ prerelease: false
87
+ type: :development
88
+ name: jeweler
89
+ version_requirements: &id005 !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - "="
93
+ - !ruby/object:Gem::Version
94
+ hash: 7
95
+ segments:
96
+ - 1
97
+ - 5
98
+ - 2
99
+ version: 1.5.2
100
+ requirement: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ prerelease: false
103
+ type: :development
104
+ name: fakeweb
105
+ version_requirements: &id006 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - "="
109
+ - !ruby/object:Gem::Version
110
+ hash: 27
111
+ segments:
112
+ - 1
113
+ - 3
114
+ - 0
115
+ version: 1.3.0
116
+ requirement: *id006
117
+ - !ruby/object:Gem::Dependency
118
+ prerelease: false
119
+ type: :development
120
+ name: shoulda
121
+ version_requirements: &id007 !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - "="
125
+ - !ruby/object:Gem::Version
126
+ hash: 37
127
+ segments:
128
+ - 2
129
+ - 11
130
+ - 3
131
+ version: 2.11.3
132
+ requirement: *id007
133
+ - !ruby/object:Gem::Dependency
134
+ prerelease: false
135
+ type: :development
136
+ name: mocha
137
+ version_requirements: &id008 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - "="
141
+ - !ruby/object:Gem::Version
142
+ hash: 35
143
+ segments:
144
+ - 0
145
+ - 9
146
+ - 12
147
+ version: 0.9.12
148
+ requirement: *id008
149
+ - !ruby/object:Gem::Dependency
150
+ prerelease: false
151
+ type: :runtime
152
+ name: activesupport
153
+ version_requirements: &id009 !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - "="
157
+ - !ruby/object:Gem::Version
158
+ hash: 11
159
+ segments:
160
+ - 2
161
+ - 3
162
+ - 4
163
+ version: 2.3.4
164
+ requirement: *id009
165
+ - !ruby/object:Gem::Dependency
166
+ prerelease: false
167
+ type: :runtime
168
+ name: activerecord
169
+ version_requirements: &id010 !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - "="
173
+ - !ruby/object:Gem::Version
174
+ hash: 11
175
+ segments:
176
+ - 2
177
+ - 3
178
+ - 4
179
+ version: 2.3.4
180
+ requirement: *id010
181
+ - !ruby/object:Gem::Dependency
182
+ prerelease: false
183
+ type: :runtime
184
+ name: sunspot
185
+ version_requirements: &id011 !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ~>
189
+ - !ruby/object:Gem::Version
190
+ hash: 11
191
+ segments:
192
+ - 1
193
+ - 2
194
+ version: "1.2"
195
+ requirement: *id011
196
+ description: |-
197
+ A simple read-only interface to Solr, built on Sunspot.
198
+ Lunr makes it easy to query and create objects from a Sunspot-managed
199
+ Solr index without requiring all the knowledge, code, and data used to
200
+ build the index in the first place. If you have complex indexes with a
201
+ stored fields and need to search / access those fields without access
202
+ to the original data store, Lunr might be what you're looking for.
203
+ email: code@jbarnette.com
204
+ executables: []
205
+
206
+ extensions: []
207
+
208
+ extra_rdoc_files:
209
+ - README.rdoc
210
+ files:
211
+ - .autotest
212
+ - .rvmrc
213
+ - CHANGELOG.rdoc
214
+ - Gemfile
215
+ - Gemfile.lock
216
+ - README.rdoc
217
+ - Rakefile
218
+ - VERSION
219
+ - lannon-lunr.gemspec
220
+ - lib/lunr.rb
221
+ - lib/lunr/errors.rb
222
+ - lib/lunr/model.rb
223
+ - lib/lunr/model/klass.rb
224
+ - lib/lunr/search.rb
225
+ - lib/lunr/sunspot.rb
226
+ - test/helper.rb
227
+ - test/test_lunr.rb
228
+ - test/test_lunr_model.rb
229
+ - test/test_lunr_search.rb
230
+ has_rdoc: true
231
+ homepage: http://github.com/lannon/lunr
232
+ licenses: []
233
+
234
+ post_install_message:
235
+ rdoc_options: []
236
+
237
+ require_paths:
238
+ - lib
239
+ required_ruby_version: !ruby/object:Gem::Requirement
240
+ none: false
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ hash: 3
245
+ segments:
246
+ - 0
247
+ version: "0"
248
+ required_rubygems_version: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - ">="
252
+ - !ruby/object:Gem::Version
253
+ hash: 3
254
+ segments:
255
+ - 0
256
+ version: "0"
257
+ requirements: []
258
+
259
+ rubyforge_project:
260
+ rubygems_version: 1.3.7
261
+ signing_key:
262
+ specification_version: 3
263
+ summary: A simple read-only interface to Solr, built on Sunspot
264
+ test_files:
265
+ - test/helper.rb
266
+ - test/test_lunr.rb
267
+ - test/test_lunr_model.rb
268
+ - test/test_lunr_search.rb