Skip to content

Commit

Permalink
[Fixes #108] Only stores one class of a given name to avoid memory le…
Browse files Browse the repository at this point in the history
…aks when classes are reloaded (e.g., Rails development mode)
  • Loading branch information
alindeman committed Oct 30, 2011
1 parent a3ecc36 commit 2b5e8a7
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
4 changes: 2 additions & 2 deletions sunspot/lib/sunspot.rb
Expand Up @@ -14,7 +14,7 @@

%w(util adapters configuration setup composite_setup text_field_setup field
field_factory data_extractor indexer query search session session_proxy
type dsl).each do |filename|
type dsl class_set).each do |filename|
require File.join(File.dirname(__FILE__), 'sunspot', filename)
end

Expand Down Expand Up @@ -45,7 +45,7 @@ module Sunspot

# Array to track classes that have been set up for searching.
# Used by, e.g., Sunspot::Rails for reindexing all searchable classes.
@searchable = []
@searchable = ClassSet.new

class <<self
#
Expand Down
23 changes: 23 additions & 0 deletions sunspot/lib/sunspot/class_set.rb
@@ -0,0 +1,23 @@
module Sunspot
class ClassSet
include Enumerable

def initialize
@name_to_klass = {}
end

def <<(klass)
@name_to_klass[klass.name.to_sym] = klass
self
end
alias_method :add, :<<

def each(&block)
@name_to_klass.values.each(&block)
end

def empty?
@name_to_klass.empty?
end
end
end
24 changes: 24 additions & 0 deletions sunspot/spec/api/class_set_spec.rb
@@ -0,0 +1,24 @@
require "spec_helper"

describe Sunspot::ClassSet do
it "is enumerable" do
class1, class2 = stub(:name => "Class1"), stub(:name => "Class2")

set = described_class.new
set << class1 << class2

set.to_a.should == [class1, class2]
end

it "replaces classes with the same name" do
set = described_class.new

class1 = stub(:name => "Class1")
set << class1
set.to_a.should == [class1]

class1_dup = stub(:name => "Class1")
set << class1_dup
set.to_a.should == [class1_dup]
end
end

0 comments on commit 2b5e8a7

Please sign in to comment.