Skip to content

Commit

Permalink
raise InvalidPickleRefError if Jar#store is given a pickle ref with a…
Browse files Browse the repository at this point in the history
…n index
  • Loading branch information
ianwhite committed Aug 21, 2010
1 parent 88074ff commit 1d9e6ec
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 9 deletions.
20 changes: 11 additions & 9 deletions lib/pickle/jar.rb
Expand Up @@ -51,16 +51,19 @@ class Jar
#
# @examples
# store object
# store object, :label => "fred"
# store object, :factory => "admin_user"
# store object, :label => "fred", :label => "admin_user"
# store object, Pickle::Ref('"fred"')
# store object, Pickle::Ref("admin_user")
# store object, Pickle::Ref('admin_user "fred"')
#
# @raise InvalidPickleRefError if an index is given in the pickle ref
# @return Object the stored object
def store(model, opts = {})
store_by_factory_and_label(model, model.class.name, opts[:label])
unless canonical(opts[:factory]) == canonical(model.class.name)
store_by_factory_and_label(model, opts[:factory], opts[:label])
end
def store(model, ref = nil)
raise InvalidPickleRefError, "you can't store a model using an index: #{ref.inspect}" if ref && ref.index
model_class_factory = canonical(model.class.name)
label = ref && ref.label
factory = ref && ref.factory
store_by_factory_and_label(model, model_class_factory, label)
store_by_factory_and_label(model, factory, label) unless factory == model_class_factory
model
end

Expand Down Expand Up @@ -91,7 +94,6 @@ def include?(ref)

private
def store_by_factory_and_label(model, factory, label)
factory = canonical(factory)
factory_models(factory) << model
labeled_models(label)[factory] = model if label.present?
end
Expand Down
4 changes: 4 additions & 0 deletions spec/pickle/jar_spec.rb
Expand Up @@ -4,6 +4,10 @@
let(:model_class) { Class.new.tap {|c| c.stub!(:name).and_return('Module::ModelClass') } }
let(:model) { model_class.new }

it "#store with a indexed Pickle::Ref raises InvalidPickleRefError" do
lambda { subject.store(model, Pickle::Ref.new('1st model')) }.should raise_error(Pickle::InvalidPickleRefError)
end

shared_examples_for "after storing a model" do
specify "can be retrieved with Pickle::Ref.new(<model class name>)" do
subject.retrieve(Pickle::Ref.new('Module::ModelClass')).should == model
Expand Down

0 comments on commit 1d9e6ec

Please sign in to comment.