require 'set' module Paperclip class << self attr_accessor :classes_with_attachments attr_writer :registered_attachments_styles_path def registered_attachments_styles_path @registered_attachments_styles_path ||= Rails.root.join('public/system/paperclip_attachments.yml').to_s end end self.classes_with_attachments = Set.new # Get list of styles saved on previous deploy (running rake paperclip:refresh:missing_styles) def self.get_registered_attachments_styles YAML.load_file(Paperclip.registered_attachments_styles_path) rescue Errno::ENOENT nil end private_class_method :get_registered_attachments_styles def self.save_current_attachments_styles! File.open(Paperclip.registered_attachments_styles_path, 'w') do |f| YAML.dump(current_attachments_styles, f) end end # Returns hash with styles for all classes using Paperclip. # Unfortunately current version does not work with lambda styles:( # { # :User => {:avatar => [:small, :big]}, # :Book => { # :cover => [:thumb, :croppable]}, # :sample => [:thumb, :big]}, # } # } def self.current_attachments_styles Hash.new.tap do |current_styles| Paperclip.classes_with_attachments.each do |klass_name| klass = Paperclip.class_for(klass_name) klass.attachment_definitions.each do |attachment_name, attachment_attributes| # TODO: is it even possible to take into account Procs? next if attachment_attributes[:styles].kind_of?(Proc) attachment_attributes[:styles].try(:keys).try(:each) do |style_name| klass_sym = klass.to_s.to_sym current_styles[klass_sym] ||= Hash.new current_styles[klass_sym][attachment_name.to_sym] ||= Array.new current_styles[klass_sym][attachment_name.to_sym] << style_name.to_sym current_styles[klass_sym][attachment_name.to_sym].map!(&:to_s).sort!.map!(&:to_sym).uniq! end end end end end private_class_method :current_attachments_styles # Returns hash with styles missing from recent run of rake paperclip:refresh:missing_styles # { # :User => {:avatar => [:big]}, # :Book => { # :cover => [:croppable]}, # } # } def self.missing_attachments_styles current_styles = current_attachments_styles registered_styles = get_registered_attachments_styles Hash.new.tap do |missing_styles| current_styles.each do |klass, attachment_definitions| attachment_definitions.each do |attachment_name, styles| registered = registered_styles[klass][attachment_name] || [] rescue [] missed = styles - registered if missed.present? klass_sym = klass.to_s.to_sym missing_styles[klass_sym] ||= Hash.new missing_styles[klass_sym][attachment_name.to_sym] ||= Array.new missing_styles[klass_sym][attachment_name.to_sym].concat(missed.to_a) missing_styles[klass_sym][attachment_name.to_sym].map!(&:to_s).sort!.map!(&:to_sym).uniq! end end end end end end