From 66b4eb4c5ddf514517e9f567f9f27c3b60aa3a55 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 17 Jul 2015 15:18:07 +1000 Subject: [PATCH] Move Spree::Preferences::Configuration patches into superclass FileConfiguration --- app/models/content_configuration.rb | 7 +-- .../preferences/configuration_decorator.rb | 34 ------------- .../spree/preferences/file_configuration.rb | 50 +++++++++++++++++++ ...ion_spec.rb => file_configuration_spec.rb} | 9 ++-- 4 files changed, 55 insertions(+), 45 deletions(-) create mode 100644 app/models/spree/preferences/file_configuration.rb rename spec/models/spree/preferences/{configuration_spec.rb => file_configuration_spec.rb} (84%) diff --git a/app/models/content_configuration.rb b/app/models/content_configuration.rb index dd2e76ed8b..32a2065c5d 100644 --- a/app/models/content_configuration.rb +++ b/app/models/content_configuration.rb @@ -1,12 +1,9 @@ require 'open_food_network/paperclippable' -class ContentConfiguration < Spree::Preferences::Configuration +class ContentConfiguration < Spree::Preferences::FileConfiguration # Header include OpenFoodNetwork::Paperclippable - preference :logo_file_name, :string - preference :logo_content_type, :string - preference :logo_file_size, :integer - preference :logo_updated_at, :string + file_preference :logo has_attached_file :logo # Home page diff --git a/app/models/spree/preferences/configuration_decorator.rb b/app/models/spree/preferences/configuration_decorator.rb index 3c01caa444..04a9f35f6b 100644 --- a/app/models/spree/preferences/configuration_decorator.rb +++ b/app/models/spree/preferences/configuration_decorator.rb @@ -1,38 +1,4 @@ module Spree::Preferences Configuration.class_eval do - def get_preference_with_files(key) - if !has_preference?(key) && has_attachment?(key) - send(key) - else - get_preference_without_files(key) - end - end - alias_method_chain :get_preference, :files - alias :[] :get_preference - - - def preference_type_with_files(name) - if has_attachment? name - :file - else - preference_type_without_files(name) - end - end - alias_method_chain :preference_type, :files - - - # Spree's Configuration responds to preference methods via method_missing, but doesn't - # override respond_to?, which consequently reports those methods as unavailable. Paperclip - # errors if respond_to? isn't correct, so we override it here. - def respond_to?(method, include_all=false) - name = method.to_s.gsub('=', '') - super(self.class.preference_getter_method(name), include_all) || super(method, include_all) - end - - - def has_attachment?(name) - self.class.respond_to?(:attachment_definitions) && - self.class.attachment_definitions.keys.include?(name.to_sym) - end end end diff --git a/app/models/spree/preferences/file_configuration.rb b/app/models/spree/preferences/file_configuration.rb new file mode 100644 index 0000000000..5d84e37fdf --- /dev/null +++ b/app/models/spree/preferences/file_configuration.rb @@ -0,0 +1,50 @@ +module Spree::Preferences + class FileConfiguration < Configuration + + # Ideally, we'd alias_method_chain preference to add new type. However, failcake. + def self.file_preference(name) + preference "#{name}_file_name", :string + preference "#{name}_content_type", :string + preference "#{name}_file_size", :integer + preference "#{name}_updated_at", :string + end + + + # TODO: Rewrite with super + + def get_preference_with_files(key) + if !has_preference?(key) && has_attachment?(key) + send(key) + else + get_preference_without_files(key) + end + end + alias_method_chain :get_preference, :files + alias :[] :get_preference + + + def preference_type_with_files(name) + if has_attachment? name + :file + else + preference_type_without_files(name) + end + end + alias_method_chain :preference_type, :files + + + # Spree's Configuration responds to preference methods via method_missing, but doesn't + # override respond_to?, which consequently reports those methods as unavailable. Paperclip + # errors if respond_to? isn't correct, so we override it here. + def respond_to?(method, include_all=false) + name = method.to_s.gsub('=', '') + super(self.class.preference_getter_method(name), include_all) || super(method, include_all) + end + + + def has_attachment?(name) + self.class.respond_to?(:attachment_definitions) && + self.class.attachment_definitions.keys.include?(name.to_sym) + end + end +end diff --git a/spec/models/spree/preferences/configuration_spec.rb b/spec/models/spree/preferences/file_configuration_spec.rb similarity index 84% rename from spec/models/spree/preferences/configuration_spec.rb rename to spec/models/spree/preferences/file_configuration_spec.rb index 77d8f03666..77aabc637e 100644 --- a/spec/models/spree/preferences/configuration_spec.rb +++ b/spec/models/spree/preferences/file_configuration_spec.rb @@ -2,18 +2,15 @@ require 'spec_helper' module Spree module Preferences - class TestConfiguration < Configuration + class TestConfiguration < FileConfiguration preference :name, :string include OpenFoodNetwork::Paperclippable - preference :logo_file_name, :string - preference :logo_content_type, :string - preference :logo_file_size, :integer - preference :logo_updated_at, :string + file_preference :logo has_attached_file :logo end - describe Configuration do + describe FileConfiguration do let(:c) { TestConfiguration.new } describe "getting preferences" do