class Asset
def self.define_class_method(name, &block)
def self.define_class_method(name, &block) eigenclass.send :define_method, name, &block end
def self.eigenclass
def self.eigenclass class << self; self; end end
def self.thumbnail_names
def self.thumbnail_names thumbnail_sizes.keys end
def self.thumbnail_options
def self.thumbnail_options asset_sizes = thumbnail_sizes.collect do |k, v| size_id = k size_description = "#{k}: " size_description << (v.is_a?(Array) ? v.join(' as ') : v) [size_description, size_id] end.sort_by { |pair| pair.last.to_s } asset_sizes.unshift ['Original (as uploaded)', 'original'] asset_sizes end
def self.thumbnail_sizes
def self.thumbnail_sizes AssetType.find(:image).paperclip_styles end
def aspect(style_name = 'original')
def aspect(style_name = 'original') geometry(style_name).aspect end
def asset_type
def asset_type AssetType.for(asset) end
def assign_title
def assign_title self.title = asset_file_name.downcase.sub(original_extension, '').sub('.', '') end
def assign_uuid
def assign_uuid self.uuid = UUIDTools::UUID.timestamp_create.to_s unless uuid? end
def attached_to?(page)
def attached_to?(page) pages.include?(page) end
def basename
def basename File.basename(asset_file_name, '.*') if asset_file_name end
def count_with_asset_types(asset_types, *args)
def count_with_asset_types(asset_types, *args) with_asset_types(asset_types) { where(*args).count } end
def dimensions_known?
def dimensions_known? original_width? && original_height? end
def extension(style_name = 'original')
def extension(style_name = 'original') if style_name == 'original' original_extension elsif style = paperclip_styles[style_name.to_sym] style.format else original_extension end end
def find_all_by_asset_types(asset_types, *args)
def find_all_by_asset_types(asset_types, *args) with_asset_types(asset_types) { where *args } end
def geometry(style_name = 'original')
def geometry(style_name = 'original') raise Paperclip::StyleError, "Requested style #{style_name} is not defined for this asset." unless style?(style_name) @geometry ||= {} begin @geometry[style_name] ||= if style_name.to_s == 'original' original_geometry else style = asset.styles[style_name.to_sym] original_geometry.transformed_by(style.geometry) # this can return dimensions for fully specified style sizes but not for relative sizes when there are no original dimensions end rescue Paperclip::TransformationError => e Rails.logger.warn "geometry transformation error: #{e}" original_geometry # returns a blank geometry if the real geometry cannot be calculated end end
def height(style_name = 'original')
def height(style_name = 'original') geometry(style_name).height.to_i end
def horizontal?(style_name = 'original')
def horizontal?(style_name = 'original') geometry(style_name).horizontal? end
def known_types
def known_types AssetType.known_types end
def orientation(style_name = 'original')
def orientation(style_name = 'original') a = aspect(style_name) if a == nil? 'unknown' elsif a < 1.0 'vertical' elsif a > 1.0 'horizontal' else 'square' end end
def original_extension
def original_extension return asset_file_name.split('.').last.downcase if asset_file_name end
def original_geometry
def original_geometry @original_geometry ||= Paperclip::Geometry.new(original_width, original_height) end
def read_dimensions
def read_dimensions if image? if file = asset.queued_for_write[:original] geometry = Paperclip::Geometry.from_file(file) self.original_width = geometry.width self.original_height = geometry.height self.original_extension = File.extname(file.path) end end true end
def square?(style_name = 'original')
def square?(style_name = 'original') geometry(style_name).square? end
def style?(style_name = 'original')
def style?(style_name = 'original') style_name == 'original' || paperclip_styles.keys.include?(style_name.to_sym) end
def thumbnail(style_name = 'original')
def thumbnail(style_name = 'original') return asset.url if style_name.to_sym == :original return asset.url(style_name.to_sym) if style?(style_name) asset_type.icon(style_name) end
def vertical?(style_name = 'original')
def vertical?(style_name = 'original') geometry(style_name).vertical? end
def width(style_name = 'original')
def width(style_name = 'original') geometry(style_name).width.to_i end
def with_asset_types(asset_types, &block)
def with_asset_types(asset_types, &block) w_asset_types = AssetType.conditions_for(asset_types) with_scope(where(conditions: ["#{w_asset_types} = ?", block])) end