Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Accept static_model_preferences class name as string #4070

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions core/lib/spree/preferences/static_model_preferences.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,14 @@ def initialize
end

def add(klass, name, preferences)
constantized_klass = klass.try(:constantize) || klass
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will trigger an autoload during initialization, which is one of the things that this change should avoid. Thoughts on just converting to a string if it's not already and allowing Definition to accept it as well?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @elia, I'm wondering how to fix it. In the end, add creates another Definition instance, and it calls .defined_preferences on the class 🤷


# We use class name instead of class to allow reloading in dev
raise "Static model preference '#{name}' on #{klass} is already defined" if @store[klass.to_s][name]
@store[klass.to_s][name] = Definition.new(klass, preferences)
if @store[constantized_klass.to_s][name]
raise "Static model preference '#{name}' on #{constantized_klass} is already defined"
end

@store[constantized_klass.to_s][name] = Definition.new(constantized_klass, preferences)
end

def for_class(klass)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
module Spree
RSpec.describe Preferences::StaticModelPreferences do
let(:preference_class) do
Class.new do
MyFakeStaticModelPreferencesClass ||= Class.new do
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think defining a constant here will actually define it under Spree::, an alternative could be using stubbed constants https://rspec.info/blog/2012/06/constant-stubbing-in-rspec-2-11/, but I'm not sure it's a good one, you need to check how they'll interact with this setup.

include Preferences::Preferable
preference :color, :string
end
Expand All @@ -23,6 +23,11 @@ module Spree
expect(definitions).to have_key('my_definition')
end

it "can add with string class name" do
subject.add(preference_class.to_s, 'my_definition', {})
expect(definitions).to have_key('my_definition')
end

it "errors assigning invalid preferences" do
expect {
subject.add(preference_class, 'my_definition', { ice_cream: 'chocolate' })
Expand Down