spree_solr_search 0.30.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/README.md +34 -0
- data/Rakefile +41 -0
- data/VERSION +1 -0
- data/app/controllers/spree/base_controller_decorator.rb +9 -0
- data/app/helpers/solr_helper.rb +8 -0
- data/app/models/product_decorator.rb +66 -0
- data/app/views/products/_facets.html.erb +18 -0
- data/app/views/products/_suggestion.html.erb +6 -0
- data/config/locales/en.yml +6 -0
- data/config/locales/ru-RU.yml +6 -0
- data/config/locales/ru.yml +6 -0
- data/lib/generators/spree_solr_search/install_generator.rb +17 -0
- data/lib/generators/templates/solr.yml +15 -0
- data/lib/solr_pagination.rb +19 -0
- data/lib/spree/search/solr.rb +92 -0
- data/lib/spree_solr_search.rb +21 -0
- data/lib/spree_solr_search_hooks.rb +6 -0
- data/lib/tasks/acts_as_solr.rake +10 -0
- data/spree_solr_search.gemspec +59 -0
- metadata +97 -0
data/.gitignore
ADDED
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Solr Search
|
2
|
+
===========
|
3
|
+
|
4
|
+
### Installation
|
5
|
+
|
6
|
+
1. Add `gem "spree_solr_search"` to your Gemfile
|
7
|
+
1. Run `bundle install`
|
8
|
+
1. Run `rails g spree_solr_search:install`
|
9
|
+
|
10
|
+
**NOTE:** Master branch works only with Spree 0.30.x.
|
11
|
+
If you want use this extension with Spree 0.10.x or 0.11.x, then you should use spree-0-11-stable branch
|
12
|
+
|
13
|
+
### Usage
|
14
|
+
|
15
|
+
To perform the indexing:
|
16
|
+
|
17
|
+
rake solr:reindex BATCH=500
|
18
|
+
|
19
|
+
|
20
|
+
To start Solr demo-server:
|
21
|
+
|
22
|
+
rake solr:start SOLR_PATH="/home/roman/www/jetty-solr"
|
23
|
+
|
24
|
+
To stop Solr demo-server:
|
25
|
+
|
26
|
+
rake solr:stop
|
27
|
+
|
28
|
+
To configure production Solr server:
|
29
|
+
|
30
|
+
edit RAILS_ROOT/config/solr.yml
|
31
|
+
|
32
|
+
P.S. For development recommended use [jetty-solr](http://github.com/dcrec1/jetty-solr) server.
|
33
|
+
|
34
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rubygems'
|
3
|
+
begin
|
4
|
+
require 'jeweler'
|
5
|
+
rescue LoadError
|
6
|
+
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
#gem 'rdoc', '= 2.2'
|
10
|
+
#require 'rdoc'
|
11
|
+
require 'rake'
|
12
|
+
require 'rake/testtask'
|
13
|
+
#require 'rake/rdoctask'
|
14
|
+
require 'rake/packagetask'
|
15
|
+
require 'rake/gempackagetask'
|
16
|
+
|
17
|
+
Jeweler::Tasks.new do |s|
|
18
|
+
s.name = "spree_solr_search"
|
19
|
+
s.summary = "Provides search via Apache Solr for a Spree store."
|
20
|
+
s.description = s.summary
|
21
|
+
s.email = "roman@railsdog.com"
|
22
|
+
s.homepage = "http://github.com/romul/spree-solr-search"
|
23
|
+
s.authors = ["Roman Smirnov"]
|
24
|
+
# s.add_dependency 'spree_core', ['>= 0.30.0.beta1']
|
25
|
+
s.add_dependency 'acts_as_solr_reloaded', ['>= 1.4.0']
|
26
|
+
s.has_rdoc = false
|
27
|
+
#s.extra_rdoc_files = [ "README.rdoc"]
|
28
|
+
#s.rdoc_options = ["--main", "README.rdoc", "--inline-source", "--line-numbers"]
|
29
|
+
#s.test_files = Dir['test/**/*.{yml,rb}']
|
30
|
+
end
|
31
|
+
Jeweler::GemcutterTasks.new
|
32
|
+
|
33
|
+
desc "Default Task"
|
34
|
+
task :default => [ :test ]
|
35
|
+
|
36
|
+
# Run the unit tests
|
37
|
+
Rake::TestTask.new { |t|
|
38
|
+
t.libs << "test"
|
39
|
+
t.pattern = 'test/**/*_test.rb'
|
40
|
+
t.warning = true
|
41
|
+
}
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.30.0.beta1
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module SolrHelper
|
2
|
+
def link_to_facet(name, value, count)
|
3
|
+
facets_hash = params[:facets]
|
4
|
+
facets_hash = {} unless facets_hash.is_a?(Hash)
|
5
|
+
facets_hash = facets_hash.merge({name => ["\"#{value}\"", facets_hash[name]].join(',')})
|
6
|
+
link_to("#{value} (#{count})", url_for(request.params.merge({:facets => facets_hash})))
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
Product.class_eval do
|
2
|
+
acts_as_solr :fields => [:name, :description, :is_active, {:price => :float},
|
3
|
+
:taxon_ids, :price_range, :taxon_names,
|
4
|
+
:brand_property, :color_option, :size_option],
|
5
|
+
:facets=>[:price_range, :taxon_names,
|
6
|
+
:brand_property, :color_option, :size_option]
|
7
|
+
|
8
|
+
def taxon_ids
|
9
|
+
taxons.map(&:id)
|
10
|
+
end
|
11
|
+
|
12
|
+
def is_active
|
13
|
+
!deleted_at &&
|
14
|
+
(available_on <= Time.zone.now) &&
|
15
|
+
(Spree::Config[:allow_backorders] || count_on_hand > 0)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def taxon_names
|
21
|
+
taxons.map(&:name)
|
22
|
+
end
|
23
|
+
|
24
|
+
def price_range
|
25
|
+
price_ranges = YAML.load(Spree::Config[:product_price_ranges])
|
26
|
+
case price
|
27
|
+
when 0..25
|
28
|
+
price_ranges[0]
|
29
|
+
when 25..50
|
30
|
+
price_ranges[1]
|
31
|
+
when 50..100
|
32
|
+
price_ranges[2]
|
33
|
+
when 100..200
|
34
|
+
price_ranges[3]
|
35
|
+
else
|
36
|
+
price_ranges[4]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def brand_property
|
41
|
+
pp = ProductProperty.first(:joins => :property,
|
42
|
+
:conditions => {:product_id => self.id, :properties => {:name => 'brand'}})
|
43
|
+
pp ? pp.value : ''
|
44
|
+
end
|
45
|
+
|
46
|
+
def color_option
|
47
|
+
get_option_values('color')
|
48
|
+
end
|
49
|
+
|
50
|
+
def size_option
|
51
|
+
get_option_values('size')
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_option_values(option_name)
|
55
|
+
sql = <<-eos
|
56
|
+
SELECT DISTINCT ov.id, ov.presentation
|
57
|
+
FROM option_values AS ov
|
58
|
+
LEFT JOIN option_types AS ot ON (ov.option_type_id = ot.id)
|
59
|
+
LEFT JOIN option_values_variants AS ovv ON (ovv.option_value_id = ov.id)
|
60
|
+
LEFT JOIN variants AS v ON (ovv.variant_id = v.id)
|
61
|
+
LEFT JOIN products AS p ON (v.product_id = p.id)
|
62
|
+
WHERE (ot.name = '#{option_name}' AND p.id = #{self.id});
|
63
|
+
eos
|
64
|
+
OptionValue.find_by_sql(sql).map(&:presentation)
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%
|
2
|
+
facets = Spree::Config.searcher.facets || []
|
3
|
+
taxon_names = @taxon ? @taxon.self_and_descendants.map(&:name) : []
|
4
|
+
for facet in facets
|
5
|
+
options = facet.options
|
6
|
+
options = options.sort{|x,y| y.count <=> x.count} unless facet.name == "price_range"
|
7
|
+
unless options.empty? %>
|
8
|
+
<h4><%= t "#{facet.name}_facet" %></h4>
|
9
|
+
<ul><%
|
10
|
+
for option in options %>
|
11
|
+
<li>
|
12
|
+
<%= link_to_facet(facet.name, option.name, option.count) %>
|
13
|
+
</li><%
|
14
|
+
end %>
|
15
|
+
</ul><%
|
16
|
+
end
|
17
|
+
end
|
18
|
+
%>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SpreeSolrSearch
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path("../../templates", __FILE__)
|
5
|
+
|
6
|
+
desc "Configures your Rails application for use with spree_solr_search."
|
7
|
+
|
8
|
+
def copy_config
|
9
|
+
template "solr.yml", "config/solr.yml"
|
10
|
+
end
|
11
|
+
|
12
|
+
# def show_readme
|
13
|
+
# readme "README" if behavior == :invoke
|
14
|
+
# end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Config file for the acts_as_solr plugin.
|
2
|
+
#
|
3
|
+
# If you change the host or port number here, make sure you update
|
4
|
+
# them in your Solr config file
|
5
|
+
|
6
|
+
development:
|
7
|
+
url: http://127.0.0.1:8982/solr
|
8
|
+
|
9
|
+
production:
|
10
|
+
url: http://127.0.0.1:8983/solr
|
11
|
+
jvm_options: -server -d64 -Xmx1024M -Xms64M
|
12
|
+
|
13
|
+
test:
|
14
|
+
url: http://127.0.0.1:8981/solr
|
15
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# By Henrik Nyh <http://henrik.nyh.se> 2007-06-15.
|
2
|
+
# Free to modify and redistribute with credit.
|
3
|
+
|
4
|
+
# Adds a find_all_by_solr method to acts_as_solr models to enable
|
5
|
+
# will_paginate for acts_as_solr search results.
|
6
|
+
|
7
|
+
module ActsAsSolr
|
8
|
+
module PaginationExtension
|
9
|
+
|
10
|
+
def find_all_by_solr(query, options)
|
11
|
+
Spree::Config.searcher.products.slice(options[:offset], options[:limit])
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module ActsAsSolr::ClassMethods
|
18
|
+
include ActsAsSolr::PaginationExtension
|
19
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Spree::Search
|
2
|
+
class Solr < Spree::Search::Base
|
3
|
+
# method should return hash with conditions {:conditions=> "..."} for Product model
|
4
|
+
def get_products_conditions_for(query)
|
5
|
+
facets = {
|
6
|
+
:fields => [:price_range, :taxon_names, :brand_property, :color_option, :size_option],
|
7
|
+
:browse => @properties[:facets_hash].map{|k,v| "#{k}:#{v}"},
|
8
|
+
:zeros => false
|
9
|
+
}
|
10
|
+
search_options = {:facets => facets, :limit => 25000, :lazy => true}
|
11
|
+
if order_by_price
|
12
|
+
search_options.merge!(:order => (order_by_price == 'descend') ? "price desc" : "price asc")
|
13
|
+
end
|
14
|
+
full_query = query + " AND is_active:(true)"
|
15
|
+
if taxon
|
16
|
+
taxons_query = taxon.self_and_descendants.map{|t| "taxon_ids:(#{t.id})"}.join(" OR ")
|
17
|
+
full_query += " AND (#{taxons_query})"
|
18
|
+
end
|
19
|
+
|
20
|
+
result = Product.find_by_solr(full_query, search_options)
|
21
|
+
@properties[:products] = result.records
|
22
|
+
count = result.records.size
|
23
|
+
|
24
|
+
products = Product.paginate(query, :finder => 'find_all_by_solr',
|
25
|
+
:page => page, :per_page => per_page, :total_entries => count)
|
26
|
+
|
27
|
+
@properties[:products] = products
|
28
|
+
@properties[:suggest] = nil
|
29
|
+
begin
|
30
|
+
if suggest = result.suggest
|
31
|
+
suggest.sub!(/\sAND.*/, '')
|
32
|
+
@properties[:suggest] = suggest if suggest != query
|
33
|
+
end
|
34
|
+
rescue
|
35
|
+
end
|
36
|
+
|
37
|
+
@properties[:facets] = parse_facets_hash(result.facets)
|
38
|
+
{:conditions=> ["products.id IN (?)", products.map(&:id)]}
|
39
|
+
end
|
40
|
+
|
41
|
+
def prepare(params)
|
42
|
+
@properties[:facets_hash] = params[:facets] || {}
|
43
|
+
@properties[:taxon] = params[:taxon].blank? ? nil : Taxon.find(params[:taxon])
|
44
|
+
@properties[:per_page] = params[:per_page]
|
45
|
+
@properties[:page] = params[:page]
|
46
|
+
@properties[:manage_pagination] = true
|
47
|
+
@properties[:order_by_price] = params[:order_by_price]
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def parse_facets_hash(facets_hash = {"facet_fields" => {}})
|
53
|
+
facets = []
|
54
|
+
price_ranges = YAML::load(Spree::Config[:product_price_ranges])
|
55
|
+
facets_hash["facet_fields"].each do |name, options|
|
56
|
+
next if options.size <= 1
|
57
|
+
facet = Facet.new(name.sub('_facet', ''))
|
58
|
+
if name == 'price_range_facet'
|
59
|
+
price_ranges.each do |price_range|
|
60
|
+
count = options[price_range]
|
61
|
+
facet.options << FacetOption.new(price_range, count) if count
|
62
|
+
end
|
63
|
+
else
|
64
|
+
options.each do |value, count|
|
65
|
+
facet.options << FacetOption.new(value, count)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
facets << facet
|
69
|
+
end
|
70
|
+
facets
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
class Facet
|
76
|
+
attr_accessor :options
|
77
|
+
attr_accessor :name
|
78
|
+
def initialize(name, options = [])
|
79
|
+
self.name = name
|
80
|
+
self.options = options
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class FacetOption
|
85
|
+
attr_accessor :name
|
86
|
+
attr_accessor :count
|
87
|
+
def initialize(name, count)
|
88
|
+
self.name = name
|
89
|
+
self.count = count
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spree_core'
|
2
|
+
require 'spree_solr_search_hooks'
|
3
|
+
|
4
|
+
module SpreeSolrSearch
|
5
|
+
class Engine < Rails::Engine
|
6
|
+
def self.activate
|
7
|
+
require 'acts_as_solr'
|
8
|
+
require 'solr_pagination'
|
9
|
+
ENV['RAILS_ENV'] = Rails.env
|
10
|
+
|
11
|
+
Spree::Config.set(:product_price_ranges =>
|
12
|
+
["Under $25", "$25 to $50", "$50 to $100", "$100 to $200", "$200 and above"])
|
13
|
+
|
14
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
|
15
|
+
Rails.env == "production" ? require(c) : load(c)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
config.to_prepare &method(:activate).to_proc
|
19
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
begin
|
2
|
+
ENV['ONLY'] = "Product"
|
3
|
+
SOLR_PATH = ENV['SOLR_PATH']
|
4
|
+
RAILS_DEFAULT_LOGGER = Logger.new(Rails.root.join("log", Rails.env + ".log"))
|
5
|
+
RAILS_ROOT = Rails.root.to_s
|
6
|
+
require 'acts_as_solr_reloaded'
|
7
|
+
load 'tasks/solr.rake'
|
8
|
+
rescue LoadError
|
9
|
+
puts "WARNING: acts_as_solr_reloaded gem appears to be unavailable. Please install with bundle install."
|
10
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{spree_solr_search}
|
8
|
+
s.version = "0.30.0.beta1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Roman Smirnov"]
|
12
|
+
s.date = %q{2010-08-26}
|
13
|
+
s.description = %q{Provides search via Apache Solr for a Spree store.}
|
14
|
+
s.email = %q{roman@railsdog.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"README.md",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"app/controllers/spree/base_controller_decorator.rb",
|
24
|
+
"app/helpers/solr_helper.rb",
|
25
|
+
"app/models/product_decorator.rb",
|
26
|
+
"app/views/products/_facets.html.erb",
|
27
|
+
"app/views/products/_suggestion.html.erb",
|
28
|
+
"config/locales/en.yml",
|
29
|
+
"config/locales/ru-RU.yml",
|
30
|
+
"config/locales/ru.yml",
|
31
|
+
"lib/generators/spree_solr_search/install_generator.rb",
|
32
|
+
"lib/generators/templates/solr.yml",
|
33
|
+
"lib/solr_pagination.rb",
|
34
|
+
"lib/spree/search/solr.rb",
|
35
|
+
"lib/spree_solr_search.rb",
|
36
|
+
"lib/spree_solr_search_hooks.rb",
|
37
|
+
"lib/tasks/acts_as_solr.rake",
|
38
|
+
"spree_solr_search.gemspec"
|
39
|
+
]
|
40
|
+
s.homepage = %q{http://github.com/romul/spree-solr-search}
|
41
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
42
|
+
s.require_paths = ["lib"]
|
43
|
+
s.rubygems_version = %q{1.3.6}
|
44
|
+
s.summary = %q{Provides search via Apache Solr for a Spree store.}
|
45
|
+
|
46
|
+
if s.respond_to? :specification_version then
|
47
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
48
|
+
s.specification_version = 3
|
49
|
+
|
50
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
51
|
+
s.add_runtime_dependency(%q<acts_as_solr_reloaded>, [">= 1.4.0"])
|
52
|
+
else
|
53
|
+
s.add_dependency(%q<acts_as_solr_reloaded>, [">= 1.4.0"])
|
54
|
+
end
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<acts_as_solr_reloaded>, [">= 1.4.0"])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spree_solr_search
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: true
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 30
|
8
|
+
- 0
|
9
|
+
- beta1
|
10
|
+
version: 0.30.0.beta1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Roman Smirnov
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-26 00:00:00 +04:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: acts_as_solr_reloaded
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 4
|
31
|
+
- 0
|
32
|
+
version: 1.4.0
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Provides search via Apache Solr for a Spree store.
|
36
|
+
email: roman@railsdog.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.md
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- README.md
|
46
|
+
- Rakefile
|
47
|
+
- VERSION
|
48
|
+
- app/controllers/spree/base_controller_decorator.rb
|
49
|
+
- app/helpers/solr_helper.rb
|
50
|
+
- app/models/product_decorator.rb
|
51
|
+
- app/views/products/_facets.html.erb
|
52
|
+
- app/views/products/_suggestion.html.erb
|
53
|
+
- config/locales/en.yml
|
54
|
+
- config/locales/ru-RU.yml
|
55
|
+
- config/locales/ru.yml
|
56
|
+
- lib/generators/spree_solr_search/install_generator.rb
|
57
|
+
- lib/generators/templates/solr.yml
|
58
|
+
- lib/solr_pagination.rb
|
59
|
+
- lib/spree/search/solr.rb
|
60
|
+
- lib/spree_solr_search.rb
|
61
|
+
- lib/spree_solr_search_hooks.rb
|
62
|
+
- lib/tasks/acts_as_solr.rake
|
63
|
+
- spree_solr_search.gemspec
|
64
|
+
has_rdoc: true
|
65
|
+
homepage: http://github.com/romul/spree-solr-search
|
66
|
+
licenses: []
|
67
|
+
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options:
|
70
|
+
- --charset=UTF-8
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
segments:
|
78
|
+
- 0
|
79
|
+
version: "0"
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
segments:
|
85
|
+
- 1
|
86
|
+
- 3
|
87
|
+
- 1
|
88
|
+
version: 1.3.1
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.3.6
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Provides search via Apache Solr for a Spree store.
|
96
|
+
test_files: []
|
97
|
+
|